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 8777647..f7d794e 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 @@ -1,5 +1,7 @@ package nova.monadic_sfx.ui.components.router +import scala.concurrent.duration._ + import io.circe.Codec import io.circe.Decoder import io.circe.Encoder @@ -7,15 +9,15 @@ import io.circe.generic.JsonCodec import io.circe.generic.semiauto._ import io.odin.Logger import monix.bio.Task +import monix.eval.Coeval +import monix.reactive.Observable import nova.monadic_sfx.util.IOUtils +import nova.monadic_sfx.util.MutHistory +import nova.monadic_sfx.util.controls.JFXSpinner 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 { @@ -23,6 +25,9 @@ object FXRouter { sealed abstract class Action[+T] final case class Replace[T](page: T) extends Action[T] + final case class HistoryEvent[T](page: T) extends Action[T] + final case object Forward extends Action[Nothing] + final case object Backward extends Action[Nothing] object Action { implicit def codec[T: Encoder: Decoder]: Codec[Action[T]] = deriveCodec @@ -32,7 +37,10 @@ object FXRouter { } -class FXRouter[P]()(implicit E: Encoder[P], D: Decoder[P]) { +class FXRouter[P](history: MutHistory[P])(implicit + E: Encoder[P], + D: Decoder[P] +) { import FXRouter._ def store(initialPage: P, logger: Logger[Task]): Task[FXStore[P]] = @@ -58,7 +66,12 @@ class FXRouter[P]()(implicit E: Encoder[P], D: Decoder[P]) { action match { // case Init => (state, None) case Replace(p) => + history.push(p) + (state.copy(page = p), None) + case HistoryEvent(p) => (state.copy(page = p), None) + case Forward => (state, None) + case Backward => (state, None) } def render(