Fix LiveView methods mixed output

This commit is contained in:
Paul-Henri Froidmont 2025-11-14 16:01:48 +01:00
parent 2424d2ff6c
commit cbd5229025
Signed by: phfroidmont
GPG key ID: BE948AFD7E7873BE
4 changed files with 15 additions and 8 deletions

View file

@ -4,9 +4,7 @@ import zio.*
import zio.stream.* import zio.stream.*
trait LiveView[Msg, Model]: trait LiveView[Msg, Model]:
def init: Task[Model] def init: Model | Task[Model]
def update(model: Model): Msg => Task[Model] def update(model: Model): Msg => Model | Task[Model]
def view(model: Dyn[Model]): HtmlElement def view(model: Dyn[Model]): HtmlElement
def subscriptions(model: Model): ZStream[Any, Nothing, Msg] def subscriptions(model: Model): ZStream[Any, Nothing, Msg]
given [T]: Conversion[T, Task[T]] = ZIO.succeed(_)

View file

@ -26,7 +26,7 @@ final case class LiveRoute[A, Msg, Model](
s"phx-${Base64.getUrlEncoder().withoutPadding().encodeToString(Random().nextBytes(12))}" s"phx-${Base64.getUrlEncoder().withoutPadding().encodeToString(Random().nextBytes(12))}"
val token = Token.sign("secret", id, "") val token = Token.sign("secret", id, "")
for for
initModel <- lv.init initModel <- normalize(lv.init)
el = lv.view(Var(initModel)) el = lv.view(Var(initModel))
_ = el.syncAll() _ = el.syncAll()
yield Response.html( yield Response.html(

View file

@ -27,7 +27,7 @@ object Socket:
inbox <- Queue.bounded[(Payload.Event, WebSocketMessage.Meta)](4) inbox <- Queue.bounded[(Payload.Event, WebSocketMessage.Meta)](4)
outHub <- Hub.unbounded[(Payload, WebSocketMessage.Meta)] outHub <- Hub.unbounded[(Payload, WebSocketMessage.Meta)]
initModel <- lv.init initModel <- normalize(lv.init)
modelVar = Var(initModel) modelVar = Var(initModel)
el = lv.view(modelVar) el = lv.view(modelVar)
ref <- Ref.make((modelVar, el)) ref <- Ref.make((modelVar, el))
@ -52,7 +52,8 @@ object Socket:
s"No binding found for event ID ${event.event}" s"No binding found for event ID ${event.event}"
) )
) )
updatedModel <- lv.update(modelVar.currentValue)(f(event.params)) updatedModel <-
normalize(lv.update(modelVar.currentValue)(f(event.params)))
_ = modelVar.set(updatedModel) _ = modelVar.set(updatedModel)
_ <- lvStreamRef.set(lv.subscriptions(updatedModel)) _ <- lvStreamRef.set(lv.subscriptions(updatedModel))
diff = el.diff() diff = el.diff()
@ -63,7 +64,7 @@ object Socket:
serverFiber <- serverMsgStream.runForeach { (msg, meta) => serverFiber <- serverMsgStream.runForeach { (msg, meta) =>
for for
(modelVar, el) <- ref.get (modelVar, el) <- ref.get
updatedModel <- lv.update(modelVar.currentValue)(msg) updatedModel <- normalize(lv.update(modelVar.currentValue)(msg))
_ = modelVar.set(updatedModel) _ = modelVar.set(updatedModel)
diff = el.diff() diff = el.diff()
payload = Payload.Diff(diff) payload = Payload.Diff(diff)

View file

@ -0,0 +1,8 @@
package scalive
import zio.*
private def normalize[A](value: A | Task[A]): Task[A] =
value match
case t: Task[?] @unchecked => t.asInstanceOf[Task[A]]
case v => ZIO.succeed(v.asInstanceOf[A])