diff --git a/src/main/scala/nova/monadic_sfx/ui/components/router/FXRouter.scala b/src/main/scala/nova/monadic_sfx/ui/components/router/FXRouter.scala index 247a253..8777647 100644 --- a/src/main/scala/nova/monadic_sfx/ui/components/router/FXRouter.scala +++ b/src/main/scala/nova/monadic_sfx/ui/components/router/FXRouter.scala @@ -12,14 +12,17 @@ import nova.monadic_sfx.util.reactive.store.Middlewares import nova.monadic_sfx.util.reactive.store.Reducer import nova.monadic_sfx.util.reactive.store.Store import scalafx.scene.Parent +import monix.reactive.Observable +import nova.monadic_sfx.util.controls.JFXSpinner +import scala.concurrent.duration._ +import monix.eval.Coeval object FXRouter { final case class State[P](page: P) - // @JsonCodec sealed abstract class Action[+T] - final case class Replace[T](p: T) extends Action[T] + final case class Replace[T](page: T) extends Action[T] object Action { implicit def codec[T: Encoder: Decoder]: Codec[Action[T]] = deriveCodec @@ -29,8 +32,7 @@ object FXRouter { } -class FXRouter[P]( -)(implicit E: Encoder[P], D: Decoder[P]) { +class FXRouter[P]()(implicit E: Encoder[P], D: Decoder[P]) { import FXRouter._ def store(initialPage: P, logger: Logger[Task]): Task[FXStore[P]] = @@ -60,9 +62,26 @@ class FXRouter[P]( } def render( - resolver: P => Task[Parent] + resolver: P => Task[Parent], + transitionDelay: FiniteDuration = 500.millis )(implicit store: FXStore[P]) = - store.mapEval { case (_, FXRouter.State(p)) => IOUtils.toTask(resolver(p)) } + store + .flatMap { + case (_, FXRouter.State(p)) => + Observable.from(Coeval(new JFXSpinner)) ++ Observable.from( + IOUtils.toTask( + Task + .racePair( + Task.sleep(transitionDelay), + resolver(p) + ) + .flatMap { + case Left(_ -> fib) => fib.join + case Right(fib -> res) => fib.join >> Task.pure(res) + } + ) + ) + } def link( page: P,