"use client"; import React, { useEffect, use } from "react"; import { ResizablePanelGroup, ResizablePanel, ResizableHandle } from "@/components/ui/resizable"; import { Tabs, TabsContent, TabsList, TabsTrigger } from "@/components/ui/tabs"; import { Theme, ThemeStyles } from "@/types/theme"; import { Sliders } from "lucide-react"; import { useEditorStore } from "@/store/editor-store"; import { ActionBar } from "./action-bar/action-bar"; import ThemeControlPanel from "./theme-control-panel"; import ThemePreviewPanel from "./theme-preview-panel"; interface EditorProps { themePromise: Promise; } const isThemeStyles = (styles: unknown): styles is ThemeStyles => { return ( !!styles && typeof styles === "object" && styles !== null && "light" in styles && "dark" in styles ); }; const Editor: React.FC = ({ themePromise }) => { const themeState = useEditorStore((state) => state.themeState); const setThemeState = useEditorStore((state) => state.setThemeState); const initialTheme = themePromise ? use(themePromise) : null; const handleStyleChange = React.useCallback( (newStyles: ThemeStyles) => { const prev = useEditorStore.getState().themeState; setThemeState({ ...prev, styles: newStyles }); }, [setThemeState] ); useEffect(() => { if (initialTheme && isThemeStyles(initialTheme.styles)) { const prev = useEditorStore.getState().themeState; setThemeState({ ...prev, styles: initialTheme.styles, preset: initialTheme.id, }); } }, [initialTheme, setThemeState]); if (initialTheme && !isThemeStyles(initialTheme.styles)) { return (
Fetched theme data is invalid.
); } const styles = themeState.styles; return (
{/* Desktop Layout */}
{/* Mobile Layout */}
Controls Preview
); }; export default Editor;