Add part5
This commit is contained in:
98
advanced/part5/src/Session.elm
Normal file
98
advanced/part5/src/Session.elm
Normal file
@@ -0,0 +1,98 @@
|
||||
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
|
||||
}
|
||||
Reference in New Issue
Block a user