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:
@@ -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 ->
|
||||||
|
|||||||
Reference in New Issue
Block a user