openreplay/frontend/app/initialize.tsx
2025-06-02 15:20:18 +02:00

181 lines
5.9 KiB
TypeScript

import './styles/index.css';
import './styles/global.css';
import React from 'react';
import '@ant-design/v5-patch-for-react-19';
import { createRoot } from 'react-dom/client';
import './init';
import { HTML5Backend } from 'react-dnd-html5-backend';
import { DndProvider } from 'react-dnd';
import { ConfigProvider, App, theme as antdTheme, ThemeConfig } from 'antd';
import { BrowserRouter } from 'react-router-dom';
import { Notification, MountPoint } from 'UI';
import { QueryClient, QueryClientProvider } from '@tanstack/react-query';
import { StoreProvider, RootStore } from './mstore';
import Router from './Router';
import './i18n';
import { ThemeProvider, useTheme } from './ThemeContext';
// @ts-ignore
window.getCommitHash = () => console.log(window.env.COMMIT_HASH);
const queryClient = new QueryClient();
const cssVar = (name: string) => `var(--color-${name})`;
const ThemedApp: React.FC = () => {
const { theme } = useTheme();
// Create theme based on current theme setting
const customTheme: ThemeConfig = {
algorithm: theme === 'dark' ? antdTheme.darkAlgorithm : antdTheme.defaultAlgorithm,
components: {
Layout: {
headerBg: cssVar('gray-lightest'),
siderBg: cssVar('gray-lightest'),
},
Segmented: {
itemSelectedBg: theme === 'dark' ? cssVar('gray-darkest') : '#FFFFFF',
itemSelectedColor: cssVar('main'),
},
Menu: {
colorPrimary: cssVar('teal'),
colorBgContainer: cssVar('gray-lightest'),
colorFillTertiary: cssVar('gray-lightest'),
colorBgLayout: cssVar('gray-lightest'),
subMenuItemBg: cssVar('gray-lightest'),
itemHoverBg: cssVar('active-blue'),
itemHoverColor: cssVar('teal'),
itemActiveBg: cssVar('tealx-light'),
itemSelectedBg: cssVar('tealx-light'),
itemSelectedColor: cssVar('teal'),
itemColor: cssVar('gray-darkest'),
itemMarginBlock: 0,
collapsedWidth: 180,
},
Button: {
colorPrimary: cssVar('main'),
},
Select: {
colorBgContainer: cssVar('white'),
colorBgElevated: cssVar('white'),
colorBorder: cssVar('gray-light'),
colorPrimaryHover: cssVar('main'),
colorPrimary: cssVar('main'),
colorText: cssVar('gray-darkest'),
colorTextPlaceholder: cssVar('gray-medium'),
colorTextQuaternary: cssVar('gray-medium'),
controlItemBgActive: cssVar('active-blue'),
controlItemBgHover: cssVar('active-blue'),
},
Radio: {
colorPrimary: cssVar('main'),
colorBorder: cssVar('gray-medium'),
colorBgContainer: cssVar('white'),
},
Switch: {
colorPrimary: cssVar('main'),
colorPrimaryHover: cssVar('teal-dark'),
colorTextQuaternary: cssVar('gray-light'),
colorTextTertiary: cssVar('gray-medium'),
colorBgContainer: cssVar('white'),
},
Input: {
colorBgContainer: cssVar('white'),
colorBorder: cssVar('gray-light'),
colorText: cssVar('gray-darkest'),
colorTextPlaceholder: cssVar('gray-medium'),
activeBorderColor: cssVar('main'),
hoverBorderColor: cssVar('main'),
},
Checkbox: {
colorPrimary: cssVar('main'),
colorBgContainer: cssVar('white'),
colorBorder: cssVar('gray-medium'),
},
Table: {
colorBgContainer: cssVar('white'),
colorText: cssVar('gray-darkest'),
colorTextHeading: cssVar('gray-darkest'),
colorBorderSecondary: cssVar('gray-light'),
headerBg: cssVar('gray-lightest'),
rowHoverBg: cssVar('gray-lightest'),
headerSortHoverBg: cssVar('gray-light'),
headerSortActiveBg: cssVar('gray-light'),
fixedHeaderSortActiveBg: cssVar('gray-light'),
},
Modal: {
colorBgElevated: cssVar('white'),
colorText: cssVar('gray-darkest'),
},
Card: {
colorBgContainer: cssVar('white'),
colorBorderSecondary: cssVar('gray-light'),
},
Tooltip: {
colorBgSpotlight: cssVar('white'),
colorTextLightSolid: cssVar('gray-darkest'),
},
Tabs: {
itemActiveColor: cssVar('main'),
inkBarColor: cssVar('main'),
itemSelectedColor: cssVar('main')
},
Tag: {
defaultBg: cssVar('gray-lightest'),
defaultColor: cssVar('gray-darkest'),
},
},
token: {
colorPrimary: cssVar('main'),
colorPrimaryActive: cssVar('teal-dark'),
colorPrimaryHover: cssVar('main'),
colorPrimaryBorder: cssVar('main'),
colorBorder: cssVar('gray-light'),
colorBgLayout: cssVar('gray-lightest'),
colorBgContainer: cssVar('white'),
controlItemBgActive: cssVar('active-blue'),
controlItemBgActiveHover: cssVar('active-blue'),
controlItemBgHover: cssVar('active-blue'),
colorLink: cssVar('teal'),
colorLinkHover: cssVar('teal-dark'),
colorText: cssVar('gray-darkest'),
colorTextSecondary: cssVar('gray-dark'),
colorTextDisabled: cssVar('disabled-text'),
borderRadius: 4,
fontSize: 14,
fontFamily: "'Roboto', 'ArialMT', 'Arial'",
fontWeightStrong: 400,
colorSplit: cssVar('gray-light'),
},
};
return (
<ConfigProvider theme={customTheme}>
<App>
<StoreProvider store={new RootStore()}>
<DndProvider backend={HTML5Backend}>
<BrowserRouter>
<Notification />
<Router />
</BrowserRouter>
</DndProvider>
<MountPoint />
</StoreProvider>
</App>
</ConfigProvider>
);
};
document.addEventListener('DOMContentLoaded', () => {
const container = document.getElementById('app');
// @ts-ignore
const root = createRoot(container);
root.render(
<QueryClientProvider client={queryClient}>
<ThemeProvider>
<ThemedApp />
</ThemeProvider>
</QueryClientProvider>
);
});