1
0
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:
James Hillyerd
2018-11-04 19:09:12 -08:00
parent f0b4dda8e6
commit 352e8c396d

View File

@@ -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