Update some advanced/ stuff
This commit is contained in:
@@ -1,7 +1,7 @@
|
|||||||
Advanced Elm Workshop
|
Advanced Elm Workshop
|
||||||
=====================
|
=====================
|
||||||
|
|
||||||
If you haven't already, follow the [Getting Started instructions](https://github.com/rtfeldman/elm-0.19-workshop/blob/master/intro/README.md
|
If you haven't already, follow the [Getting Started instructions](https://github.com/rtfeldman/elm-0.19-workshop/blob/master/README.md
|
||||||
) at the root of this repository, then continue here!
|
) at the root of this repository, then continue here!
|
||||||
|
|
||||||
## Start the server
|
## Start the server
|
||||||
|
|||||||
@@ -25,13 +25,8 @@ import Viewer.Cred as Cred exposing (Cred)
|
|||||||
|
|
||||||
|
|
||||||
type Session
|
type Session
|
||||||
= Session Internals
|
= LoggedIn Nav.Key Viewer
|
||||||
|
| Guest Nav.Key
|
||||||
|
|
||||||
type alias Internals =
|
|
||||||
{ navKey : Nav.Key
|
|
||||||
, viewer : Maybe Viewer
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
@@ -39,18 +34,28 @@ type alias Internals =
|
|||||||
|
|
||||||
|
|
||||||
viewer : Session -> Maybe Viewer
|
viewer : Session -> Maybe Viewer
|
||||||
viewer (Session info) =
|
viewer session =
|
||||||
info.viewer
|
case session of
|
||||||
|
LoggedIn _ val ->
|
||||||
|
Just val
|
||||||
|
|
||||||
|
Guest _ ->
|
||||||
|
Nothing
|
||||||
|
|
||||||
|
|
||||||
cred : Session -> Maybe Cred
|
cred : Session -> Maybe Cred
|
||||||
cred (Session info) =
|
cred session =
|
||||||
Maybe.map Viewer.cred info.viewer
|
Maybe.map Viewer.cred (viewer session)
|
||||||
|
|
||||||
|
|
||||||
navKey : Session -> Nav.Key
|
navKey : Session -> Nav.Key
|
||||||
navKey (Session info) =
|
navKey session =
|
||||||
info.navKey
|
case session of
|
||||||
|
LoggedIn key _ ->
|
||||||
|
key
|
||||||
|
|
||||||
|
Guest key ->
|
||||||
|
key
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
@@ -83,8 +88,7 @@ port storeSession : Maybe String -> Cmd msg
|
|||||||
|
|
||||||
changes : (Session -> msg) -> Nav.Key -> Sub msg
|
changes : (Session -> msg) -> Nav.Key -> Sub msg
|
||||||
changes toMsg key =
|
changes toMsg key =
|
||||||
onSessionChange (decode key)
|
onSessionChange (\val -> toMsg (decode key val))
|
||||||
|> Sub.map toMsg
|
|
||||||
|
|
||||||
|
|
||||||
port onSessionChange : (Value -> msg) -> Sub msg
|
port onSessionChange : (Value -> msg) -> Sub msg
|
||||||
@@ -92,7 +96,16 @@ port onSessionChange : (Value -> msg) -> Sub msg
|
|||||||
|
|
||||||
decode : Nav.Key -> Value -> Session
|
decode : Nav.Key -> Value -> Session
|
||||||
decode key value =
|
decode key value =
|
||||||
Session
|
-- It's stored in localStorage as a JSON String;
|
||||||
{ viewer = Result.toMaybe (Decode.decodeValue Viewer.decoder value)
|
-- first decode the Value as a String, then
|
||||||
, navKey = key
|
-- decode that String as JSON.
|
||||||
}
|
case
|
||||||
|
Decode.decodeValue Decode.string value
|
||||||
|
|> Result.andThen (Decode.decodeString Viewer.decoder)
|
||||||
|
|> Result.toMaybe
|
||||||
|
of
|
||||||
|
Just decodedViewer ->
|
||||||
|
LoggedIn key decodedViewer
|
||||||
|
|
||||||
|
Nothing ->
|
||||||
|
Guest key
|
||||||
|
|||||||
@@ -25,13 +25,8 @@ import Viewer.Cred as Cred exposing (Cred)
|
|||||||
|
|
||||||
|
|
||||||
type Session
|
type Session
|
||||||
= Session Internals
|
= LoggedIn Nav.Key Viewer
|
||||||
|
| Guest Nav.Key
|
||||||
|
|
||||||
type alias Internals =
|
|
||||||
{ navKey : Nav.Key
|
|
||||||
, viewer : Maybe Viewer
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
@@ -39,18 +34,28 @@ type alias Internals =
|
|||||||
|
|
||||||
|
|
||||||
viewer : Session -> Maybe Viewer
|
viewer : Session -> Maybe Viewer
|
||||||
viewer (Session info) =
|
viewer session =
|
||||||
info.viewer
|
case session of
|
||||||
|
LoggedIn _ val ->
|
||||||
|
Just val
|
||||||
|
|
||||||
|
Guest _ ->
|
||||||
|
Nothing
|
||||||
|
|
||||||
|
|
||||||
cred : Session -> Maybe Cred
|
cred : Session -> Maybe Cred
|
||||||
cred (Session info) =
|
cred session =
|
||||||
Maybe.map Viewer.cred info.viewer
|
Maybe.map Viewer.cred (viewer session)
|
||||||
|
|
||||||
|
|
||||||
navKey : Session -> Nav.Key
|
navKey : Session -> Nav.Key
|
||||||
navKey (Session info) =
|
navKey session =
|
||||||
info.navKey
|
case session of
|
||||||
|
LoggedIn key _ ->
|
||||||
|
key
|
||||||
|
|
||||||
|
Guest key ->
|
||||||
|
key
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
@@ -83,8 +88,7 @@ port storeSession : Maybe String -> Cmd msg
|
|||||||
|
|
||||||
changes : (Session -> msg) -> Nav.Key -> Sub msg
|
changes : (Session -> msg) -> Nav.Key -> Sub msg
|
||||||
changes toMsg key =
|
changes toMsg key =
|
||||||
onSessionChange (decode key)
|
onSessionChange (\val -> toMsg (decode key val))
|
||||||
|> Sub.map toMsg
|
|
||||||
|
|
||||||
|
|
||||||
port onSessionChange : (Value -> msg) -> Sub msg
|
port onSessionChange : (Value -> msg) -> Sub msg
|
||||||
@@ -92,7 +96,16 @@ port onSessionChange : (Value -> msg) -> Sub msg
|
|||||||
|
|
||||||
decode : Nav.Key -> Value -> Session
|
decode : Nav.Key -> Value -> Session
|
||||||
decode key value =
|
decode key value =
|
||||||
Session
|
-- It's stored in localStorage as a JSON String;
|
||||||
{ viewer = Result.toMaybe (Decode.decodeValue Viewer.decoder value)
|
-- first decode the Value as a String, then
|
||||||
, navKey = key
|
-- decode that String as JSON.
|
||||||
}
|
case
|
||||||
|
Decode.decodeValue Decode.string value
|
||||||
|
|> Result.andThen (Decode.decodeString Viewer.decoder)
|
||||||
|
|> Result.toMaybe
|
||||||
|
of
|
||||||
|
Just decodedViewer ->
|
||||||
|
LoggedIn key decodedViewer
|
||||||
|
|
||||||
|
Nothing ->
|
||||||
|
Guest key
|
||||||
|
|||||||
@@ -25,13 +25,8 @@ import Viewer.Cred as Cred exposing (Cred)
|
|||||||
|
|
||||||
|
|
||||||
type Session
|
type Session
|
||||||
= Session Internals
|
= LoggedIn Nav.Key Viewer
|
||||||
|
| Guest Nav.Key
|
||||||
|
|
||||||
type alias Internals =
|
|
||||||
{ navKey : Nav.Key
|
|
||||||
, viewer : Maybe Viewer
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
@@ -39,18 +34,28 @@ type alias Internals =
|
|||||||
|
|
||||||
|
|
||||||
viewer : Session -> Maybe Viewer
|
viewer : Session -> Maybe Viewer
|
||||||
viewer (Session info) =
|
viewer session =
|
||||||
info.viewer
|
case session of
|
||||||
|
LoggedIn _ val ->
|
||||||
|
Just val
|
||||||
|
|
||||||
|
Guest _ ->
|
||||||
|
Nothing
|
||||||
|
|
||||||
|
|
||||||
cred : Session -> Maybe Cred
|
cred : Session -> Maybe Cred
|
||||||
cred (Session info) =
|
cred session =
|
||||||
Maybe.map Viewer.cred info.viewer
|
Maybe.map Viewer.cred (viewer session)
|
||||||
|
|
||||||
|
|
||||||
navKey : Session -> Nav.Key
|
navKey : Session -> Nav.Key
|
||||||
navKey (Session info) =
|
navKey session =
|
||||||
info.navKey
|
case session of
|
||||||
|
LoggedIn key _ ->
|
||||||
|
key
|
||||||
|
|
||||||
|
Guest key ->
|
||||||
|
key
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
@@ -83,8 +88,7 @@ port storeSession : Maybe String -> Cmd msg
|
|||||||
|
|
||||||
changes : (Session -> msg) -> Nav.Key -> Sub msg
|
changes : (Session -> msg) -> Nav.Key -> Sub msg
|
||||||
changes toMsg key =
|
changes toMsg key =
|
||||||
onSessionChange (decode key)
|
onSessionChange (\val -> toMsg (decode key val))
|
||||||
|> Sub.map toMsg
|
|
||||||
|
|
||||||
|
|
||||||
port onSessionChange : (Value -> msg) -> Sub msg
|
port onSessionChange : (Value -> msg) -> Sub msg
|
||||||
@@ -92,7 +96,16 @@ port onSessionChange : (Value -> msg) -> Sub msg
|
|||||||
|
|
||||||
decode : Nav.Key -> Value -> Session
|
decode : Nav.Key -> Value -> Session
|
||||||
decode key value =
|
decode key value =
|
||||||
Session
|
-- It's stored in localStorage as a JSON String;
|
||||||
{ viewer = Result.toMaybe (Decode.decodeValue Viewer.decoder value)
|
-- first decode the Value as a String, then
|
||||||
, navKey = key
|
-- decode that String as JSON.
|
||||||
}
|
case
|
||||||
|
Decode.decodeValue Decode.string value
|
||||||
|
|> Result.andThen (Decode.decodeString Viewer.decoder)
|
||||||
|
|> Result.toMaybe
|
||||||
|
of
|
||||||
|
Just decodedViewer ->
|
||||||
|
LoggedIn key decodedViewer
|
||||||
|
|
||||||
|
Nothing ->
|
||||||
|
Guest key
|
||||||
|
|||||||
@@ -25,13 +25,8 @@ import Viewer.Cred as Cred exposing (Cred)
|
|||||||
|
|
||||||
|
|
||||||
type Session
|
type Session
|
||||||
= Session Internals
|
= LoggedIn Nav.Key Viewer
|
||||||
|
| Guest Nav.Key
|
||||||
|
|
||||||
type alias Internals =
|
|
||||||
{ navKey : Nav.Key
|
|
||||||
, viewer : Maybe Viewer
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
@@ -39,18 +34,28 @@ type alias Internals =
|
|||||||
|
|
||||||
|
|
||||||
viewer : Session -> Maybe Viewer
|
viewer : Session -> Maybe Viewer
|
||||||
viewer (Session info) =
|
viewer session =
|
||||||
info.viewer
|
case session of
|
||||||
|
LoggedIn _ val ->
|
||||||
|
Just val
|
||||||
|
|
||||||
|
Guest _ ->
|
||||||
|
Nothing
|
||||||
|
|
||||||
|
|
||||||
cred : Session -> Maybe Cred
|
cred : Session -> Maybe Cred
|
||||||
cred (Session info) =
|
cred session =
|
||||||
Maybe.map Viewer.cred info.viewer
|
Maybe.map Viewer.cred (viewer session)
|
||||||
|
|
||||||
|
|
||||||
navKey : Session -> Nav.Key
|
navKey : Session -> Nav.Key
|
||||||
navKey (Session info) =
|
navKey session =
|
||||||
info.navKey
|
case session of
|
||||||
|
LoggedIn key _ ->
|
||||||
|
key
|
||||||
|
|
||||||
|
Guest key ->
|
||||||
|
key
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
@@ -83,8 +88,7 @@ port storeSession : Maybe String -> Cmd msg
|
|||||||
|
|
||||||
changes : (Session -> msg) -> Nav.Key -> Sub msg
|
changes : (Session -> msg) -> Nav.Key -> Sub msg
|
||||||
changes toMsg key =
|
changes toMsg key =
|
||||||
onSessionChange (decode key)
|
onSessionChange (\val -> toMsg (decode key val))
|
||||||
|> Sub.map toMsg
|
|
||||||
|
|
||||||
|
|
||||||
port onSessionChange : (Value -> msg) -> Sub msg
|
port onSessionChange : (Value -> msg) -> Sub msg
|
||||||
@@ -92,7 +96,16 @@ port onSessionChange : (Value -> msg) -> Sub msg
|
|||||||
|
|
||||||
decode : Nav.Key -> Value -> Session
|
decode : Nav.Key -> Value -> Session
|
||||||
decode key value =
|
decode key value =
|
||||||
Session
|
-- It's stored in localStorage as a JSON String;
|
||||||
{ viewer = Result.toMaybe (Decode.decodeValue Viewer.decoder value)
|
-- first decode the Value as a String, then
|
||||||
, navKey = key
|
-- decode that String as JSON.
|
||||||
}
|
case
|
||||||
|
Decode.decodeValue Decode.string value
|
||||||
|
|> Result.andThen (Decode.decodeString Viewer.decoder)
|
||||||
|
|> Result.toMaybe
|
||||||
|
of
|
||||||
|
Just decodedViewer ->
|
||||||
|
LoggedIn key decodedViewer
|
||||||
|
|
||||||
|
Nothing ->
|
||||||
|
Guest key
|
||||||
|
|||||||
@@ -25,13 +25,8 @@ import Viewer.Cred as Cred exposing (Cred)
|
|||||||
|
|
||||||
|
|
||||||
type Session
|
type Session
|
||||||
= Session Internals
|
= LoggedIn Nav.Key Viewer
|
||||||
|
| Guest Nav.Key
|
||||||
|
|
||||||
type alias Internals =
|
|
||||||
{ navKey : Nav.Key
|
|
||||||
, viewer : Maybe Viewer
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
@@ -39,18 +34,28 @@ type alias Internals =
|
|||||||
|
|
||||||
|
|
||||||
viewer : Session -> Maybe Viewer
|
viewer : Session -> Maybe Viewer
|
||||||
viewer (Session info) =
|
viewer session =
|
||||||
info.viewer
|
case session of
|
||||||
|
LoggedIn _ val ->
|
||||||
|
Just val
|
||||||
|
|
||||||
|
Guest _ ->
|
||||||
|
Nothing
|
||||||
|
|
||||||
|
|
||||||
cred : Session -> Maybe Cred
|
cred : Session -> Maybe Cred
|
||||||
cred (Session info) =
|
cred session =
|
||||||
Maybe.map Viewer.cred info.viewer
|
Maybe.map Viewer.cred (viewer session)
|
||||||
|
|
||||||
|
|
||||||
navKey : Session -> Nav.Key
|
navKey : Session -> Nav.Key
|
||||||
navKey (Session info) =
|
navKey session =
|
||||||
info.navKey
|
case session of
|
||||||
|
LoggedIn key _ ->
|
||||||
|
key
|
||||||
|
|
||||||
|
Guest key ->
|
||||||
|
key
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
@@ -83,8 +88,7 @@ port storeSession : Maybe String -> Cmd msg
|
|||||||
|
|
||||||
changes : (Session -> msg) -> Nav.Key -> Sub msg
|
changes : (Session -> msg) -> Nav.Key -> Sub msg
|
||||||
changes toMsg key =
|
changes toMsg key =
|
||||||
onSessionChange (decode key)
|
onSessionChange (\val -> toMsg (decode key val))
|
||||||
|> Sub.map toMsg
|
|
||||||
|
|
||||||
|
|
||||||
port onSessionChange : (Value -> msg) -> Sub msg
|
port onSessionChange : (Value -> msg) -> Sub msg
|
||||||
@@ -92,7 +96,16 @@ port onSessionChange : (Value -> msg) -> Sub msg
|
|||||||
|
|
||||||
decode : Nav.Key -> Value -> Session
|
decode : Nav.Key -> Value -> Session
|
||||||
decode key value =
|
decode key value =
|
||||||
Session
|
-- It's stored in localStorage as a JSON String;
|
||||||
{ viewer = Result.toMaybe (Decode.decodeValue Viewer.decoder value)
|
-- first decode the Value as a String, then
|
||||||
, navKey = key
|
-- decode that String as JSON.
|
||||||
}
|
case
|
||||||
|
Decode.decodeValue Decode.string value
|
||||||
|
|> Result.andThen (Decode.decodeString Viewer.decoder)
|
||||||
|
|> Result.toMaybe
|
||||||
|
of
|
||||||
|
Just decodedViewer ->
|
||||||
|
LoggedIn key decodedViewer
|
||||||
|
|
||||||
|
Nothing ->
|
||||||
|
Guest key
|
||||||
|
|||||||
Reference in New Issue
Block a user