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

Effects refactor continued (#177)

* Use Effects instead of replaceUrl in Mailbox
* Add Effect.navigateRoute to handle monitor message clicks
* Add a focusModal effect for mailbox purge
* Remove temporary Cmd wrapper Effect
This commit is contained in:
James Hillyerd
2020-09-13 17:08:11 -07:00
committed by GitHub
parent 8adfd82232
commit 5c5b0f819b
3 changed files with 77 additions and 53 deletions

View File

@@ -5,6 +5,7 @@ module Effect exposing
, deleteMessage , deleteMessage
, disableRouting , disableRouting
, enableRouting , enableRouting
, focusModal
, getGreeting , getGreeting
, getHeaderList , getHeaderList
, getMessage , getMessage
@@ -12,21 +13,25 @@ module Effect exposing
, getServerMetrics , getServerMetrics
, map , map
, markMessageSeen , markMessageSeen
, navigateRoute
, none , none
, perform , perform
, posixTime , posixTime
, purgeMailbox , purgeMailbox
, schedule , schedule
, showFlash , showFlash
, wrap , updateRoute
) )
import Api exposing (DataResult, HttpResult) import Api exposing (DataResult, HttpResult)
import Browser.Navigation as Nav
import Data.Message exposing (Message) import Data.Message exposing (Message)
import Data.MessageHeader exposing (MessageHeader) import Data.MessageHeader exposing (MessageHeader)
import Data.Metrics exposing (Metrics) import Data.Metrics exposing (Metrics)
import Data.ServerConfig exposing (ServerConfig) import Data.ServerConfig exposing (ServerConfig)
import Data.Session as Session exposing (Session) import Data.Session as Session exposing (Session)
import Modal
import Route exposing (Route)
import Task import Task
import Time import Time
import Timer exposing (Timer) import Timer exposing (Timer)
@@ -34,11 +39,13 @@ import Timer exposing (Timer)
type Effect msg type Effect msg
= None = None
| Batch (List (Effect msg))
| Command (Cmd msg)
| PosixTime (Time.Posix -> msg)
| ScheduleTimer (Timer -> msg) Timer Float
| ApiEffect (ApiEffect msg) | ApiEffect (ApiEffect msg)
| Batch (List (Effect msg))
| ModalFocus (Modal.Msg -> msg)
| PosixTime (Time.Posix -> msg)
| RouteNavigate Bool Route
| RouteUpdate Route
| ScheduleTimer (Timer -> msg) Timer Float
| SessionEffect SessionEffect | SessionEffect SessionEffect
@@ -79,8 +86,8 @@ map f effect =
Batch effects -> Batch effects ->
Batch <| List.map (map f) effects Batch <| List.map (map f) effects
Command cmd -> ModalFocus toMsg ->
Command <| Cmd.map f cmd ModalFocus <| toMsg >> f
PosixTime toMsg -> PosixTime toMsg ->
PosixTime <| toMsg >> f PosixTime <| toMsg >> f
@@ -88,6 +95,12 @@ map f effect =
ScheduleTimer toMsg timer millis -> ScheduleTimer toMsg timer millis ->
ScheduleTimer (toMsg >> f) timer millis ScheduleTimer (toMsg >> f) timer millis
RouteNavigate pushHistory route ->
RouteNavigate pushHistory route
RouteUpdate route ->
RouteUpdate route
ApiEffect apiEffect -> ApiEffect apiEffect ->
ApiEffect <| mapApi f apiEffect ApiEffect <| mapApi f apiEffect
@@ -135,8 +148,8 @@ perform ( session, effect ) =
List.foldl batchPerform ( session, [] ) effects List.foldl batchPerform ( session, [] ) effects
|> Tuple.mapSecond Cmd.batch |> Tuple.mapSecond Cmd.batch
Command cmd -> ModalFocus toMsg ->
( session, cmd ) ( session, Modal.resetFocusCmd toMsg )
PosixTime toMsg -> PosixTime toMsg ->
( session, Task.perform toMsg Time.now ) ( session, Task.perform toMsg Time.now )
@@ -144,6 +157,27 @@ perform ( session, effect ) =
ScheduleTimer toMsg timer millis -> ScheduleTimer toMsg timer millis ->
( session, Timer.schedule toMsg timer millis ) ( session, Timer.schedule toMsg timer millis )
RouteNavigate pushHistory route ->
let
url =
-- TODO replace Session.router
session.router.toPath route
in
( Session.enableRouting session
, if pushHistory then
Nav.pushUrl session.key url
else
Nav.replaceUrl session.key url
)
RouteUpdate route ->
( Session.disableRouting session
, -- TODO replace Session.router
session.router.toPath route
|> Nav.replaceUrl session.key
)
ApiEffect apiEffect -> ApiEffect apiEffect ->
performApi ( session, apiEffect ) performApi ( session, apiEffect )
@@ -234,6 +268,13 @@ showFlash flash =
SessionEffect (FlashShow flash) SessionEffect (FlashShow flash)
{-| Locks focus to the `modal-dialog` dom ID.
-}
focusModal : (Modal.Msg -> msg) -> Effect msg
focusModal toMsg =
ModalFocus toMsg
deleteMessage : HttpResult msg -> String -> String -> Effect msg deleteMessage : HttpResult msg -> String -> String -> Effect msg
deleteMessage toMsg mailboxName id = deleteMessage toMsg mailboxName id =
ApiEffect (DeleteMessage toMsg mailboxName id) ApiEffect (DeleteMessage toMsg mailboxName id)
@@ -286,12 +327,20 @@ schedule toMsg timer millis =
ScheduleTimer toMsg timer millis ScheduleTimer toMsg timer millis
{-| Wrap a Cmd into an Effect. This is a temporary function to aid in the transition to the effect {-| Updates the browsers displayed URL to the specified route, and triggers the route to be
pattern. handled by the frontend.
-} -}
wrap : Cmd msg -> Effect msg navigateRoute : Bool -> Route -> Effect msg
wrap cmd = navigateRoute pushHistory route =
Command cmd RouteNavigate pushHistory route
{-| Updates the browsers displayed URL to the specified route. Does not trigger our own route
handling.
-}
updateRoute : Route -> Effect msg
updateRoute route =
RouteUpdate route

View File

@@ -1,7 +1,6 @@
module Page.Mailbox exposing (Model, Msg, init, subscriptions, update, view) module Page.Mailbox exposing (Model, Msg, init, subscriptions, update, view)
import Api import Api
import Browser.Navigation as Nav
import Data.Message as Message exposing (Message) import Data.Message as Message exposing (Message)
import Data.MessageHeader exposing (MessageHeader) import Data.MessageHeader exposing (MessageHeader)
import Data.Session exposing (Session) import Data.Session exposing (Session)
@@ -161,11 +160,7 @@ update msg model =
( updateSelected model id ( updateSelected model id
, Effect.batch , Effect.batch
[ -- Update browser location. [ -- Update browser location.
Effect.disableRouting Effect.updateRoute (Route.Message model.mailboxName id)
, Route.Message model.mailboxName id
|> model.session.router.toPath
|> Nav.replaceUrl model.session.key
|> Effect.wrap
, Effect.getMessage MessageLoaded model.mailboxName id , Effect.getMessage MessageLoaded model.mailboxName id
] ]
) )
@@ -241,7 +236,7 @@ update msg model =
updateSearchInput model searchInput updateSearchInput model searchInput
PurgeMailboxPrompt -> PurgeMailboxPrompt ->
( { model | promptPurge = True }, Modal.resetFocusCmd ModalFocused |> Effect.wrap ) ( { model | promptPurge = True }, Effect.focusModal ModalFocused )
PurgeMailboxCanceled -> PurgeMailboxCanceled ->
( { model | promptPurge = False }, Effect.none ) ( { model | promptPurge = False }, Effect.none )
@@ -305,28 +300,16 @@ updateMessageResult model message =
-} -}
updateTriggerPurge : Model -> ( Model, Effect Msg ) updateTriggerPurge : Model -> ( Model, Effect Msg )
updateTriggerPurge model = updateTriggerPurge model =
let
effects =
Effect.batch
[ Route.Mailbox model.mailboxName
|> model.session.router.toPath
|> Nav.replaceUrl model.session.key
|> Effect.wrap
, Effect.purgeMailbox PurgedMailbox model.mailboxName
]
in
case model.state of
ShowingList _ _ ->
( { model ( { model
| promptPurge = False | promptPurge = False
, state = ShowingList (MessageList [] Nothing "") NoMessage , state = ShowingList (MessageList [] Nothing "") NoMessage
} }
, Effect.batch [ Effect.disableRouting, effects ] , Effect.batch
[ Effect.updateRoute (Route.Mailbox model.mailboxName)
, Effect.purgeMailbox PurgedMailbox model.mailboxName
]
) )
_ ->
( model, effects )
updateSearchInput : Model -> String -> ( Model, Effect Msg ) updateSearchInput : Model -> String -> ( Model, Effect Msg )
updateSearchInput model searchInput = updateSearchInput model searchInput =
@@ -390,11 +373,7 @@ updateDeleteMessage model message =
( { model | state = ShowingList (filter (\x -> x.id /= message.id) list) NoMessage } ( { model | state = ShowingList (filter (\x -> x.id /= message.id) list) NoMessage }
, Effect.batch , Effect.batch
[ Effect.deleteMessage DeletedMessage message.mailbox message.id [ Effect.deleteMessage DeletedMessage message.mailbox message.id
, Effect.disableRouting , Effect.updateRoute (Route.Mailbox model.mailboxName)
, Route.Mailbox model.mailboxName
|> model.session.router.toPath
|> Nav.replaceUrl model.session.key
|> Effect.wrap
] ]
) )

View File

@@ -1,9 +1,8 @@
module Page.Monitor exposing (Model, Msg, init, update, view) module Page.Monitor exposing (Model, Msg, init, update, view)
import Api import Api
import Browser.Navigation as Nav
import Data.MessageHeader as MessageHeader exposing (MessageHeader) import Data.MessageHeader as MessageHeader exposing (MessageHeader)
import Data.Session as Session exposing (Session) import Data.Session exposing (Session)
import DateFormat as DF import DateFormat as DF
import Effect exposing (Effect) import Effect exposing (Effect)
import Html import Html
@@ -102,10 +101,7 @@ update msg model =
openMessage : MessageHeader -> Model -> ( Model, Effect Msg ) openMessage : MessageHeader -> Model -> ( Model, Effect Msg )
openMessage header model = openMessage header model =
( model ( model
, Route.Message header.mailbox header.id , Effect.navigateRoute True (Route.Message header.mailbox header.id)
|> model.session.router.toPath
|> Nav.replaceUrl model.session.key
|> Effect.wrap
) )