⚡️Add login with Google
Tim Izzo tim@octree.ch
Wed, 22 Jul 2020 10:01:48 +0000
10 files changed,
38 insertions(+),
19 deletions(-)
jump to
M
api/event/documentation/1.0.0/event.json
→
api/event/documentation/1.0.0/event.json
@@ -587,8 +587,6 @@ "items": {
"required": [ "id", "username", - "firstName", - "lastName", "email" ], "properties": {
M
app/src/containers/SignInForm/index.js
→
app/src/containers/SignInForm/index.js
@@ -1,22 +1,23 @@
-import React, {useCallback, useState, useMemo} from 'react'; +import React, {useCallback, useState, useMemo, useEffect} from 'react'; import {Redirect, Link as RouterLink} from 'react-router-dom'; import {useTranslation} from 'react-i18next'; import {useAuth} from 'strapi-react-context'; import TextField from '@material-ui/core/TextField'; +import {useLocation} from 'react-router-dom'; import Button from '@material-ui/core/Button'; import Link from '@material-ui/core/Link'; import CardContent from '@material-ui/core/CardContent'; import {CircularProgress} from '@material-ui/core'; import CardActions from '@material-ui/core/CardActions'; -import {useToast} from '../../contexts/Toast'; import {makeStyles} from '@material-ui/core/styles'; +import {useToast} from '../../contexts/Toast'; const SignIn = () => { const {t} = useTranslation(); const classes = useStyles(); - - const {login, token, authState} = useAuth(); + const location = useLocation(); + const {login, token, authState, loginWithProvider} = useAuth(); const [isLoading, setIsLoading] = useState(false); const [error, setError] = useState(''); const [email, setEmail] = useState('');@@ -53,12 +54,24 @@ },
[email, password, login, isLoading, addToast, t] ); - if (token) { - return <Redirect to="/dashboard" />; - } - if (authState && authState.user && !authState.user.confirmed) { + // If an access token is given in URL params, login with auth provider + useEffect(() => { + const authWithGoogle = async search => { + try { + await loginWithProvider('google', search); + } catch (error) { + console.log('ERROR', {error}); + addToast(t('signin.errors')); + } + }; + + if (location.search) authWithGoogle(location.search); + }, [location.search]); // eslint-disable-line react-hooks/exhaustive-deps + + if (token) return <Redirect to="/dashboard" />; + if (authState?.user && !authState.user.confirmed) return <Redirect to="/confirm" />; - } + return ( <form onSubmit={onSubmit}> <CardContent>@@ -108,6 +121,9 @@ {t('signin.login')}
{isLoading && ( <CircularProgress className={classes.loader} size={20} /> )} + </Button> + <Button color="primary" variant="contained" href="/connect/google"> + {t('signin.withGoogle')} </Button> <Button id="SignInRegister" href="/register"> {t('signin.register')}
M
app/src/containers/SignUpForm/index.js
→
app/src/containers/SignUpForm/index.js
@@ -126,6 +126,9 @@ color="secondary"
/> )} </Button> + <Button color="primary" variant="contained" href="/connect/google"> + {t('signin.withGoogle')} + </Button> <Button id="SignUpLogin" href="/login"> {t('signup.login')} </Button>
M
app/src/layouts/Default.js
→
app/src/layouts/Default.js
@@ -1,6 +1,7 @@
import React from 'react'; import GenericMenu from '../containers/GenericMenu'; import Helmet from './Helmet'; + const DefaultLayout = ({ children, className,
M
app/src/locales/fr.json
→
app/src/locales/fr.json
@@ -171,7 +171,7 @@ "firstName": "Prénom",
"lastName": "Nom", "password": "Mot de passe", "submit": "Créer son compte", - "login": "Déjà un compte ? Se connecter", + "login": "Déjà un compte ?", "errors": { "email_taken": "Email déjà pris" },@@ -188,7 +188,8 @@ "email": "Email",
"password": "Mot de passe", "login": "Se connecter", "register": "Pas encore de compte ? S'inscrire", - "errors": "Vérifier votre email et mot de passe" + "errors": "Vérifier votre email et mot de passe", + "withGoogle": "Login avec Google" }, "lost_password": { "title": "Récupération de mot de passe",
M
app/src/pages/SignIn.js
→
app/src/pages/SignIn.js
@@ -5,6 +5,7 @@ import CardMedia from '@material-ui/core/CardMedia';
import Logo from '../components/Logo'; import SignInForm from '../containers/SignInForm'; import {useTranslation} from 'react-i18next'; + const SignIn = () => { const {t} = useTranslation(); return (
M
app/src/pages/SignUp.js
→
app/src/pages/SignUp.js
@@ -5,6 +5,7 @@ import CardMedia from '@material-ui/core/CardMedia';
import Logo from '../components/Logo'; import SignUpForm from '../containers/SignUpForm'; import {useTranslation} from 'react-i18next'; + const SignUp = () => { const {t} = useTranslation(); return (
M
config/server.js
→
config/server.js
@@ -1,5 +1,5 @@
module.exports = ({env}) => ({ host: env('HOST', '0.0.0.0'), port: env.int('PORT', 1337), - url: env('STRAPI_URL', ''), + url: env('STRAPI_URL', 'http://localhost:1337'), });
M
extensions/documentation/documentation/1.0.0/full_documentation.json
→
extensions/documentation/documentation/1.0.0/full_documentation.json
@@ -14,7 +14,7 @@ "license": {
"name": "Apache 2.0", "url": "https://www.apache.org/licenses/LICENSE-2.0.html" }, - "x-generation-date": "21.07.2020 11:35:03" + "x-generation-date": "22.07.2020 08:14:36" }, "x-strapi-config": { "path": "/documentation",@@ -2069,8 +2069,6 @@ "items": {
"required": [ "id", "username", - "firstName", - "lastName", "email" ], "properties": {
M
extensions/users-permissions/models/User.settings.json
→
extensions/users-permissions/models/User.settings.json
@@ -21,13 +21,13 @@ "firstName": {
"type": "string", "minLength": 3, "configurable": false, - "required": true + "required": false }, "lastName": { "type": "string", "minLength": 3, "configurable": false, - "required": true + "required": false }, "email": { "type": "email",