76 lines
1.4 KiB
Elm
76 lines
1.4 KiB
Elm
|
module Session exposing (Session, changes, cred, fromViewer, navKey, viewer)
|
||
|
|
||
|
import Api exposing (Cred)
|
||
|
import Avatar exposing (Avatar)
|
||
|
import Browser.Navigation as Nav
|
||
|
import Json.Decode as Decode exposing (Decoder)
|
||
|
import Json.Encode as Encode exposing (Value)
|
||
|
import Profile exposing (Profile)
|
||
|
import Time
|
||
|
import Viewer exposing (Viewer)
|
||
|
|
||
|
|
||
|
|
||
|
-- TYPES
|
||
|
|
||
|
|
||
|
type Session
|
||
|
= LoggedIn Nav.Key Viewer
|
||
|
| Guest Nav.Key
|
||
|
|
||
|
|
||
|
|
||
|
-- INFO
|
||
|
|
||
|
|
||
|
viewer : Session -> Maybe Viewer
|
||
|
viewer session =
|
||
|
case session of
|
||
|
LoggedIn _ val ->
|
||
|
Just val
|
||
|
|
||
|
Guest _ ->
|
||
|
Nothing
|
||
|
|
||
|
|
||
|
cred : Session -> Maybe Cred
|
||
|
cred session =
|
||
|
case session of
|
||
|
LoggedIn _ val ->
|
||
|
Just (Viewer.cred val)
|
||
|
|
||
|
Guest _ ->
|
||
|
Nothing
|
||
|
|
||
|
|
||
|
navKey : Session -> Nav.Key
|
||
|
navKey session =
|
||
|
case session of
|
||
|
LoggedIn key _ ->
|
||
|
key
|
||
|
|
||
|
Guest key ->
|
||
|
key
|
||
|
|
||
|
|
||
|
|
||
|
-- CHANGES
|
||
|
|
||
|
|
||
|
changes : (Session -> msg) -> Nav.Key -> Sub msg
|
||
|
changes toMsg key =
|
||
|
Api.viewerChanges (\maybeViewer -> toMsg (fromViewer key maybeViewer)) Viewer.decoder
|
||
|
|
||
|
|
||
|
fromViewer : Nav.Key -> Maybe Viewer -> Session
|
||
|
fromViewer key maybeViewer =
|
||
|
-- It's stored in localStorage as a JSON String;
|
||
|
-- first decode the Value as a String, then
|
||
|
-- decode that String as JSON.
|
||
|
case maybeViewer of
|
||
|
Just viewerVal ->
|
||
|
LoggedIn key viewerVal
|
||
|
|
||
|
Nothing ->
|
||
|
Guest key
|