From 56a342b719fc708b4676ed1ebd4ae23dd3d9ba28 Mon Sep 17 00:00:00 2001 From: FabioPinheiro Date: Thu, 9 Nov 2023 23:52:13 +0000 Subject: [PATCH] webapp: new pages DiscordBotInfo and WebBluetoothTool & update Home --- README.md | 10 +--- .../scala/fmgp/webapp/AgentMessages.scala | 4 +- webapp/src/main/scala/fmgp/webapp/App.scala | 4 ++ .../scala/fmgp/webapp/DiscordBotInfo.scala | 36 +++++++++++++ webapp/src/main/scala/fmgp/webapp/Home.scala | 52 +++++++++++++------ .../src/main/scala/fmgp/webapp/MyRouter.scala | 16 +++++- .../scala/fmgp/webapp/WebBluetoothTool.scala | 26 ++++++++++ 7 files changed, 121 insertions(+), 27 deletions(-) create mode 100644 webapp/src/main/scala/fmgp/webapp/DiscordBotInfo.scala create mode 100644 webapp/src/main/scala/fmgp/webapp/WebBluetoothTool.scala diff --git a/README.md b/README.md index 724bce66..d563cc78 100644 --- a/README.md +++ b/README.md @@ -84,14 +84,8 @@ Want to see your project here? [Submit a PR] - support `from_prior` - support `sub` `iss` on JWT https://datatracker.ietf.org/doc/html/rfc7519 - create module for protocols -- routing: - - implement utilities for DID Agents [WIP] - - [DONE] HTTP POST - - [WIP] push notification - - [WIP] websocket - - [WIP-stop] NFC - - [TODO] bluetooth -- maybe implement method `did:peer.3` (this is an extension) +- maybe implement method `did:peer.3` and `did:peer.4` +- [TODO] method `did:key` - maybe implement method `did:jwk` https://github.com/quartzjer/did-jwk - maybe implement methods ["KERI lite"](https://docs.google.com/presentation/d/1ksqVxeCAvqLjr67htWZ4JYaSnI8TUZIO7tDMF5npHTo/edit#slide=id.g1ca1fd90f33_0_0) - be part of the Adopters in https://github.com/sbt/sbt-ci-release/ diff --git a/webapp/src/main/scala/fmgp/webapp/AgentMessages.scala b/webapp/src/main/scala/fmgp/webapp/AgentMessages.scala index f791c928..71bc543c 100644 --- a/webapp/src/main/scala/fmgp/webapp/AgentMessages.scala +++ b/webapp/src/main/scala/fmgp/webapp/AgentMessages.scala @@ -23,8 +23,8 @@ object AgentMessageStorage { // job(ctx.owner) () }, - // code("AgentMessageStorage"), - // p("Agent Message Storage of ", child <-- Global.agentVar.signal.map(_.map(_.id.string).getOrElse("NONE"))), + code("AgentMessageStorage"), + p("Agent Message Storage of ", child <-- Global.agentVar.signal.map(_.map(_.id.string).getOrElse("NONE"))), // br(), div( // container padding := "12pt", diff --git a/webapp/src/main/scala/fmgp/webapp/App.scala b/webapp/src/main/scala/fmgp/webapp/App.scala index 8afc2263..540c70cc 100644 --- a/webapp/src/main/scala/fmgp/webapp/App.scala +++ b/webapp/src/main/scala/fmgp/webapp/App.scala @@ -68,6 +68,8 @@ object App { .collectSignal[OOBPage](page => OutOfBandTool(page)) .collectStatic(QRcodeScannerPage)(QRcodeScannerTool()) .collectStatic(NFCScannerPage)(NFCScannerTool()) + .collectStatic(WebBluetoothPage)(WebBluetoothTool()) + .collectStatic(DiscordBotPage)(DiscordBotInfo()) .collectStatic(DocPage)(Doc()) .collectStatic(AgentManagementPage)(AgentManagement()) // .collectStatic(AgentDBPage)(AgentDB()) @@ -86,6 +88,8 @@ object App { SettingsPage, QRcodeScannerPage, NFCScannerPage, + WebBluetoothPage, + DiscordBotPage, OOBPage(oobExample), ResolverPage(didExample), AgentManagementPage, diff --git a/webapp/src/main/scala/fmgp/webapp/DiscordBotInfo.scala b/webapp/src/main/scala/fmgp/webapp/DiscordBotInfo.scala new file mode 100644 index 00000000..176507f1 --- /dev/null +++ b/webapp/src/main/scala/fmgp/webapp/DiscordBotInfo.scala @@ -0,0 +1,36 @@ +package fmgp.webapp + +import org.scalajs.dom +import org.scalajs.dom.HTMLElement +import com.raquo.laminar.api.L._ +import com.raquo.laminar.nodes.ReactiveHtmlElement +import typings.std.stdStrings.text +import typings.mermaid + +import fmgp.did._ +object DiscordBotInfo { + + def apply(): HtmlElement = // rootElement + div( + p("Discord Bot"), + p("The Discord bot is this a WIP (2023-11-05)"), + p( + "The Bot id is ", + code("1170442329883168788"), + ". ", + a( + href := "https://discord.com/api/oauth2/authorize?client_id=1170442329883168788&permissions=8&scope=bot", + "Click here to add the Bot" + ), + ". The permission need to be refine (is Administrator for now)." + ), + p("Capabilities:"), + ul( + li("[WIP] As a Discord user proved that you control the DID"), + li("[TODO] Setup Discord ROLEs based on DID Comm interactions"), + li("[TODO] As a DID get the Verifiable Credentials that you control a Discord user"), + li("[TODO] Setup Discord ROLEs based on Verifiable Credentials"), + ) + ) + +} diff --git a/webapp/src/main/scala/fmgp/webapp/Home.scala b/webapp/src/main/scala/fmgp/webapp/Home.scala index 21df92e1..25ca0c41 100644 --- a/webapp/src/main/scala/fmgp/webapp/Home.scala +++ b/webapp/src/main/scala/fmgp/webapp/Home.scala @@ -18,31 +18,53 @@ object Home { def hack = mermaid.mod.default + def showPage(page: MyRouter.Page, message: String) = + p("Navigate to ", b(message), MyRouter.navigateTo(page), page.makeI) + def apply(): HtmlElement = // rootElement div( p("Sandbox for DID Comm v2.1"), - p("Navigate to ", b("Settings Page"), MyRouter.navigateTo(MyRouter.SettingsPage)), - p("Navigate to ", b("OOB Tool "), MyRouter.navigateTo(MyRouter.OOBPage(App.oobExample))), - p("Navigate to ", b("QRcode Scanner Tool "), MyRouter.navigateTo(MyRouter.QRcodeScannerPage)), - p("Navigate to ", b("NFC Scanner Tool "), MyRouter.navigateTo(MyRouter.NFCScannerPage)), - p("Navigate to ", b("DID Resolver Tool "), MyRouter.navigateTo(MyRouter.ResolverPage(App.didExample))), - p("Navigate to ", b("Encrypt Tool "), MyRouter.navigateTo(MyRouter.EncryptPage)), - p("Navigate to ", b("Decrypt Tool "), MyRouter.navigateTo(MyRouter.DecryptPage)), - p("Navigate to ", b("Basic Message "), MyRouter.navigateTo(MyRouter.BasicMessagePage)), - p("Navigate to ", b("Trust Ping "), MyRouter.navigateTo(MyRouter.TrustPingPage)), - p("Navigate to ", b("TapIntoStream Tool "), MyRouter.navigateTo(MyRouter.TapIntoStreamPage)), + showPage(MyRouter.SettingsPage, "Settings Page"), + showPage(MyRouter.AgentManagementPage, "Agent Management"), + showPage(MyRouter.AgentMessageStoragePage, "Agent Message Storage"), + showPage(MyRouter.OOBPage(App.oobExample), "OOB Tool"), + showPage(MyRouter.QRcodeScannerPage, "DIDComm over QRcode"), + showPage(MyRouter.NFCScannerPage, "DIDComm over NFC"), + showPage(MyRouter.ResolverPage(App.didExample), "DID Resolver Tool"), + showPage(MyRouter.EncryptPage, "Encrypt Tool"), + showPage(MyRouter.DecryptPage, "Decrypt Tool"), // p( // "Navigate to ", // b("Message DB"), // " (only works for alice, bob and charlie)", // MyRouter.navigateTo(MyRouter.AgentDBPage) // ), - // p("Navigate to ", b("Agent Message DB"), MyRouter.navigateTo(MyRouter.AgentDBPage)), - p("Navigate to ", b("Mediator (Alice)"), MyRouter.navigateTo(MyRouter.MediatorPage)), - p("Navigate to ", b("Agent Management"), MyRouter.navigateTo(MyRouter.AgentManagementPage)), - p("Navigate to ", b("Documentation for scala-did lib"), MyRouter.navigateTo(MyRouter.DocPage)), + // showPage(MyRouter.AgentDBPage, ge("Agent Message DB"), + br(), + p("In developing:"), + showPage(MyRouter.DiscordBotPage, "Discord Bot (with DIDComm capabilities)"), + showPage(MyRouter.WebBluetoothPage, "DIDComm over Web Bluetooth"), + br(), + p("Deprecated:"), + showPage(MyRouter.BasicMessagePage, "Basic Message"), + showPage(MyRouter.TrustPingPage, "Trust Ping"), + showPage(MyRouter.TapIntoStreamPage, "TapIntoStream Tool"), + showPage(MyRouter.MediatorPage, "Mediator (Alice)"), + showPage(MyRouter.DocPage, "Documentation for scala-did lib"), + br(), + p("Ideas for experiments and applications:"), + ul( + li("[Done] DID Comm over Websocket"), + li("[WIP] DID Comm over Push API"), + li("DID Comm Protocol to Bootstrap WebRTC"), + li("DID Comm over WebRTC: This would be indeed very interesting"), + li("DID Comm over Email (in top of a SMTP server): Prove the control/ownership of emails addresses"), + li("DID Comm over Power Line: Smart meters"), + li("DID Comm over Li-Fi: Vehicles communication, Broadcast news, Indoor positioning system"), + li("DID Comm over Audio Waves"), + ), br(), - p("DIDs: "), + p("DIDs:"), div(child <-- statementVar.signal.map(e => getHtml(e))) ) def getHtml(statement: Option[Statement], indent: Int = 0): ReactiveHtmlElement[HTMLElement] = diff --git a/webapp/src/main/scala/fmgp/webapp/MyRouter.scala b/webapp/src/main/scala/fmgp/webapp/MyRouter.scala index 8df0fc98..ecc24968 100644 --- a/webapp/src/main/scala/fmgp/webapp/MyRouter.scala +++ b/webapp/src/main/scala/fmgp/webapp/MyRouter.scala @@ -11,14 +11,22 @@ object MyRouter { sealed abstract class Page( val title: String, val icon: String // https://fonts.google.com/icons?selected=Material+Icons+Outlined - ) + ) { + def makeI = i( + className("material-icons mdc-list-item__graphic"), + aria.hidden(true), + this.icon + ) + } case object HomePage extends Page("Home", "home") case object SettingsPage extends Page("Settings", "settings") case class OOBPage(query_oob: String) extends Page("OutOfBand", "app_shortcut") object OOBPage { def apply(oob: OutOfBand) = new OOBPage(oob.data.urlBase64) } case object QRcodeScannerPage extends Page("QRcodeScanner", "qr_code_scanner") - case object NFCScannerPage extends Page("NFCScanner", "nfc") + case object NFCScannerPage extends Page("NFCScanner", "nfc") // or "contactless" + case object WebBluetoothPage extends Page("WebBluetooth", "bluetooth") + case object DiscordBotPage extends Page("DIscordBot", "smart_toy") case object DocPage extends Page("Doc", "menu_book") case object AgentManagementPage extends Page("AgentManagement", "manage_accounts") // case object DIDPage extends Page("DID", "visibility") @@ -38,6 +46,8 @@ object MyRouter { given oobPageRW: ReadWriter[OOBPage] = macroRW given qrcodeScannerPageRW: ReadWriter[QRcodeScannerPage.type] = macroRW given nfcScannerPageRW: ReadWriter[NFCScannerPage.type] = macroRW + given webBluetoothPageRW: ReadWriter[WebBluetoothPage.type] = macroRW + given discordBotPageRW: ReadWriter[DiscordBotPage.type] = macroRW given docPageRW: ReadWriter[DocPage.type] = macroRW given keysPageRW: ReadWriter[AgentManagementPage.type] = macroRW // given agentDBPageRW: ReadWriter[AgentDBPage.type] = macroRW @@ -72,6 +82,8 @@ object MyRouter { Route.static(DocPage, root / "doc" / endOfSegments, Router.localFragmentBasePath), Route.static(QRcodeScannerPage, root / "scanner" / endOfSegments, Router.localFragmentBasePath), Route.static(NFCScannerPage, root / "nfc" / endOfSegments, Router.localFragmentBasePath), + Route.static(WebBluetoothPage, root / "bluetooth" / endOfSegments, Router.localFragmentBasePath), + Route.static(DiscordBotPage, root / "discord" / endOfSegments, Router.localFragmentBasePath), Route.static(AgentManagementPage, root / "agentkeys" / endOfSegments, Router.localFragmentBasePath), // Route.static(AgentDBPage, root / "db" / endOfSegments, Router.localFragmentBasePath), Route.static(AgentMessageStoragePage, root / "agent" / endOfSegments, Router.localFragmentBasePath), diff --git a/webapp/src/main/scala/fmgp/webapp/WebBluetoothTool.scala b/webapp/src/main/scala/fmgp/webapp/WebBluetoothTool.scala new file mode 100644 index 00000000..6a55ab7e --- /dev/null +++ b/webapp/src/main/scala/fmgp/webapp/WebBluetoothTool.scala @@ -0,0 +1,26 @@ +package fmgp.webapp + +import org.scalajs.dom +import org.scalajs.dom.HTMLElement +import com.raquo.laminar.api.L._ +import com.raquo.laminar.nodes.ReactiveHtmlElement +import typings.std.stdStrings.text +import typings.mermaid + +import fmgp.did._ +object WebBluetoothTool { + + def apply(): HtmlElement = // rootElement + div( + p("WebBluetoothTool"), + p("The Discord bot is this a WIP (2023-09-10)"), + p( + "Specs of ", + a( + href := "https://translate.google.pt/?sl=en&tl=pt&text=we%20did%20come%20capabilities&op=translate", + "Web Bluetooth API" + ), + ), + ) + +}