2023-03-06 13:30:58 +00:00
|
|
|
import { MantineProvider } from '@mantine/core';
|
|
|
|
import { ModalsProvider } from '@mantine/modals';
|
2023-03-14 11:00:40 +00:00
|
|
|
import React from 'react';
|
|
|
|
import ReactDOM from 'react-dom/client';
|
|
|
|
import { IntlProvider } from 'react-intl';
|
2023-03-10 22:00:37 +00:00
|
|
|
import { Provider } from 'react-redux';
|
2023-03-14 11:00:40 +00:00
|
|
|
import { createBrowserRouter, RouterProvider } from "react-router-dom";
|
2023-03-10 22:00:37 +00:00
|
|
|
import { PersistGate } from 'redux-persist/integration/react';
|
2023-03-16 19:06:29 +00:00
|
|
|
import { AppContextProvider } from './context';
|
|
|
|
import store, { persistor } from './store';
|
2023-03-14 11:00:40 +00:00
|
|
|
|
|
|
|
import ChatPage from './components/pages/chat';
|
|
|
|
import LandingPage from './components/pages/landing';
|
2023-03-08 21:30:11 +00:00
|
|
|
|
2023-03-14 11:00:40 +00:00
|
|
|
import './backend';
|
2023-03-06 13:30:58 +00:00
|
|
|
import './index.scss';
|
|
|
|
|
|
|
|
const router = createBrowserRouter([
|
|
|
|
{
|
|
|
|
path: "/",
|
2023-03-08 21:30:11 +00:00
|
|
|
element: <AppContextProvider>
|
|
|
|
<LandingPage landing={true} />
|
|
|
|
</AppContextProvider>,
|
2023-03-06 13:30:58 +00:00
|
|
|
},
|
|
|
|
{
|
|
|
|
path: "/chat/:id",
|
2023-03-08 21:30:11 +00:00
|
|
|
element: <AppContextProvider>
|
|
|
|
<ChatPage />
|
|
|
|
</AppContextProvider>,
|
2023-03-06 13:30:58 +00:00
|
|
|
},
|
|
|
|
{
|
|
|
|
path: "/s/:id",
|
2023-03-08 21:30:11 +00:00
|
|
|
element: <AppContextProvider>
|
|
|
|
<ChatPage share={true} />
|
|
|
|
</AppContextProvider>,
|
2023-03-06 13:30:58 +00:00
|
|
|
},
|
|
|
|
{
|
|
|
|
path: "/s/:id/*",
|
2023-03-08 21:30:11 +00:00
|
|
|
element: <AppContextProvider>
|
|
|
|
<ChatPage share={true} />
|
|
|
|
</AppContextProvider>,
|
|
|
|
},
|
2023-03-06 13:30:58 +00:00
|
|
|
]);
|
|
|
|
|
|
|
|
const root = ReactDOM.createRoot(
|
|
|
|
document.getElementById('root') as HTMLElement
|
|
|
|
);
|
|
|
|
|
2023-03-14 11:00:40 +00:00
|
|
|
async function loadLocaleData(locale: string) {
|
2023-03-16 20:05:45 +00:00
|
|
|
const response = await fetch(`/lang/${locale}.json`);
|
|
|
|
if (!response.ok) {
|
2023-03-14 11:00:40 +00:00
|
|
|
throw new Error("Failed to load locale data");
|
|
|
|
}
|
2023-03-16 20:05:45 +00:00
|
|
|
const messages: any = await response.json();
|
|
|
|
for (const key of Object.keys(messages)) {
|
|
|
|
if (typeof messages[key] !== 'string') {
|
|
|
|
messages[key] = messages[key].defaultMessage;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
return messages;
|
2023-03-14 11:00:40 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
async function bootstrapApplication() {
|
|
|
|
const locale = navigator.language;
|
|
|
|
|
|
|
|
let messages: any;
|
|
|
|
try {
|
|
|
|
messages = await loadLocaleData(locale.toLocaleLowerCase());
|
|
|
|
} catch (e) {
|
|
|
|
console.warn("No locale data for", locale);
|
|
|
|
}
|
|
|
|
|
|
|
|
root.render(
|
|
|
|
<React.StrictMode>
|
|
|
|
<IntlProvider locale={navigator.language} messages={messages}>
|
|
|
|
<MantineProvider theme={{ colorScheme: "dark" }}>
|
|
|
|
<Provider store={store}>
|
|
|
|
<PersistGate loading={null} persistor={persistor}>
|
|
|
|
<ModalsProvider>
|
|
|
|
<RouterProvider router={router} />
|
|
|
|
</ModalsProvider>
|
|
|
|
</PersistGate>
|
|
|
|
</Provider>
|
|
|
|
</MantineProvider>
|
|
|
|
</IntlProvider>
|
|
|
|
</React.StrictMode>
|
|
|
|
);
|
|
|
|
}
|
|
|
|
|
|
|
|
bootstrapApplication();
|