all repos — caroster @ 4a0142c40fa8f7d43889465908667617995be6bc

[Octree] Group carpool to your event https://caroster.io

⚡️Add login with Google
Tim Izzo tim@octree.ch
Wed, 22 Jul 2020 10:01:48 +0000
commit

4a0142c40fa8f7d43889465908667617995be6bc

parent

db14df0f7a21cbdd9a57218dc259b4d58a79db87

M api/event/documentation/1.0.0/event.jsonapi/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.jsapp/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.jsapp/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.jsapp/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.jsonapp/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.jsapp/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.jsapp/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.jsconfig/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.jsonextensions/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.jsonextensions/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",