package nova.monadic_sfx.screens import akka.actor.typed._ import io.odin.Logger import monix.eval.Task import nova.monadic_sfx.AppTypes import nova.monadic_sfx.executors.Schedulers import nova.monadic_sfx.http.Requesters import nova.monadic_sfx.http.requests.DummyRequest import nova.monadic_sfx.ui.screens.Screen import nova.monadic_sfx.util.Action import scalafx.Includes._ import scalafx.application.JFXApp.PrimaryStage import scalafx.scene.Parent import scalafx.scene.control.TextField import scalafx.scene.control._ import scalafx.scene.layout.VBox // import io.odin.syntax._ // import _root_.monix.eval.Task // import io.odin.monix._ // import javafx.beans.property.ObjectProperty // import javafx.event.{ActionEvent, EventHandler} class LoginScreen( override protected val appStage: PrimaryStage, logger: Logger[Task], backend: AppTypes.HttpBackend, system: ActorSystem[SpawnProtocol.Command], requesters: Requesters, // dm: DummyRequest, schedulers: Schedulers ) extends Screen { val dummyRequester: DummyRequest = requesters.dummyRequester //pure function callbacks, but with side effects still // lazy val hs = { // import com.softwaremill.macwire._ // lazy val action = () => onLogout(appStage) // wire[HomeScreen] // } private def onLogout(stage: PrimaryStage) = for { _ <- logger.info("Logging out") root <- render _ <- changeRootL(root) } yield () private def onLogin(stage: PrimaryStage) = for { _ <- logger.info("Logging in") homeScreen <- HomeScreen( backend, system, () => onLogout(appStage) ) _ <- Task { stage.scene().setRoot(homeScreen) } } yield () private lazy val root = Task.deferAction(implicit s => Task { new VBox { children = Seq( new Label { text = "username" }, new TextField(), new Label { text = "password" }, new TextField(), new Button { text = "Login" // onAction.--> onAction = () => Action.asyncT { Task .parSequence( List( testRequest, // .executeOn(Scheduler.global) onLogin(appStage) ) ) } } ) } } ) def render: Task[Parent] = root val testRequest = for { res <- dummyRequester.send _ <- logger.info(res.body.toString()) } yield () } // object LoginScreen { // def apply( // appStage: PrimaryStage, // backend: AppTypes.HttpBackend, // system: ActorSystem[SpawnProtocol.Command] // ) = new LoginScreen(appStage, backend, system).render // }