You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

72 lines
2.2 KiB

  1. package outwatchapp
  2. import scala.concurrent.duration._
  3. import colibri.ext.monix._
  4. import com.softwaremill.macwire._
  5. import io.odin.consoleLogger
  6. import monix.bio.Task
  7. import monix.eval.Coeval
  8. import monix.reactive.Observable
  9. import org.scalajs.dom.raw.Element
  10. import outwatch._
  11. import outwatch.dsl._
  12. import outwatch.router._
  13. import outwatchapp.components.CounterDemo
  14. import outwatchapp.components.RequestDemo
  15. import outwatchapp.components.todo.ChartjsDemo
  16. import outwatchapp.components.todo.FusejsDemo
  17. import outwatchapp.pages.HomePage
  18. import outwatchapp.ui.components.todo.TodoListStore
  19. import outwatchapp.util.reactive.WebWorker
  20. import outwatchapp.util.reactive.WorkerData
  21. class MainApp(el: Element)(implicit
  22. backend: AppTypes.Backend,
  23. store: RouterStore[Page]
  24. ) {
  25. def run: Task[Unit] = for {
  26. resolver <- resolver
  27. _ <- OutWatch.renderInto[Task](el, Router(resolver))
  28. } yield ()
  29. def resolver: Task[PartialFunction[Page, VDomModifier]] =
  30. Task.deferAction(implicit s =>
  31. for {
  32. counterDemo <- CounterDemo()
  33. chartDemo <- ChartjsDemo()
  34. todoStore <- TodoListStore(consoleLogger[Task]())
  35. requestDemo <- RequestDemo(todoStore)
  36. demoWorker <- WebWorker[WorkerData]("/worker.js")
  37. } yield {
  38. case Page.Home => wire[HomePage].render
  39. case Page.SomePage =>
  40. div(
  41. div(cls := "title", "SomePage"),
  42. // RequestDemo(todoStore),
  43. Observable
  44. .interval(1.second)
  45. .doOnNextF(i => Coeval(println(s"Producer emitted $i")))
  46. .doOnNextF(i =>
  47. Coeval(demoWorker.onNext(WorkerData(i))) >> Coeval.unit
  48. )
  49. .map(_ => div()),
  50. demoWorker.map(_.toString).map(v => p(cls := "text-white", v)),
  51. requestDemo,
  52. div(cls := "slider")
  53. )
  54. case Page.UserHome(id) =>
  55. div(
  56. cls := "text-white",
  57. div(cls := "title", "UserHome"),
  58. s"User id: $id",
  59. div(FusejsDemo.y.map(_.item.toString).mkString(" "))
  60. )
  61. case Page.NotFound =>
  62. div(
  63. div(cls := "title", "NotFound"),
  64. p(cls := "text-white", "notfound")
  65. )
  66. }
  67. )
  68. }