Update intro/part8

This commit is contained in:
Richard Feldman
2018-08-14 02:37:39 -04:00
parent 3effe9e9d9
commit 39a344cd4c
2 changed files with 82 additions and 82 deletions

View File

@@ -161,45 +161,16 @@ update : Msg -> Model -> ( Model, Cmd Msg )
update msg model = update msg model =
case msg of case msg of
SubmittedForm -> SubmittedForm ->
let case validate model.form of
requestBody : Http.Body Ok validForm ->
requestBody = ( { model | problems = [] }
encodeJsonBody model.form , Http.send CompletedLogin (login validForm)
)
responseDecoder : Decoder Viewer Err problems ->
responseDecoder = ( { model | problems = problems }
Decode.field "user" Viewer.decoder , Cmd.none
)
{- 👉 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 )
EnteredEmail email -> EnteredEmail email ->
updateForm (\form -> { form | email = email }) model updateForm (\form -> { form | email = email }) model
@@ -236,19 +207,6 @@ updateForm transform model =
( { model | form = transform model.form }, Cmd.none ) ( { 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 -- 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 -- EXPORT

View File

@@ -146,16 +146,45 @@ update : Msg -> Model -> ( Model, Cmd Msg )
update msg model = update msg model =
case msg of case msg of
SubmittedForm -> SubmittedForm ->
case validate model.form of let
Ok validForm -> requestBody : Http.Body
( { model | problems = [] } requestBody =
, Http.send CompletedRegister (register validForm) encodeJsonBody model.form
)
Err problems -> responseDecoder : Decoder Viewer
( { model | problems = problems } responseDecoder =
, Cmd.none 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 -> EnteredUsername username ->
updateForm (\form -> { form | username = username }) model updateForm (\form -> { form | username = username }) model
@@ -195,6 +224,20 @@ updateForm transform model =
( { model | form = transform model.form }, Cmd.none ) ( { 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 -- SUBSCRIPTIONS
@@ -295,25 +338,3 @@ trimFields form =
, email = String.trim form.email , email = String.trim form.email
, password = String.trim form.password , 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