Fix comprehension rendering

This commit is contained in:
Paul-Henri Froidmont 2025-08-26 19:37:45 +02:00
parent ccdd22b61a
commit 1bd65fd49c
Signed by: phfroidmont
GPG key ID: BE948AFD7E7873BE
3 changed files with 30 additions and 20 deletions

View file

@ -8,7 +8,7 @@ enum Diff:
case Tag( case Tag(
static: Seq[String] = Seq.empty, static: Seq[String] = Seq.empty,
dynamic: Seq[Diff.Dynamic] = Seq.empty) dynamic: Seq[Diff.Dynamic] = Seq.empty)
case Split( case Comprehension(
static: Seq[String] = Seq.empty, static: Seq[String] = Seq.empty,
entries: Seq[Diff.Dynamic] = Seq.empty) entries: Seq[Diff.Dynamic] = Seq.empty)
case Value(value: String) case Value(value: String)
@ -16,7 +16,7 @@ enum Diff:
case Deleted case Deleted
object Diff: object Diff:
given JsonEncoder[Diff] = JsonEncoder[Json].contramap(toJson) given JsonEncoder[Diff] = JsonEncoder[Json].contramap(toJson(_))
private def toJson(diff: Diff): Json = private def toJson(diff: Diff): Json =
diff match diff match
@ -29,17 +29,18 @@ object Diff:
dynamic.map(d => d.key -> toJson(d.diff)) dynamic.map(d => d.key -> toJson(d.diff))
) )
) )
case Diff.Split(static, entries) => case Diff.Comprehension(static, entries) =>
Json.Obj( Json.Obj(
Option Option
.when(static.nonEmpty)("s" -> Json.Arr(static.map(Json.Str(_))*)) .when(static.nonEmpty)("s" -> Json.Arr(static.map(Json.Str(_))*))
.to(Chunk) .to(Chunk)
.appendedAll( .appendedAll(
Option.when(entries.nonEmpty)( Option.when(entries.nonEmpty)(
"d" -> "k" ->
Json.Obj( Json
entries.map(d => d.key -> toJson(d.diff))* .Obj(
) entries.map(d => d.key -> toJson(d.diff))*
).add("kc", Json.Num(entries.length))
) )
) )
) )

View file

@ -47,7 +47,7 @@ object DiffBuilder:
entries.collectFirst { case (_, Some(el)) => el.static }.getOrElse(List.empty) entries.collectFirst { case (_, Some(el)) => el.static }.getOrElse(List.empty)
List( List(
Some( Some(
Diff.Split( Diff.Comprehension(
static = if trackUpdates then Seq.empty else static, static = if trackUpdates then Seq.empty else static,
entries = entries.map { entries = entries.map {
case (key, Some(el)) => case (key, Some(el)) =>

View file

@ -8,28 +8,37 @@ import scala.util.Random
final case class Socket[Cmd](lv: LiveView[Cmd]): final case class Socket[Cmd](lv: LiveView[Cmd]):
private var clientInitialized = false private var clientInitialized = false
val id: String = s"phx-${Base64.getEncoder().encodeToString(Random().nextBytes(8))}" val id: String =
private val token = Token.sign("secret", id, "") s"phx-${Base64.getUrlEncoder().withoutPadding().encodeToString(Random().nextBytes(8))}"
private val element = lv.el.prepended(idAttr := id, dataAttr("phx-session") := token) private val token = Token.sign("secret", id, "")
element.syncAll() lv.el.syncAll()
def receiveCommand(cmd: Cmd): Unit = def receiveCommand(cmd: Cmd): Unit =
lv.handleCommand(cmd) lv.handleCommand(cmd)
def renderHtml(rootLayout: HtmlElement => HtmlElement = identity): String = def renderHtml(rootLayout: HtmlElement => HtmlElement = identity): String =
element.syncAll() lv.el.syncAll()
HtmlBuilder.build(rootLayout(element)) HtmlBuilder.build(
rootLayout(
div(
idAttr := id,
dataAttr("phx-session") := token,
lv.el
)
)
)
def syncClient: Unit = def syncClient: Unit =
element.syncAll() lv.el.syncAll()
println(DiffBuilder.build(element, trackUpdates = clientInitialized).toJsonPretty) println(DiffBuilder.build(lv.el, trackUpdates = clientInitialized).toJsonPretty)
clientInitialized = true clientInitialized = true
element.setAllUnchanged() lv.el.setAllUnchanged()
def diff: Diff = def diff: Diff =
element.syncAll() lv.el.syncAll()
val diff = DiffBuilder.build(element, trackUpdates = clientInitialized) val diff = DiffBuilder.build(lv.el, trackUpdates = clientInitialized)
clientInitialized = true clientInitialized = true
element.setAllUnchanged() lv.el.setAllUnchanged()
diff diff
end Socket