all repos — caroster @ 5d5e4ac4d7656640903b1bbc356776619411befb

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

slider padding, logo size & place, slide bottom offset, extract share button from fab and add it to the appbar, add icons before empty passenger, locales, theme texts vs. buttons, harmonize appbars height, ...
Karian Før karian@subtext.studio
Tue, 07 Jul 2020 11:51:21 +0000
commit

5d5e4ac4d7656640903b1bbc356776619411befb

parent

0cf7e5b8e2927cf655d498d134ec5dc86b69c37b

M app/src/components/Logo/index.jsapp/src/components/Logo/index.js

@@ -8,15 +8,28 @@

const Logo = () => { const classes = useStyles(); return ( - <a href={LOGO_URL}> - <img src={LogoUrl} alt="Caroster" className={classes.logo} /> - </a> + <div className={classes.layout}> + <a href={LOGO_URL} className={classes.link}> + <img src={LogoUrl} alt="Caroster" className={classes.logo} /> + </a> + </div> ); }; const useStyles = makeStyles(theme => ({ + layout: { + display: 'flex', + justifyContent: 'center', + paddingTop: '1rem', + paddingBottom: '1rem', + }, + link: { + width: '75%', + }, logo: { + display: 'block', width: '100%', + height: 'auto', }, })); export default Logo;
M app/src/containers/Car/Header.jsapp/src/containers/Car/Header.js

@@ -12,6 +12,8 @@ const {t} = useTranslation();

return ( <div className={classes.header}> <IconButton + size="small" + color="primary" className={classes.editBtn} onClick={toggleEditing} id="EditCarBtn"

@@ -64,6 +66,7 @@ editBtn: {

position: 'absolute', top: 0, right: 0, + margin: theme.spacing(1), zIndex: theme.zIndex.speedDial, }, section: {
M app/src/containers/Car/HeaderEditing.jsapp/src/containers/Car/HeaderEditing.js

@@ -175,8 +175,8 @@ </div>

</form> <div className={classes.actions}> <Button - color="secondary" variant="outlined" + color="primary" onClick={toggleRemoving} id="CarRemove" >
M app/src/containers/CarColumns/AddCar.jsapp/src/containers/CarColumns/AddCar.js

@@ -9,7 +9,13 @@ const classes = useStyles();

const {t} = useTranslation(); return ( <Container maxWidth="sm" className={classes.container}> - <Button variant="contained" onClick={toggleNewCar}> + <Button + fullWidth + variant="contained" + color="primary" + onClick={toggleNewCar} + classes={{containedPrimary: classes.button}} + > {t('car.creation.title')} </Button> </Container>

@@ -20,6 +26,11 @@ const useStyles = makeStyles(theme => ({

container: { display: 'flex', justifyContent: 'center', + }, + button: { + backgroundColor: theme.palette.background.paper, + color: theme.palette.text.primary, + '&:hover': {color: theme.palette.primary.contrastText}, }, }));
M app/src/containers/CarColumns/index.jsapp/src/containers/CarColumns/index.js

@@ -69,7 +69,7 @@ [strapi.stores.cars, event]

); return ( - <Slider {...settings}> + <Slider className={classes.slider} {...settings}> <Container maxWidth="sm" className={classes.slide}> <WaitingList /> </Container>

@@ -87,10 +87,16 @@ );

}; const useStyles = makeStyles(theme => ({ + slider: { + padding: theme.spacing(1), + }, slide: { - height: `calc(100vh - ${theme.mixins.toolbar.minHeight}px)`, + height: `calc(100vh - ${theme.mixins.toolbar.minHeight}px - ${theme.spacing( + 2 + )})`, outline: 'none', padding: theme.spacing(2), + marginBottom: theme.spacing(10), }, }));
M app/src/containers/EventFab/index.jsapp/src/containers/EventFab/index.js

@@ -1,103 +1,29 @@

-import React, {useReducer} from 'react'; +import React from 'react'; import Icon from '@material-ui/core/Icon'; import Fab from '@material-ui/core/Fab'; import {makeStyles} from '@material-ui/core/styles'; -import {useTranslation} from 'react-i18next'; -import {useEvent} from '../../contexts/Event'; -import {useToast} from '../../contexts/Toast'; -const EventFab = ({toggleNewCar}) => { - const {t} = useTranslation(); - const [open, toggleOpen] = useReducer(i => !i, false); +const EventFab = ({toggleNewCar, open}) => { const classes = useStyles({open}); - const {event} = useEvent(); - const {addToast} = useToast(); - - const onShare = async () => { - if (!event) return null; - // If navigator as share capability - if (!!navigator.share) - return await navigator.share({ - title: `Caroster ${event.name}`, - url: `${window.location.href}`, - }); - // Else copy URL in clipboard - else if (!!navigator.clipboard) { - await navigator.clipboard.writeText(window.location.href); - addToast(t('event.actions.copied')); - return true; - } - }; return ( - <> - <div className={classes.fabContainer}> - <Fab aria-label="more" onClick={toggleOpen}> - <Icon>add</Icon> - </Fab> - </div> - <div - className={classes.actionContainer} - onClick={toggleOpen} - role="dialog" - > - <Fab - color="primary" - aria-label="share" - variant="extended" - className={classes.extendedFab} - onClick={onShare} - > - <Icon className={classes.extendedIcon}>share</Icon> - Partager - </Fab> - <Fab - color="secondary" - aria-label="add-car" - variant="extended" - className={classes.extendedFab} - onClick={toggleNewCar} - > - <Icon className={classes.extendedIcon}>directions_car</Icon> - Ajouter - </Fab> - </div> - </> + <div className={classes.container}> + <Fab color="secondary" aria-label="add-car" onClick={toggleNewCar}> + <Icon>add</Icon> + </Fab> + </div> ); }; const useStyles = makeStyles(theme => ({ - fabContainer: ({open}) => ({ + container: ({open}) => ({ position: 'fixed', - bottom: open ? '-4rem' : theme.spacing(2), - right: theme.spacing(2), + bottom: open ? -theme.spacing(8) : theme.spacing(3), + right: theme.spacing(3), transition: 'all 0.3s ease', transform: open ? 'rotate(45deg)' : '', zIndex: theme.zIndex.speedDial, - '& .MuiFab-root': { - backgroundColor: theme.palette.accent.yellow, - }, }), - actionContainer: ({open}) => ({ - position: 'fixed', - bottom: open ? 0 : '-100vh', - left: 0, - right: 0, - display: 'flex', - flexDirection: 'column', - justifyContent: 'flex-end', - transition: 'all 0.3s ease', - height: '100vh', - }), - extendedIcon: { - marginRight: theme.spacing(2), - }, - extendedFab: { - width: '11rem', - marginLeft: 'auto', - marginRight: 'auto', - marginBottom: theme.spacing(2), - }, })); export default EventFab;
M app/src/containers/NewCarDialog/index.jsapp/src/containers/NewCarDialog/index.js

@@ -6,14 +6,14 @@ import DialogContentText from '@material-ui/core/DialogContentText';

import DialogTitle from '@material-ui/core/DialogTitle'; import Button from '@material-ui/core/Button'; import Slide from '@material-ui/core/Slide'; -import moment from 'moment'; -import {useStrapi} from 'strapi-react-context'; -import {useTranslation} from 'react-i18next'; import TextField from '@material-ui/core/TextField'; import Slider from '@material-ui/core/Slider'; import Typography from '@material-ui/core/Typography'; -import {makeStyles} from '@material-ui/core/styles'; import {DateTimePicker} from '@material-ui/pickers'; +import {makeStyles} from '@material-ui/core/styles'; +import moment from 'moment'; +import {useTranslation} from 'react-i18next'; +import {useStrapi} from 'strapi-react-context'; import {useToast} from '../../contexts/Toast'; import {useEvent} from '../../contexts/Event';

@@ -95,14 +95,25 @@ onChange={e => setName(e.target.value)}

id="NewCarName" name="name" /> + <DateTimePicker + label={t('event.creation.date')} + value={date} + onChange={setDate} + className={classes.picker} + fullWidth + format="LLLL" + disablePast + id="NewCarDateTime" + name="date" + /> <Typography variant="caption">{t('car.creation.seats')}</Typography> <Slider value={seats} onChange={(e, value) => setSeats(value)} step={1} - marks={marks} min={1} max={marks.length} + marks={marks} valueLabelDisplay="auto" /> <TextField

@@ -110,24 +121,11 @@ className={classes.textField}

label={t('car.creation.meeting')} fullWidth margin="dense" - multiline - rows={2} value={meeting} onChange={e => setMeeting(e.target.value)} id="NewCarMeeting" name="meeting" /> - <DateTimePicker - label={t('event.creation.date')} - value={date} - onChange={setDate} - className={classes.textField} - fullWidth - format="LLLL" - disablePast - id="NewCarDateTime" - name="date" - /> <TextField className={classes.textField} label={t('car.creation.phone')}

@@ -144,7 +142,7 @@ label={t('car.creation.notes')}

fullWidth margin="dense" multiline - rows={2} + rows={4} value={details} onChange={e => setDetails(e.target.value)} id="NewCarDetails"

@@ -153,10 +151,16 @@ />

</DialogContentText> </DialogContent> <DialogActions> - <Button id="NewCarCancel" onClick={toggle} tabIndex={-1}> + <Button + color="primary" + id="NewCarCancel" + onClick={toggle} + tabIndex={-1} + > {t('generic.cancel')} </Button> <Button + color="primary" variant="contained" type="submit" disabled={!canCreate}

@@ -172,7 +176,12 @@ );

}; const useStyles = makeStyles(theme => ({ - textField: {marginBottom: theme.spacing(2)}, + textField: { + marginBottom: theme.spacing(2), + }, + picker: { + marginBottom: theme.spacing(3), + }, })); export default NewCarDialog;
M app/src/containers/PassengersList/Input.jsapp/src/containers/PassengersList/Input.js

@@ -33,7 +33,13 @@ label={t('car.passengers.add')}

id="NewPassenger" name="passenger" /> - <IconButton edge="end" size="small" disabled={!name} onClick={onSave}> + <IconButton + color="primary" + edge="end" + size="small" + disabled={!name} + onClick={onSave} + > <Icon>check</Icon> </IconButton> </Box>
M app/src/containers/PassengersList/Passenger.jsapp/src/containers/PassengersList/Passenger.js

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

import React from 'react'; import Box from '@material-ui/core/Box'; +import Icon from '@material-ui/core/Icon'; import Typography from '@material-ui/core/Typography'; import {makeStyles} from '@material-ui/core/styles'; import {useTranslation} from 'react-i18next';

@@ -23,6 +24,9 @@ px={2}

py={1} minHeight={46} > + <Icon color="disabled" className={classes.icon}> + person + </Icon> <Typography variant="body2">{t('car.passengers.empty')}</Typography> </Box> );

@@ -31,6 +35,9 @@

const useStyles = makeStyles(theme => ({ name: { flexGrow: 1, + }, + icon: { + marginRight: theme.spacing(2), }, }));
M app/src/containers/PassengersList/index.jsapp/src/containers/PassengersList/index.js

@@ -37,8 +37,9 @@ key={index}

passenger={passenger} button={ <IconButton + size="small" + color="primary" edge="end" - size="small" onClick={() => onClick(index)} > <Icon>{icon}</Icon>
M app/src/containers/WaitingList/index.jsapp/src/containers/WaitingList/index.js

@@ -81,7 +81,12 @@ return (

<> <Paper className={classes.root}> <div className={classes.header}> - <IconButton className={classes.editBtn} onClick={onEdit}> + <IconButton + size="small" + color="primary" + className={classes.editBtn} + onClick={onEdit} + > {isEditing ? <Icon>check</Icon> : <Icon>edit</Icon>} </IconButton> <Typography variant="h5">{t('passenger.title')}</Typography>

@@ -128,6 +133,7 @@ editBtn: {

position: 'absolute', top: 0, right: 0, + margin: theme.spacing(1), zIndex: theme.zIndex.speedDial, }, }));
M app/src/contexts/Toast.jsapp/src/contexts/Toast.js

@@ -24,7 +24,7 @@ {children}

<Snackbar anchorOrigin={{ vertical: 'bottom', - horizontal: 'right', + horizontal: 'left', }} autoHideDuration={6000} open={toasts && toasts.length > 0}
M app/src/locales/fr.jsonapp/src/locales/fr.json

@@ -17,7 +17,7 @@ },

"creation": { "event_name": "Nom de l'événement", "creator_email": "Votre e-mail", - "date": "Date de l'événement", + "date": "Départ", "address": "Adresse de l'événement", "next": "Suivant", "tos": "J'accepte les conditions générales d'utilisation"
M app/src/pages/Event.jsapp/src/pages/Event.js

@@ -44,34 +44,65 @@ addToast(t('event.errors.cant_update'));

} }; + const onShare = async () => { + if (!event) return null; + // If navigator as share capability + if (!!navigator.share) + return await navigator.share({ + title: `Caroster ${event.name}`, + url: `${window.location.href}`, + }); + // Else copy URL in clipboard + else if (!!navigator.clipboard) { + await navigator.clipboard.writeText(window.location.href); + addToast(t('event.actions.copied')); + return true; + } + }; + if (!event) return <Loading />; return ( <Layout> <AppBar position="static" + color="primary" className={classes.appbar} id={(isEditing && 'EditEvent') || (detailsOpen && 'Details') || 'Menu'} > <Toolbar> <Typography variant="h6" + noWrap className={classes.name} id="MenuHeaderTitle" > {event.name} </Typography> {!detailsOpen && ( - <IconButton - edge="end" - id="MenuMoreInfo" - onClick={e => setAnchorEl(e.currentTarget)} - > - <Icon className={classes.barIcon}>more_vert</Icon> - </IconButton> + <> + <IconButton + color="inherit" + edge="end" + id="ShareBtn" + onClick={onShare} + className={classes.shareIcon} + > + <Icon>share</Icon> + </IconButton> + <IconButton + color="inherit" + edge="end" + id="MenuMoreInfo" + onClick={e => setAnchorEl(e.currentTarget)} + > + <Icon>more_vert</Icon> + </IconButton> + </> )} {detailsOpen && !isEditing && ( <IconButton + color="inherit" edge="end" id="DetailsEditBtn" onClick={e => setIsEditing(true)}

@@ -80,7 +111,12 @@ <Icon className={classes.barIcon}>edit</Icon>

</IconButton> )} {detailsOpen && isEditing && ( - <IconButton edge="end" id="EditEventSubmit" onClick={onEventSave}> + <IconButton + color="inherit" + edge="end" + id="EditEventSubmit" + onClick={onEventSave} + > <Icon className={classes.barIcon}>done</Icon> </IconButton> )}

@@ -113,25 +149,27 @@ <EventDetails toggleDetails={toggleDetails} />

</Container> </AppBar> <CarColumns toggleNewCar={toggleNewCar} /> - <EventFab toggleNewCar={toggleNewCar} /> + <EventFab toggleNewCar={toggleNewCar} open={openNewCar} /> <NewCarDialog open={openNewCar} toggle={toggleNewCar} /> </Layout> ); }; const useStyles = makeStyles(theme => ({ - container: {padding: theme.spacing(2)}, + container: { + padding: theme.spacing(2), + }, appbar: ({detailsOpen}) => ({ - transition: 'height 0.3s ease', overflow: 'hidden', height: detailsOpen ? '100vh' : theme.mixins.toolbar.minHeight, + transition: 'height 0.3s ease', zIndex: theme.zIndex.appBar, }), name: { flexGrow: 1, }, - barIcon: { - color: 'white', + shareIcon: { + marginRight: theme.spacing(2), }, }));
M app/src/theme.jsapp/src/theme.js

@@ -3,22 +3,26 @@

export default createMuiTheme({ palette: { primary: { - main: 'rgba(0,0,0,0.78)', + main: '#009688', }, secondary: { - main: '#007CE7', - }, - accent: { - yellow: '#FFD11D', - blue: '#0A12FF', - red: '#FF2200', - purple: '#251479', + main: '#ffde03', }, background: { default: '#f4f4ff', }, - text: { - primary: '#006C6B', + }, + mixins: { + toolbar: { + minHeight: 64, + }, + }, + overrides: { + MuiAppBar: { + colorPrimary: { + backgroundColor: 'rgba(0,0,0,0.78)', + color: 'white', + }, }, }, });