blob: 8ed340336e3a1501eaf891e997067b5ccf238d0b [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';
simonff1cb352022-11-24 15:15:26 -050024import CallProvider, { CallRole, CallStatus } from './contexts/CallProvider';
simonf929a362022-11-18 16:53:45 -050025import ConversationProvider from './contexts/ConversationProvider';
simon21f7d9f2022-11-28 14:21:54 -050026import MessengerProvider from './contexts/MessengerProvider';
Misha Krieger-Raynauld20cf1c82022-11-23 20:26:50 -050027import WebRtcProvider from './contexts/WebRtcProvider';
simon3f5f3e72022-11-08 21:01:57 -050028import WebSocketProvider from './contexts/WebSocketProvider';
simonf929a362022-11-18 16:53:45 -050029import { RouteParams } from './hooks/useUrlParams';
30import NotificationManager from './managers/NotificationManager';
simon3f5f3e72022-11-08 21:01:57 -050031import AccountSettings from './pages/AccountSettings';
32import CallInterface from './pages/CallInterface';
idillon3470d072022-11-22 15:22:34 -050033import GeneralSettings from './pages/GeneralSettings';
simon3f5f3e72022-11-08 21:01:57 -050034import Messenger from './pages/Messenger';
Michelle Sepkap Sime6967fb92022-11-08 08:39:36 -050035import Setup from './pages/Setup';
36import SetupLogin from './pages/SetupLogin';
simon3f5f3e72022-11-08 21:01:57 -050037import Welcome from './pages/Welcome';
38import { ThemeDemonstrator } from './themes/ThemeDemonstrator';
simon3f5f3e72022-11-08 21:01:57 -050039
simon21f7d9f2022-11-28 14:21:54 -050040export type ConversationRouteParams = RouteParams<{ conversationId?: string }, Record<string, never>>;
simonf929a362022-11-18 16:53:45 -050041
simonff1cb352022-11-24 15:15:26 -050042export type CallRouteParams = RouteParams<
43 { conversationId?: string },
Charlieb837e8f2022-11-28 19:18:46 -050044 Record<string, never>,
simonff1cb352022-11-24 15:15:26 -050045 {
Charlieb837e8f2022-11-28 19:18:46 -050046 role: CallRole;
simonff1cb352022-11-24 15:15:26 -050047 isVideoOn?: boolean;
48 callStatus: CallStatus;
49 }
50>;
simon3f5f3e72022-11-08 21:01:57 -050051
52export const router = createBrowserRouter(
53 createRoutesFromElements(
Michelle Sepkap Sime6967fb92022-11-08 08:39:36 -050054 <Route path="/" element={<App />} loader={appLoader}>
simon3f5f3e72022-11-08 21:01:57 -050055 <Route path="login" element={<Welcome />} />
Michelle Sepkap Sime6967fb92022-11-08 08:39:36 -050056 <Route path="setup/login" element={<SetupLogin />} />
57 <Route path="setup" element={<Setup />} />
simon3f5f3e72022-11-08 21:01:57 -050058 <Route path="theme" element={<ThemeDemonstrator />} />
59 <Route
60 element={
61 <AuthProvider>
62 <WebSocketProvider>
simonf929a362022-11-18 16:53:45 -050063 <NotificationManager>
64 <Outlet />
65 </NotificationManager>
simon3f5f3e72022-11-08 21:01:57 -050066 </WebSocketProvider>
67 </AuthProvider>
68 }
69 >
simon21f7d9f2022-11-28 14:21:54 -050070 <Route
71 element={
72 <MessengerProvider>
73 <Outlet />
74 </MessengerProvider>
75 }
76 >
77 <Route index element={<Messenger />} />
78 <Route path="conversation" element={<Messenger />} />
simonf929a362022-11-18 16:53:45 -050079 <Route
simon21f7d9f2022-11-28 14:21:54 -050080 path="conversation/:conversationId"
simonf929a362022-11-18 16:53:45 -050081 element={
simon09fe4822022-11-30 23:36:25 -050082 <ConversationProvider>
83 <Messenger>
simon21f7d9f2022-11-28 14:21:54 -050084 <Outlet />
simon09fe4822022-11-30 23:36:25 -050085 </Messenger>
86 </ConversationProvider>
simonf929a362022-11-18 16:53:45 -050087 }
88 >
89 <Route index element={<ConversationView />} />
90 <Route
91 path="call"
92 element={
Misha Krieger-Raynauld20cf1c82022-11-23 20:26:50 -050093 <WebRtcProvider>
simonf929a362022-11-18 16:53:45 -050094 <CallProvider>
95 <CallInterface />
96 </CallProvider>
Misha Krieger-Raynauld20cf1c82022-11-23 20:26:50 -050097 </WebRtcProvider>
simonf929a362022-11-18 16:53:45 -050098 }
99 />
100 </Route>
101 </Route>
idillon3470d072022-11-22 15:22:34 -0500102 <Route path="settings-account" element={<AccountSettings />} />
103 <Route path="settings-general" element={<GeneralSettings />} />
simon3f5f3e72022-11-08 21:01:57 -0500104 <Route path="contacts" element={<ContactList />} />
simon3f5f3e72022-11-08 21:01:57 -0500105 </Route>
simon3f5f3e72022-11-08 21:01:57 -0500106 </Route>
107 )
108);