1
0
mirror of https://github.com/jhillyerd/inbucket.git synced 2025-12-17 09:37:02 +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 , addRecent
, append , append
, batch , batch
, clearFlash
, deleteMessage , deleteMessage
, disableRouting , disableRouting
, enableRouting , enableRouting
, focusModal , focusModal
, focusModalResult
, getGreeting , getGreeting
, getHeaderList , getHeaderList
, getMessage , getMessage
@@ -64,6 +66,7 @@ type ApiEffect msg
type SessionEffect type SessionEffect
= FlashClear = FlashClear
| FlashShow Session.Flash | FlashShow Session.Flash
| ModalFocusResult Modal.Msg
| RecentAdd String | RecentAdd String
| RoutingDisable | RoutingDisable
| RoutingEnable | RoutingEnable
@@ -233,6 +236,9 @@ performSession ( session, effect ) =
FlashShow flash -> FlashShow flash ->
( Session.showFlash flash session, Cmd.none ) ( Session.showFlash flash session, Cmd.none )
ModalFocusResult result ->
( Modal.updateSession result session, Cmd.none )
RoutingDisable -> RoutingDisable ->
( Session.disableRouting session, Cmd.none ) ( Session.disableRouting session, Cmd.none )
@@ -283,6 +289,11 @@ focusModal toMsg =
ModalFocus toMsg ModalFocus toMsg
focusModalResult : Modal.Msg -> Effect msg
focusModalResult msg =
SessionEffect (ModalFocusResult msg)
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)

View File

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

View File

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