-
Notifications
You must be signed in to change notification settings - Fork 2.5k
/
router.tsx
118 lines (110 loc) · 3.25 KB
/
router.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
import { QueryClient, useQueryClient } from '@tanstack/react-query';
import { useMemo } from 'react';
import {
LoaderFunctionArgs,
RouterProvider,
createBrowserRouter,
} from 'react-router-dom';
import { ProtectedRoute } from '@/lib/auth';
import { AppRoot } from './routes/app/root';
export const createAppRouter = (queryClient: QueryClient) =>
createBrowserRouter([
{
path: '/',
lazy: async () => {
const { LandingRoute } = await import('./routes/landing');
return { Component: LandingRoute };
},
},
{
path: '/auth/register',
lazy: async () => {
const { RegisterRoute } = await import('./routes/auth/register');
return { Component: RegisterRoute };
},
},
{
path: '/auth/login',
lazy: async () => {
const { LoginRoute } = await import('./routes/auth/login');
return { Component: LoginRoute };
},
},
{
path: '/app',
element: (
<ProtectedRoute>
<AppRoot />
</ProtectedRoute>
),
children: [
{
path: 'discussions',
lazy: async () => {
const { DiscussionsRoute } = await import(
'./routes/app/discussions/discussions'
);
return { Component: DiscussionsRoute };
},
loader: async (args: LoaderFunctionArgs) => {
const { discussionsLoader } = await import(
'./routes/app/discussions/discussions'
);
return discussionsLoader(queryClient)(args);
},
},
{
path: 'discussions/:discussionId',
lazy: async () => {
const { DiscussionRoute } = await import(
'./routes/app/discussions/discussion'
);
return { Component: DiscussionRoute };
},
loader: async (args: LoaderFunctionArgs) => {
const { discussionLoader } = await import(
'./routes/app/discussions/discussion'
);
return discussionLoader(queryClient)(args);
},
},
{
path: 'users',
lazy: async () => {
const { UsersRoute } = await import('./routes/app/users');
return { Component: UsersRoute };
},
loader: async () => {
const { usersLoader } = await import('./routes/app/users');
return usersLoader(queryClient)();
},
},
{
path: 'profile',
lazy: async () => {
const { ProfileRoute } = await import('./routes/app/profile');
return { Component: ProfileRoute };
},
},
{
path: '',
lazy: async () => {
const { DashboardRoute } = await import('./routes/app/dashboard');
return { Component: DashboardRoute };
},
},
],
},
{
path: '*',
lazy: async () => {
const { NotFoundRoute } = await import('./routes/not-found');
return { Component: NotFoundRoute };
},
},
]);
export const AppRouter = () => {
const queryClient = useQueryClient();
const router = useMemo(() => createAppRouter(queryClient), [queryClient]);
return <RouterProvider router={router} />;
};