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

ui: Convert Layout to use Effects

This commit is contained in:
James Hillyerd
2020-09-23 23:00:29 -07:00
parent e56365b9a0
commit 7c87649579
3 changed files with 31 additions and 40 deletions

View File

@@ -3,10 +3,12 @@ module Effect exposing
, addRecent
, append
, batch
, clearFlash
, deleteMessage
, disableRouting
, enableRouting
, focusModal
, focusModalResult
, getGreeting
, getHeaderList
, getMessage
@@ -64,6 +66,7 @@ type ApiEffect msg
type SessionEffect
= FlashClear
| FlashShow Session.Flash
| ModalFocusResult Modal.Msg
| RecentAdd String
| RoutingDisable
| RoutingEnable
@@ -233,6 +236,9 @@ performSession ( session, effect ) =
FlashShow flash ->
( Session.showFlash flash session, Cmd.none )
ModalFocusResult result ->
( Modal.updateSession result session, Cmd.none )
RoutingDisable ->
( Session.disableRouting session, Cmd.none )
@@ -283,6 +289,11 @@ focusModal toMsg =
ModalFocus toMsg
focusModalResult : Modal.Msg -> Effect msg
focusModalResult msg =
SessionEffect (ModalFocusResult msg)
deleteMessage : HttpResult msg -> String -> String -> Effect msg
deleteMessage toMsg mailboxName id =
ApiEffect (DeleteMessage toMsg mailboxName id)

View File

@@ -1,7 +1,7 @@
module Layout exposing (Model, Msg, Page(..), frame, init, reset, update)
import Browser.Navigation as Nav
import Data.Session as Session exposing (Session)
import Effect exposing (Effect)
import Html
exposing
( Attribute
@@ -39,7 +39,7 @@ import Html.Attributes
)
import Html.Events as Events
import Modal
import Route exposing (Route)
import Route
import Timer exposing (Timer)
@@ -96,46 +96,31 @@ type Msg
| RecentMenuToggled
update : Msg -> Model msg -> Session -> ( Model msg, Session, Cmd msg )
update msg model session =
update : Msg -> Model msg -> ( Model msg, Effect msg )
update msg model =
case msg of
ClearFlash ->
( model
, Session.clearFlash session
, Cmd.none
)
( model, Effect.clearFlash )
MainMenuToggled ->
( { model | mainMenuVisible = not model.mainMenuVisible }
, session
, Cmd.none
)
( { model | mainMenuVisible = not model.mainMenuVisible }, Effect.none )
ModalFocused message ->
( model
, Modal.updateSession message session
, Cmd.none
)
( model, Effect.focusModalResult message )
ModalUnfocused ->
( model, session, Modal.resetFocusCmd (ModalFocused >> model.mapMsg) )
( model, Effect.focusModal (ModalFocused >> model.mapMsg) )
OnMailboxNameInput name ->
( { model | mailboxName = name }
, session
, Cmd.none
)
( { model | mailboxName = name }, Effect.none )
OpenMailbox ->
if model.mailboxName == "" then
( model, session, Cmd.none )
( model, Effect.none )
else
( model
, session
, Route.Mailbox model.mailboxName
|> session.router.toPath
|> Nav.pushUrl session.key
, Effect.navigateRoute True (Route.Mailbox model.mailboxName)
)
RecentMenuMouseOver ->
@@ -143,20 +128,19 @@ update msg model session =
| recentMenuVisible = True
, recentMenuTimer = Timer.cancel model.recentMenuTimer
}
, session
, Cmd.none
, Effect.none
)
RecentMenuMouseOut ->
let
-- Keep the recent menu open for a moment even if the mouse leaves it.
newTimer =
Timer.replace model.recentMenuTimer
in
( { model
| recentMenuTimer = newTimer
}
, session
, Timer.schedule (RecentMenuTimeout >> model.mapMsg) newTimer 400
, Effect.schedule (RecentMenuTimeout >> model.mapMsg) newTimer 400
)
RecentMenuTimeout timer ->
@@ -165,18 +149,16 @@ update msg model session =
| recentMenuVisible = False
, recentMenuTimer = Timer.cancel timer
}
, session
, Cmd.none
, Effect.none
)
else
-- Timer was no longer valid.
( model, session, Cmd.none )
( model, Effect.none )
RecentMenuToggled ->
( { model | recentMenuVisible = not model.recentMenuVisible }
, session
, Cmd.none
, Effect.none
)

View File

@@ -199,12 +199,10 @@ updateMain msg model session =
LayoutMsg subMsg ->
let
( layout, newSession, cmd ) =
Layout.update subMsg model.layout session
( layout, effect ) =
Layout.update subMsg model.layout
in
( updateSession { model | layout = layout } newSession
, cmd
)
( { model | layout = layout }, effect ) |> performEffects
_ ->
updatePage msg model |> performEffects