aboutsummaryrefslogtreecommitdiff
path: root/src/Update.elm
blob: 42eb68232b16460bd7e511d63b9f86091bd176a7 (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
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
module Update exposing
  ( update
  )

import Dict

import Msg exposing (Msg)

import Ring

import Model exposing (Model)
import Model.Id exposing (..)
import Model.IdGenerator exposing (..)
import Model.Keyboard exposing (KeyCode)

import Timer.Model as Timer exposing (..)
import Timer.Model.State as TimerState
import Timer.Update exposing (..)
import Timer.Msg as Timer

import Edition.Model exposing (..)
import Edition.Model.Name exposing (..)
import Edition.Model.Time exposing (..)
import Edition.Update exposing (..)
import Edition.Msg as Edition

import Utils.Maybe exposing (..)

update : Msg -> Model -> (Model, Cmd Msg)
update msg model =
  case msg of

    Msg.NoOp ->
      (model, Cmd.none)

    Msg.Initialize ->
      Model.init model.time

    Msg.AddNewTimer ->
      let (id, newTimerIdGenerator) = getId model.timerIdGenerator
      in  ( { model
            | timers = Dict.insert id (Timer.init model.time) model.timers
            , timerIdGenerator = newTimerIdGenerator
            }
          , Cmd.none
          )

    Msg.Time time ->
      let delta = time - model.time
          newModel =
            { model
            | time = time
            , timers = Dict.map (\id timer -> updateTimer (Timer.SubstractTime delta) timer) model.timers
            }
          ringing =
            newModel.timers
              |> Dict.values
              |> List.map .state
              |> List.member TimerState.Ringing
      in  ( newModel
          , Ring.ring ringing
          )

    Msg.UpdateTimer id timerMsg ->
      let maybeEdition = filterMaybe (\edition -> edition.id == id) model.edition
          newModel =
            case maybeEdition of
              Just edition ->
                if edition.kind == Time then validEdition model else model
              Nothing ->
                model
      in  ( { newModel | timers = Dict.update id (Maybe.map (updateTimer timerMsg)) newModel.timers }
          , Cmd.none
          )

    Msg.RemoveTimer id ->
      if Model.numberOfTimers model > 1
        then
          ( { model | timers = Dict.remove id model.timers }
          , Cmd.none
          )
        else
          (model, Cmd.none)

    Msg.Edit id kind ->
      ( { model
        | edition = Just (newEdition id kind)
        , timers =
            if kind == Time
              then Dict.update id (Maybe.map (updateTimer Timer.Pause)) model.timers
              else model.timers
        }
      , Cmd.none
      )

    Msg.ClickAway ->
      ( { model | edition = Nothing }
      , Cmd.none
      )

    Msg.KeyPressed keyCode ->
      if isEnterKeyCode keyCode
        then
          (validEdition model, Cmd.none)
        else
          let editionAction =
            if isRemoveKeyCode keyCode
              then Edition.DeleteLast
              else Edition.AddChar keyCode
          in  ( { model | edition = Maybe.map (updateEdition editionAction) model.edition }
              , Cmd.none
              )

validEdition : Model -> Model
validEdition model =
  case model.edition of
    Just edition ->
      if isEmpty edition
        then
          { model
          | edition = Nothing
          }
        else
          let timerMsg =
            case edition.kind of
              Name ->
                Timer.Rename (renderNameEdition edition.chars)
              Time ->
                Timer.SetTime (toTime edition.chars)
          in  { model
              | timers = Dict.update edition.id (Maybe.map (updateTimer timerMsg)) model.timers
              , edition = Nothing
              }
    Nothing ->
      model

isEnterKeyCode : KeyCode -> Bool
isEnterKeyCode = (==) 13

isRemoveKeyCode : KeyCode -> Bool
isRemoveKeyCode = (==) 8