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

Merge branch 'feature/mailbox-timer' into develop

This commit is contained in:
James Hillyerd
2020-04-12 16:29:31 -07:00
2 changed files with 38 additions and 95 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,22 +269,13 @@ update msg model =
, Cmd.none , Cmd.none
) )
MarkSeenTick now -> MarkSeenTriggered timer ->
case model.state of if timer == model.markSeenTimer then
ShowingList _ (ShowingMessage { message, markSeenAt }) -> -- Matching timer means we have changed messages, mark this one seen.
case markSeenAt of updateMarkMessageSeen model
Just deadline ->
if Time.posixToMillis now >= deadline then
updateMarkMessageSeen model message
else else
( model, Cmd.none ) ( model, Cmd.none )
Nothing ->
( model, Cmd.none )
_ ->
( model, Cmd.none )
Tick now -> Tick now ->
( { model | now = now }, Cmd.none ) ( { model | now = now }, Cmd.none )
@@ -355,14 +298,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,32 +414,28 @@ updateDeleteMessage model message =
( model, Cmd.none ) ( model, Cmd.none )
updateMarkMessageSeen : Model -> Message -> ( Model, Cmd Msg ) {-| Updates both the active message, and the message list to mark the currently viewed message as seen.
updateMarkMessageSeen model message = -}
updateMarkMessageSeen : Model -> ( Model, Cmd Msg )
updateMarkMessageSeen model =
case model.state of case model.state of
ShowingList list (ShowingMessage visible) -> ShowingList messages (ShowingMessage visibleMessage) ->
let let
updateSeen header = updateHeader header =
if header.id == message.id then if header.id == visibleMessage.id then
{ header | seen = True } { header | seen = True }
else else
header header
map f messageList = newMessages =
{ messageList | headers = List.map f messageList.headers } { messages | headers = List.map updateHeader messages.headers }
in in
( { model ( { model
| state = | state =
ShowingList (map updateSeen list) ShowingList newMessages (ShowingMessage { visibleMessage | seen = True })
(ShowingMessage
{ visible
| message = { message | seen = True }
, markSeenAt = Nothing
}
)
} }
, Api.markMessageSeen MarkedSeen message.mailbox message.id , Api.markMessageSeen MarkSeenLoaded visibleMessage.mailbox visibleMessage.id
) )
_ -> _ ->
@@ -557,10 +502,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
_ -> _ ->