1
0
mirror of https://github.com/jhillyerd/inbucket.git synced 2026-01-26 13:05:56 +00:00

ui: Add an Effect system to handle global state and Elm Cmds (#176)

All pages now leverage Effects for most of their Session and Cmd requests. More work required for routing and other lingering Cmd use.
This commit is contained in:
James Hillyerd
2020-09-12 19:45:14 -07:00
committed by GitHub
parent cf4c5a29bb
commit 2162a4caaa
8 changed files with 460 additions and 167 deletions

View File

@@ -5,6 +5,7 @@ import Browser.Navigation as Nav
import Data.MessageHeader as MessageHeader exposing (MessageHeader)
import Data.Session as Session exposing (Session)
import DateFormat as DF
import Effect exposing (Effect)
import Html
exposing
( Attribute
@@ -41,9 +42,9 @@ type alias Model =
}
init : Session -> ( Model, Cmd Msg )
init : Session -> ( Model, Effect Msg )
init session =
( Model session False [], Cmd.none )
( Model session False [], Effect.none )
@@ -58,20 +59,20 @@ type Msg
| MessageKeyPress MessageHeader Int
update : Msg -> Model -> ( Model, Cmd Msg )
update : Msg -> Model -> ( Model, Effect Msg )
update msg model =
case msg of
Connected True ->
( { model | connected = True, messages = [] }, Cmd.none )
( { model | connected = True, messages = [] }, Effect.none )
Connected False ->
( { model | connected = False }, Cmd.none )
( { model | connected = False }, Effect.none )
MessageReceived value ->
case D.decodeValue (MessageHeader.decoder |> D.at [ "detail" ]) value of
Ok header ->
( { model | messages = header :: List.take 500 model.messages }
, Cmd.none
, Effect.none
)
Err err ->
@@ -81,12 +82,10 @@ update msg model =
, table = [ ( "Error", D.errorToString err ) ]
}
in
( { model | session = Session.showFlash flash model.session }
, Cmd.none
)
( model, Effect.showFlash flash )
Clear ->
( { model | messages = [] }, Cmd.none )
( { model | messages = [] }, Effect.none )
OpenMessage header ->
openMessage header model
@@ -97,15 +96,16 @@ update msg model =
openMessage header model
_ ->
( model, Cmd.none )
( model, Effect.none )
openMessage : MessageHeader -> Model -> ( Model, Cmd Msg )
openMessage : MessageHeader -> Model -> ( Model, Effect Msg )
openMessage header model =
( model
, Route.Message header.mailbox header.id
|> model.session.router.toPath
|> Nav.replaceUrl model.session.key
|> Effect.wrap
)