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
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
|
module Update exposing
( update
, urlUpdate
)
import Task
import Platform.Cmd exposing (Cmd)
import Navigation
import Page exposing (Page)
import Server
import Msg exposing (..)
import Model exposing (Model)
import Model.Translations exposing (getMessage)
import Model.View as V
import LoggedIn.Model as LoggedInModel
import LoggedIn.Msg as LoggedInMsg
import LoggedIn.Update as LoggedInUpdate
import SignIn.Model as SignInModel
import SignIn.Msg as SignInMsg
import SignIn.Update as SignInUpdate
import Dialog
import Dialog.Update as DialogUpdate
import Tooltip
import Utils.Http exposing (errorKey)
import Utils.Cmd exposing ((:>))
import Utils.Tuple as Tuple
update : Msg -> Model -> (Model, Cmd Msg)
update msg model =
case msg of
NoOp ->
(model, Cmd.none)
SignIn email ->
( applySignIn model (SignInMsg.WaitingServer)
, Server.signIn email
|> Task.perform
(\error -> UpdateSignIn (SignInMsg.ErrorLogin (errorKey error)))
(\() -> UpdateSignIn SignInMsg.ValidLogin)
)
GoLoggedInView init ->
( { model | view = V.LoggedInView (LoggedInModel.init init) }
, Cmd.none
)
UpdateTime time ->
({ model | currentTime = time }, Cmd.none)
GoSignInView ->
({ model | view = V.SignInView (SignInModel.init Nothing) }, Cmd.none)
UpdateSignIn signInMsg ->
(applySignIn model signInMsg, Cmd.none)
UpdateLoggedIn loggedInMsg ->
applyLoggedIn model loggedInMsg
CreatePayment name cost date frequency ->
( model
, Server.createPayment name cost date frequency
|> Task.perform
(always <| Error "CreatePaymentError")
(\paymentId -> UpdateLoggedIn <| LoggedInMsg.ValidateCreatePayment paymentId name cost date frequency)
)
EditPayment paymentId name cost date frequency ->
( model
, Server.editPayment paymentId name cost date frequency
|> Task.perform
(always <| Error "EditPaymentError")
(always <| UpdateLoggedIn <| LoggedInMsg.ValidateEditPayment paymentId name cost date frequency)
)
DeletePayment paymentId ->
( model
, Server.deletePayment paymentId
|> Task.perform
(always <| Error "DeletePaymentError")
(always <| UpdateLoggedIn <| LoggedInMsg.ValidateDeletePayment paymentId)
)
CreateIncome amount date ->
( model
, Server.createIncome amount date
|> Task.perform
(always <| Error "CreateIncomeError")
(\incomeId -> UpdateLoggedIn <| LoggedInMsg.ValidateCreateIncome incomeId amount date)
)
EditIncome incomeId amount date ->
( model
, Server.editIncome incomeId amount date
|> Task.perform
(always <| Error "EditIncomeError")
(always <| UpdateLoggedIn <| LoggedInMsg.ValidateEditIncome incomeId amount date)
)
DeleteIncome incomeId ->
( model
, Server.deleteIncome incomeId
|> Task.perform
(always <| Error "DeleteIncomeError")
(always <| UpdateLoggedIn <| LoggedInMsg.ValidateDeleteIncome incomeId)
)
SignOut ->
( model
, Server.signOut
|> Task.perform (always <| Error "SignOutError") (always GoSignInView)
)
Error error ->
({ model | errors = model.errors ++ [ error ] }, Cmd.none)
Dialog dialogMsg ->
Dialog.update DialogUpdate.update dialogMsg model.dialog.model model.dialog
|> Tuple.mapFst (\dialog -> { model | dialog = dialog })
:> update (Tooltip Tooltip.HideMessage)
Tooltip tooltipMsg ->
let (newTooltip, command) = Tooltip.update tooltipMsg model.tooltip
in ( { model | tooltip = newTooltip }
, Cmd.map Tooltip command
)
applySignIn : Model -> SignInMsg.Msg -> Model
applySignIn model signInMsg =
case model.view of
V.SignInView signInView ->
{ model | view = V.SignInView (SignInUpdate.update model.translations signInMsg signInView) }
_ ->
model
applyLoggedIn : Model -> LoggedInMsg.Msg -> (Model, Cmd Msg)
applyLoggedIn model loggedInMsg =
case model.view of
V.LoggedInView loggedInView ->
let (loggedInView, cmd) = LoggedInUpdate.update model loggedInMsg loggedInView
in ( { model | view = V.LoggedInView loggedInView }
, Cmd.map UpdateLoggedIn cmd
)
_ ->
(model, Cmd.none)
urlUpdate : Result String Page -> Model -> (Model, Cmd Msg)
urlUpdate result model =
case result of
Err _ ->
(model, Navigation.modifyUrl (Page.toHash model.page))
Ok page ->
({ model | page = page }, Cmd.none)
|