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

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
// }