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.

104 lines
2.8 KiB

  1. package nova.monadic_sfx.screens
  2. import akka.actor.typed._
  3. import io.odin.Logger
  4. import monix.eval.Task
  5. import nova.monadic_sfx.AppTypes
  6. import nova.monadic_sfx.executors.Schedulers
  7. import nova.monadic_sfx.http.Requesters
  8. import nova.monadic_sfx.http.requests.DummyRequest
  9. import nova.monadic_sfx.ui.screens.Screen
  10. import nova.monadic_sfx.util.Action
  11. import scalafx.Includes._
  12. import scalafx.application.JFXApp.PrimaryStage
  13. import scalafx.scene.Parent
  14. import scalafx.scene.control.TextField
  15. import scalafx.scene.control._
  16. import scalafx.scene.layout.VBox
  17. // import io.odin.syntax._
  18. // import _root_.monix.eval.Task
  19. // import io.odin.monix._
  20. // import javafx.beans.property.ObjectProperty
  21. // import javafx.event.{ActionEvent, EventHandler}
  22. class LoginScreen(
  23. override protected val appStage: PrimaryStage,
  24. logger: Logger[Task],
  25. backend: AppTypes.HttpBackend,
  26. system: ActorSystem[SpawnProtocol.Command],
  27. requesters: Requesters,
  28. // dm: DummyRequest,
  29. schedulers: Schedulers
  30. ) extends Screen {
  31. val dummyRequester: DummyRequest = requesters.dummyRequester
  32. //pure function callbacks, but with side effects still
  33. // lazy val hs = {
  34. // import com.softwaremill.macwire._
  35. // lazy val action = () => onLogout(appStage)
  36. // wire[HomeScreen]
  37. // }
  38. private def onLogout(stage: PrimaryStage) =
  39. for {
  40. _ <- logger.info("Logging out")
  41. root <- render
  42. _ <- changeRootL(root)
  43. } yield ()
  44. private def onLogin(stage: PrimaryStage) =
  45. for {
  46. _ <- logger.info("Logging in")
  47. homeScreen <- HomeScreen(
  48. backend,
  49. system,
  50. () => onLogout(appStage)
  51. )
  52. _ <- Task { stage.scene().setRoot(homeScreen) }
  53. } yield ()
  54. private lazy val root = Task.deferAction(implicit s =>
  55. Task {
  56. new VBox {
  57. children = Seq(
  58. new Label {
  59. text = "username"
  60. },
  61. new TextField(),
  62. new Label {
  63. text = "password"
  64. },
  65. new TextField(),
  66. new Button {
  67. text = "Login"
  68. // onAction.-->
  69. onAction = () =>
  70. Action.asyncT {
  71. Task
  72. .parSequence(
  73. List(
  74. testRequest,
  75. // .executeOn(Scheduler.global)
  76. onLogin(appStage)
  77. )
  78. )
  79. }
  80. }
  81. )
  82. }
  83. }
  84. )
  85. def render: Task[Parent] = root
  86. val testRequest = for {
  87. res <- dummyRequester.send
  88. _ <- logger.info(res.body.toString())
  89. } yield ()
  90. }
  91. // object LoginScreen {
  92. // def apply(
  93. // appStage: PrimaryStage,
  94. // backend: AppTypes.HttpBackend,
  95. // system: ActorSystem[SpawnProtocol.Command]
  96. // ) = new LoginScreen(appStage, backend, system).render
  97. // }