mirror of
https://github.com/phfroidmont/scalive.git
synced 2025-12-25 05:26:59 +01:00
Fix comprehension rendering
This commit is contained in:
parent
ccdd22b61a
commit
1bd65fd49c
3 changed files with 30 additions and 20 deletions
|
|
@ -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))
|
||||||
)
|
)
|
||||||
)
|
)
|
||||||
)
|
)
|
||||||
|
|
|
||||||
|
|
@ -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)) =>
|
||||||
|
|
|
||||||
|
|
@ -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
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue