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
|
module Update
( routerConfig
, update
) where
import Task
import Effects exposing (Effects)
import TransitRouter
import RouteParser
import Route exposing (Route)
import Server
import Action exposing (..)
import Model exposing (Model)
import Model.Translations exposing (getMessage)
import Model.View as V
import LoggedIn.Model as LoggedInModel
import LoggedIn.Action as LoggedInAction
import LoggedIn.Update as LoggedInUpdate
import SignIn.Model as SignInModel
import SignIn.Action as SignInAction
import SignIn.Update as SignInUpdate
import Utils.Http exposing (errorKey)
routerConfig : TransitRouter.Config Route Action Model
routerConfig =
{ mountRoute = \_ _ model -> (model, Effects.none)
, getDurations = \_ _ _ -> (50, 200)
, actionWrapper = RouterAction
, routeDecoder = Maybe.withDefault Route.Home << RouteParser.match Route.matchers
}
update : Action -> Model -> (Model, Effects Action)
update action model =
case action of
NoOp ->
(model, Effects.none)
SignIn email ->
( applySignIn model (SignInAction.WaitingServer)
, Server.signIn email
|> Task.map (always (UpdateSignIn SignInAction.ValidLogin))
|> flip Task.onError (\error ->
Task.succeed (UpdateSignIn (SignInAction.ErrorLogin (errorKey error)))
)
|> Effects.task
)
GoLoggedInView init ->
( { model | view = V.LoggedInView (LoggedInModel.init init) }
, Effects.none
)
UpdateTime time ->
({ model | currentTime = time }, Effects.none)
GoSignInView ->
({ model | view = V.SignInView (SignInModel.init Nothing) }, Effects.none)
UpdateSignIn signInAction ->
(applySignIn model signInAction, Effects.none)
UpdateLoggedIn loggedInAction ->
applyLoggedIn model loggedInAction
RouterAction routeAction ->
TransitRouter.update
routerConfig
routeAction
model
SignOut ->
( model
, Server.signOut
|> Task.map (always GoSignInView)
|> flip Task.onError (always <| Task.succeed NoOp)
|> Effects.task
)
applySignIn : Model -> SignInAction.Action -> Model
applySignIn model signInAction =
case model.view of
V.SignInView signInView ->
{ model | view = V.SignInView (SignInUpdate.update model.translations signInAction signInView) }
_ ->
model
applyLoggedIn : Model -> LoggedInAction.Action -> (Model, Effects Action)
applyLoggedIn model loggedInAction =
case model.view of
V.LoggedInView loggedInView ->
let (loggedInView, effects) = LoggedInUpdate.update model loggedInAction loggedInView
in ( { model | view = V.LoggedInView loggedInView }
, Effects.map UpdateLoggedIn effects
)
_ ->
(model, Effects.none)
|