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.

108 lines
2.9 KiB

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