Skip to content

Commit c880cfb

Browse files
committed
Add the main tab
1 parent 068c8cb commit c880cfb

File tree

10 files changed

+215
-16
lines changed

10 files changed

+215
-16
lines changed

public/index.html

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -39,6 +39,11 @@
3939
alarm.pause();
4040
alarm.src = '';
4141
break;
42+
case 'CopyInPasteBin':
43+
navigator.clipboard
44+
.writeText(command.value)
45+
.finally(() => app.ports.events.send({name: 'Copied', value: ""}))
46+
break;
4247
}
4348
});
4449
alarm.addEventListener("ended", () => {

src/elm/Footer.elm

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
module Footer exposing (..)
2+
3+
import Html exposing (Html, a, footer, i, text)
4+
import Html.Attributes exposing (class, href, id, target)
5+
import Lib.Icons
6+
7+
8+
view : Html msg
9+
view =
10+
footer
11+
[]
12+
[ a
13+
[ href "https://github.com/HadrienMP/mob-time-elm"
14+
, id "git"
15+
, target "blank"
16+
]
17+
[ Lib.Icons.github
18+
, text "Fork me on github!"
19+
]
20+
]

src/elm/Js/Commands.elm

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@ type Command
1111
= SoundAlarm
1212
| SetAlarm Sound.Library.Sound
1313
| StopAlarm
14+
| CopyInPasteBin String
1415

1516

1617
type alias OutCommand =
@@ -23,6 +24,9 @@ send : Command -> Cmd msg
2324
send command =
2425
commands <|
2526
case command of
27+
CopyInPasteBin toCopy ->
28+
OutCommand "CopyInPasteBin" <| Json.Encode.string toCopy
29+
2630
SoundAlarm ->
2731
OutCommand "SoundAlarm" Json.Encode.null
2832

@@ -31,5 +35,3 @@ send command =
3135

3236
StopAlarm ->
3337
OutCommand "StopAlarm" Json.Encode.null
34-
35-

src/elm/Lib/BatchMsg.elm

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
module Lib.BatchMsg exposing (update)
2+
3+
type alias UpdateFunction msg model = msg -> model -> ( model, Cmd msg)
4+
5+
update : List msg -> model -> UpdateFunction msg model -> ( model, Cmd msg)
6+
update msg model updateF =
7+
update_ msg model [] updateF
8+
|> Tuple.mapSecond Cmd.batch
9+
10+
11+
update_ : List msg -> model -> List (Cmd msg) -> UpdateFunction msg model -> ( model, List (Cmd msg) )
12+
update_ msg model commandAcc updateF =
13+
case msg of
14+
first :: other ->
15+
let
16+
( updated, command ) =
17+
updateF first model
18+
in
19+
update_ other updated (command :: commandAcc) updateF
20+
21+
_ ->
22+
( model, commandAcc )

src/elm/Lib/Icons.elm

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,8 +4,13 @@ import Html exposing (i)
44
import Html.Attributes exposing (class)
55
import Ionicon
66
import Ionicon.Android
7+
import Ionicon.Social
78
import Svg exposing (Svg)
89

10+
github : Svg msg
11+
github =
12+
display Ionicon.Social.github
13+
914
info : Svg msg
1015
info =
1116
display Ionicon.informationCircled

src/elm/Lib/Toaster.elm

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,8 +3,10 @@ module Lib.Toaster exposing (..)
33
import Html exposing (Html, div, i, section, span, text)
44
import Html.Attributes exposing (class, id)
55
import Html.Events exposing (onClick)
6+
import Js.EventsMapping as EventsMapping exposing (EventsMapping)
67
import Lib.Delay
78
import Lib.Icons
9+
import Js.Events
810

911

1012

@@ -64,6 +66,16 @@ add toAdd model =
6466

6567

6668

69+
-- EVENTS SUBSCRIPTIONS
70+
71+
72+
eventsMapping : EventsMapping Msg
73+
eventsMapping =
74+
[ Js.Events.EventMessage "Copied" (\_ -> Add <| Toast Success "The text has been copied to your clipboard!") ]
75+
|> EventsMapping.create
76+
77+
78+
6779
-- VIEW
6880

6981

src/elm/Main.elm

Lines changed: 59 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -5,16 +5,19 @@ import Browser.Navigation as Nav
55
import Circle
66
import Clock.Model exposing (ClockState(..))
77
import Html exposing (..)
8-
import Html.Attributes exposing (class, id)
8+
import Html.Attributes exposing (class, classList, id)
99
import Html.Events exposing (onClick)
1010
import Js.Commands
1111
import Js.Events
12+
import Js.EventsMapping as EventsMapping exposing (EventsMapping)
1213
import Json.Decode
1314
import Json.Encode
15+
import Lib.BatchMsg
1416
import Lib.Duration as Duration exposing (Duration)
1517
import Lib.Icons as Icons
1618
import Lib.Ratio
1719
import Lib.Toaster exposing (Toasts)
20+
import Mob.Tabs.Home
1821
import Mobbers.Settings
1922
import Random
2023
import Shared
@@ -59,22 +62,36 @@ type AlarmState
5962
| Standby
6063

6164

65+
type Tab
66+
= Main
67+
| Mobbers
68+
| Clock
69+
| Sound
70+
| Share
71+
72+
6273
type alias Model =
63-
{ shared : Shared.State
74+
{ key : Nav.Key
75+
, url : Url.Url
76+
, shared : Shared.State
6477
, mobbersSettings : Mobbers.Settings.Model
6578
, alarm : AlarmState
6679
, now : Time.Posix
6780
, toasts : Toasts
81+
, tab : Tab
6882
}
6983

7084

7185
init : () -> Url.Url -> Nav.Key -> ( Model, Cmd Msg )
72-
init _ _ _ =
73-
( { shared = Shared.init
86+
init _ url key =
87+
( { key = key
88+
, url = url
89+
, shared = Shared.init
7490
, mobbersSettings = Mobbers.Settings.init
7591
, alarm = Standby
7692
, now = Time.millisToPosix 0
7793
, toasts = []
94+
, tab = Main
7895
}
7996
, Task.perform TimePassed Time.now
8097
)
@@ -96,8 +113,11 @@ type Msg
96113
| StopSound
97114
| AlarmEnded
98115
| UnknownEvent
116+
| GotMainTabMsg Mob.Tabs.Home.Msg
99117
| GotMobbersSettingsMsg Mobbers.Settings.Msg
100118
| GotToastMsg Lib.Toaster.Msg
119+
| SwitchTab Tab
120+
| Batch (List Msg)
101121

102122

103123
update : Msg -> Model -> ( Model, Cmd Msg )
@@ -176,6 +196,9 @@ update msg model =
176196
UnknownEvent ->
177197
( model, Cmd.none )
178198

199+
GotMainTabMsg subMsg ->
200+
( model, Mob.Tabs.Home.update subMsg |> Cmd.map GotMainTabMsg )
201+
179202
GotMobbersSettingsMsg subMsg ->
180203
let
181204
mobbersResult =
@@ -199,6 +222,12 @@ update msg model =
199222
(\toasts -> { model | toasts = toasts })
200223
(Cmd.map GotToastMsg)
201224

225+
SwitchTab tab ->
226+
( { model | tab = tab }, Cmd.none )
227+
228+
Batch messages ->
229+
Lib.BatchMsg.update messages model update
230+
202231

203232

204233
-- SUBSCRIPTIONS
@@ -221,7 +250,10 @@ toMsg event =
221250
AlarmEnded
222251

223252
_ ->
224-
UnknownEvent
253+
Lib.Toaster.eventsMapping
254+
|> EventsMapping.map GotToastMsg
255+
|> EventsMapping.dispatch event
256+
|> Batch
225257

226258

227259

@@ -273,14 +305,29 @@ view model =
273305
]
274306
]
275307
, nav []
276-
[ button [] [ Icons.home ]
277-
, button [] [ Icons.clock ]
278-
, button [] [ Icons.people ]
279-
, button [] [ Icons.sound ]
280-
, button [] [ Icons.share ]
308+
[ button [ onClick <| SwitchTab Main, classList [ ( "active", model.tab == Main ) ] ] [ Icons.home ]
309+
, button [ onClick <| SwitchTab Clock, classList [ ( "active", model.tab == Clock ) ] ] [ Icons.clock ]
310+
, button [ onClick <| SwitchTab Mobbers, classList [ ( "active", model.tab == Mobbers ) ] ] [ Icons.people ]
311+
, button [ onClick <| SwitchTab Sound, classList [ ( "active", model.tab == Sound ) ] ] [ Icons.sound ]
312+
, button [ onClick <| SwitchTab Share, classList [ ( "active", model.tab == Share ) ] ] [ Icons.share ]
281313
]
282-
, Mobbers.Settings.view model.shared.mobbers model.mobbersSettings
283-
|> Html.map GotMobbersSettingsMsg
314+
, case model.tab of
315+
Main ->
316+
Mob.Tabs.Home.view "Awesome" model.url model.shared.mobbers
317+
|> Html.map GotMainTabMsg
318+
319+
Clock ->
320+
div [] []
321+
322+
Mobbers ->
323+
Mobbers.Settings.view model.shared.mobbers model.mobbersSettings
324+
|> Html.map GotMobbersSettingsMsg
325+
326+
Sound ->
327+
div [] []
328+
329+
Share ->
330+
div [] []
284331
, Lib.Toaster.view model.toasts |> Html.map GotToastMsg
285332
]
286333
]

src/elm/Mob/Tabs/Home.elm

Lines changed: 79 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,79 @@
1+
module Mob.Tabs.Home exposing (..)
2+
3+
import Footer
4+
import Html exposing (Html, button, div, i, li, span, strong, text, ul)
5+
import Html.Attributes exposing (class, id, title)
6+
import Html.Events exposing (onClick)
7+
import Js.Commands
8+
import Lib.Icons
9+
import Mobbers.Model exposing (Mobber, Mobbers)
10+
import Mobbers.Settings
11+
import Url
12+
13+
14+
type Msg
15+
= PutLinkInPasteBin Url.Url
16+
17+
18+
update : Msg -> Cmd Msg
19+
update msg =
20+
case msg of
21+
PutLinkInPasteBin url ->
22+
Url.toString url
23+
|> Js.Commands.CopyInPasteBin
24+
|> Js.Commands.send
25+
26+
27+
view : String -> Url.Url -> Mobbers -> Html Msg
28+
view mobName url mobbers =
29+
div
30+
[ id "home", class "tab" ]
31+
[ shareButton mobName url
32+
, roles mobbers
33+
, Footer.view
34+
]
35+
36+
37+
shareButton : String -> Url.Url -> Html Msg
38+
shareButton mob url =
39+
button
40+
[ onClick <| PutLinkInPasteBin url
41+
, id "share-link"
42+
, title "Copy this mob's link in your clipboard"
43+
]
44+
[ shareText mob
45+
, Lib.Icons.share
46+
]
47+
48+
49+
shareText : String -> Html Msg
50+
shareText mob =
51+
span []
52+
[ text "You are in the "
53+
, strong [] [ text mob ]
54+
, text " mob"
55+
]
56+
57+
58+
roles : Mobbers -> Html msg
59+
roles mobbers =
60+
Mobbers.Settings.assignRoles mobbers
61+
|> List.filter (\(_, mobber) -> mobber /= Nothing)
62+
|> List.take 2
63+
|> List.map roleView
64+
|> (\list ->
65+
case list of
66+
[] ->
67+
div [] []
68+
69+
_ ->
70+
ul [ class "mobber-roles" ] list
71+
)
72+
73+
74+
roleView : ( Maybe String, Maybe Mobber ) -> Html msg
75+
roleView (role, mobber) =
76+
li [ class "mobber-role" ]
77+
[ span [ class "role" ] [ role |> Maybe.withDefault "Wut ?" |> text ]
78+
, span [ class "mobber" ] [ mobber |> Maybe.map .name |> Maybe.withDefault "Wut ?" |> text ]
79+
]

src/elm/Mobbers/Settings.elm

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -116,14 +116,16 @@ view mobbers model =
116116
]
117117
]
118118
, ul []
119-
(mobbers
120-
|> assign [ "Driver", "Navigator" ]
119+
(assignRoles mobbers
121120
|> List.map mobberView
122121
|> List.filter ((/=) Nothing)
123122
|> List.map (Maybe.withDefault (li [] []))
124123
)
125124
]
126125

126+
assignRoles : Mobbers -> List ( Maybe String, Maybe Mobber )
127+
assignRoles mobbers =
128+
assign [ "Driver", "Navigator" ] mobbers
127129

128130
textFieldConfig : String -> (String -> msg) -> Field.String.ViewConfig msg
129131
textFieldConfig title toMsg =

src/sass/main.scss

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -59,6 +59,8 @@ a, button {
5959
cursor: pointer;
6060
}
6161

62+
@include icon(1.2em, black);
63+
6264
button {
6365
border-radius: 0;
6466
border: none;
@@ -147,6 +149,7 @@ hr {
147149
font-size: 1em;
148150
align-items: center;
149151
width: 100%;
152+
@include icon(1.4em, black);
150153

151154
span {
152155
flex: 1 1;
@@ -172,10 +175,12 @@ footer {
172175
&:hover {
173176
background: $dark-button-color;
174177
color: white;
178+
@include icon(1.2em, white);
175179
}
176180

177181
i {
178182
padding-right: 10px;
183+
vertical-align: sub;
179184
}
180185
}
181186
}

0 commit comments

Comments
 (0)