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 import Effect (Eff) 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, [Eff]) updatePage (HandleListCollection action) (ListCollection m) = ListCollection.updateModel action m & first (bimap HandleListCollection ListCollection) updatePage (HandleListCollection _) p = (noEff p, []) updatePage (HandleEditValue action) (EditValue m) = EditValue.updateModel action m & first (bimap HandleEditValue EditValue) updatePage (HandleEditValue _) p = (noEff p, []) updatePage (HandleNewCollection action) (NewCollection m) = NewCollection.updateModel action m & first (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