basic parsing nostr events from input.

This commit is contained in:
fiatjaf 2023-03-18 21:42:41 -03:00
parent b54ae5f8fb
commit 61bf4e6ed0
No known key found for this signature in database
GPG Key ID: BAD43C4BE5C1A3A1
3 changed files with 44 additions and 56 deletions

View File

@ -1,7 +1,7 @@
<meta charset=utf-8> <meta charset=utf-8>
<title>nostr army knife</title> <title>nostr army knife</title>
<script src="https://cdn.tailwindcss.com"></script> <script src="https://cdn.tailwindcss.com"></script>
<body class="bg-emerald-200 text-black m-0"> <body class="bg-emerald-200 text-black m-0 w-full h-full">
<div id="app"></div> <div id="app" class="w-full h-full"></div>
<script type="module" src="/target/esbuild/bundle.js"></script> <script type="module" src="/target/esbuild/bundle.js"></script>
</body> </body>

View File

@ -0,0 +1,38 @@
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(
textArea.withSelf { self =>
(
cls := "w-2/3 min-h-fit max-h-96 p-3",
placeholder := "paste something nostric",
onInput --> (_.foreach(_ => self.value.get.flatMap(input.set))),
value <-- input
)
},
div(
input.map(inp =>
decode[Event](inp) match {
case Left(err) => err.toString
case Right(event) => event.toString
}
)
)
)
}
}

View File

@ -1,63 +1,13 @@
import cats.effect.*
import calico.* import calico.*
import calico.html.io.{*, given} import calico.html.io.{*, given}
import calico.syntax.* import calico.syntax.*
import calico.unsafe.given
import cats.effect.*
import cats.effect.syntax.all.*
import cats.syntax.all.*
import fs2.*
import fs2.concurrent.*
import fs2.dom.* import fs2.dom.*
object Main extends IOWebApp { object Main extends IOWebApp {
def Counter(
label: String,
initialStep: Int
): Resource[IO, HtmlDivElement[IO]] =
SignallingRef[IO]
.of(initialStep)
.product(Channel.unbounded[IO, Int])
.toResource
.flatMap { (step, diff) =>
val allowedSteps = List(1, 2, 3, 5, 10)
div(
p(
"Step: ",
select.withSelf { self =>
(
allowedSteps
.map(step => option(value := step.toString, step.toString)),
value <-- step.map(_.toString),
onChange --> {
_.evalMap(_ => self.value.get)
.map(_.toIntOption)
.unNone
.foreach(step.set)
}
)
}
),
p(
label + ": ",
b(diff.stream.scanMonoid.map(_.toString).holdOptionResource),
" ",
button(
"-",
onClick --> {
_.evalMap(_ => step.get).map(-1 * _).foreach(diff.send(_).void)
}
),
button(
"+",
onClick --> (_.evalMap(_ => step.get).foreach(diff.send(_).void))
)
)
)
}
def render: Resource[IO, HtmlDivElement[IO]] = div( def render: Resource[IO, HtmlDivElement[IO]] = div(
h1("Let's count!"), cls := "flex w-full h-full flex-col items-center justify-center",
Counter("Sheep", initialStep = 3) h1(cls := "px-1 py-2 text-lg", "nostr army knife"),
Input()
) )
} }