import { useLayoutEffect, useState } from 'react'; import CanvasStudio from './pages/CanvasStudio'; import TemplateHome from './pages/TemplateHome'; import TestWorkbench from './pages/TestWorkbench'; import { CanvasDocument, WordcloudStickerPayload } from './types'; import { createDefaultDocument } from './lib/canvasDocument'; type AppPage = 'home' | 'canvas' | 'wordcloud'; type ThemeMode = 'light' | 'dark' | 'system'; const getStoredTheme = (): ThemeMode => { const stored = window.localStorage.getItem('wordcloud-theme'); return stored === 'light' || stored === 'dark' || stored === 'system' ? stored : 'system'; }; const getSystemTheme = () => window.matchMedia('(prefers-color-scheme: dark)').matches ? 'dark' : 'light'; export default function App() { const [page, setPage] = useState('home'); const [themeMode] = useState(getStoredTheme); const [systemTheme] = useState<'light' | 'dark'>(getSystemTheme); const [initialDocument, setInitialDocument] = useState(null); const [pendingWordcloudSticker, setPendingWordcloudSticker] = useState(null); useLayoutEffect(() => { const resolvedTheme = themeMode === 'system' ? systemTheme : themeMode; document.documentElement.dataset.theme = resolvedTheme; document.documentElement.dataset.themeMode = themeMode; document.documentElement.style.colorScheme = resolvedTheme; }, [themeMode, systemTheme]); if (page === 'wordcloud') { return ( setPage('canvas')} onImportWordcloudSticker={(payload) => { setPendingWordcloudSticker(payload); setPage('canvas'); }} /> ); } if (page === 'canvas') { return ( setPage('home')} onOpenWordcloud={() => setPage('wordcloud')} initialDocument={initialDocument} onConsumeInitialDocument={() => setInitialDocument(null)} pendingWordcloudSticker={pendingWordcloudSticker} onConsumeWordcloudSticker={() => setPendingWordcloudSticker(null)} /> ); } return ( { setInitialDocument(createDefaultDocument()); setPage('canvas'); }} onUseTemplate={(template) => { setInitialDocument(template.document); setPage('canvas'); }} onOpenCanvas={() => setPage('canvas')} onOpenWordcloud={() => setPage('wordcloud')} /> ); }