diff --git a/ui/src/Data/Session.elm b/ui/src/Data/Session.elm index c372059..5c38ed2 100644 --- a/ui/src/Data/Session.elm +++ b/ui/src/Data/Session.elm @@ -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 ) + ] diff --git a/ui/src/Main.elm b/ui/src/Main.elm index 4d55d13..97672e3 100644 --- a/ui/src/Main.elm +++ b/ui/src/Main.elm @@ -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. diff --git a/ui/src/Ports.elm b/ui/src/Ports.elm index 9d85612..f3506c1 100644 --- a/ui/src/Ports.elm +++ b/ui/src/Ports.elm @@ -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