1
0
mirror of https://github.com/jhillyerd/inbucket.git synced 2025-12-17 09:37:02 +00:00

ui: Refactor Timer into it's own module.

This commit is contained in:
James Hillyerd
2020-04-05 16:22:16 -07:00
parent 8a3d291ff3
commit e8e506f870
2 changed files with 57 additions and 34 deletions

View File

@@ -41,6 +41,7 @@ import Modal
import Process import Process
import Route exposing (Route) import Route exposing (Route)
import Task import Task
import Timer exposing (Timer)
{-| Used to highlight current page in navbar. {-| Used to highlight current page in navbar.
@@ -61,41 +62,12 @@ type alias Model msg =
} }
type Timer
= New
| Idle Int
| Timer Int
replaceTimer : Timer -> Timer
replaceTimer previous =
case previous of
New ->
Timer 0
Idle index ->
Timer (index + 1)
Timer index ->
Timer (index + 1)
cancelTimer : Timer -> Timer
cancelTimer previous =
case previous of
Timer index ->
Idle (index + 1)
_ ->
previous
init : (Msg -> msg) -> Model msg init : (Msg -> msg) -> Model msg
init mapMsg = init mapMsg =
{ mapMsg = mapMsg { mapMsg = mapMsg
, mainMenuVisible = False , mainMenuVisible = False
, recentMenuVisible = False , recentMenuVisible = False
, recentMenuTimer = New , recentMenuTimer = Timer.empty
, mailboxName = "" , mailboxName = ""
} }
@@ -107,7 +79,7 @@ reset model =
{ model { model
| mainMenuVisible = False | mainMenuVisible = False
, recentMenuVisible = False , recentMenuVisible = False
, recentMenuTimer = cancelTimer model.recentMenuTimer , recentMenuTimer = Timer.cancel model.recentMenuTimer
, mailboxName = "" , mailboxName = ""
} }
@@ -168,7 +140,7 @@ update msg model session =
RecentMenuMouseOver -> RecentMenuMouseOver ->
( { model ( { model
| recentMenuVisible = True | recentMenuVisible = True
, recentMenuTimer = cancelTimer model.recentMenuTimer , recentMenuTimer = Timer.cancel model.recentMenuTimer
} }
, session , session
, Cmd.none , Cmd.none
@@ -177,7 +149,7 @@ update msg model session =
RecentMenuMouseOut -> RecentMenuMouseOut ->
let let
newTimer = newTimer =
replaceTimer model.recentMenuTimer Timer.replace model.recentMenuTimer
in in
( { model ( { model
| recentMenuTimer = newTimer | recentMenuTimer = newTimer
@@ -190,7 +162,7 @@ update msg model session =
if timer == model.recentMenuTimer then if timer == model.recentMenuTimer then
( { model ( { model
| recentMenuVisible = False | recentMenuVisible = False
, recentMenuTimer = cancelTimer timer , recentMenuTimer = Timer.cancel timer
} }
, session , session
, Cmd.none , Cmd.none

51
ui/src/Timer.elm Normal file
View File

@@ -0,0 +1,51 @@
module Timer exposing (Timer, cancel, empty, replace)
{-| Implements an identity to track an asynchronous timer.
-}
type Timer
= Empty
| Idle Int
| Timer Int
empty : Timer
empty =
Empty
{-| Replaces the provided timer with a newly created one.
-}
replace : Timer -> Timer
replace previous =
case previous of
Empty ->
Timer 0
Idle index ->
Timer (next index)
Timer index ->
Timer (next index)
{-| Cancels the provided timer without creating a replacement.
-}
cancel : Timer -> Timer
cancel previous =
case previous of
Timer index ->
Idle index
_ ->
previous
next : Int -> Int
next index =
if index > 2 ^ 30 then
0
else
index + 1