-
Notifications
You must be signed in to change notification settings - Fork 0
/
main.tsx
123 lines (120 loc) · 3.41 KB
/
main.tsx
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
// eslint-disable-line unicorn/filename-case
import React, {lazy, Suspense} from 'react';
import ReactDOM from 'react-dom/client';
import '@unocss/reset/tailwind.css';
import 'virtual:uno.css';
import {createBrowserRouter, redirect, RouterProvider} from 'react-router-dom';
import './index.css';
import ErrorPage from './pages/ErrorPage.tsx';
import Loading from './components/Loading.tsx';
import {UserProvider} from './components/UserProvider.tsx';
const Audience = lazy(async () => import('./pages/Audience.tsx'));
const Speaker = lazy(async () => import('./pages/Speaker.tsx'));
const Presentation = lazy(async () => import('./pages/Presentation.tsx'));
const Home = lazy(async () => import('./pages/Home.tsx'));
const SignIn = lazy(async () => import('./pages/SignIn.tsx'));
const Upload = lazy(async () => import('./pages/Upload.tsx'));
const PresentationPreferences = lazy(
async () => import('./pages/PresentationPreferences.tsx'),
);
const UserPreferences = lazy(async () => import('./pages/UserPreferences.tsx'));
const Viewer = lazy(async () => import('./pages/Viewer.tsx'));
const router = createBrowserRouter([
{
path: '/',
element: <Home />,
errorElement: <ErrorPage />,
},
{
path: '/signin',
element: <SignIn />,
errorElement: <ErrorPage />,
},
{
path: '/upload',
element: <Upload />,
errorElement: <ErrorPage />,
},
{
path: '/user',
element: <UserPreferences />,
errorElement: <ErrorPage />,
},
{
path: '/p/:presentationId',
element: <Presentation />,
errorElement: <ErrorPage />,
},
{
path: '/r/p/:presentationId',
// Note: redirects could also happen with a component and useNavigate... not sure which is better
loader({request}) {
const redirectTo = new URL(request.url);
return redirect(
`${redirectTo.pathname.replace('/r/', '/')}${redirectTo.search}`,
);
},
errorElement: <ErrorPage />,
},
{
path: '/i/:presentationId',
element: <Audience />,
errorElement: <ErrorPage />,
},
{
path: '/r/i/:presentationId',
// Note: redirects could also happen with a component and useNavigate... not sure which is better
loader({request}) {
const redirectTo = new URL(request.url);
return redirect(
`${redirectTo.pathname.replace('/r/', '/')}${redirectTo.search}`,
);
},
errorElement: <ErrorPage />,
},
{
path: '/s/:presentationId',
element: <Speaker />,
errorElement: <ErrorPage />,
},
{
path: '/v/:presentationId',
element: <Viewer />,
errorElement: <ErrorPage />,
},
{
path: '/r/v/:presentationId',
// Note: redirects could also happen with a component and useNavigate... not sure which is better
loader({request}) {
const redirectTo = new URL(request.url);
return redirect(
`${redirectTo.pathname.replace('/r/', '/')}${redirectTo.search}`,
);
},
errorElement: <ErrorPage />,
},
{
path: '/e/:presentationId',
element: <PresentationPreferences />,
errorElement: <ErrorPage />,
},
{
path: '*',
element: <ErrorPage />,
},
]);
ReactDOM.createRoot(document.querySelector('#root')!).render(
<React.StrictMode>
<UserProvider>
<Suspense
fallback={
<div className="h-screen w-screen">
<Loading />
</div>
}
>
<RouterProvider router={router} />
</Suspense>
</UserProvider>
</React.StrictMode>,
);