mirror of
https://github.com/jhillyerd/inbucket.git
synced 2025-12-17 17:47:03 +00:00
ui: Refactor Mailbox update function
This commit is contained in:
@@ -122,7 +122,8 @@ update session msg model =
|
|||||||
ClickMessage id ->
|
ClickMessage id ->
|
||||||
( updateSelected model id
|
( updateSelected model id
|
||||||
, Cmd.batch
|
, Cmd.batch
|
||||||
[ Route.newUrl (Route.Message model.mailboxName id)
|
[ -- Update browser location
|
||||||
|
Route.newUrl (Route.Message model.mailboxName id)
|
||||||
, getMessage model.mailboxName id
|
, getMessage model.mailboxName id
|
||||||
]
|
]
|
||||||
, Session.DisableRouting
|
, Session.DisableRouting
|
||||||
@@ -134,8 +135,8 @@ update session msg model =
|
|||||||
, Session.AddRecent model.mailboxName
|
, Session.AddRecent model.mailboxName
|
||||||
)
|
)
|
||||||
|
|
||||||
DeleteMessage msg ->
|
DeleteMessage message ->
|
||||||
deleteMessage model msg
|
updateDeleteMessage model message
|
||||||
|
|
||||||
DeleteMessageResult (Ok _) ->
|
DeleteMessageResult (Ok _) ->
|
||||||
( model, Cmd.none, Session.none )
|
( model, Cmd.none, Session.none )
|
||||||
@@ -170,38 +171,8 @@ update session msg model =
|
|||||||
MarkSeenResult (Err err) ->
|
MarkSeenResult (Err err) ->
|
||||||
( model, Cmd.none, Session.SetFlash (HttpUtil.errorString err) )
|
( model, Cmd.none, Session.SetFlash (HttpUtil.errorString err) )
|
||||||
|
|
||||||
MessageResult (Ok msg) ->
|
MessageResult (Ok message) ->
|
||||||
let
|
updateMessageResult model message
|
||||||
bodyMode =
|
|
||||||
if msg.html == "" then
|
|
||||||
TextBody
|
|
||||||
else
|
|
||||||
model.bodyMode
|
|
||||||
|
|
||||||
updateMessage list message =
|
|
||||||
( { model
|
|
||||||
| state = ShowingMessage list { message = message, markSeenAt = Nothing }
|
|
||||||
, bodyMode = bodyMode
|
|
||||||
}
|
|
||||||
, Task.perform OpenedTime Time.now
|
|
||||||
, Session.none
|
|
||||||
)
|
|
||||||
in
|
|
||||||
case model.state of
|
|
||||||
LoadingList _ ->
|
|
||||||
( model, Cmd.none, Session.none )
|
|
||||||
|
|
||||||
ShowingList list _ ->
|
|
||||||
updateMessage list msg
|
|
||||||
|
|
||||||
LoadingMessage list _ ->
|
|
||||||
updateMessage list msg
|
|
||||||
|
|
||||||
ShowingMessage list _ ->
|
|
||||||
updateMessage list msg
|
|
||||||
|
|
||||||
Transitioning list _ _ ->
|
|
||||||
updateMessage list msg
|
|
||||||
|
|
||||||
MessageResult (Err err) ->
|
MessageResult (Err err) ->
|
||||||
( model, Cmd.none, Session.SetFlash (HttpUtil.errorString err) )
|
( model, Cmd.none, Session.SetFlash (HttpUtil.errorString err) )
|
||||||
@@ -210,37 +181,7 @@ update session msg model =
|
|||||||
( { model | bodyMode = bodyMode }, Cmd.none, Session.none )
|
( { model | bodyMode = bodyMode }, Cmd.none, Session.none )
|
||||||
|
|
||||||
SearchInput searchInput ->
|
SearchInput searchInput ->
|
||||||
let
|
updateSearch model searchInput
|
||||||
updateList list =
|
|
||||||
{ list
|
|
||||||
| searchFilter =
|
|
||||||
if String.length searchInput > 1 then
|
|
||||||
searchInput
|
|
||||||
else
|
|
||||||
""
|
|
||||||
}
|
|
||||||
|
|
||||||
updateModel state =
|
|
||||||
( { model | searchInput = searchInput, state = state }
|
|
||||||
, Cmd.none
|
|
||||||
, Session.none
|
|
||||||
)
|
|
||||||
in
|
|
||||||
case model.state of
|
|
||||||
LoadingList _ ->
|
|
||||||
( model, Cmd.none, Session.none )
|
|
||||||
|
|
||||||
ShowingList list selection ->
|
|
||||||
updateModel (ShowingList (updateList list) selection)
|
|
||||||
|
|
||||||
LoadingMessage list id ->
|
|
||||||
updateModel (LoadingMessage (updateList list) id)
|
|
||||||
|
|
||||||
ShowingMessage list visible ->
|
|
||||||
updateModel (ShowingMessage (updateList list) visible)
|
|
||||||
|
|
||||||
Transitioning list visible id ->
|
|
||||||
updateModel (Transitioning (updateList list) visible id)
|
|
||||||
|
|
||||||
OpenedTime time ->
|
OpenedTime time ->
|
||||||
case model.state of
|
case model.state of
|
||||||
@@ -269,7 +210,7 @@ update session msg model =
|
|||||||
case markSeenAt of
|
case markSeenAt of
|
||||||
Just deadline ->
|
Just deadline ->
|
||||||
if now >= deadline then
|
if now >= deadline then
|
||||||
markMessageSeen model message
|
updateMarkMessageSeen model message
|
||||||
else
|
else
|
||||||
( model, Cmd.none, Session.none )
|
( model, Cmd.none, Session.none )
|
||||||
|
|
||||||
@@ -280,6 +221,76 @@ update session msg model =
|
|||||||
( model, Cmd.none, Session.none )
|
( model, Cmd.none, Session.none )
|
||||||
|
|
||||||
|
|
||||||
|
updateMessageResult : Model -> Message -> ( Model, Cmd Msg, Session.Msg )
|
||||||
|
updateMessageResult model message =
|
||||||
|
let
|
||||||
|
bodyMode =
|
||||||
|
if message.html == "" then
|
||||||
|
TextBody
|
||||||
|
else
|
||||||
|
model.bodyMode
|
||||||
|
|
||||||
|
updateMessage list message =
|
||||||
|
( { model
|
||||||
|
| state = ShowingMessage list { message = message, markSeenAt = Nothing }
|
||||||
|
, bodyMode = bodyMode
|
||||||
|
}
|
||||||
|
, Task.perform OpenedTime Time.now
|
||||||
|
, Session.none
|
||||||
|
)
|
||||||
|
in
|
||||||
|
case model.state of
|
||||||
|
LoadingList _ ->
|
||||||
|
( model, Cmd.none, Session.none )
|
||||||
|
|
||||||
|
ShowingList list _ ->
|
||||||
|
updateMessage list message
|
||||||
|
|
||||||
|
LoadingMessage list _ ->
|
||||||
|
updateMessage list message
|
||||||
|
|
||||||
|
ShowingMessage list _ ->
|
||||||
|
updateMessage list message
|
||||||
|
|
||||||
|
Transitioning list _ _ ->
|
||||||
|
updateMessage list message
|
||||||
|
|
||||||
|
|
||||||
|
updateSearch : Model -> String -> ( Model, Cmd Msg, Session.Msg )
|
||||||
|
updateSearch model searchInput =
|
||||||
|
let
|
||||||
|
updateList list =
|
||||||
|
{ list
|
||||||
|
| searchFilter =
|
||||||
|
if String.length searchInput > 1 then
|
||||||
|
String.toLower searchInput
|
||||||
|
else
|
||||||
|
""
|
||||||
|
}
|
||||||
|
|
||||||
|
updateModel state =
|
||||||
|
( { model | searchInput = searchInput, state = state }
|
||||||
|
, Cmd.none
|
||||||
|
, Session.none
|
||||||
|
)
|
||||||
|
in
|
||||||
|
case model.state of
|
||||||
|
LoadingList _ ->
|
||||||
|
( model, Cmd.none, Session.none )
|
||||||
|
|
||||||
|
ShowingList list selection ->
|
||||||
|
updateModel (ShowingList (updateList list) selection)
|
||||||
|
|
||||||
|
LoadingMessage list id ->
|
||||||
|
updateModel (LoadingMessage (updateList list) id)
|
||||||
|
|
||||||
|
ShowingMessage list visible ->
|
||||||
|
updateModel (ShowingMessage (updateList list) visible)
|
||||||
|
|
||||||
|
Transitioning list visible id ->
|
||||||
|
updateModel (Transitioning (updateList list) visible id)
|
||||||
|
|
||||||
|
|
||||||
updateSelected : Model -> MessageID -> Model
|
updateSelected : Model -> MessageID -> Model
|
||||||
updateSelected model id =
|
updateSelected model id =
|
||||||
case model.state of
|
case model.state of
|
||||||
@@ -297,21 +308,11 @@ updateSelected model id =
|
|||||||
model
|
model
|
||||||
|
|
||||||
|
|
||||||
getList : String -> Cmd Msg
|
updateDeleteMessage : Model -> Message -> ( Model, Cmd Msg, Session.Msg )
|
||||||
getList mailboxName =
|
updateDeleteMessage model message =
|
||||||
let
|
let
|
||||||
url =
|
url =
|
||||||
"/api/v1/mailbox/" ++ mailboxName
|
"/api/v1/mailbox/" ++ message.mailbox ++ "/" ++ message.id
|
||||||
in
|
|
||||||
Http.get url (Decode.list MessageHeader.decoder)
|
|
||||||
|> Http.send ListResult
|
|
||||||
|
|
||||||
|
|
||||||
deleteMessage : Model -> Message -> ( Model, Cmd Msg, Session.Msg )
|
|
||||||
deleteMessage model msg =
|
|
||||||
let
|
|
||||||
url =
|
|
||||||
"/api/v1/mailbox/" ++ msg.mailbox ++ "/" ++ msg.id
|
|
||||||
|
|
||||||
cmd =
|
cmd =
|
||||||
HttpUtil.delete url
|
HttpUtil.delete url
|
||||||
@@ -323,7 +324,7 @@ deleteMessage model msg =
|
|||||||
case model.state of
|
case model.state of
|
||||||
ShowingMessage list _ ->
|
ShowingMessage list _ ->
|
||||||
( { model
|
( { model
|
||||||
| state = ShowingList (filter (\x -> x.id /= msg.id) list) Nothing
|
| state = ShowingList (filter (\x -> x.id /= message.id) list) Nothing
|
||||||
}
|
}
|
||||||
, cmd
|
, cmd
|
||||||
, Session.none
|
, Session.none
|
||||||
@@ -333,18 +334,8 @@ deleteMessage model msg =
|
|||||||
( model, cmd, Session.none )
|
( model, cmd, Session.none )
|
||||||
|
|
||||||
|
|
||||||
getMessage : String -> MessageID -> Cmd Msg
|
updateMarkMessageSeen : Model -> Message -> ( Model, Cmd Msg, Session.Msg )
|
||||||
getMessage mailboxName id =
|
updateMarkMessageSeen model message =
|
||||||
let
|
|
||||||
url =
|
|
||||||
"/serve/m/" ++ mailboxName ++ "/" ++ id
|
|
||||||
in
|
|
||||||
Http.get url Message.decoder
|
|
||||||
|> Http.send MessageResult
|
|
||||||
|
|
||||||
|
|
||||||
markMessageSeen : Model -> Message -> ( Model, Cmd Msg, Session.Msg )
|
|
||||||
markMessageSeen model message =
|
|
||||||
case model.state of
|
case model.state of
|
||||||
ShowingMessage list visible ->
|
ShowingMessage list visible ->
|
||||||
let
|
let
|
||||||
@@ -387,6 +378,26 @@ markMessageSeen model message =
|
|||||||
( model, Cmd.none, Session.none )
|
( model, Cmd.none, Session.none )
|
||||||
|
|
||||||
|
|
||||||
|
getList : String -> Cmd Msg
|
||||||
|
getList mailboxName =
|
||||||
|
let
|
||||||
|
url =
|
||||||
|
"/api/v1/mailbox/" ++ mailboxName
|
||||||
|
in
|
||||||
|
Http.get url (Decode.list MessageHeader.decoder)
|
||||||
|
|> Http.send ListResult
|
||||||
|
|
||||||
|
|
||||||
|
getMessage : String -> MessageID -> Cmd Msg
|
||||||
|
getMessage mailboxName id =
|
||||||
|
let
|
||||||
|
url =
|
||||||
|
"/serve/m/" ++ mailboxName ++ "/" ++ id
|
||||||
|
in
|
||||||
|
Http.get url Message.decoder
|
||||||
|
|> Http.send MessageResult
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
-- VIEW
|
-- VIEW
|
||||||
|
|
||||||
@@ -445,18 +456,18 @@ messageList list selected =
|
|||||||
|
|
||||||
|
|
||||||
messageChip : Maybe MessageID -> MessageHeader -> Html Msg
|
messageChip : Maybe MessageID -> MessageHeader -> Html Msg
|
||||||
messageChip selected msg =
|
messageChip selected message =
|
||||||
div
|
div
|
||||||
[ classList
|
[ classList
|
||||||
[ ( "message-list-entry", True )
|
[ ( "message-list-entry", True )
|
||||||
, ( "selected", selected == Just msg.id )
|
, ( "selected", selected == Just message.id )
|
||||||
, ( "unseen", not msg.seen )
|
, ( "unseen", not message.seen )
|
||||||
]
|
]
|
||||||
, onClick (ClickMessage msg.id)
|
, onClick (ClickMessage message.id)
|
||||||
]
|
]
|
||||||
[ div [ class "subject" ] [ text msg.subject ]
|
[ div [ class "subject" ] [ text message.subject ]
|
||||||
, div [ class "from" ] [ text msg.from ]
|
, div [ class "from" ] [ text message.from ]
|
||||||
, div [ class "date" ] [ text msg.date ]
|
, div [ class "date" ] [ text message.date ]
|
||||||
]
|
]
|
||||||
|
|
||||||
|
|
||||||
@@ -561,11 +572,8 @@ filterMessageList list =
|
|||||||
list.headers
|
list.headers
|
||||||
else
|
else
|
||||||
let
|
let
|
||||||
searchFilter =
|
|
||||||
String.toLower list.searchFilter
|
|
||||||
|
|
||||||
matches header =
|
matches header =
|
||||||
String.contains searchFilter (String.toLower header.subject)
|
String.contains list.searchFilter (String.toLower header.subject)
|
||||||
|| String.contains searchFilter (String.toLower header.from)
|
|| String.contains list.searchFilter (String.toLower header.from)
|
||||||
in
|
in
|
||||||
List.filter matches list.headers
|
List.filter matches list.headers
|
||||||
|
|||||||
Reference in New Issue
Block a user