module Page ( Page (..), Action, initialPage, updatePage, viewPage, ) where import Data.Bifunctor import Data.Default import Data.Function import Miso import Page.EditValue qualified as EditValue import Page.ListCollection qualified as ListCollection import Page.NewCollection qualified as NewCollection import Route (Route) import Route qualified as Route data Page = Home | ListCollection ListCollection.Model | EditValue EditValue.Model | NewCollection NewCollection.Model deriving (Show, Eq) data Action = HandleListCollection ListCollection.Action | HandleEditValue EditValue.Action | HandleNewCollection NewCollection.Action deriving (Show, Eq) instance Default Page where def = Home initialPage :: Route -> JSM (Either String Page) initialPage Route.Home = pure (Right Home) initialPage (Route.ListCollection c) = fmap ListCollection <$> ListCollection.initialModel c initialPage (Route.EditValue c f) = fmap EditValue <$> EditValue.initialModel c f initialPage Route.NewCollection = fmap NewCollection <$> NewCollection.initialModel updatePage :: Action -> Page -> Effect Action Page updatePage (HandleListCollection action) (ListCollection m) = ListCollection.updateModel action m & bimap HandleListCollection ListCollection updatePage (HandleListCollection _) p = noEff p updatePage (HandleEditValue action) (EditValue m) = EditValue.updateModel action m & bimap HandleEditValue EditValue updatePage (HandleEditValue _) p = noEff p updatePage (HandleNewCollection action) (NewCollection m) = NewCollection.updateModel action m & bimap HandleNewCollection NewCollection updatePage (HandleNewCollection _) p = noEff p viewPage :: Page -> View Action viewPage Home = text "home" viewPage (ListCollection m) = HandleListCollection <$> ListCollection.viewModel m viewPage (EditValue m) = HandleEditValue <$> EditValue.viewModel m viewPage (NewCollection m) = HandleNewCollection <$> NewCollection.viewModel m