blob: aea571bc3c7cfb6d6b34ad22f7e323222d8e6ace [file] [log] [blame]
simon3f5f3e72022-11-08 21:01:57 -05001/*
2 * Copyright (C) 2022 Savoir-faire Linux Inc.
3 *
4 * This program is free software; you can redistribute it and/or modify
5 * it under the terms of the GNU Affero General Public License as
6 * published by the Free Software Foundation; either version 3 of the
7 * License, or (at your option) any later version.
8 *
9 * This program is distributed in the hope that it will be useful,
10 * but WITHOUT ANY WARRANTY; without even the implied warranty of
11 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12 * GNU Affero General Public License for more details.
13 *
14 * You should have received a copy of the GNU Affero General Public
15 * License along with this program. If not, see
16 * <https://www.gnu.org/licenses/>.
17 */
18import { createBrowserRouter, createRoutesFromElements, Outlet, Route } from 'react-router-dom';
19
Michelle Sepkap Sime6967fb92022-11-08 08:39:36 -050020import App, { appLoader } from './App';
simon3f5f3e72022-11-08 21:01:57 -050021import ContactList from './components/ContactList';
simonf929a362022-11-18 16:53:45 -050022import ConversationView from './components/ConversationView';
simon3f5f3e72022-11-08 21:01:57 -050023import AuthProvider from './contexts/AuthProvider';
simonf929a362022-11-18 16:53:45 -050024import CallProvider, { CallRole } from './contexts/CallProvider';
25import ConversationProvider from './contexts/ConversationProvider';
26import WebRTCProvider from './contexts/WebRTCProvider';
simon3f5f3e72022-11-08 21:01:57 -050027import WebSocketProvider from './contexts/WebSocketProvider';
simonf929a362022-11-18 16:53:45 -050028import { RouteParams } from './hooks/useUrlParams';
29import NotificationManager from './managers/NotificationManager';
simon3f5f3e72022-11-08 21:01:57 -050030import AccountSettings from './pages/AccountSettings';
31import CallInterface from './pages/CallInterface';
32import Messenger from './pages/Messenger';
Michelle Sepkap Sime6967fb92022-11-08 08:39:36 -050033import Setup from './pages/Setup';
34import SetupLogin from './pages/SetupLogin';
simon3f5f3e72022-11-08 21:01:57 -050035import Welcome from './pages/Welcome';
36import { ThemeDemonstrator } from './themes/ThemeDemonstrator';
simon3f5f3e72022-11-08 21:01:57 -050037
simonf929a362022-11-18 16:53:45 -050038export type ConversationRouteParams = RouteParams<{ conversationId: string }, Record<string, never>>;
39export type AddContactRouteParams = RouteParams<{ contactId: string }, Record<string, never>>;
40
41/**
42 * Route parameters for the call routes.
43 */
44export type CallRouteParams = RouteParams<{ conversationId: string }, { role?: CallRole }>;
simon3f5f3e72022-11-08 21:01:57 -050045
46export const router = createBrowserRouter(
47 createRoutesFromElements(
Michelle Sepkap Sime6967fb92022-11-08 08:39:36 -050048 <Route path="/" element={<App />} loader={appLoader}>
simon3f5f3e72022-11-08 21:01:57 -050049 <Route path="login" element={<Welcome />} />
Michelle Sepkap Sime6967fb92022-11-08 08:39:36 -050050 <Route path="setup/login" element={<SetupLogin />} />
51 <Route path="setup" element={<Setup />} />
simon3f5f3e72022-11-08 21:01:57 -050052 <Route path="theme" element={<ThemeDemonstrator />} />
53 <Route
54 element={
55 <AuthProvider>
56 <WebSocketProvider>
simonf929a362022-11-18 16:53:45 -050057 <NotificationManager>
58 <Outlet />
59 </NotificationManager>
simon3f5f3e72022-11-08 21:01:57 -050060 </WebSocketProvider>
61 </AuthProvider>
62 }
63 >
simonf929a362022-11-18 16:53:45 -050064 <Route index element={<Messenger />} />
65 <Route path="conversation" element={<Messenger />}>
66 <Route path="add-contact/:contactId" />
67 <Route
68 path=":conversationId"
69 element={
70 <ConversationProvider>
71 <Outlet />
72 </ConversationProvider>
73 }
74 >
75 <Route index element={<ConversationView />} />
76 <Route
77 path="call"
78 element={
79 <WebRTCProvider>
80 <CallProvider>
81 <CallInterface />
82 </CallProvider>
83 </WebRTCProvider>
84 }
85 />
86 </Route>
87 </Route>
simon3f5f3e72022-11-08 21:01:57 -050088 <Route path="settings" element={<AccountSettings />} />
89 <Route path="contacts" element={<ContactList />} />
simon3f5f3e72022-11-08 21:01:57 -050090 </Route>
simon3f5f3e72022-11-08 21:01:57 -050091 </Route>
92 )
93);