mirror of
https://github.com/jeffvli/feishin.git
synced 2026-05-08 04:50:12 +02:00
96 lines
3.3 KiB
TypeScript
96 lines
3.3 KiB
TypeScript
/* eslint-disable perfectionist/sort-imports */
|
|
import { MantineProvider } from '@mantine/core';
|
|
import { Notifications } from '@mantine/notifications';
|
|
import 'overlayscrollbars/overlayscrollbars.css';
|
|
import '/styles/overlayscrollbars.css';
|
|
import '@mantine/core/styles.css';
|
|
import '@mantine/dates/styles.css';
|
|
import '@mantine/notifications/styles.css';
|
|
import isElectron from 'is-electron';
|
|
import { useEffect, useMemo, useRef, useState } from 'react';
|
|
|
|
import i18n from '/@/i18n/i18n';
|
|
import { WebAudioContext } from '/@/renderer/features/player/context/webaudio-context';
|
|
import { useServerVersion } from '/@/renderer/hooks/use-server-version';
|
|
import { IsUpdatedDialog } from '/@/renderer/is-updated-dialog';
|
|
import { AppRouter } from '/@/renderer/router/app-router';
|
|
import { useCssSettings, useHotkeySettings, useSettingsStore } from '/@/renderer/store';
|
|
import { useAppTheme } from '/@/renderer/themes/use-app-theme';
|
|
import { sanitizeCss } from '/@/renderer/utils/sanitize';
|
|
import { WebAudio } from '/@/shared/types/types';
|
|
import '/@/shared/styles/global.css';
|
|
import { PlayerProvider } from '/@/renderer/features/player/context/player-context';
|
|
import { AudioPlayers } from '/@/renderer/features/player/components/audio-players';
|
|
|
|
const ipc = isElectron() ? window.api.ipc : null;
|
|
|
|
export const App = () => {
|
|
const { mode, theme } = useAppTheme();
|
|
const language = useSettingsStore((store) => store.general.language);
|
|
|
|
const { content, enabled } = useCssSettings();
|
|
const { bindings } = useHotkeySettings();
|
|
const cssRef = useRef<HTMLStyleElement | null>(null);
|
|
useServerVersion();
|
|
|
|
const [webAudio, setWebAudio] = useState<WebAudio>();
|
|
|
|
useEffect(() => {
|
|
if (enabled && content) {
|
|
// Yes, CSS is sanitized here as well. Prevent a suer from changing the
|
|
// localStorage to bypass sanitizing.
|
|
const sanitized = sanitizeCss(content);
|
|
if (!cssRef.current) {
|
|
cssRef.current = document.createElement('style');
|
|
document.body.appendChild(cssRef.current);
|
|
}
|
|
|
|
cssRef.current.textContent = sanitized;
|
|
|
|
return () => {
|
|
cssRef.current!.textContent = '';
|
|
};
|
|
}
|
|
|
|
return () => {};
|
|
}, [content, enabled]);
|
|
|
|
const webAudioProvider = useMemo(() => {
|
|
return { setWebAudio, webAudio };
|
|
}, [webAudio]);
|
|
|
|
useEffect(() => {
|
|
if (isElectron()) {
|
|
ipc?.send('set-global-shortcuts', bindings);
|
|
}
|
|
}, [bindings]);
|
|
|
|
useEffect(() => {
|
|
if (language) {
|
|
i18n.changeLanguage(language);
|
|
}
|
|
}, [language]);
|
|
|
|
return (
|
|
<MantineProvider forceColorScheme={mode} theme={theme}>
|
|
<Notifications
|
|
containerWidth="300px"
|
|
position="bottom-center"
|
|
styles={{
|
|
root: {
|
|
marginBottom: 90,
|
|
},
|
|
}}
|
|
zIndex={50000}
|
|
/>
|
|
<WebAudioContext.Provider value={webAudioProvider}>
|
|
<PlayerProvider>
|
|
<AudioPlayers />
|
|
<AppRouter />
|
|
</PlayerProvider>
|
|
</WebAudioContext.Provider>
|
|
<IsUpdatedDialog />
|
|
</MantineProvider>
|
|
);
|
|
};
|