all repos — caroster @ 220f6f54c7b1c4720d3e6fbfd2e0db4a18a10967

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

add event to user profile
Karian Før karian.for@gmail.com
Sat, 18 Jul 2020 11:06:51 +0200
commit

220f6f54c7b1c4720d3e6fbfd2e0db4a18a10967

parent

e0e4355b87b11e45d294e6cd17e38188b7d03217

M app/src/containers/CreateEvent/Step1.jsapp/src/containers/CreateEvent/Step1.js

@@ -6,6 +6,7 @@ import Checkbox from '@material-ui/core/Checkbox';

import FormControlLabel from '@material-ui/core/FormControlLabel'; import {useTranslation} from 'react-i18next'; import useDebounce from '../../hooks/useDebounce'; +import useProfile from '../../hooks/useProfile'; const isValidEmail = email => // eslint-disable-next-line

@@ -13,9 +14,10 @@ /^(([^<>()\[\]\\.,;:\s@"]+(\.[^<>()\[\]\\.,;:\s@"]+)*)|(".+"))@((\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}])|(([a-zA-Z\-0-9]+\.)+[a-zA-Z]{2,}))$/.test(

email ); -const Step1 = ({nextStep, previousStep, createEvent, event, addToEvent}) => { +const Step1 = ({nextStep, event, addToEvent}) => { const classes = useStyles(); const {t} = useTranslation(); + const {connected, user} = useProfile(); // States const [name, setName] = useState(event.name ?? '');

@@ -23,17 +25,21 @@ const [email, setEmail] = useState(event.email ?? '');

const [emailIsValid, setEmailIsValid] = useState(false); const [newsletter, setNewsletter] = useState(false); const debouncedEmail = useDebounce(email, 400); - const canSubmit = useMemo( - () => name.length > 0 && email.length > 0 && emailIsValid, - [name, email, emailIsValid] - ); + useEffect(() => { setEmailIsValid(isValidEmail(debouncedEmail)); }, [debouncedEmail]); + const canSubmit = useMemo(() => { + const n = name.length > 0; + const e = email.length > 0 && emailIsValid; + return connected ? n : n && e; + }, [name, email, emailIsValid, connected]); + const onNext = event => { if (event.preventDefault) event.preventDefault(); - addToEvent({name, email, newsletter}); + const e = connected ? user.email : email; + addToEvent({name, email: e, newsletter}); nextStep(); return false; };

@@ -51,17 +57,19 @@ onChange={e => setName(e.target.value)}

id="NewEventName" name="name" /> - <TextField - className={classes.textField} - label={t('event.creation.creator_email')} - fullWidth - margin="dense" - value={email} - onChange={e => setEmail(e.target.value)} - id="NewEventEmail" - name="email" - type="email" - /> + {!connected && ( + <TextField + className={classes.textField} + label={t('event.creation.creator_email')} + fullWidth + margin="dense" + value={email} + onChange={e => setEmail(e.target.value)} + id="NewEventEmail" + name="email" + type="email" + /> + )} <FormControlLabel className={classes.newsletter} label={t('event.creation.newsletter')}
M app/src/containers/CreateEvent/index.jsapp/src/containers/CreateEvent/index.js

@@ -1,5 +1,6 @@

import React, {useState, useReducer} from 'react'; import {useStrapi} from 'strapi-react-context'; +import useProfile from '../../hooks/useProfile'; // Steps import Step1 from './Step1';

@@ -14,10 +15,16 @@ const strapi = useStrapi();

const [step, setStep] = useState(0); const [event, addToEvent] = useReducer(eventReducer, {}); const Step = steps[step]; + const {connected, addEvent} = useProfile(); const createEvent = async eventData => { try { - return await strapi.services.events.create({...event, ...eventData}); + const result = await strapi.services.events.create({ + ...event, + ...eventData, + }); + if (connected) addEvent(result); + return result; } catch (err) { console.error(err); return false;
M app/src/containers/NewCarDialog/index.jsapp/src/containers/NewCarDialog/index.js

@@ -16,6 +16,7 @@ import {useTranslation} from 'react-i18next';

import {useStrapi} from 'strapi-react-context'; import {useToast} from '../../contexts/Toast'; import {useEvent} from '../../contexts/Event'; +import useProfile from '../../hooks/useProfile'; const Transition = React.forwardRef(function Transition(props, ref) { return <Slide direction="up" ref={ref} {...props} />;

@@ -32,6 +33,7 @@ const {t} = useTranslation();

const classes = useStyles(); const {addToast} = useToast(); const {event} = useEvent(); + const {addEvent} = useProfile(); // States const [name, setName] = useState('');

@@ -55,6 +57,7 @@ phone_number: phone,

details, event: event.id, }); + addEvent(event); addToast(t('car.creation.created')); toggle();
M app/src/containers/PassengersList/Input.jsapp/src/containers/PassengersList/Input.js

@@ -6,7 +6,7 @@ import Divider from '@material-ui/core/Divider';

import Icon from '@material-ui/core/Icon'; import {useTranslation} from 'react-i18next'; -const Input = ({addPassenger}) => { +const Input = ({addPassenger, id}) => { const [name, setName] = useState(''); const {t} = useTranslation();

@@ -30,8 +30,8 @@ onChange={e => setName(e.target.value)}

onKeyDown={onKeyDown} fullWidth label={t('car.passengers.add')} - id="NewPassenger" - name="passenger" + id={`NewPassenger-${id}`} + name={`passenger-${id}`} /> <IconButton color="primary"
M app/src/containers/PassengersList/index.jsapp/src/containers/PassengersList/index.js

@@ -46,7 +46,9 @@ {(!!places

? !!passengers ? places - passengers.length > 0 : places > 0 - : true) && <Input addPassenger={addPassenger} />} + : true) && ( + <Input addPassenger={addPassenger} id={!!places ? 'Car' : 'Waiting'} /> + )} <List disablePadding> {!!list && list.map((passenger, index) => (
M app/src/containers/WaitingList/index.jsapp/src/containers/WaitingList/index.js

@@ -9,6 +9,7 @@ import {Trans, useTranslation} from 'react-i18next';

import {useStrapi} from 'strapi-react-context'; import {useEvent} from '../../contexts/Event'; import {useToast} from '../../contexts/Toast'; +import useProfile from '../../hooks/useProfile'; import PassengersList from '../PassengersList'; import RemoveDialog from '../RemoveDialog'; import CarDialog from './CarDialog';

@@ -25,6 +26,7 @@ const classes = useStyles();

const {t} = useTranslation(); const strapi = useStrapi(); const {event} = useEvent(); + const {addEvent} = useProfile(); const {addToast} = useToast(); const [isEditing, toggleEditing] = useReducer(i => !i, false); const [removing, setRemoving] = useState(null);

@@ -51,6 +53,7 @@ try {

await strapi.services.events.update(event.id, { waiting_list: waitingList, }); + addEvent(event); } catch (error) { console.error(error); addToast(t(i18nError));
M app/src/hooks/useProfile.jsapp/src/hooks/useProfile.js

@@ -1,26 +1,28 @@

-import {useEffect, useState} from 'react'; +import {useMemo, useCallback} from 'react'; import {useAuth} from 'strapi-react-context'; export default () => { const {token, authState, updateProfile} = useAuth(); - const [connected, setConnected] = useState(false); - useEffect(() => { - setConnected(!!token); - }, [token]); + const connected = useMemo(() => !!token, [token]); - const addEvent = async event => { - if (connected) { - const {user} = authState; - const {events} = user; - updateProfile({ - ...user, - events: !!events - ? [...events.filter(e => e !== event.id), event.id] - : [event.id], - }); - } - }; + const user = useMemo(() => authState?.user, [authState]); - return {connected, addEvent}; + const addEvent = useCallback( + async event => { + if (!!token) { + const {user} = authState; + const {events} = user; + updateProfile({ + ...user, + events: !!events + ? [...events.filter(e => e !== event.id), event.id] + : [event.id], + }); + } + }, + [token, authState] // eslint-disable-line + ); + + return {connected, user, addEvent}; };