mirror of
https://github.com/phfroidmont/scalive.git
synced 2025-12-25 21:46:59 +01:00
Improve LiveView's API with inspiration from TEA
This commit is contained in:
parent
4af9a78408
commit
08036ab5aa
10 changed files with 254 additions and 238 deletions
|
|
@ -2,28 +2,23 @@ package scalive
|
|||
package playground
|
||||
|
||||
import scalive.*
|
||||
import zio.*
|
||||
|
||||
final case class MyModel(
|
||||
cls: String = "text-xs",
|
||||
bool: Boolean = true,
|
||||
elems: List[Elem] = List.empty)
|
||||
final case class Elem(name: String, age: Int)
|
||||
import TestView.*
|
||||
class TestView extends LiveView[Msg, Model]:
|
||||
|
||||
class TestView(initialModel: MyModel) extends LiveView[TestView.Event]:
|
||||
import TestView.Event.*
|
||||
def init = ZIO.succeed(Model())
|
||||
|
||||
private val modelVar = Var[MyModel](initialModel)
|
||||
def update(model: Model) =
|
||||
case Msg.UpdateModel(f) => ZIO.succeed(f(model))
|
||||
|
||||
def handleEvent =
|
||||
case UpdateModel(f) => modelVar.update(f)
|
||||
|
||||
val el: HtmlElement =
|
||||
def view(model: Dyn[Model]) =
|
||||
div(
|
||||
idAttr := "42",
|
||||
cls := modelVar(_.cls),
|
||||
disabled := modelVar(_.bool),
|
||||
cls := model(_.cls),
|
||||
disabled := model(_.bool),
|
||||
ul(
|
||||
modelVar(_.elems).splitByIndex((_, elem) =>
|
||||
model(_.elems).splitByIndex((_, elem) =>
|
||||
li(
|
||||
"Nom: ",
|
||||
elem(_.name),
|
||||
|
|
@ -35,5 +30,12 @@ class TestView(initialModel: MyModel) extends LiveView[TestView.Event]:
|
|||
)
|
||||
|
||||
object TestView:
|
||||
enum Event:
|
||||
case UpdateModel(f: MyModel => MyModel)
|
||||
|
||||
enum Msg:
|
||||
case UpdateModel(f: Model => Model)
|
||||
|
||||
final case class Model(
|
||||
cls: String = "text-xs",
|
||||
bool: Boolean = true,
|
||||
elems: List[Elem] = List.empty)
|
||||
final case class Elem(name: String, age: Int)
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue