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
|