1
0
mirror of https://github.com/jhillyerd/inbucket.git synced 2025-12-18 01:57:02 +00:00

ui: Refactor message/markSeenAt into visible record.

This commit is contained in:
James Hillyerd
2018-11-04 11:24:44 -08:00
parent 7dade7f0e4
commit 04a3f58e6d

View File

@@ -28,15 +28,18 @@ type alias Model =
{ name : String { name : String
, selected : Maybe String , selected : Maybe String
, headers : List MessageHeader , headers : List MessageHeader
, message : Maybe Message , visible :
Maybe
{ message : Message
, markSeenAt : Maybe Time
}
, bodyMode : Body , bodyMode : Body
, markSeenAt : Maybe Time
} }
init : String -> Maybe String -> Model init : String -> Maybe String -> Model
init name id = init name id =
Model name id [] Nothing SafeHtmlBody Nothing Model name id [] Nothing SafeHtmlBody
load : String -> Cmd Msg load : String -> Cmd Msg
@@ -53,9 +56,14 @@ load name =
subscriptions : Model -> Sub Msg subscriptions : Model -> Sub Msg
subscriptions model = subscriptions model =
case model.markSeenAt of case model.visible of
Just time -> Just { message, markSeenAt } ->
Time.every (250 * Time.millisecond) Tick case markSeenAt of
Just time ->
Time.every (250 * Time.millisecond) Tick
Nothing ->
Sub.none
Nothing -> Nothing ->
Sub.none Sub.none
@@ -136,7 +144,7 @@ update session msg model =
model.bodyMode model.bodyMode
in in
( { model ( { model
| message = Just msg | visible = Just { message = msg, markSeenAt = Nothing }
, bodyMode = bodyMode , bodyMode = bodyMode
} }
, Task.perform OpenedTime Time.now , Task.perform OpenedTime Time.now
@@ -150,16 +158,19 @@ update session msg model =
( { model | bodyMode = bodyMode }, Cmd.none, Session.none ) ( { model | bodyMode = bodyMode }, Cmd.none, Session.none )
OpenedTime time -> OpenedTime time ->
case model.message of case model.visible of
Just message -> Just visible ->
if message.seen then if visible.message.seen then
( { model | markSeenAt = Nothing } ( model, Cmd.none, Session.none )
, Cmd.none
, Session.none
)
else else
-- Set delay to report message as seen to backend. -- Set delay to report message as seen to backend.
( { model | markSeenAt = Just (time + (1.5 * Time.second)) } ( { model
| visible =
Just
{ visible
| markSeenAt = Just (time + (1.5 * Time.second))
}
}
, Cmd.none , Cmd.none
, Session.none , Session.none
) )
@@ -167,15 +178,20 @@ update session msg model =
Nothing -> Nothing ->
( model, Cmd.none, Session.none ) ( model, Cmd.none, Session.none )
Tick time -> Tick now ->
case ( model.message, model.markSeenAt ) of case model.visible of
( Just message, Just markSeenAt ) -> Just { message, markSeenAt } ->
if time > markSeenAt then case markSeenAt of
markMessageSeen model message Just deadline ->
else if now >= deadline then
( model, Cmd.none, Session.none ) markMessageSeen model message
else
( model, Cmd.none, Session.none )
_ -> Nothing ->
( model, Cmd.none, Session.none )
Nothing ->
( model, Cmd.none, Session.none ) ( model, Cmd.none, Session.none )
@@ -200,7 +216,7 @@ deleteMessage model msg =
|> Http.send DeleteMessageResult |> Http.send DeleteMessageResult
in in
( { model ( { model
| message = Nothing | visible = Nothing
, selected = Nothing , selected = Nothing
, headers = List.filter (\x -> x.id /= msg.id) model.headers , headers = List.filter (\x -> x.id /= msg.id) model.headers
} }
@@ -221,31 +237,36 @@ getMessage mailbox id =
markMessageSeen : Model -> Message -> ( Model, Cmd Msg, Session.Msg ) markMessageSeen : Model -> Message -> ( Model, Cmd Msg, Session.Msg )
markMessageSeen model message = markMessageSeen model message =
let case model.visible of
updateSeen header = Just visible ->
if header.id == message.id then let
{ header | seen = True } updateSeen header =
else if header.id == message.id then
header { header | seen = True }
else
header
url = url =
"/api/v1/mailbox/" ++ message.mailbox ++ "/" ++ message.id "/api/v1/mailbox/" ++ message.mailbox ++ "/" ++ message.id
command = command =
-- The URL tells the API what message to update, so we only need to indicate the -- The URL tells the API what message to update, so we only need to indicate the
-- desired change in the body. -- desired change in the body.
Encode.object [ ( "seen", Encode.bool True ) ] Encode.object [ ( "seen", Encode.bool True ) ]
|> Http.jsonBody |> Http.jsonBody
|> HttpUtil.patch url |> HttpUtil.patch url
|> Http.send MarkSeenResult |> Http.send MarkSeenResult
in in
( { model ( { model
| markSeenAt = Nothing | visible = Just { visible | markSeenAt = Nothing }
, headers = List.map updateSeen model.headers , headers = List.map updateSeen model.headers
} }
, command , command
, Session.None , Session.None
) )
Nothing ->
( model, Cmd.none, Session.none )
@@ -258,8 +279,8 @@ view session model =
[ aside [ id "message-list" ] [ messageList model ] [ aside [ id "message-list" ] [ messageList model ]
, main_ , main_
[ id "message" ] [ id "message" ]
[ case model.message of [ case model.visible of
Just message -> Just { message } ->
viewMessage message model.bodyMode viewMessage message model.bodyMode
Nothing -> Nothing ->