aboutsummaryrefslogtreecommitdiff
path: root/src/client/elm/Update.elm
blob: 5c89d0a91fb46b706ad977847ffbf88a08d8b88d (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
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)