module View.Timer ( timerView ) where import Html (..) import Html.Attributes (..) import Html.Events (..) import String import Time (Time) import Signal import Maybe import Model.Model (..) import Model.Timer (..) import Model.TimerEdition (..) import Model.TimerState (..) import Model.Id (..) import Update.Update (..) import Update.UpdateTimer (..) import View.ActivatedClasses (..) import Utils.Maybe (..) timerView : Model -> (Id, Timer) -> Html timerView model (id, timer) = div [ [ (True, "timer") , (timer.state == Running, "isRunning") , (timer.state == Ringing, "isRinging") ] |> activatedClasses ] [ nameBlock (id, timer) , timeBlock model (id, timer) , restartBlock (id, timer) , playPauseBlock (id, timer) , stopBlock (id, timer) , removeBlock model (id, timer) ] nameBlock : (Id, Timer) -> Html nameBlock (id, timer) = button [ class "name block" , onClick (stopIfRinging (id, timer) (Signal.send updates NoOp)) ] [ text timer.name ] timeBlock : Model -> (Id, Timer) -> Html timeBlock model (id, timer) = let maybeEdition = filterMaybe (\te -> te.id == id) model.timerEdition in case maybeEdition of Just edition -> button [ class "time block edition" , onClick (stopIfRinging (id, timer) (Signal.send updates ValidTimerEdition)) ] [ text (editionView edition.numbers) ] Nothing -> button [ class "time block" , onClick (stopIfRinging (id, timer) (Signal.send updates (EditTimer id))) ] [ text (timeView timer.currentTime) ] editionView : Numbers -> String editionView numbers = let (minutes, seconds) = toMinutesAndSeconds numbers in minutes ++ " : " ++ seconds timeView : Time -> String timeView time = let totalSeconds = truncate (time / 1000) totalMinutes = totalSeconds // 60 restSeconds = totalSeconds `rem` 60 in (String.padLeft 2 '0' (toString totalMinutes)) ++ " : " ++ (String.padLeft 2 '0' (toString restSeconds)) restartBlock : (Id, Timer) -> Html restartBlock (id, timer) = button [ class <| "restart block" , onClick (stopIfRinging (id, timer) (Signal.send updates (UpdateTimer id Restart))) ] [ i [ class "fa fa-fw fa-backward" ] [] ] playPauseBlock : (Id, Timer) -> Html playPauseBlock (id, timer) = button [ class <| "playPause block" , onClick (stopIfRinging (id, timer) (Signal.send updates (UpdateTimer id ToggleRunning))) ] [ let icon = if timer.state == Running then "fa-pause" else "fa-play" in i [ class <| "fa fa-fw " ++ icon ] [] ] stopBlock : (Id, Timer) -> Html stopBlock (id, timer) = button [ class <| "stop block" , onClick (stopIfRinging (id, timer) (Signal.send updates (UpdateTimer id Stop))) ] [ i [ class "fa fa-fw fa-stop" ] [] ] removeBlock : Model -> (Id, Timer) -> Html removeBlock model (id, timer) = let removeClass = if numberOfTimers model > 1 then "remove" else "singleRemove" in button [ class <| "block " ++ removeClass , onClick (Signal.send updates (RemoveTimer id)) ] [ i [ class "fa fa-fw fa-remove" ] [] ] stopIfRinging : (Id, Timer) -> Signal.Message -> Signal.Message stopIfRinging (id, timer) message = if timer.state == Ringing then Signal.send updates (UpdateTimer id Stop) else message