aboutsummaryrefslogtreecommitdiff
path: root/src/client/elm/Update/LoggedIn.elm
blob: fe53af786ed4d16e27a1f89671dfdec47713e471 (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
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
module Update.LoggedIn
  ( updateLoggedIn
  ) where

import Date
import Dict

import Effects exposing (Effects)
import Task

import ServerCommunication exposing (sendRequest)

import Model exposing (Model)
import Model.User exposing (UserId)
import Model.Payment exposing (..)
import Model.Action exposing (..)
import Model.Action.LoggedInAction exposing (..)
import Model.Action.AccountAction exposing (..)
import Model.Action.MonthlyAction as Monthly
import Model.Action.AddPaymentAction as AddPayment
import Model.Communication as Communication exposing (Communication)
import Model.View.LoggedInView exposing (..)
import Model.View.LoggedIn.AddPayment exposing (..)

import Update.LoggedIn.AddPayment exposing (updateAddPayment)
import Update.LoggedIn.Monthly exposing (updateMonthly)
import Update.LoggedIn.Account exposing (updateAccount)

updateLoggedIn : Model -> LoggedInAction -> LoggedInView -> (LoggedInView, Effects Action)
updateLoggedIn model action loggedInView =
  case action of

    UpdateAdd addPaymentAction ->
      ( { loggedInView | add = updateAddPayment addPaymentAction loggedInView.add }
      , Effects.none
      )

    UpdatePayments payments ->
      ( { loggedInView | payments = payments }
      , Effects.none
      )

    AddPayment name cost frequency ->
      ( { loggedInView | add = updateAddPayment AddPayment.WaitingServer loggedInView.add }
      , sendRequest (Communication.AddPayment name cost frequency)
          |> flip Task.onError (always <| Task.succeed NoOp)
          |> Effects.task
      )

    ValidateAddPayment paymentId name cost frequency ->
      let newPayment = Payment paymentId (Date.fromTime model.currentTime) name cost loggedInView.account.me
          newAdd = initAddPayment frequency
      in  case frequency of
            Punctual ->
              ( { loggedInView
                | currentPage = 1
                , add = newAdd
                , account = updateAccount (UpdatePayer loggedInView.account.me model.currentTime cost) loggedInView.account
                , payments = newPayment :: loggedInView.payments
                , paymentsCount = loggedInView.paymentsCount + 1
                }
              , Effects.none
              )
            Monthly ->
              ( { loggedInView
                | add = newAdd
                , monthly = updateMonthly (Monthly.AddPayment newPayment) loggedInView.monthly
                }
              , Effects.none
              )

    ToggleEdit id ->
      ( { loggedInView | paymentEdition = if loggedInView.paymentEdition == Just id then Nothing else Just id }
      , Effects.none
      )

    DeletePayment payment frequency ->
      case frequency of
        Monthly ->
          ( { loggedInView
            | monthly = updateMonthly (Monthly.DeletePayment payment) loggedInView.monthly
            }
          , Effects.none
          )
        Punctual ->
          ( { loggedInView
            | account = updateAccount (UpdatePayer payment.userId (Date.toTime payment.creation) -payment.cost) loggedInView.account
            , payments = deletePayment payment.id loggedInView.payments
            , paymentsCount = loggedInView.paymentsCount - 1
            }
          , Effects.none
          )

    UpdatePage page ->
      ( { loggedInView | currentPage = page }
      , Effects.none
      )

    UpdateMonthly monthlyAction ->
      ( { loggedInView | monthly = updateMonthly monthlyAction loggedInView.monthly }
      , Effects.none
      )

    UpdateAccount accountAction ->
      ( { loggedInView | account = updateAccount accountAction loggedInView.account }
      , Effects.none
      )