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

ui: Initial impl of seen message marking

This commit is contained in:
James Hillyerd
2018-11-04 10:40:00 -08:00
parent 523c04a522
commit 7dade7f0e4
3 changed files with 107 additions and 7 deletions

View File

@@ -16,6 +16,19 @@ delete url =
} }
patch : String -> Http.Body -> Http.Request ()
patch url body =
Http.request
{ method = "PATCH"
, headers = []
, url = url
, body = body
, expect = Http.expectStringResponse (\_ -> Ok ())
, timeout = Nothing
, withCredentials = False
}
errorString : Http.Error -> String errorString : Http.Error -> String
errorString error = errorString error =
case error of case error of

View File

@@ -80,6 +80,9 @@ sessionChange =
pageSubscriptions : Page -> Sub Msg pageSubscriptions : Page -> Sub Msg
pageSubscriptions page = pageSubscriptions page =
case page of case page of
Mailbox subModel ->
Sub.map MailboxMsg (Mailbox.subscriptions subModel)
Monitor subModel -> Monitor subModel ->
Sub.map MonitorMsg (Monitor.subscriptions subModel) Sub.map MonitorMsg (Monitor.subscriptions subModel)

View File

@@ -1,4 +1,4 @@
module Page.Mailbox exposing (Model, Msg, init, load, update, view) module Page.Mailbox exposing (Model, Msg, init, load, subscriptions, update, view)
import Data.Message as Message exposing (Message) import Data.Message as Message exposing (Message)
import Data.MessageHeader as MessageHeader exposing (MessageHeader) import Data.MessageHeader as MessageHeader exposing (MessageHeader)
@@ -9,9 +9,11 @@ import Html.Attributes exposing (class, classList, downloadAs, href, id, propert
import Html.Events exposing (..) import Html.Events exposing (..)
import Http exposing (Error) import Http exposing (Error)
import HttpUtil import HttpUtil
import Json.Encode exposing (string) import Json.Encode as Encode
import Ports import Ports
import Route exposing (Route) import Route
import Task
import Time exposing (Time)
-- MODEL -- MODEL
@@ -28,12 +30,13 @@ type alias Model =
, headers : List MessageHeader , headers : List MessageHeader
, message : Maybe Message , message : Maybe Message
, 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 Model name id [] Nothing SafeHtmlBody Nothing
load : String -> Cmd Msg load : String -> Cmd Msg
@@ -45,6 +48,20 @@ load name =
-- SUBSCRIPTIONS
subscriptions : Model -> Sub Msg
subscriptions model =
case model.markSeenAt of
Just time ->
Time.every (250 * Time.millisecond) Tick
Nothing ->
Sub.none
-- UPDATE -- UPDATE
@@ -54,8 +71,11 @@ type Msg
| DeleteMessage Message | DeleteMessage Message
| DeleteMessageResult (Result Http.Error ()) | DeleteMessageResult (Result Http.Error ())
| MailboxResult (Result Http.Error (List MessageHeader)) | MailboxResult (Result Http.Error (List MessageHeader))
| MarkSeenResult (Result Http.Error ())
| MessageResult (Result Http.Error Message) | MessageResult (Result Http.Error Message)
| MessageBody Body | MessageBody Body
| OpenedTime Time
| Tick Time
update : Session -> Msg -> Model -> ( Model, Cmd Msg, Session.Msg ) update : Session -> Msg -> Model -> ( Model, Cmd Msg, Session.Msg )
@@ -101,6 +121,12 @@ update session msg model =
MailboxResult (Err err) -> MailboxResult (Err err) ->
( model, Cmd.none, Session.SetFlash (HttpUtil.errorString err) ) ( model, Cmd.none, Session.SetFlash (HttpUtil.errorString err) )
MarkSeenResult (Ok _) ->
( model, Cmd.none, Session.none )
MarkSeenResult (Err err) ->
( model, Cmd.none, Session.SetFlash (HttpUtil.errorString err) )
MessageResult (Ok msg) -> MessageResult (Ok msg) ->
let let
bodyMode = bodyMode =
@@ -113,7 +139,7 @@ update session msg model =
| message = Just msg | message = Just msg
, bodyMode = bodyMode , bodyMode = bodyMode
} }
, Cmd.none , Task.perform OpenedTime Time.now
, Session.none , Session.none
) )
@@ -123,6 +149,35 @@ update session msg model =
MessageBody bodyMode -> MessageBody bodyMode ->
( { model | bodyMode = bodyMode }, Cmd.none, Session.none ) ( { model | bodyMode = bodyMode }, Cmd.none, Session.none )
OpenedTime time ->
case model.message of
Just message ->
if message.seen then
( { model | markSeenAt = Nothing }
, Cmd.none
, Session.none
)
else
-- Set delay to report message as seen to backend.
( { model | markSeenAt = Just (time + (1.5 * Time.second)) }
, Cmd.none
, Session.none
)
Nothing ->
( model, Cmd.none, Session.none )
Tick time ->
case ( model.message, model.markSeenAt ) of
( Just message, Just markSeenAt ) ->
if time > markSeenAt then
markMessageSeen model message
else
( model, Cmd.none, Session.none )
_ ->
( model, Cmd.none, Session.none )
getMailbox : String -> Cmd Msg getMailbox : String -> Cmd Msg
getMailbox name = getMailbox name =
@@ -164,6 +219,35 @@ getMessage mailbox id =
|> Http.send MessageResult |> Http.send MessageResult
markMessageSeen : Model -> Message -> ( Model, Cmd Msg, Session.Msg )
markMessageSeen model message =
let
updateSeen header =
if header.id == message.id then
{ header | seen = True }
else
header
url =
"/api/v1/mailbox/" ++ message.mailbox ++ "/" ++ message.id
command =
-- The URL tells the API what message to update, so we only need to indicate the
-- desired change in the body.
Encode.object [ ( "seen", Encode.bool True ) ]
|> Http.jsonBody
|> HttpUtil.patch url
|> Http.send MarkSeenResult
in
( { model
| markSeenAt = Nothing
, headers = List.map updateSeen model.headers
}
, command
, Session.None
)
-- VIEW -- VIEW
@@ -264,10 +348,10 @@ messageBody message bodyMode =
, article [ class "message-body" ] , article [ class "message-body" ]
[ case bodyMode of [ case bodyMode of
SafeHtmlBody -> SafeHtmlBody ->
div [ property "innerHTML" (string message.html) ] [] div [ property "innerHTML" (Encode.string message.html) ] []
TextBody -> TextBody ->
div [ property "innerHTML" (string message.text) ] [] div [ property "innerHTML" (Encode.string message.text) ] []
] ]
] ]