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

ui: Add session update logic into Session

This commit is contained in:
James Hillyerd
2018-11-23 13:57:42 -08:00
parent e71377f966
commit 0f9585a52b
3 changed files with 57 additions and 46 deletions

View File

@@ -10,8 +10,10 @@ module Data.Session exposing
)
import Browser.Navigation as Nav
import Json.Decode exposing (..)
import Json.Decode as D
import Json.Decode.Pipeline exposing (..)
import Json.Encode as E
import Ports
import Url exposing (Url)
@@ -43,40 +45,51 @@ init key location persistent =
Session key location.host "" True persistent
update : Msg -> Session -> Session
update : Msg -> Session -> ( Session, Cmd a )
update msg session =
case msg of
None ->
session
let
newSession =
case msg of
None ->
session
SetFlash flash ->
{ session | flash = flash }
SetFlash flash ->
{ session | flash = flash }
ClearFlash ->
{ session | flash = "" }
ClearFlash ->
{ session | flash = "" }
DisableRouting ->
{ session | routing = False }
DisableRouting ->
{ session | routing = False }
EnableRouting ->
{ session | routing = True }
EnableRouting ->
{ session | routing = True }
AddRecent mailbox ->
if List.head session.persistent.recentMailboxes == Just mailbox then
session
AddRecent mailbox ->
if List.head session.persistent.recentMailboxes == Just mailbox then
session
else
let
recent =
session.persistent.recentMailboxes
|> List.filter ((/=) mailbox)
|> List.take 7
|> (::) mailbox
else
let
recent =
session.persistent.recentMailboxes
|> List.filter ((/=) mailbox)
|> List.take 7
|> (::) mailbox
persistent =
session.persistent
in
{ session | persistent = { persistent | recentMailboxes = recent } }
persistent =
session.persistent
in
{ session | persistent = { persistent | recentMailboxes = recent } }
in
if session.persistent == newSession.persistent then
-- No change
( newSession, Cmd.none )
else
( newSession
, Ports.storeSession (encode newSession.persistent)
)
none : Msg
@@ -84,12 +97,19 @@ none =
None
decoder : Decoder Persistent
decoder : D.Decoder Persistent
decoder =
succeed Persistent
|> optional "recentMailboxes" (list string) []
D.succeed Persistent
|> optional "recentMailboxes" (D.list D.string) []
decodeValueWithDefault : Value -> Persistent
decodeValueWithDefault : D.Value -> Persistent
decodeValueWithDefault =
decodeValue decoder >> Result.withDefault { recentMailboxes = [] }
D.decodeValue decoder >> Result.withDefault { recentMailboxes = [] }
encode : Persistent -> E.Value
encode persistent =
E.object
[ ( "recentMailboxes", E.list E.string persistent.recentMailboxes )
]

View File

@@ -224,20 +224,12 @@ changeRouteTo route model =
updateSession : ( Model, Cmd Msg, Session.Msg ) -> ( Model, Cmd Msg )
updateSession ( model, cmd, sessionMsg ) =
let
session =
( session, newCmd ) =
Session.update sessionMsg model.session
newModel =
{ model | session = session }
in
if session.persistent == model.session.persistent then
-- No change
( newModel, cmd )
else
( newModel
, Cmd.batch [ cmd, Ports.storeSession session.persistent ]
)
( { model | session = session }
, Cmd.batch [ newCmd, cmd ]
)
{-| Map page updates to Main Model and Msg types.

View File

@@ -5,7 +5,6 @@ port module Ports exposing
, storeSession
)
import Data.Session exposing (Persistent)
import Json.Encode exposing (Value)
@@ -18,4 +17,4 @@ port monitorMessage : (Value -> msg) -> Sub msg
port onSessionChange : (Value -> msg) -> Sub msg
port storeSession : Persistent -> Cmd msg
port storeSession : Value -> Cmd msg