/* 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 { useSyncSettingsToMain } from '/@/renderer/hooks/use-sync-settings-to-main'; import { ReleaseNotesModal } from './release-notes-modal'; import { AppRouter } from '/@/renderer/router/app-router'; import { useCssSettings, useHotkeySettings, useLanguage } 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 = useLanguage(); const { content, enabled } = useCssSettings(); const { bindings } = useHotkeySettings(); const cssRef = useRef(null); useSyncSettingsToMain(); 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]); const notificationStyles = useMemo( () => ({ root: { marginBottom: 90, }, }), [], ); return ( ); };