all repos — caroster @ 46303167ec1138b375af3513350eb491415bb6a1

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

frontend/pages/dashboard.tsx (view raw)

 1import {useMemo} from 'react';
 2import {useRouter} from 'next/router';
 3import moment from 'moment';
 4import {useTranslation} from 'react-i18next';
 5import useProfile from '../hooks/useProfile';
 6import LayoutDefault from '../layouts/Default';
 7import DashboardEvents from '../containers/DashboardEvents';
 8import DashboardEmpty from '../containers/DashboardEmpty';
 9import Loading from '../containers/Loading';
10import Fab from '../containers/Fab';
11import pageUtils from '../lib/pageUtils';
12
13const Dashboard = () => {
14  const {t} = useTranslation();
15  const router = useRouter();
16  const {profile, isReady} = useProfile();
17  const events = profile?.events?.data || [];
18
19  const pastEvents = useMemo(
20    () =>
21      events
22        ?.filter(({date}) => date && moment(date).isBefore(moment(), 'day'))
23        .sort(sortDesc),
24    [events]
25  );
26
27  const futureEvents = useMemo(
28    () =>
29      events
30        ?.filter(
31          ({date}) => date && moment(date).isSameOrAfter(moment(), 'day')
32        )
33        .sort(sortDesc),
34    [events]
35  );
36
37  const noDateEvents = useMemo(
38    () => events?.filter(({date}) => !date),
39    [events]
40  );
41
42  const menuActions = [
43    {
44      label: t('menu.new_event'),
45      onClick: () => router.push('/'),
46      id: 'AddEventTabs',
47    },
48    {
49      label: t('menu.profile'),
50      onClick: () => router.push('/profile'),
51      id: 'ProfileTabs',
52    },
53  ];
54
55  if (!events || !isReady)
56    return (
57      <LayoutDefault menuTitle={t('dashboard.title')}>
58        <Loading />
59      </LayoutDefault>
60    );
61
62  return (
63    <LayoutDefault menuActions={menuActions} menuTitle={t('dashboard.title')}>
64      {events.length === 0 ? (
65        <DashboardEmpty />
66      ) : (
67        <DashboardEvents
68          pastEvents={pastEvents}
69          futureEvents={futureEvents}
70          noDateEvents={noDateEvents}
71        />
72      )}
73      <Fab onClick={() => router.push('/')} aria-label="add-event">
74        {t('dashboard.actions.add_event')}
75      </Fab>
76    </LayoutDefault>
77  );
78};
79
80const sortDesc = ({date: dateA}, {date: dateB}) => dateB.localeCompare(dateA);
81
82export const getServerSideProps = pageUtils.getServerSideProps();
83
84export default Dashboard;