diff --git a/intro/part8/src/Page/Login.elm b/intro/part8/src/Page/Login.elm index fc5ddb6..852a9b7 100644 --- a/intro/part8/src/Page/Login.elm +++ b/intro/part8/src/Page/Login.elm @@ -161,45 +161,16 @@ update : Msg -> Model -> ( Model, Cmd Msg ) update msg model = case msg of SubmittedForm -> - let - requestBody : Http.Body - requestBody = - encodeJsonBody model.form + case validate model.form of + Ok validForm -> + ( { model | problems = [] } + , Http.send CompletedLogin (login validForm) + ) - responseDecoder : Decoder Viewer - responseDecoder = - Decode.field "user" Viewer.decoder - - {- 👉 TODO: Create a Http.Request value that represents - a POST request to "/api/users/login" - - 💡 HINT 1: Documentation for `Http.post` is here: - - http://package.elm-lang.org/packages/elm-lang/http/1.0.0/Http#post - - 💡 HINT 2: Look at the values defined above in this - let-expression. What are their types? What are the types the - `Http.post` function is looking for? - -} - request : Http.Request Viewer - request = - Debug.todo "Call Http.post to represent a POST to /api/users/login" - - {- 👉 TODO: Use Http.send to turn the request we just defined - into a Cmd for `update` to execute. - - 💡 HINT 1: Documentation for `Http.send` is here: - - http://package.elm-lang.org/packages/elm-lang/http/1.0.0/Http#send - - 💡 HINT 2: The `CompletedLogin` variant defined in `type Msg` - will be useful here! - -} - cmd : Cmd Msg - cmd = - Cmd.none - in - ( { model | problems = [] }, cmd ) + Err problems -> + ( { model | problems = problems } + , Cmd.none + ) EnteredEmail email -> updateForm (\form -> { form | email = email }) model @@ -236,19 +207,6 @@ updateForm transform model = ( { model | form = transform model.form }, Cmd.none ) -encodeJsonBody : Form -> Http.Body -encodeJsonBody form = - let - user = - Encode.object - [ ( "email", Encode.string form.email ) - , ( "password", Encode.string form.password ) - ] - in - Encode.object [ ( "user", user ) ] - |> Http.jsonBody - - -- SUBSCRIPTIONS @@ -330,6 +288,27 @@ trimFields form = +-- HTTP + + +login : TrimmedForm -> Http.Request Viewer +login (Trimmed form) = + let + user = + Encode.object + [ ( "email", Encode.string form.email ) + , ( "password", Encode.string form.password ) + ] + + body = + Encode.object [ ( "user", user ) ] + |> Http.jsonBody + in + Decode.field "user" Viewer.decoder + |> Http.post (Api.url [ "users", "login" ]) body + + + -- EXPORT diff --git a/intro/part8/src/Page/Register.elm b/intro/part8/src/Page/Register.elm index f2f31e2..07cb8ae 100644 --- a/intro/part8/src/Page/Register.elm +++ b/intro/part8/src/Page/Register.elm @@ -146,16 +146,45 @@ update : Msg -> Model -> ( Model, Cmd Msg ) update msg model = case msg of SubmittedForm -> - case validate model.form of - Ok validForm -> - ( { model | problems = [] } - , Http.send CompletedRegister (register validForm) - ) + let + requestBody : Http.Body + requestBody = + encodeJsonBody model.form - Err problems -> - ( { model | problems = problems } - , Cmd.none - ) + responseDecoder : Decoder Viewer + responseDecoder = + Decode.field "user" Viewer.decoder + + {- 👉 TODO: Create a Http.Request value that represents + a POST request to "/api/users" + + 💡 HINT 1: Documentation for `Http.post` is here: + + http://package.elm-lang.org/packages/elm-lang/http/1.0.0/Http#post + + 💡 HINT 2: Look at the values defined above in this + let-expression. What are their types? What are the types the + `Http.post` function is looking for? + -} + request : Http.Request Viewer + request = + Debug.todo "Call Http.post to represent a POST to /api/users/login" + + {- 👉 TODO: Use Http.send to turn the request we just defined + into a Cmd for `update` to execute. + + 💡 HINT 1: Documentation for `Http.send` is here: + + http://package.elm-lang.org/packages/elm-lang/http/1.0.0/Http#send + + 💡 HINT 2: The `CompletedRegister` variant defined in `type Msg` + will be useful here! + -} + cmd : Cmd Msg + cmd = + Cmd.none + in + ( { model | problems = [] }, cmd ) EnteredUsername username -> updateForm (\form -> { form | username = username }) model @@ -195,6 +224,20 @@ updateForm transform model = ( { model | form = transform model.form }, Cmd.none ) +encodeJsonBody : Form -> Http.Body +encodeJsonBody form = + let + user = + Encode.object + [ ( "username", Encode.string form.username ) + , ( "email", Encode.string form.email ) + , ( "password", Encode.string form.password ) + ] + in + Encode.object [ ( "user", user ) ] + |> Http.jsonBody + + -- SUBSCRIPTIONS @@ -295,25 +338,3 @@ trimFields form = , email = String.trim form.email , password = String.trim form.password } - - - --- HTTP - - -register : TrimmedForm -> Http.Request Viewer -register (Trimmed form) = - let - user = - Encode.object - [ ( "username", Encode.string form.username ) - , ( "email", Encode.string form.email ) - , ( "password", Encode.string form.password ) - ] - - body = - Encode.object [ ( "user", user ) ] - |> Http.jsonBody - in - Decode.field "user" Viewer.decoder - |> Http.post (Api.url [ "users" ]) body