import { MantineProvider } from '@mantine/core'; import '@mantine/core/styles.css'; import '@mantine/dates/styles.css'; import { Notifications } from '@mantine/notifications'; import '@mantine/notifications/styles.css'; import isElectron from 'is-electron'; import { useEffect, useMemo, useRef, useState } from 'react'; import '/@/shared/styles/global.css'; import 'overlayscrollbars/overlayscrollbars.css'; import i18n from '/@/i18n/i18n'; import { useDiscordRpc } from '/@/renderer/features/discord-rpc/use-discord-rpc'; import { PlayerProvider } from '/@/renderer/features/player/context/player-context'; 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 '/styles/overlayscrollbars.css'; 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(null); useDiscordRpc(); useServerVersion(); const [webAudio, setWebAudio] = useState(); 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 ( ); };