aboutsummaryrefslogtreecommitdiff
path: root/client/src/View/Category/Reducer.hs
blob: 5ad0ddb0b209fca28440d725cc4d9e23f8bff912 (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
module View.Category.Reducer
  ( perPage
  , reducer
  , In(..)
  ) where

import           Data.Text    (Text)
import qualified Data.Text    as T
import           Reflex.Dom   (Dynamic, Event, MonadWidget)
import qualified Reflex.Dom   as R

import           Common.Model (CategoryPage)

import           Loadable     (Loadable (..))
import qualified Loadable     as Loadable
import qualified Util.Ajax    as AjaxUtil
import qualified Util.Either  as EitherUtil

perPage :: Int
perPage = 7

data In t a b c = In
  { _in_page           :: Event t Int
  , _in_addCategory    :: Event t a
  , _in_editCategory   :: Event t b
  , _in_deleteCategory :: Event t c
  }

reducer :: forall t m a b c. MonadWidget t m => In t a b c -> m (Dynamic t (Loadable CategoryPage))
reducer input = do

  postBuild <- R.getPostBuild

  currentPage <- R.holdDyn 1 (_in_page input)

  let loadPage =
        R.leftmost
          [ 1 <$ postBuild
          , _in_page input
          , 1 <$ _in_addCategory input
          , R.tag (R.current currentPage) (_in_editCategory input)
          , R.tag (R.current currentPage) (_in_deleteCategory input)
          ]

  getResult <- AjaxUtil.get $ fmap pageUrl loadPage

  R.holdDyn
    Loading
    (R.leftmost
      [ Loading <$ loadPage
      , Loadable.fromEither <$> getResult
      ])

  where
    pageUrl p =
      "api/categories?page="
      <> (T.pack . show $ p)
      <> "&perPage="
      <> (T.pack . show $ perPage)