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