import { useState, useEffect, Suspense, lazy, useMemo, } from '@wordpress/element'; import { ModifierPanelProps } from '@components/DesignPanel/types'; import { ChapterDivider } from '@components/ui/ChapterDivider'; import ButtonToggleGroup from '@components/ui/ButtonToggle'; import TailwindIcon from 'blockbite-icons/dist/Tailwind'; import Half3Icon from 'blockbite-icons/dist/Half3'; export const ThemeOrNative: React.FC = ({ currentControlId, currentControlLabel, modifiers, emitOptions, }) => { const [category, setCategory] = useState('theme'); const [activeControl, setActiveControl] = useState(null); const [codexValue, setCodexValue] = useState(null); const [currentModifier, setCurrentModifier] = useState(); // Set the first modifier on mount useEffect(() => { setCurrentModifier(modifiers[0]); }, []); // Update activeControl and codexValue when category or currentModifier changes useEffect(() => { if (currentModifier?.id) { const dynamicSplit = currentModifier.dynamicControl?.split('|') || []; const codexSplit = currentModifier.codex?.split('|') || []; if (dynamicSplit.length > 0 && codexSplit.length > 0) { setActiveControl(dynamicSplit[category === 'theme' ? 0 : 1] || null); setCodexValue(codexSplit[category === 'theme' ? 0 : 1] || null); } } }, [category, currentModifier?.id]); // Lazy load the dynamic component const DynamicComponent = useMemo(() => { return activeControl ? lazy( () => import(`@components/DesignPanel/DynamicControls/${activeControl}`) ) : null; }, [activeControl]); return (
{modifiers.length > 1 && ( { if (value) { const selectedModifier = modifiers.find( (modifier) => modifier.id === value ); if (selectedModifier) { setCurrentModifier(selectedModifier); } } }} display="icon" size="small" tabs={modifiers.length < 4} options={modifiers.map((modifier) => ({ label: modifier.label, value: modifier.id, icon: modifier.icon, }))} className="mb-4" /> )}
{ setCategory(value); }} /> {DynamicComponent && ( )}
); }; export default ThemeOrNative;