Files
elm-0.19-workshop/advanced/part1/src/Session.elm
Richard Feldman d57dec1681 Rename more stuff
2018-08-05 04:49:15 -04:00

99 lines
1.5 KiB
Elm

port module Session
exposing
( Session
, changes
, cred
, decode
, login
, logout
, navKey
, viewer
)
import Browser.Navigation as Nav
import Json.Decode as Decode exposing (Decoder)
import Json.Decode.Pipeline exposing (custom, required)
import Json.Encode as Encode exposing (Value)
import Profile exposing (Profile)
import Time
import Viewer exposing (Viewer)
import Viewer.Cred as Cred exposing (Cred)
-- TYPES
type Session
= Session Internals
type alias Internals =
{ navKey : Nav.Key
, viewer : Maybe Viewer
}
-- INFO
viewer : Session -> Maybe Viewer
viewer (Session info) =
info.viewer
cred : Session -> Maybe Cred
cred (Session info) =
Maybe.map Viewer.cred info.viewer
navKey : Session -> Nav.Key
navKey (Session info) =
info.navKey
-- LOGIN
login : Viewer -> Cmd msg
login newViewer =
Viewer.encode newViewer
|> Encode.encode 0
|> Just
|> storeSession
-- LOGOUT
logout : Cmd msg
logout =
storeSession Nothing
port storeSession : Maybe String -> Cmd msg
-- CHANGES
changes : (Session -> msg) -> Nav.Key -> Sub msg
changes toMsg key =
onSessionChange (decode key)
|> Sub.map toMsg
port onSessionChange : (Value -> msg) -> Sub msg
decode : Nav.Key -> Value -> Session
decode key value =
Session
{ viewer = Result.toMaybe (Decode.decodeValue Viewer.decoder value)
, navKey = key
}