all repos — caroster @ 3a6483727355d59a734458de22d13c6088c9ce29

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

frontend/layouts/Event.tsx (view raw)

 1import {PropsWithChildren, useEffect, useState} from 'react';
 2import useMediaQuery from '@mui/material/useMediaQuery';
 3import Box from '@mui/material/Box';
 4import {useTheme} from '@mui/material/styles';
 5import {useTranslation} from 'react-i18next';
 6import ErrorPage from '../pages/_error';
 7import useEventStore from '../stores/useEventStore';
 8import Layout from '../layouts/Default';
 9import EventBar from '../containers/EventBar';
10import DrawerMenu from '../containers/DrawerMenu';
11import AddToMyEventDialog from '../containers/AddToMyEventDialog';
12import {Event as EventType, useEventByUuidQuery, Module} from '../generated/graphql';
13
14const POLL_INTERVAL = 10000;
15
16export type TabComponent = (props: {
17  event: EventType & {id: string};
18  modulesSettings: Module;
19}) => JSX.Element;
20
21interface Props {
22  modulesSettings?: Module;
23  eventUUID: string;
24  Tab: TabComponent;
25  goBack?: () => void;
26  titleKey?: string;
27}
28
29const EventLayout = (props: PropsWithChildren<Props>) => {
30  const {eventUUID, modulesSettings, Tab, goBack, titleKey, ...pageProps} = props;
31  const {t} = useTranslation();
32  const theme = useTheme();
33
34  const isMobile = useMediaQuery(theme.breakpoints.down('md'));
35  const setEvent = useEventStore(s => s.setEvent);
36  const [isAddToMyEvent, setIsAddToMyEvent] = useState(false);
37  const {data: {eventByUUID: {data: {attributes, id} = {}} = {}} = {}} =
38    useEventByUuidQuery({
39      pollInterval: POLL_INTERVAL,
40      variables: {uuid: eventUUID},
41    });
42  const event = {id, ...attributes};
43
44  useEffect(() => {
45    if (event) setEvent(event);
46  }, [event]);
47
48  if (!event) return <ErrorPage statusCode={404} title={t`event.not_found`} />;
49
50  return (
51    <Layout
52      pageTitle={t('event.title', {title: event.name})}
53      menuTitle={t('event.title', {title: event.name})}
54      displayMenu={false}
55      {...pageProps}
56    >
57      <Box
58        flex={1}
59        display="flex"
60        alignItems="stretch"
61        height="calc(100% - 80px)"
62        overflow="hidden"
63        flexDirection={isMobile ? 'column-reverse' : 'row'}
64      >
65        <DrawerMenu eventUuid={event.uuid} />
66        <Box
67          sx={{
68            position: 'relative',
69            flex: 1,
70            maxWidth: 'calc(100% - 109px)',
71            overflow: 'auto',
72
73            [theme.breakpoints.down('md')]: {
74              maxWidth: '100%',
75            },
76          }}
77          id="event-content"
78        >
79          <EventBar title={t(titleKey)} goBack={goBack} event={event} onAdd={setIsAddToMyEvent} />
80          <Tab event={event} modulesSettings={modulesSettings}/>
81        </Box>
82      </Box>
83      <AddToMyEventDialog
84        event={event}
85        open={isAddToMyEvent}
86        onClose={() => setIsAddToMyEvent(false)}
87      />
88    </Layout>
89  );
90};
91
92export default EventLayout;