Add part2, clean up part1 some

This commit is contained in:
Richard Feldman
2018-08-05 07:19:09 -04:00
parent c247c24a23
commit 2163df4cb3
53 changed files with 5419 additions and 72 deletions

View 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
}