module Page ( Page (..), Action, initialPage, updatePage, viewPage, ) where import Control.Monad.Catch (SomeException) import Data.Bifunctor import Data.Default import Data.Function import Effect (Eff) 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) newtype Action = Action (Page -> (Effect Action Page, [Eff])) instance Default Page where def = Home initialPage :: Route -> JSM (Either SomeException 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 update__handleListCollection :: ListCollection.Action -> Action update__handleListCollection action = Action $ \case ListCollection m -> ListCollection.updateModel action m & first (bimap update__handleListCollection ListCollection) p -> (noEff p, []) update__handleEditValue :: EditValue.Action -> Action update__handleEditValue action = Action $ \case EditValue m -> EditValue.updateModel action m & first (bimap update__handleEditValue EditValue) p -> (noEff p, []) update__handleNewCollection :: NewCollection.Action -> Action update__handleNewCollection action = Action $ \case NewCollection m -> NewCollection.updateModel action m & first (bimap update__handleNewCollection NewCollection) p -> (noEff p, []) updatePage :: Action -> Page -> (Effect Action Page, [Eff]) updatePage (Action f) m = f m viewPage :: Page -> View Action viewPage Home = text "home" viewPage (ListCollection m) = update__handleListCollection <$> ListCollection.viewModel m viewPage (EditValue m) = update__handleEditValue <$> EditValue.viewModel m viewPage (NewCollection m) = update__handleNewCollection <$> NewCollection.viewModel m