From 6d39279591d7dbf357bcf78f93610b6bb39ff370 Mon Sep 17 00:00:00 2001 From: Danila Fedorin Date: Mon, 17 Dec 2018 16:32:39 -0800 Subject: [PATCH] Allow for non-string values in responses, and ports. --- src/Main.elm | 19 +++++++++++-------- src/Scylla/Model.elm | 2 +- src/Scylla/Storage.elm | 11 +++++++++-- 3 files changed, 21 insertions(+), 11 deletions(-) diff --git a/src/Main.elm b/src/Main.elm index 0a0eed1..93962f7 100644 --- a/src/Main.elm +++ b/src/Main.elm @@ -15,6 +15,7 @@ import Url exposing (Url) import Url.Parser exposing (parse) import Url.Builder import Json.Encode +import Json.Decode import Html exposing (div, text) import Http import Dict @@ -78,15 +79,17 @@ update msg model = case msg of ReceiveCompletedReadMarker r -> (model, Cmd.none) ReceiveStoreData d -> updateStoreData model d -updateStoreData : Model -> StoreData -> (Model, Cmd Msg) -updateStoreData m d = case d.key of - "scylla.loginInfo" -> updateLoginInfo m d.value - _ -> (m, Cmd.none) +updateStoreData : Model -> Json.Encode.Value -> (Model, Cmd Msg) +updateStoreData m d = case (Json.Decode.decodeValue storeDataDecoder d) of + Ok { key, value } -> case key of + "scylla.loginInfo" -> updateLoginInfo m value + _ -> (m, Cmd.none) + Err _ -> (m, Cmd.none) -updateLoginInfo : Model -> String -> (Model, Cmd Msg) -updateLoginInfo m s = case decodeLoginInfo s of - Just (t,a,u) -> ({ m | token = Just t, apiUrl = a, loginUsername = u}, firstSync a t) - Nothing -> (m, Nav.pushUrl m.key <| Url.Builder.absolute [ "login" ] []) +updateLoginInfo : Model -> Json.Encode.Value -> (Model, Cmd Msg) +updateLoginInfo m s = case Json.Decode.decodeValue (Json.Decode.map decodeLoginInfo Json.Decode.string) s of + Ok (Just (t,a,u)) -> ({ m | token = Just t, apiUrl = a, loginUsername = u}, firstSync a t) + _ -> (m, Nav.pushUrl m.key <| Url.Builder.absolute [ "login" ] []) updateChangeRoute : Model -> Route -> (Model, Cmd Msg) updateChangeRoute m r = diff --git a/src/Scylla/Model.elm b/src/Scylla/Model.elm index 7f2f951..791d956 100644 --- a/src/Scylla/Model.elm +++ b/src/Scylla/Model.elm @@ -46,7 +46,7 @@ type Msg = | ReceiveLoginResponse ApiUrl (Result Http.Error LoginResponse) -- HTTP, Login has finished | ReceiveUserData Username (Result Http.Error UserData) | ReceiveCompletedReadMarker (Result Http.Error ()) - | ReceiveStoreData StoreData + | ReceiveStoreData Json.Decode.Value displayName : Model -> Username -> String displayName m s = Maybe.withDefault (senderName s) <| Maybe.andThen .displayName <| Dict.get s m.userData diff --git a/src/Scylla/Storage.elm b/src/Scylla/Storage.elm index 0479eee..2af5dc7 100644 --- a/src/Scylla/Storage.elm +++ b/src/Scylla/Storage.elm @@ -1,11 +1,18 @@ port module Scylla.Storage exposing (..) import Json.Encode +import Json.Decode as Decode exposing (Decoder, int, string, float, list, value, dict, bool) +import Json.Decode.Pipeline exposing (required, optional) type alias StoreData = { key : String - , value: String + , value: Decode.Value } +storeDataDecoder : Decoder StoreData +storeDataDecoder = Decode.succeed StoreData + |> required "key" string + |> required "value" value + port setStoreValuePort : (String, Json.Encode.Value) -> Cmd msg port getStoreValuePort : (String) -> Cmd msg -port receiveStoreValuePort : (StoreData -> msg) -> Sub msg +port receiveStoreValuePort : (Json.Encode.Value -> msg) -> Sub msg