import { useContext, useEffect, useState } from '@wordpress/element'; import { ScrollList } from '@components/ui/ScrollList'; import { DesignContext } from '@components/DesignPanel/DesignStore'; import { Button } from '@components/ui/Button'; import { Badge } from '@components/ui/Badge'; import EraserIcon from 'blockbite-icons/dist/Eraser'; import Pencil1Icon from 'blockbite-icons/dist/Pencil1'; import ClipboardIcon from 'blockbite-icons/dist/Clipboard'; import ClipboardCopy from 'blockbite-icons/dist/ClipboardCopy'; import { useStore } from 'zustand'; import { PanelCurrentProps } from '@components/DesignPanel/types'; import { DesignClassToStore } from '@components/DesignPanel/DesignStoreActions'; import { mergeModifierPanels } from '@components/DesignPanel/Helpers'; import { ResponsiveOptions } from '@components/DesignPanel/ResponsivePanel'; import ChevronLeftIcon from 'blockbite-icons/dist/ChevronLeft'; import TailwindIcon from 'blockbite-icons/dist/Tailwind'; import { ButtonToggle, ButtonToggleGroup } from '@components/ui/ButtonToggle'; import { Icon } from '@components/ui/Icon'; export const PanelCurrent: React.FC = ({ panels, setCurrentTab = null, setPanelId = null, }) => { const store = useStore(useContext(DesignContext)); const { currentDesign, currentClass, setCurrentDesign, setDesignReset, setCurrentControl, } = store; // create a copy of list const [list, setList] = useState([]); /** * Synchronise the currentDesign with extra attributes * like icons, etc */ useEffect(() => { const filteredCurrentDesign = currentDesign.filter((d: any) => d?.id); const newList = mergeModifierPanels(filteredCurrentDesign, panels); setList(newList); // Using an empty dependency array results in list being empty when "current" tab is programmatically opened }, [currentDesign]); const removeAllDesign = () => { setCurrentDesign([]); DesignClassToStore([], store); setDesignReset(true); setList([]); }; const removeOneDesign = (index: number) => { const newDesign = [...currentDesign]; newDesign.splice(index, 1); if (newDesign.length === 0) { setCurrentDesign([]); setDesignReset(true); setList([]); } else { setCurrentDesign(newDesign); DesignClassToStore(newDesign, store); setList([...newDesign]); } }; const copyAllDesign = () => { const design = [...currentDesign]; const designString = JSON.stringify(design, null, 2); navigator.clipboard.writeText(designString); }; const pasteAllDesign = () => { navigator.clipboard.readText().then((text) => { try { const design = JSON.parse(text); setCurrentDesign(design); DesignClassToStore(design, store); setList(design); } catch (e) { console.error('Error parsing clipboard text', e); } }); }; const CopyPastEraseButtons = [ { label: 'Copy Design', value: 'copyDesign', icon: ClipboardIcon, }, { label: 'Paste Design', value: 'pasteDesign', icon: ClipboardCopy, }, { label: 'Remove Design', value: 'removeDesign', icon: EraserIcon, }, ]; return (
{ setCurrentTab('design'); }} />
Current Styles
{ switch (value) { case 'copyDesign': copyAllDesign(); break; case 'pasteDesign': pasteAllDesign(); break; case 'removeDesign': removeAllDesign(); break; } }} /> {list.map((design: any, index: number) => { const currentResponsive = ResponsiveOptions.find( (option: any) => option.value === design.screen ); return (
{currentResponsive && (
{currentResponsive.icon}
)}
{design.control}
{design.label}
{design.selector} {design.value} {design.interaction && {design.interaction}}
); })}
{currentClass}
); }; export default PanelCurrent;