diff --git a/src/main/scala/Generator.scala b/src/main/scala/Generator.scala deleted file mode 100644 index b43698c..0000000 --- a/src/main/scala/Generator.scala +++ /dev/null @@ -1,27 +0,0 @@ -import cats.effect.* -import cats.effect.syntax.all.* -import cats.syntax.all.* -import fs2.concurrent.* -import fs2.dom.{Event => _, *} -import io.circe.parser.* -import calico.* -import calico.html.io.{*, given} -import calico.syntax.* -import snow.* - -object Generator { - def apply(): Resource[IO, HtmlDivElement[IO]] = - SignallingRef[IO] - .of("") - .toResource - .flatMap { input => - div( - cls := "my-3", - button(cls := buttonCls, "generate event"), - button(cls := buttonCls, "generate keypair") - ) - } - - val buttonCls = - "bg-blue-500 hover:bg-blue-700 text-white font-bold py-2 mx-2 px-4 rounded" -} diff --git a/src/main/scala/Input.scala b/src/main/scala/Input.scala deleted file mode 100644 index c0ed513..0000000 --- a/src/main/scala/Input.scala +++ /dev/null @@ -1,52 +0,0 @@ -import cats.effect.* -import cats.effect.syntax.all.* -import cats.syntax.all.* -import fs2.concurrent.* -import fs2.dom.{Event => _, *} -import io.circe.parser.* -import calico.* -import calico.html.io.{*, given} -import calico.syntax.* -import snow.* - -object Input { - def apply(): Resource[IO, HtmlDivElement[IO]] = - SignallingRef[IO] - .of("") - .toResource - .flatMap { input => - div( - cls := "w-full", - div( - cls := "w-full flex justify-center", - textArea.withSelf { self => - ( - cls := "w-2/3 max-h-96 p-3", - styleAttr := "min-height: 200px", - placeholder := "paste something nostric", - onInput --> (_.foreach(_ => self.value.get.flatMap(input.set))), - value <-- input - ) - } - ), - div( - cls := "w-full flex justify-center", - input.map(inp => - if inp.trim() == "" then "" - else - decode[Event](inp) match { - case Right(event) => event.toString - case Left(err: io.circe.DecodingFailure) => - err.pathToRootString match { - case Some(path) => s"field $path is missing or wrong" - case None => s"decoding ${err.pathToRootString}" - } - case Left(err: io.circe.ParsingFailure) => - "not valid JSON" - } - ) - ) - ) - } - -} diff --git a/src/main/scala/Main.scala b/src/main/scala/Main.scala index 88d64a4..544d900 100644 --- a/src/main/scala/Main.scala +++ b/src/main/scala/Main.scala @@ -1,14 +1,73 @@ import cats.effect.* +import cats.effect.syntax.all.* +import cats.syntax.all.* +import fs2.concurrent.* +import fs2.dom.{Event => _, *} +import io.circe.parser.* import calico.* import calico.html.io.{*, given} import calico.syntax.* -import fs2.dom.* +import snow.* object Main extends IOWebApp { - def render: Resource[IO, HtmlDivElement[IO]] = div( - cls := "flex w-full h-full flex-col items-center justify-center", - h1(cls := "px-1 py-2 text-lg", "nostr army knife"), - Input(), - Generator() - ) + def render: Resource[IO, HtmlDivElement[IO]] = { + div( + cls := "flex w-full h-full flex-col items-center justify-center", + h1(cls := "px-1 py-2 text-lg", "nostr army knife"), + div( + cls := "flex justify-center my-3" + // button(cls := buttonCls, "generate event", onClick --> (_.foreach(_ => ))), + ), + input() + ) + } + + def input(): Resource[IO, HtmlDivElement[IO]] = + SignallingRef[IO] + .of("") + .toResource + .flatMap { input => + div( + cls := "w-full", + div( + cls := "w-full flex justify-center", + textArea.withSelf { self => + ( + cls := "w-2/3 max-h-96 p-3", + styleAttr := "min-height: 200px", + placeholder := "paste something nostric", + onInput --> (_.foreach(_ => self.value.get.flatMap(input.set))), + value <-- input + ) + } + ) + ) + } + + def result(): Resource[IO, HtmlDivElement[IO]] = + SignallingRef[IO] + .of("") + .toResource + .flatMap { input => + div( + cls := "w-full flex justify-center", + input.map(inp => + if inp.trim() == "" then "" + else + decode[Event](inp) match { + case Right(event) => event.toString + case Left(err: io.circe.DecodingFailure) => + err.pathToRootString match { + case Some(path) => s"field $path is missing or wrong" + case None => s"decoding ${err.pathToRootString}" + } + case Left(err: io.circe.ParsingFailure) => + "not valid JSON" + } + ) + ) + } + + val buttonCls = + "bg-blue-500 hover:bg-blue-700 text-white font-bold py-2 mx-2 px-4 rounded" }