aboutsummaryrefslogtreecommitdiffstats
path: root/frontend/app/Page.hs
blob: ed1e44dbdef133d8efa967a2ae26ccd3e821ab13 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
module Page
  ( Page (..),
    Action,
    initialPage,
    updatePage,
    viewPage,
    route,
  )
where

import Collection
import Control.Monad.Catch (SomeException)
import Data.Bifunctor
import Data.Default
import Data.Function
import Effect (Eff)
import Miso hiding (route)
import Miso.String (MisoString, fromMisoString)
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 MisoString ListCollection.Model
  | EditValue MisoString MisoString 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 c) <$> ListCollection.initialModel (Collection (fromMisoString c))
initialPage (Route.EditValue c f) =
  fmap (EditValue c f) <$> EditValue.initialModel (CollectionItem (Collection (fromMisoString c)) (fromMisoString f))
initialPage Route.NewCollection =
  fmap NewCollection <$> NewCollection.initialModel

route :: Page -> Route
route Home = Route.Home
route (ListCollection c _) = Route.ListCollection c
route (EditValue c f _) = Route.EditValue c f
route (NewCollection _) = Route.NewCollection

update__handleListCollection :: ListCollection.Action -> Action
update__handleListCollection action = Action $ \case
  ListCollection c m ->
    ListCollection.updateModel action m
      & first (bimap update__handleListCollection (ListCollection c))
  p -> (noEff p, [])

update__handleEditValue :: EditValue.Action -> Action
update__handleEditValue action = Action $ \case
  EditValue c f m ->
    EditValue.updateModel action m
      & first (bimap update__handleEditValue (EditValue c f))
  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