aboutsummaryrefslogtreecommitdiff
path: root/src/client/elm/Update.elm
blob: adb90ab4295f49bfb26972a73b3611bdeb5a190e (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
module Update
  ( update
  ) where

import Task

import Effects exposing (Effects)

import Server

import Model exposing (Model)
import Model.Translations exposing (getMessage)
import Model.Action exposing (..)
import Model.Action.SignInAction as SignInAction exposing (SignInAction)
import Model.Action.LoggedInAction exposing (LoggedInAction)
import Model.View as V
import Model.View.SignInView exposing (..)
import Model.View.LoggedInView exposing (..)

import Update.LoggedIn exposing (updateLoggedIn)
import Update.SignIn exposing (updateSignIn)

import Utils.Http exposing (errorKey)

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 ->
               let errorMessage = getMessage (errorKey error) model.translations
               in  Task.succeed (UpdateSignIn (SignInAction.ErrorLogin errorMessage))
             )
          |> Effects.task
      )

    GoLoggedInView init ->
      ( { model | view = V.LoggedInView (initLoggedInView init) }
      , Effects.none
      )

    UpdateTime time ->
      ({ model | currentTime = time }, Effects.none)

    GoSignInView ->
      ({ model | view = V.SignInView initSignInView }, Effects.none)

    UpdateSignIn signInAction ->
      (applySignIn model signInAction, Effects.none)

    UpdateLoggedIn loggedInAction ->
      applyLoggedIn model loggedInAction

    SignOut ->
      ( model
      , Server.signOut
          |> Task.map (always GoSignInView)
          |> flip Task.onError (always <| Task.succeed NoOp)
          |> Effects.task
      )

applySignIn : Model -> SignInAction -> Model
applySignIn model signInAction =
  case model.view of
    V.SignInView signInView ->
      { model | view = V.SignInView (updateSignIn model.translations signInAction signInView) }
    _ ->
      model

applyLoggedIn : Model -> LoggedInAction -> (Model, Effects Action)
applyLoggedIn model loggedInAction =
  case model.view of
    V.LoggedInView loggedInView ->
      let (loggedInView, effects) = updateLoggedIn model loggedInAction loggedInView
      in  ( { model | view = V.LoggedInView loggedInView }
          , Effects.map UpdateLoggedIn effects
          )
    _ ->
      (model, Effects.none)