Skip to content

Commit

Permalink
PurpleKingdomGames#198 : Change TyrianAppF to take both varargs and M…
Browse files Browse the repository at this point in the history
…ap. Update flag data-attr to data-tyrian-flag. Fixed the types to IO and ZIO in tyrian-io and tyrian-zio.
  • Loading branch information
stevechy committed May 17, 2023
1 parent 48fed4a commit 55cfde7
Show file tree
Hide file tree
Showing 6 changed files with 23 additions and 21 deletions.
4 changes: 2 additions & 2 deletions examples/main-launcher/index.html
Original file line number Diff line number Diff line change
Expand Up @@ -9,8 +9,8 @@

<body>
<h1>Main launcher example</h1>
<div data-tyrian-app="CounterApp" data-tyrian-app-flag-initial-counter="42"></div>
<div data-tyrian-app="ChatApp" data-tyrian-app-flag-initial-message="Hello"></div>
<div data-tyrian-app="CounterApp" data-tyrian-flag-initial-counter="42"></div>
<div data-tyrian-app="ChatApp" data-tyrian-flag-initial-message="Hello"></div>
</body>

</html>
6 changes: 3 additions & 3 deletions examples/main-launcher/src/main/scala/example/ChatApp.scala
Original file line number Diff line number Diff line change
Expand Up @@ -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(
Expand All @@ -29,15 +29,15 @@ object ChatApp extends TyrianApp[ChatAppMsg, ChatAppModel]:
)

def router: Location => ChatAppMsg =
_ => NavigateTo()
_ => NoOp()

def subscriptions(model: ChatAppModel): Sub[IO, ChatAppMsg] =
Sub.None

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

Original file line number Diff line number Diff line change
Expand Up @@ -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(
Expand All @@ -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
Expand All @@ -43,4 +43,4 @@ object Model:
def -(other: Int): Model = i - other

enum Msg:
case Increment, Decrement, NavigateTo
case Increment, Decrement, NoOp
6 changes: 3 additions & 3 deletions tyrian-io/src/main/scala/tyrian/TyrianApp.scala
Original file line number Diff line number Diff line change
Expand Up @@ -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)
6 changes: 3 additions & 3 deletions tyrian-zio/src/main/scala/tyrian/TyrianApp.scala
Original file line number Diff line number Diff line change
Expand Up @@ -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)
16 changes: 9 additions & 7 deletions tyrian/js/src/main/scala/tyrian/TyrianAppF.scala
Original file line number Diff line number Diff line change
Expand Up @@ -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(())
Expand All @@ -144,21 +144,23 @@ 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 {
val tyrianAppElement = element.asInstanceOf[HTMLElement]
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) =>
Expand All @@ -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

0 comments on commit 55cfde7

Please sign in to comment.