From 39ce9ac8eec6f8b2542ea6c9df7f1a7ac71621d1 Mon Sep 17 00:00:00 2001 From: Richard Feldman Date: Sat, 11 Aug 2018 14:08:05 -0400 Subject: [PATCH] Update some advanced/ stuff --- advanced/README.md | 2 +- advanced/part1/src/Session.elm | 51 +++++++++++++++++++++------------- advanced/part2/src/Session.elm | 51 +++++++++++++++++++++------------- advanced/part3/src/Session.elm | 51 +++++++++++++++++++++------------- advanced/part4/src/Session.elm | 51 +++++++++++++++++++++------------- advanced/part5/src/Session.elm | 51 +++++++++++++++++++++------------- 6 files changed, 161 insertions(+), 96 deletions(-) diff --git a/advanced/README.md b/advanced/README.md index f15d00d..2d8e126 100644 --- a/advanced/README.md +++ b/advanced/README.md @@ -1,7 +1,7 @@ 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! ## Start the server diff --git a/advanced/part1/src/Session.elm b/advanced/part1/src/Session.elm index e1e9ee0..89c93e4 100644 --- a/advanced/part1/src/Session.elm +++ b/advanced/part1/src/Session.elm @@ -25,13 +25,8 @@ import Viewer.Cred as Cred exposing (Cred) type Session - = Session Internals - - -type alias Internals = - { navKey : Nav.Key - , viewer : Maybe Viewer - } + = LoggedIn Nav.Key Viewer + | Guest Nav.Key @@ -39,18 +34,28 @@ type alias Internals = viewer : Session -> Maybe Viewer -viewer (Session info) = - info.viewer +viewer session = + case session of + LoggedIn _ val -> + Just val + + Guest _ -> + Nothing cred : Session -> Maybe Cred -cred (Session info) = - Maybe.map Viewer.cred info.viewer +cred session = + Maybe.map Viewer.cred (viewer session) navKey : Session -> Nav.Key -navKey (Session info) = - info.navKey +navKey session = + 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 toMsg key = - onSessionChange (decode key) - |> Sub.map toMsg + onSessionChange (\val -> toMsg (decode key val)) port onSessionChange : (Value -> msg) -> Sub msg @@ -92,7 +96,16 @@ 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 - } + -- It's stored in localStorage as a JSON String; + -- first decode the Value as a String, then + -- 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 diff --git a/advanced/part2/src/Session.elm b/advanced/part2/src/Session.elm index e1e9ee0..89c93e4 100644 --- a/advanced/part2/src/Session.elm +++ b/advanced/part2/src/Session.elm @@ -25,13 +25,8 @@ import Viewer.Cred as Cred exposing (Cred) type Session - = Session Internals - - -type alias Internals = - { navKey : Nav.Key - , viewer : Maybe Viewer - } + = LoggedIn Nav.Key Viewer + | Guest Nav.Key @@ -39,18 +34,28 @@ type alias Internals = viewer : Session -> Maybe Viewer -viewer (Session info) = - info.viewer +viewer session = + case session of + LoggedIn _ val -> + Just val + + Guest _ -> + Nothing cred : Session -> Maybe Cred -cred (Session info) = - Maybe.map Viewer.cred info.viewer +cred session = + Maybe.map Viewer.cred (viewer session) navKey : Session -> Nav.Key -navKey (Session info) = - info.navKey +navKey session = + 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 toMsg key = - onSessionChange (decode key) - |> Sub.map toMsg + onSessionChange (\val -> toMsg (decode key val)) port onSessionChange : (Value -> msg) -> Sub msg @@ -92,7 +96,16 @@ 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 - } + -- It's stored in localStorage as a JSON String; + -- first decode the Value as a String, then + -- 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 diff --git a/advanced/part3/src/Session.elm b/advanced/part3/src/Session.elm index e1e9ee0..89c93e4 100644 --- a/advanced/part3/src/Session.elm +++ b/advanced/part3/src/Session.elm @@ -25,13 +25,8 @@ import Viewer.Cred as Cred exposing (Cred) type Session - = Session Internals - - -type alias Internals = - { navKey : Nav.Key - , viewer : Maybe Viewer - } + = LoggedIn Nav.Key Viewer + | Guest Nav.Key @@ -39,18 +34,28 @@ type alias Internals = viewer : Session -> Maybe Viewer -viewer (Session info) = - info.viewer +viewer session = + case session of + LoggedIn _ val -> + Just val + + Guest _ -> + Nothing cred : Session -> Maybe Cred -cred (Session info) = - Maybe.map Viewer.cred info.viewer +cred session = + Maybe.map Viewer.cred (viewer session) navKey : Session -> Nav.Key -navKey (Session info) = - info.navKey +navKey session = + 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 toMsg key = - onSessionChange (decode key) - |> Sub.map toMsg + onSessionChange (\val -> toMsg (decode key val)) port onSessionChange : (Value -> msg) -> Sub msg @@ -92,7 +96,16 @@ 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 - } + -- It's stored in localStorage as a JSON String; + -- first decode the Value as a String, then + -- 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 diff --git a/advanced/part4/src/Session.elm b/advanced/part4/src/Session.elm index e1e9ee0..89c93e4 100644 --- a/advanced/part4/src/Session.elm +++ b/advanced/part4/src/Session.elm @@ -25,13 +25,8 @@ import Viewer.Cred as Cred exposing (Cred) type Session - = Session Internals - - -type alias Internals = - { navKey : Nav.Key - , viewer : Maybe Viewer - } + = LoggedIn Nav.Key Viewer + | Guest Nav.Key @@ -39,18 +34,28 @@ type alias Internals = viewer : Session -> Maybe Viewer -viewer (Session info) = - info.viewer +viewer session = + case session of + LoggedIn _ val -> + Just val + + Guest _ -> + Nothing cred : Session -> Maybe Cred -cred (Session info) = - Maybe.map Viewer.cred info.viewer +cred session = + Maybe.map Viewer.cred (viewer session) navKey : Session -> Nav.Key -navKey (Session info) = - info.navKey +navKey session = + 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 toMsg key = - onSessionChange (decode key) - |> Sub.map toMsg + onSessionChange (\val -> toMsg (decode key val)) port onSessionChange : (Value -> msg) -> Sub msg @@ -92,7 +96,16 @@ 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 - } + -- It's stored in localStorage as a JSON String; + -- first decode the Value as a String, then + -- 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 diff --git a/advanced/part5/src/Session.elm b/advanced/part5/src/Session.elm index e1e9ee0..89c93e4 100644 --- a/advanced/part5/src/Session.elm +++ b/advanced/part5/src/Session.elm @@ -25,13 +25,8 @@ import Viewer.Cred as Cred exposing (Cred) type Session - = Session Internals - - -type alias Internals = - { navKey : Nav.Key - , viewer : Maybe Viewer - } + = LoggedIn Nav.Key Viewer + | Guest Nav.Key @@ -39,18 +34,28 @@ type alias Internals = viewer : Session -> Maybe Viewer -viewer (Session info) = - info.viewer +viewer session = + case session of + LoggedIn _ val -> + Just val + + Guest _ -> + Nothing cred : Session -> Maybe Cred -cred (Session info) = - Maybe.map Viewer.cred info.viewer +cred session = + Maybe.map Viewer.cred (viewer session) navKey : Session -> Nav.Key -navKey (Session info) = - info.navKey +navKey session = + 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 toMsg key = - onSessionChange (decode key) - |> Sub.map toMsg + onSessionChange (\val -> toMsg (decode key val)) port onSessionChange : (Value -> msg) -> Sub msg @@ -92,7 +96,16 @@ 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 - } + -- It's stored in localStorage as a JSON String; + -- first decode the Value as a String, then + -- 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