import { useEffect, useState } from '@wordpress/element'; import { store as blocksStore } from '@wordpress/blocks'; import { useSelect } from '@wordpress/data'; import { Button } from '@wordpress/components'; import { ScrollList } from '@components/ui/ScrollList'; import { Checkbox } from '@components/ui/Checkbox'; import apiFetch from '@wordpress/api-fetch'; import { useBlockSupportStore } from './BlockSupportStore'; import { Button as WordpressButton } from '@components/ui/Button'; import { Modal, ModalClose, ModalContent, ModalFooter, ModalHeader, ModalTitle, ModalTrigger, } from '@components/ui/Modal'; type Category = { key: number; name: string; value: string; }; type Categories = { name: string; values: Category[]; }; type SupportData = { disallowed: string[]; dynamic: string[]; allowed_dynamic: string[]; }; type SupportDataSave = { disallowed: string[]; }; export const initBlockSupport = () => { const url = `/blockbite/v1/block-support`; apiFetch({ path: url }) .then((response) => { return response; }) .then((data: SupportData) => { const { setDisAllowed, setDynamic, setAllowedDynamic } = useBlockSupportStore.getState(); setDisAllowed(data.disallowed); setDynamic(data.dynamic); setAllowedDynamic(data.allowed_dynamic); }); }; export const BlockSupportModal = () => { const { disallowed } = useBlockSupportStore(); const [open, setOpen] = useState(false); const [filteredBlocks, setFilteredBlocks] = useState([]); const [selectedIds, setSelectedIds] = useState([]); const [selection, setSelection] = useState(false); const blockTypes = useSelect( // @ts-ignore (select) => select(blocksStore).getBlockTypes(), [] ); useEffect(() => { if (disallowed !== null) setSelectedIds(disallowed); }, disallowed); /* Create categories outof a flat list of blocks */ useEffect(() => { const categorizedList: Categories[] = []; let key = 0; blockTypes.forEach((block: any) => { const category = block.name.split('/')[0]; const value = block.name.split('/')[1]; key += 1; const existingCategory = categorizedList.find((c) => c.name === category); if (existingCategory) { existingCategory.values.push({ key: key, name: value, value: block.name, }); } else { categorizedList.push({ name: category, values: [{ key: key, name: value, value: block.name } as Category], }); } }); setFilteredBlocks(categorizedList); }, [blockTypes]); const handleCheckboxChange = (checked: Boolean, value: string) => { const setSelectedIds = selectedIds; if (checked) { setSelectedIds.push(value); } else { setSelectedIds.splice(selectedIds.indexOf(value), 1); } }; const selectAll = () => { const allIds = blockTypes.map((block: any) => block.name); setSelectedIds(allIds); }; const onSave = () => { apiFetch({ path: `/blockbite/v1/block-support/allowed`, method: 'POST', data: { blocks: selectedIds }, }).then((res: SupportDataSave) => { setSelectedIds(res.disallowed); }); }; return ( Block Support

Disable Blockbite Editor for blocks

{filteredBlocks.map((category: Categories) => (

{category.name}

{category.values.map((item: any) => ( handleCheckboxChange(checked, value) } /> ))}
))}
{selection ? ( ) : ( )}
); }; export default { initBlockSupport, BlockSupportModal, };