aboutsummaryrefslogtreecommitdiff
path: root/client/src/View/Income/Income.hs
blob: 7be809122d2a5eb7bde6323c2a70b28683cf6ad3 (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
{-# LANGUAGE ExplicitForAll #-}

module View.Income.Income
  ( view
  , In(..)
  ) where

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

import           Common.Model        (Currency, Income (..), IncomePage (..),
                                      User, UserId)

import qualified Component.Pages     as Pages
import           Loadable            (Loadable (..))
import qualified Loadable
import qualified Util.Ajax           as AjaxUtil
import qualified Util.Reflex         as ReflexUtil
import qualified Util.Reflex         as ReflexUtil
import qualified View.Income.Header  as Header
import qualified View.Income.Reducer as Reducer
import qualified View.Income.Table   as Table

data In t = In
  { _in_users       :: [User]
  , _in_currentUser :: UserId
  , _in_currency    :: Currency
  }

view :: forall t m. MonadWidget t m => In t -> m ()
view input = do
  rec
    incomePage <- Reducer.reducer $ Reducer.In
      { Reducer._in_page         = page
      , Reducer._in_addIncome    = R.leftmost [headerAddIncome, tableAddIncome]
      , Reducer._in_editIncome   = editIncome
      , Reducer._in_deleteIncome = deleteIncome
      }

    let eventFromResult :: forall a. ((Header.Out t, Table.Out t, Pages.Out t) -> Event t a) -> m (Event t a)
        eventFromResult op = ReflexUtil.flatten . fmap (Maybe.fromMaybe R.never . fmap op) $ result

    page <- eventFromResult $ Pages._out_newPage . (\(_, _, c) -> c)
    headerAddIncome <- eventFromResult $ Header._out_add . (\(a, _, _) -> a)
    tableAddIncome <- eventFromResult $ Table._out_add . (\(_, b, _) -> b)
    editIncome <- eventFromResult $ Table._out_edit . (\(_, b, _) -> b)
    deleteIncome <- eventFromResult $ Table._out_delete . (\(_, b, _) -> b)

    result <- Loadable.viewShowValueWhileLoading incomePage $
      \(IncomePage page header incomes count) -> do
        header <- Header.view $ Header.In
          { Header._in_users = _in_users input
          , Header._in_header = header
          , Header._in_currency = _in_currency input
          }

        table <- Table.view $ Table.In
          { Table._in_currentUser = _in_currentUser input
          , Table._in_currency = _in_currency input
          , Table._in_incomes = incomes
          , Table._in_users = _in_users input
          }

        pages <- Pages.view $ Pages.In
          { Pages._in_total = R.constDyn count
          , Pages._in_perPage = Reducer.perPage
          , Pages._in_page = page
          }

        return (header, table, pages)

  return ()