diff --git a/src/main/scala/Components.scala b/src/main/scala/Components.scala index 0136520..08ff3ab 100644 --- a/src/main/scala/Components.scala +++ b/src/main/scala/Components.scala @@ -1,4 +1,4 @@ -import cats.data.* +import cats.data.{Store => *, *} import cats.effect.* import cats.effect.syntax.all.* import cats.syntax.all.* @@ -12,6 +12,8 @@ import calico.syntax.* import scoin.* import snow.* +import Utils.* + object Components { def renderEventPointer( evp: snow.EventPointer @@ -53,12 +55,83 @@ object Components { else None ) - def renderEvent(event: Event): Resource[IO, HtmlDivElement[IO]] = + def renderEvent( + event: Event, + store: Store + ): Resource[IO, HtmlDivElement[IO]] = div( cls := "text-md", - List(("pubkey", event.pubkey), ("id", event.id), ("sig", event.sig)) - .filter((_, v) => v.isEmpty) - .map { (label, _) => entry("property missing", label) }, + if event.pubkey.isEmpty then + Some( + div( + cls := "flex items-center", + entry("missing", "pubkey"), + button( + Styles.buttonSmall, + "fill with a debugging key", + onClick --> (_.foreach { _ => + store.input.set( + event + .copy(pubkey = Some(keyOne.publicKey.xonly)) + .asJson + .printWith(jsonPrinter) + ) + }) + ) + ) + ) + else None, + if event.id.isEmpty then + Some( + div( + cls := "flex items-center", + entry("missing", "id"), + if event.pubkey.isDefined then + Some( + button( + Styles.buttonSmall, + "fill id", + onClick --> (_.foreach(_ => + store.input.set( + event + .copy(id = Some(event.hash.toHex)) + .asJson + .printWith(jsonPrinter) + ) + )) + ) + ) + else None + ) + ) + else None, + if event.sig.isEmpty then + Some( + div( + cls := "flex items-center", + entry("missing", "sig"), + if event.id.isDefined && event.pubkey == Some( + keyOne.publicKey.xonly + ) + then + Some( + button( + Styles.buttonSmall, + "sign", + onClick --> (_.foreach(_ => + store.input.set( + event + .sign(keyOne) + .asJson + .printWith(jsonPrinter) + ) + )) + ) + ) + else None + ) + ) + else None, entry("serialized event", event.serialized), entry("implied event id", event.hash.toHex), entry( diff --git a/src/main/scala/Main.scala b/src/main/scala/Main.scala index ec53c34..06bf8f3 100644 --- a/src/main/scala/Main.scala +++ b/src/main/scala/Main.scala @@ -58,7 +58,7 @@ object Main extends IOWebApp { Event( kind = 1, content = "hello world" - ).sign(PrivateKey(randomBytes32())) + ).sign(keyOne) .asJson .printWith(jsonPrinter) ) @@ -90,9 +90,8 @@ object Main extends IOWebApp { div( cls := "w-full flex my-5", store.result.map { - case Left(msg) => div(msg) - case Right(event: Event) => - renderEvent(event) + case Left(msg) => div(msg) + case Right(event: Event) => renderEvent(event, store) case Right(pp: ProfilePointer) => renderProfilePointer(pp) case Right(evp: EventPointer) => renderEventPointer(evp) case Right(sk: PrivateKey) => diff --git a/src/main/scala/Store.scala b/src/main/scala/Store.scala index 7b73e34..7817602 100644 --- a/src/main/scala/Store.scala +++ b/src/main/scala/Store.scala @@ -4,6 +4,7 @@ import cats.effect.syntax.all.* import cats.syntax.all.* import fs2.concurrent.* import fs2.dom.{Event => _, *} +import scoin.PrivateKey case class Store( input: SignallingRef[IO, String], diff --git a/src/main/scala/Styles.scala b/src/main/scala/Styles.scala index 42d756c..4a72181 100644 --- a/src/main/scala/Styles.scala +++ b/src/main/scala/Styles.scala @@ -3,5 +3,7 @@ import calico.html.io.* object Styles { val button = cls := "shrink bg-blue-500 hover:bg-blue-700 text-white font-bold py-2 mx-2 px-4 rounded " + val buttonSmall = cls := + "shrink text-sm bg-blue-500 hover:bg-blue-700 text-white font-bold mx-2 px-2 rounded " val mono = styleAttr := "font-family: monospace" } diff --git a/src/main/scala/Utils.scala b/src/main/scala/Utils.scala index 6e2d257..7a64810 100644 --- a/src/main/scala/Utils.scala +++ b/src/main/scala/Utils.scala @@ -1,6 +1,10 @@ import io.circe.Printer +import scodec.bits.ByteVector +import scoin.* object Utils { + val keyOne = PrivateKey(ByteVector32(ByteVector(0x01).padLeft(32))) + val jsonPrinter = Printer( dropNullValues = false, indent = " ",