From 55cfde7517314e4970434d41bd767865a3508b09 Mon Sep 17 00:00:00 2001 From: stevechy Date: Tue, 16 May 2023 19:13:16 -0600 Subject: [PATCH] #198 : Change TyrianAppF to take both varargs and Map. Update flag data-attr to data-tyrian-flag. Fixed the types to IO and ZIO in tyrian-io and tyrian-zio. --- examples/main-launcher/index.html | 4 ++-- .../src/main/scala/example/ChatApp.scala | 6 +++--- .../src/main/scala/example/CounterApp.scala | 6 +++--- tyrian-io/src/main/scala/tyrian/TyrianApp.scala | 6 +++--- tyrian-zio/src/main/scala/tyrian/TyrianApp.scala | 6 +++--- tyrian/js/src/main/scala/tyrian/TyrianAppF.scala | 16 +++++++++------- 6 files changed, 23 insertions(+), 21 deletions(-) diff --git a/examples/main-launcher/index.html b/examples/main-launcher/index.html index c4d9bfaa..f499f62c 100644 --- a/examples/main-launcher/index.html +++ b/examples/main-launcher/index.html @@ -9,8 +9,8 @@

Main launcher example

-
-
+
+
diff --git a/examples/main-launcher/src/main/scala/example/ChatApp.scala b/examples/main-launcher/src/main/scala/example/ChatApp.scala index a33a97a5..f209b2b6 100644 --- a/examples/main-launcher/src/main/scala/example/ChatApp.scala +++ b/examples/main-launcher/src/main/scala/example/ChatApp.scala @@ -16,7 +16,7 @@ object ChatApp extends TyrianApp[ChatAppMsg, ChatAppModel]: def update(model: ChatAppModel): ChatAppMsg => (ChatAppModel, Cmd[IO, ChatAppMsg]) = case ChatInput(input) => (model.copy(chatInput = input), Cmd.None) case SendChat() => (model.copy(chatInput = "", messages = model.messages :+ model.chatInput), Cmd.None) - case NavigateTo() => (model, Cmd.None) + case NoOp() => (model, Cmd.None) def view(model: ChatAppModel): Html[ChatAppMsg] = div( @@ -29,7 +29,7 @@ object ChatApp extends TyrianApp[ChatAppMsg, ChatAppModel]: ) def router: Location => ChatAppMsg = - _ => NavigateTo() + _ => NoOp() def subscriptions(model: ChatAppModel): Sub[IO, ChatAppMsg] = Sub.None @@ -37,7 +37,7 @@ object ChatApp extends TyrianApp[ChatAppMsg, ChatAppModel]: case class ChatAppModel(chatInput: String, messages: Seq[String]) sealed abstract class ChatAppMsg -case class NavigateTo() extends ChatAppMsg +case class NoOp() extends ChatAppMsg case class ChatInput(input: String) extends ChatAppMsg case class SendChat() extends ChatAppMsg diff --git a/examples/main-launcher/src/main/scala/example/CounterApp.scala b/examples/main-launcher/src/main/scala/example/CounterApp.scala index 64e2b593..603933bc 100644 --- a/examples/main-launcher/src/main/scala/example/CounterApp.scala +++ b/examples/main-launcher/src/main/scala/example/CounterApp.scala @@ -19,7 +19,7 @@ object CounterApp extends TyrianApp[Msg, Model]: def update(model: Model): Msg => (Model, Cmd[IO, Msg]) = case Msg.Increment => (model + 1, Cmd.None) case Msg.Decrement => (model - 1, Cmd.None) - case Msg.NavigateTo => (model, Cmd.None) + case Msg.NoOp => (model, Cmd.None) def view(model: Model): Html[Msg] = div( @@ -29,7 +29,7 @@ object CounterApp extends TyrianApp[Msg, Model]: ) def router: Location => Msg = - _ => Msg.NavigateTo + _ => Msg.NoOp def subscriptions(model: Model): Sub[IO, Msg] = Sub.None @@ -43,4 +43,4 @@ object Model: def -(other: Int): Model = i - other enum Msg: - case Increment, Decrement, NavigateTo + case Increment, Decrement, NoOp diff --git a/tyrian-io/src/main/scala/tyrian/TyrianApp.scala b/tyrian-io/src/main/scala/tyrian/TyrianApp.scala index 696d339a..4b69ff27 100644 --- a/tyrian-io/src/main/scala/tyrian/TyrianApp.scala +++ b/tyrian-io/src/main/scala/tyrian/TyrianApp.scala @@ -16,8 +16,8 @@ trait TyrianApp[Msg, Model] extends TyrianAppF[IO, Msg, Model]: _.map(_.start()).useForever.unsafeRunAndForget() object TyrianApp: - def onLoad[F[_] : Async](appDirectory: (String, TyrianAppF[F, _, _])*): Unit = + def onLoad(appDirectory: (String, TyrianAppF[IO, _, _])*): Unit = TyrianAppF.onLoad(appDirectory: _*) - def launch[F[_] : Async](appDirectory: (String, TyrianAppF[F, _, _])*): Unit = - TyrianAppF.launch(appDirectory: _*) + def launch(appDirectory: Map[String, TyrianAppF[IO, _, _]]): Unit = + TyrianAppF.launch(appDirectory) diff --git a/tyrian-zio/src/main/scala/tyrian/TyrianApp.scala b/tyrian-zio/src/main/scala/tyrian/TyrianApp.scala index be2042be..c2fcfe57 100644 --- a/tyrian-zio/src/main/scala/tyrian/TyrianApp.scala +++ b/tyrian-zio/src/main/scala/tyrian/TyrianApp.scala @@ -23,8 +23,8 @@ trait TyrianApp[Msg, Model](using Async[Task]) extends TyrianAppF[Task, Msg, Mod } object TyrianApp: - def onLoad[F[_] : Async](appDirectory: (String, TyrianAppF[F, _, _])*): Unit = + def onLoad(appDirectory: (String, TyrianAppF[Task, _, _])*)(using Async[Task]): Unit = TyrianAppF.onLoad(appDirectory: _*) - def launch[F[_] : Async](appDirectory: (String, TyrianAppF[F, _, _])*): Unit = - TyrianAppF.launch(appDirectory: _*) + def launch(appDirectory: Map[String, TyrianAppF[Task, _, _]])(using Async[Task]): Unit = + TyrianAppF.launch(appDirectory) diff --git a/tyrian/js/src/main/scala/tyrian/TyrianAppF.scala b/tyrian/js/src/main/scala/tyrian/TyrianAppF.scala index e5e66c68..e32f1aee 100644 --- a/tyrian/js/src/main/scala/tyrian/TyrianAppF.scala +++ b/tyrian/js/src/main/scala/tyrian/TyrianAppF.scala @@ -134,7 +134,7 @@ trait TyrianAppF[F[_]: Async, Msg, Model]: object TyrianAppF: /** Launch app instances after DOMContentLoaded. */ - def onLoad[F[_] : Async](appDirectory: (String, TyrianAppF[F, _, _])*): Unit = + def onLoad[F[_] : Async](appDirectory: Map[String, TyrianAppF[F, _, _]]): Unit = val documentReady = new Promise((resolve, _reject) => { document.addEventListener("DOMContentLoaded", _ => { resolve(()) @@ -144,13 +144,15 @@ object TyrianAppF: } }) documentReady.`then`(_ => { - launch[F](appDirectory: _*) + launch[F](appDirectory) }) + def onLoad[F[_] : Async](appDirectory: (String, TyrianAppF[F, _, _])*): Unit = + onLoad(appDirectory.toMap) + /** Find data-tyrian-app HTMLElements and launch corresponding TyrianAppF instances */ - def launch[F[_] : Async](appDirectory: (String, TyrianAppF[F, _, _])*): Unit = - val appMap = appDirectory.toMap + def launch[F[_] : Async](appDirectory: Map[String, TyrianAppF[F, _, _]]): Unit = for { element <- document.querySelectorAll("[data-tyrian-app]") } yield { @@ -158,7 +160,7 @@ object TyrianAppF: val tyrianAppName = tyrianAppElement.dataset.get("tyrianApp") val appSupplierOption = for { appName <- tyrianAppName - appSupplier <- appMap.get(appName) + appSupplier <- appDirectory.get(appName) } yield appSupplier appSupplierOption match case Some(appSupplier) => @@ -170,7 +172,7 @@ object TyrianAppF: private def appElementFlags(tyrianAppElement: HTMLElement): Map[String,String] = val appFlags = for { (dataAttr, attrValue) <- tyrianAppElement.dataset - if dataAttr.startsWith("tyrianAppFlag") - flagName = dataAttr.replaceFirst("^tyrianAppFlag", "") + if dataAttr.startsWith("tyrianFlag") + flagName = dataAttr.replaceFirst("^tyrianFlag", "") } yield (flagName, attrValue) appFlags.toMap \ No newline at end of file