From 0d8dc555e0b569ada0b75aa7115b47f74564cb29 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Martin=20Maro=C5=A1i?= <marvusm.mmi@gmail.com> Date: Mon, 6 Apr 2020 10:31:25 +0200 Subject: [PATCH] Added profile update. --- package.json | 2 ++ src/react-auth0-spa.js | 1 + src/views/Profile.js | 46 ++++++++++++++++++++++++++++++++++-------- src/views/profile.css | 4 ++++ yarn.lock | 27 +++++++++++++++++++++++++ 5 files changed, 72 insertions(+), 8 deletions(-) create mode 100644 src/views/profile.css diff --git a/package.json b/package.json index e27c920..4e76d96 100644 --- a/package.json +++ b/package.json @@ -16,9 +16,11 @@ "@material-ui/lab": "^4.0.0-alpha.46", "axios": "^0.19.0", "clsx": "^1.1.0", + "final-form": "^4.19.1", "lodash": "^4.17.15", "react": "^16.8.6", "react-dom": "^16.8.6", + "react-final-form": "^6.4.0", "react-router-dom": "^5.0.0", "react-scripts": "3.0.1" }, diff --git a/src/react-auth0-spa.js b/src/react-auth0-spa.js index e6c8786..8c58821 100644 --- a/src/react-auth0-spa.js +++ b/src/react-auth0-spa.js @@ -102,6 +102,7 @@ export const Auth0Provider = ({ children, onRedirectCallback = DEFAULT_REDIRECT_ loginWithPopup, handleRedirectCallback, updateProfile, + setUser, getIdTokenClaims: (...p) => auth0Client.getIdTokenClaims(...p), loginWithRedirect: (...p) => auth0Client.loginWithRedirect(...p), getTokenSilently: (...p) => auth0Client.getTokenSilently(...p), diff --git a/src/views/Profile.js b/src/views/Profile.js index 7075da8..c6e8a73 100644 --- a/src/views/Profile.js +++ b/src/views/Profile.js @@ -1,24 +1,54 @@ import React from "react"; - +import { Form, Field } from "react-final-form"; +import TextField from "@material-ui/core/TextField"; +import Grid from "@material-ui/core/Grid"; +import "./profile.css"; import Loading from "../components/Loading"; import { useAuth0 } from "../react-auth0-spa"; -const Profile = () => { - const { loading, user, updateProfile } = useAuth0(); +const FormTextField = ({ input, meta, ...props }) => ( + <Grid item xs={12}> + <TextField {...input} {...props} fullWidth /> + </Grid> +); - const handleNameUpdate = () => updateProfile({ user_metadata: { name: "Testing2" } }); +const Profile = () => { + const { loading, user, updateProfile, setUser } = useAuth0(); + const initialValues = { + name: user.name, + nickname: user.nickname, + picture: user.picture + }; if (loading || !user) { return <Loading />; } + const handleSubmit = (values) => + updateProfile(values).then(({ name, nickname, picture }) => + setUser({ + name, + nickname, + picture + }) + ); + return ( <div> - <button onClick={handleNameUpdate}>Click</button> - <img src={user.picture} alt="Profile" /> + <img className="profile-image" src={user.picture} alt="Profile" /> <div> - <h2>{user.name}</h2> - <p className="lead text-muted">{user.email}</p> + <Grid container> + <Form initialValues={initialValues} onSubmit={handleSubmit}> + {({ handleSubmit }) => ( + <form onSubmit={handleSubmit} style={{ width: "100%" }}> + <Field name="name" component={FormTextField} label="Name" type="text" /> + <Field name="nickname" component={FormTextField} label="Nickname" type="text" /> + <Field name="picture" component={FormTextField} label="Picture" type="text" /> + <button type="submit">Submit</button> + </form> + )} + </Form> + </Grid> </div> <div> <pre>{JSON.stringify(user, null, 2)}</pre> diff --git a/src/views/profile.css b/src/views/profile.css new file mode 100644 index 0000000..1d9e5ce --- /dev/null +++ b/src/views/profile.css @@ -0,0 +1,4 @@ +.profile-image { + max-width: 200px; + height: auto; +} diff --git a/yarn.lock b/yarn.lock index 2520460..17164db 100644 --- a/yarn.lock +++ b/yarn.lock @@ -959,6 +959,13 @@ dependencies: regenerator-runtime "^0.13.4" +"@babel/runtime@^7.8.3", "@babel/runtime@^7.9.2": + version "7.9.2" + resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.9.2.tgz#d90df0583a3a252f09aaa619665367bae518db06" + integrity sha512-NE2DtOdufG7R5vnfQUTehdTfNycfUANEtCa9PssN9O/xmTzP4E08UI797ixaei6hBEVL9BI/PsdJS5x7mWoB9Q== + dependencies: + regenerator-runtime "^0.13.4" + "@babel/template@^7.4.0", "@babel/template@^7.7.4": version "7.7.4" resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.7.4.tgz#428a7d9eecffe27deac0a98e23bf8e3675d2a77b" @@ -4195,6 +4202,13 @@ fill-range@^4.0.0: repeat-string "^1.6.1" to-regex-range "^2.1.0" +final-form@^4.19.1: + version "4.19.1" + resolved "https://registry.yarnpkg.com/final-form/-/final-form-4.19.1.tgz#1aa1a3bf67f7399b54ed6185d56f9a8d74cfda5a" + integrity sha512-C4RldRCUs8YZod91ydtrsT+TOeG3fwU4ip9oBDXhvbWdQ6iXl4cIrTAQkqpWijbnI3XFVA0akV7YTjSFJMJ2uw== + dependencies: + "@babel/runtime" "^7.8.3" + finalhandler@~1.1.2: version "1.1.2" resolved "https://registry.yarnpkg.com/finalhandler/-/finalhandler-1.1.2.tgz#b7e7d000ffd11938d0fdb053506f6ebabe9f587d" @@ -8232,6 +8246,14 @@ react-error-overlay@^6.0.3: resolved "https://registry.yarnpkg.com/react-error-overlay/-/react-error-overlay-6.0.4.tgz#0d165d6d27488e660bc08e57bdabaad741366f7a" integrity sha512-ueZzLmHltszTshDMwyfELDq8zOA803wQ1ZuzCccXa1m57k1PxSHfflPD5W9YIiTXLs0JTLzoj6o1LuM5N6zzNA== +react-final-form@^6.4.0: + version "6.4.0" + resolved "https://registry.yarnpkg.com/react-final-form/-/react-final-form-6.4.0.tgz#7f9064c10a8bee6a02cd3e9b8aff06fa07f9c908" + integrity sha512-M7J7f0pnoj0o8sBq3iG6jsWJEh08pNUyl2D4wBC9SJvCNkGdol2UdyjMiEFYD3rz9LIFzQqFSG0kbRBCadqzhA== + dependencies: + "@babel/runtime" "^7.9.2" + ts-essentials "^6.0.3" + react-is@^16.6.0, react-is@^16.7.0, react-is@^16.8.1, react-is@^16.8.4: version "16.12.0" resolved "https://registry.yarnpkg.com/react-is/-/react-is-16.12.0.tgz#2cc0fe0fba742d97fd527c42a13bec4eeb06241c" @@ -9628,6 +9650,11 @@ tr46@^1.0.1: dependencies: punycode "^2.1.0" +ts-essentials@^6.0.3: + version "6.0.4" + resolved "https://registry.yarnpkg.com/ts-essentials/-/ts-essentials-6.0.4.tgz#d36055bf0a7620b1338da6aafd2268787e208aab" + integrity sha512-ZtU9zgSnn8DcAxDZY1DJF8rnxsen8M0IVkO7dVB5fTEOVs7o/0RA4V6i99PIg99bpX81Sgb0FCLjQqD5Ufz3rQ== + ts-pnp@1.1.2: version "1.1.2" resolved "https://registry.yarnpkg.com/ts-pnp/-/ts-pnp-1.1.2.tgz#be8e4bfce5d00f0f58e0666a82260c34a57af552" -- GitLab