wheelshare-frontend/src/components/App.tsx
2021-07-08 16:16:39 -04:00

91 lines
2.0 KiB
TypeScript

import { CSSProperties, lazy, Suspense, useEffect, useState } from 'react';
import { BrowserRouter, Route, Switch } from 'react-router-dom';
import { getReceivedInvitationsAndRequests } from './api';
import { useMe } from './hooks';
import Notifications from './Notifications/Notifications';
import { IInvitation } from './types';
import WheelShare from './WheelShare';
import WheelShareLoggedOut from './WheelShareLoggedOut';
const Authenticator = lazy(() => import('./Authentication/Authenticator'));
const Group = lazy(() => import('./Group'));
const dummyNotificationData: IInvitation[] = [
{
user: {
id: 0,
name: 'Michael Fatemi',
},
carpool: {
id: 0,
name: 'Cross Country',
},
isRequest: true,
sentTime: new Date().toISOString(),
},
{
user: {
id: 1,
name: 'Joshua Hsueh',
},
carpool: {
id: 0,
name: 'TJ Lax',
},
isRequest: false,
sentTime: new Date().toISOString(),
},
];
const style: CSSProperties = {
display: 'flex',
flexDirection: 'column',
alignItems: 'center',
width: '30rem',
maxWidth: '100%',
marginLeft: 'auto',
marginRight: 'auto',
};
function useNotifications() {
const [notifications, setNotifications] = useState(dummyNotificationData);
useEffect(() => {
getReceivedInvitationsAndRequests().then(setNotifications);
}, []);
return notifications;
}
export default function App() {
const user = useMe();
const notifications = useNotifications();
return (
<div style={{ padding: '1rem', maxWidth: '100vw' }}>
<div style={style}>
{notifications.length > 0 ? (
<Notifications notifications={notifications} />
) : (
<span>No notifications</span>
)}
<BrowserRouter>
<Switch>
<Route
path="/"
exact
component={user ? WheelShare : WheelShareLoggedOut}
/>
<Suspense fallback={null}>
<Route path="/groups/:id" component={Group} />
<Route
component={Authenticator}
path="/auth/:provider/callback"
/>
</Suspense>
</Switch>
</BrowserRouter>
</div>
</div>
);
}