import { useEffect, useState } from '@wordpress/element'; import apiFetch from '@wordpress/api-fetch'; import { TextControl, ToolbarDropdownMenu } from '@wordpress/components'; import { DropdownOption } from '@wordpress/components/build-types/dropdown-menu/types'; interface IconPickerProps { parentCallback: (inlineSvg: any) => void; initialIconCode: string; } interface IconData { icon_url: string; icons: string[]; } function IconList({ iconData, onActiveIcon, }: { iconData: IconData; onActiveIcon: (icon: string) => void; }) { const list: DropdownOption[] = []; if (iconData.icons == null) return []; // iterate over the icons and show img with icon based on icon_url and icon iconData.icons.forEach((icon) => { list.push({ title: icon, icon: ( onActiveIcon(icon)} /> ), onClick: () => onActiveIcon(icon), }); }); return list; } export default function IconPicker({ parentCallback, initialIconCode, }: IconPickerProps) { const [iconData, setIconData] = useState({ icon_url: '', icons: [] }); const [activeIcon, setActiveIcon] = useState(''); const [activeKeyword, setActiveKeyword] = useState(''); const [loadingIcons, setLoadingIcons] = useState(true); const filteredIconData = { icon_url: iconData.icon_url, icons: iconData.icons.filter((icon) => icon.toLowerCase().includes(activeKeyword.toLowerCase()) ), }; useEffect(() => { apiFetch({ path: '/blockbite/v1/block-helpers/get-icons/' }).then( (iconData: IconData) => { setIconData({ icon_url: iconData.icon_url, icons: iconData.icons.map((icon: string) => icon), }); setLoadingIcons(false); } ); }, []); const sendBackData = (inlineSvg: any) => { if (inlineSvg === undefined) return; parentCallback(inlineSvg); }; // api call for icon without .svg useEffect(() => { if (activeIcon === '') return; setActiveKeyword(''); apiFetch({ path: '/blockbite/v1/block-helpers/pick-icon/' + activeIcon, }).then((inlineSvg) => { sendBackData(inlineSvg); }); }, [activeIcon]); return ( ) : ( ) } label="Change icon" controls={IconList({ iconData: filteredIconData, onActiveIcon: setActiveIcon, })} children={() => { return loadingIcons ? ( Loading icons… ) : iconData.icons.length === 0 ? (

No icons found. Icons should be added to:
your_theme/resources/svg/

) : (
setActiveKeyword(value)} />
); }} /> ); }