all repos — caroster @ 094a8c427e49795ce503594385599a43d41ca2bc

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

frontend/containers/VehicleChoiceDialog/index.tsx (view raw)

  1import {forwardRef, Fragment} from 'react';
  2import {makeStyles} from '@material-ui/core/styles';
  3import Dialog from '@material-ui/core/Dialog';
  4import DialogActions from '@material-ui/core/DialogActions';
  5import DialogContent from '@material-ui/core/DialogContent';
  6import DialogTitle from '@material-ui/core/DialogTitle';
  7import Button from '@material-ui/core/Button';
  8import List from '@material-ui/core/List';
  9import Container from '@material-ui/core/Container';
 10import Divider from '@material-ui/core/Divider';
 11import Slide from '@material-ui/core/Slide';
 12import {useTranslation} from 'react-i18next';
 13import VehicleItem from './VehicleItem';
 14import Typography from '@material-ui/core/Typography';
 15import {VehicleFieldsFragment} from '../../generated/graphql';
 16
 17interface Props {
 18  open: boolean;
 19  toggle: () => void;
 20  toggleNewTravel: ({
 21    opened,
 22    vehicle,
 23  }: {
 24    opened: boolean;
 25    vehicle?: VehicleFieldsFragment;
 26  }) => void;
 27  vehicles: Array<VehicleFieldsFragment>;
 28}
 29
 30const VehicleChoiceDialog = ({
 31  open,
 32  toggle,
 33  toggleNewTravel,
 34  vehicles,
 35}: Props) => {
 36  const {t} = useTranslation();
 37  const classes = useStyles();
 38
 39  return (
 40    <Dialog
 41      fullWidth
 42      maxWidth="xs"
 43      open={open}
 44      onClose={toggle}
 45      TransitionComponent={Transition}
 46    >
 47      <DialogTitle>{t('travel.vehicle.title')}</DialogTitle>
 48      <DialogContent dividers className={classes.content}>
 49        {(vehicles && vehicles.length != 0 && (
 50          <List>
 51            {vehicles.map((vehicle, index, {length}) => (
 52              <Fragment key={index}>
 53                <VehicleItem
 54                  vehicle={vehicle}
 55                  select={() => {
 56                    toggleNewTravel({vehicle, opened: true});
 57                    toggle();
 58                  }}
 59                />
 60                {index + 1 < length && <Divider />}
 61              </Fragment>
 62            ))}
 63          </List>
 64        )) || (
 65          <Container className={classes.empty}>
 66            <Typography>{t('travel.vehicle.empty')}</Typography>
 67          </Container>
 68        )}
 69      </DialogContent>
 70      <DialogActions className={classes.actions}>
 71        <Button
 72          className={classes.new}
 73          color="primary"
 74          fullWidth
 75          variant="outlined"
 76          onClick={() => {
 77            toggleNewTravel({opened: true});
 78            toggle();
 79          }}
 80        >
 81          {t('travel.vehicle.add')}
 82        </Button>
 83      </DialogActions>
 84    </Dialog>
 85  );
 86};
 87
 88const Transition = forwardRef(function Transition(props, ref) {
 89  return <Slide direction="up" ref={ref} {...props} />;
 90});
 91
 92const useStyles = makeStyles(theme => ({
 93  actions: {
 94    justifyContent: 'center',
 95  },
 96  content: {
 97    padding: 0,
 98  },
 99  new: {
100    maxWidth: '300px',
101  },
102  empty: {
103    padding: theme.spacing(2, 3)
104  }
105}));
106
107export default VehicleChoiceDialog;