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 Modal
import Process
import Route exposing (Route)
import Task
import Timer exposing (Timer)

View File

@@ -1,7 +1,6 @@
module Page.Mailbox exposing (Model, Msg, init, load, subscriptions, update, view)
import Api
import Browser.Dom as Dom
import Data.Message as Message exposing (Message)
import Data.MessageHeader exposing (MessageHeader)
import Data.Session as Session exposing (Session)
@@ -56,6 +55,7 @@ import Modal
import Route
import Task
import Time exposing (Posix)
import Timer exposing (Timer)
@@ -75,8 +75,8 @@ type State
type MessageState
= NoMessage
| LoadingMessage
| ShowingMessage VisibleMessage
| Transitioning VisibleMessage
| ShowingMessage Message
| Transitioning Message
type alias MessageID =
@@ -90,12 +90,6 @@ type alias MessageList =
}
type alias VisibleMessage =
{ message : Message
, markSeenAt : Maybe Int
}
type alias Model =
{ session : Session
, mailboxName : String
@@ -103,6 +97,7 @@ type alias Model =
, bodyMode : Body
, searchInput : String
, promptPurge : Bool
, markSeenTimer : Timer
, now : Posix
}
@@ -115,6 +110,7 @@ init session mailboxName selection =
, bodyMode = SafeHtmlBody
, searchInput = ""
, promptPurge = False
, markSeenTimer = Timer.empty
, now = Time.millisToPosix 0
}
, load mailboxName
@@ -134,24 +130,8 @@ load mailboxName =
subscriptions : Model -> Sub Msg
subscriptions model =
let
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
]
subscriptions _ =
Time.every (30 * 1000) Tick
@@ -165,9 +145,8 @@ type Msg
| CloseMessage
| MessageLoaded (Result HttpUtil.Error Message)
| MessageBody Body
| OpenedTime Posix
| MarkSeenTick Posix
| MarkedSeen (Result HttpUtil.Error ())
| MarkSeenTriggered Timer
| MarkSeenLoaded (Result HttpUtil.Error ())
| DeleteMessage Message
| DeletedMessage (Result HttpUtil.Error ())
| PurgeMailboxPrompt
@@ -246,10 +225,10 @@ update msg model =
, Cmd.none
)
MarkedSeen (Ok _) ->
MarkSeenLoaded (Ok _) ->
( model, Cmd.none )
MarkedSeen (Err err) ->
MarkSeenLoaded (Err err) ->
( { model | session = Session.showFlash (HttpUtil.errorFlash err) model.session }
, Cmd.none
)
@@ -273,33 +252,6 @@ update msg model =
OnSearchInput 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 ->
( { model | promptPurge = True }, Modal.resetFocusCmd ModalFocused )
@@ -317,23 +269,14 @@ update msg model =
, Cmd.none
)
MarkSeenTick now ->
case model.state of
ShowingList _ (ShowingMessage { message, markSeenAt }) ->
case markSeenAt of
Just deadline ->
if Time.posixToMillis now >= deadline then
updateMarkMessageSeen model message
MarkSeenTriggered timer ->
if timer == model.markSeenTimer then
-- Matching timer means we have changed messages, mark this one seen.
updateMarkMessageSeen model
else
( model, Cmd.none )
Nothing ->
( model, Cmd.none )
_ ->
( model, Cmd.none )
Tick now ->
( { model | now = now }, Cmd.none )
@@ -355,14 +298,20 @@ updateMessageResult model message =
( model, Cmd.none )
ShowingList list _ ->
let
newTimer =
Timer.replace model.markSeenTimer
in
( { model
| state =
ShowingList
{ list | selected = Just message.id }
(ShowingMessage (VisibleMessage message Nothing))
(ShowingMessage message)
, 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 )
updateMarkMessageSeen : Model -> Message -> ( Model, Cmd Msg )
updateMarkMessageSeen model message =
{-| Updates both the active message, and the message list to mark the currently viewed message as seen.
-}
updateMarkMessageSeen : Model -> ( Model, Cmd Msg )
updateMarkMessageSeen model =
case model.state of
ShowingList list (ShowingMessage visible) ->
ShowingList messages (ShowingMessage visibleMessage) ->
let
updateSeen header =
if header.id == message.id then
updateHeader header =
if header.id == visibleMessage.id then
{ header | seen = True }
else
header
map f messageList =
{ messageList | headers = List.map f messageList.headers }
newMessages =
{ messages | headers = List.map updateHeader messages.headers }
in
( { model
| state =
ShowingList (map updateSeen list)
(ShowingMessage
{ visible
| message = { message | seen = True }
, markSeenAt = Nothing
ShowingList newMessages (ShowingMessage { visibleMessage | seen = True })
}
)
}
, 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."
)
ShowingList _ (ShowingMessage { message }) ->
ShowingList _ (ShowingMessage message) ->
viewMessage model.session.zone message model.bodyMode
ShowingList _ (Transitioning { message }) ->
ShowingList _ (Transitioning message) ->
viewMessage model.session.zone message model.bodyMode
_ ->