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

ui: Update Mailbox to use Timer module

This commit is contained in:
James Hillyerd
2020-04-11 15:32:35 -07:00
parent 930801f6da
commit 9e1da20782
2 changed files with 33 additions and 87 deletions

View File

@@ -38,9 +38,7 @@ import Html.Attributes
) )
import Html.Events as Events import Html.Events as Events
import Modal import Modal
import Process
import Route exposing (Route) import Route exposing (Route)
import Task
import Timer exposing (Timer) import Timer exposing (Timer)

View File

@@ -1,7 +1,6 @@
module Page.Mailbox exposing (Model, Msg, init, load, subscriptions, update, view) module Page.Mailbox exposing (Model, Msg, init, load, subscriptions, update, view)
import Api import Api
import Browser.Dom as Dom
import Data.Message as Message exposing (Message) import Data.Message as Message exposing (Message)
import Data.MessageHeader exposing (MessageHeader) import Data.MessageHeader exposing (MessageHeader)
import Data.Session as Session exposing (Session) import Data.Session as Session exposing (Session)
@@ -56,6 +55,7 @@ import Modal
import Route import Route
import Task import Task
import Time exposing (Posix) import Time exposing (Posix)
import Timer exposing (Timer)
@@ -75,8 +75,8 @@ type State
type MessageState type MessageState
= NoMessage = NoMessage
| LoadingMessage | LoadingMessage
| ShowingMessage VisibleMessage | ShowingMessage Message
| Transitioning VisibleMessage | Transitioning Message
type alias MessageID = type alias MessageID =
@@ -90,12 +90,6 @@ type alias MessageList =
} }
type alias VisibleMessage =
{ message : Message
, markSeenAt : Maybe Int
}
type alias Model = type alias Model =
{ session : Session { session : Session
, mailboxName : String , mailboxName : String
@@ -103,6 +97,7 @@ type alias Model =
, bodyMode : Body , bodyMode : Body
, searchInput : String , searchInput : String
, promptPurge : Bool , promptPurge : Bool
, markSeenTimer : Timer
, now : Posix , now : Posix
} }
@@ -115,6 +110,7 @@ init session mailboxName selection =
, bodyMode = SafeHtmlBody , bodyMode = SafeHtmlBody
, searchInput = "" , searchInput = ""
, promptPurge = False , promptPurge = False
, markSeenTimer = Timer.empty
, now = Time.millisToPosix 0 , now = Time.millisToPosix 0
} }
, load mailboxName , load mailboxName
@@ -134,24 +130,8 @@ load mailboxName =
subscriptions : Model -> Sub Msg subscriptions : Model -> Sub Msg
subscriptions model = subscriptions _ =
let Time.every (30 * 1000) Tick
subSeen =
case model.state of
ShowingList _ (ShowingMessage { message }) ->
if message.seen then
Sub.none
else
Time.every 250 MarkSeenTick
_ ->
Sub.none
in
Sub.batch
[ Time.every (30 * 1000) Tick
, subSeen
]
@@ -165,9 +145,8 @@ type Msg
| CloseMessage | CloseMessage
| MessageLoaded (Result HttpUtil.Error Message) | MessageLoaded (Result HttpUtil.Error Message)
| MessageBody Body | MessageBody Body
| OpenedTime Posix | MarkSeenTriggered Timer
| MarkSeenTick Posix | MarkSeenLoaded (Result HttpUtil.Error ())
| MarkedSeen (Result HttpUtil.Error ())
| DeleteMessage Message | DeleteMessage Message
| DeletedMessage (Result HttpUtil.Error ()) | DeletedMessage (Result HttpUtil.Error ())
| PurgeMailboxPrompt | PurgeMailboxPrompt
@@ -246,10 +225,10 @@ update msg model =
, Cmd.none , Cmd.none
) )
MarkedSeen (Ok _) -> MarkSeenLoaded (Ok _) ->
( model, Cmd.none ) ( model, Cmd.none )
MarkedSeen (Err err) -> MarkSeenLoaded (Err err) ->
( { model | session = Session.showFlash (HttpUtil.errorFlash err) model.session } ( { model | session = Session.showFlash (HttpUtil.errorFlash err) model.session }
, Cmd.none , Cmd.none
) )
@@ -273,33 +252,6 @@ update msg model =
OnSearchInput searchInput -> OnSearchInput searchInput ->
updateSearchInput model searchInput updateSearchInput model searchInput
OpenedTime time ->
case model.state of
ShowingList list (ShowingMessage visible) ->
if visible.message.seen then
( model, Cmd.none )
else
-- Set 1500ms delay before reporting message as seen to backend.
let
markSeenAt =
Time.posixToMillis time + 1500
in
( { model
| state =
ShowingList list
(ShowingMessage
{ visible
| markSeenAt = Just markSeenAt
}
)
}
, Cmd.none
)
_ ->
( model, Cmd.none )
PurgeMailboxPrompt -> PurgeMailboxPrompt ->
( { model | promptPurge = True }, Modal.resetFocusCmd ModalFocused ) ( { model | promptPurge = True }, Modal.resetFocusCmd ModalFocused )
@@ -317,19 +269,15 @@ update msg model =
, Cmd.none , Cmd.none
) )
MarkSeenTick now -> MarkSeenTriggered timer ->
case model.state of case model.state of
ShowingList _ (ShowingMessage { message, markSeenAt }) -> ShowingList _ (ShowingMessage _) ->
case markSeenAt of if timer == model.markSeenTimer then
Just deadline -> -- Matching timer means we have changed messages, mark this one seen.
if Time.posixToMillis now >= deadline then updateMarkMessageSeen model
updateMarkMessageSeen model message
else else
( model, Cmd.none ) ( model, Cmd.none )
Nothing ->
( model, Cmd.none )
_ -> _ ->
( model, Cmd.none ) ( model, Cmd.none )
@@ -355,14 +303,20 @@ updateMessageResult model message =
( model, Cmd.none ) ( model, Cmd.none )
ShowingList list _ -> ShowingList list _ ->
let
newTimer =
Timer.replace model.markSeenTimer
in
( { model ( { model
| state = | state =
ShowingList ShowingList
{ list | selected = Just message.id } { list | selected = Just message.id }
(ShowingMessage (VisibleMessage message Nothing)) (ShowingMessage message)
, bodyMode = bodyMode , bodyMode = bodyMode
, markSeenTimer = newTimer
} }
, Task.perform OpenedTime Time.now -- Set 1500ms delay before reporting message as seen to backend.
, Timer.schedule MarkSeenTriggered newTimer 1500
) )
@@ -465,10 +419,10 @@ updateDeleteMessage model message =
( model, Cmd.none ) ( model, Cmd.none )
updateMarkMessageSeen : Model -> Message -> ( Model, Cmd Msg ) updateMarkMessageSeen : Model -> ( Model, Cmd Msg )
updateMarkMessageSeen model message = updateMarkMessageSeen model =
case model.state of case model.state of
ShowingList list (ShowingMessage visible) -> ShowingList list (ShowingMessage message) ->
let let
updateSeen header = updateSeen header =
if header.id == message.id then if header.id == message.id then
@@ -482,15 +436,9 @@ updateMarkMessageSeen model message =
in in
( { model ( { model
| state = | state =
ShowingList (map updateSeen list) ShowingList (map updateSeen list) (ShowingMessage { message | seen = True })
(ShowingMessage
{ visible
| message = { message | seen = True }
, markSeenAt = Nothing
}
)
} }
, Api.markMessageSeen MarkedSeen message.mailbox message.id , Api.markMessageSeen MarkSeenLoaded message.mailbox message.id
) )
_ -> _ ->
@@ -557,10 +505,10 @@ view model =
++ " or enter a different username into the box on upper right." ++ " or enter a different username into the box on upper right."
) )
ShowingList _ (ShowingMessage { message }) -> ShowingList _ (ShowingMessage message) ->
viewMessage model.session.zone message model.bodyMode viewMessage model.session.zone message model.bodyMode
ShowingList _ (Transitioning { message }) -> ShowingList _ (Transitioning message) ->
viewMessage model.session.zone message model.bodyMode viewMessage model.session.zone message model.bodyMode
_ -> _ ->