aboutsummaryrefslogtreecommitdiff
path: root/client/src/View/Payment/Clone.hs
blob: 5624f6c4173b0f445937a435a4505a9de247f1d6 (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
module View.Payment.Clone
  ( Input(..)
  , view
  ) where

import qualified Control.Monad             as Monad
import           Control.Monad.IO.Class    (liftIO)
import qualified Data.Text                 as T
import qualified Data.Time.Clock           as Time
import           Reflex.Dom                (Dynamic, Event, MonadWidget)
import qualified Reflex.Dom                as R

import           Common.Model              (Category (..), CategoryId,
                                            CreatePayment (..), Frequency (..),
                                            Payment (..), PaymentCategory (..),
                                            SavedPayment (..))
import qualified Common.Msg                as Msg
import qualified Common.Util.Time          as TimeUtil
import qualified Common.Validation.Payment as PaymentValidation
import qualified Component.Modal           as Modal
import qualified Util.Reflex               as ReflexUtil
import qualified View.Payment.Form         as Form

data Input t = Input
  { _input_show              :: Event t ()
  , _input_categories        :: [Category]
  , _input_paymentCategories :: Dynamic t [PaymentCategory]
  , _input_payment           :: Dynamic t Payment
  , _input_category          :: Dynamic t CategoryId
  }

view :: forall t m. MonadWidget t m => Input t -> Modal.Content t m SavedPayment
view input cancel = do

  currentDay <- liftIO $ Time.getCurrentTime >>= TimeUtil.timeToDay

  formOutput <- R.dyn $ do
    paymentCategories <- _input_paymentCategories input
    payment <- _input_payment input
    category <- _input_category input
    return . Form.view $ Form.Input
      { Form._input_cancel = cancel
      , Form._input_headerLabel = Msg.get Msg.Payment_CloneLong
      , Form._input_categories = _input_categories input
      , Form._input_paymentCategories = paymentCategories
      , Form._input_name = _payment_name payment
      , Form._input_cost = T.pack . show . _payment_cost $ payment
      , Form._input_date = currentDay
      , Form._input_category = category
      , Form._input_frequency = _payment_frequency payment
      , Form._input_mkPayload = CreatePayment
      }

  hide <- ReflexUtil.flatten (Form._output_hide <$> formOutput)
  clonePayment <- ReflexUtil.flatten (Form._output_addPayment <$> formOutput)

  return $
    ( hide
    , clonePayment
    )