mirror of
https://github.com/jhillyerd/inbucket.git
synced 2025-12-17 17:47:03 +00:00
ui: Update Mailbox to use Timer module
This commit is contained in:
@@ -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)
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -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
|
||||||
|
|
||||||
_ ->
|
_ ->
|
||||||
|
|||||||
Reference in New Issue
Block a user