import { useState, useEffect } from 'react'; import AnimateApp from './AnimateApp'; import ExcalidrawApp from './ExcalidrawApp'; import type { AppState, BinaryFiles } from '@excalidraw/excalidraw/types'; import type { ExcalidrawElement } from '@excalidraw/excalidraw/element/types'; const STORAGE_KEY = 'excalidraw-app'; const loadFromStorage = (): | { elements: ExcalidrawElement[]; appState: AppState; files: BinaryFiles } | undefined => { try { const data = JSON.parse(localStorage.getItem(STORAGE_KEY) || ''); data.appState.collaborators = new Map(); data.scrollToContent = true; return data; } catch { return undefined; } }; const saveToStorage = (data: { elements: readonly ExcalidrawElement[]; appState: AppState; files: BinaryFiles; }) => { try { localStorage.setItem(STORAGE_KEY, JSON.stringify(data)); } catch { // ignore } }; type ViewMode = 'animate' | 'excalidraw'; type Theme = 'light' | 'dark'; const App = () => { const [mode, setMode] = useState('animate'); const [theme, setTheme] = useState( () => (localStorage.getItem('theme') as Theme | null) ?? 'light', ); useEffect(() => { document.documentElement.classList.remove('light', 'dark'); document.documentElement.classList.add(theme); localStorage.setItem('theme', theme); }, [theme]); const toggleMode = () => { setMode((prev) => (prev === 'animate' ? 'excalidraw' : 'animate')); }; const toggleTheme = () => { setTheme((prev) => (prev === 'light' ? 'dark' : 'light')); }; return (
{mode === 'animate' ? ( ) : ( saveToStorage(data)} theme={theme} /> )}
); }; export default App;