package nova.monadic_sfx.screens import nova.monadic_sfx.AppTypes import scalafx.scene.control.TextField import scalafx.scene.control._ import scalafx.scene.layout.VBox import scalafx.scene.Node import scalafx.Includes._ import scalafx.scene.Parent import scalafx.application.JFXApp.PrimaryStage import nova.monadic_sfx.http.requests.DummyRequest import monix.eval.Task import monix.execution.Scheduler import cats.effect.Effect import cats.effect.implicits._ import nova.monadic_sfx.util.Action import io.odin.Logger import nova.monadic_sfx.http.Requesters import sttp.client.Response import nova.monadic_sfx.models.HttpBinResponse import sttp.client.ResponseError import nova.monadic_sfx.executors.Schedulers import nova.monadic_sfx.ui.screens.Screen // 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: akka.actor.ActorSystem, requesters: Requesters, 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 scheduler => Task { new VBox { children = Seq( new Label { text = "username" }, new TextField(), new Label { text = "password" }, new TextField(), new Button { text = "Login" 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: akka.actor.ActorSystem // ) = new LoginScreen(appStage, backend, system).render // }