UNPKG

@wordpress/core-data

Version:
103 lines (102 loc) 3.1 kB
// packages/core-data/src/hooks/use-entity-block-editor.js import { useCallback, useMemo } from "@wordpress/element"; import { useDispatch, useSelect } from "@wordpress/data"; import { parse, __unstableSerializeAndClean } from "@wordpress/blocks"; import { STORE_NAME } from "../name"; import useEntityId from "./use-entity-id"; import { updateFootnotesFromMeta } from "../footnotes"; var EMPTY_ARRAY = []; var parsedBlocksCache = /* @__PURE__ */ new WeakMap(); function useEntityBlockEditor(kind, name, { id: _id } = {}) { const providerId = useEntityId(kind, name); const id = _id ?? providerId; const { getEntityRecord, getEntityRecordEdits } = useSelect(STORE_NAME); const { content, editedBlocks, meta } = useSelect( (select) => { if (!id) { return {}; } const { getEditedEntityRecord } = select(STORE_NAME); const editedRecord = getEditedEntityRecord(kind, name, id); return { editedBlocks: editedRecord.blocks, content: editedRecord.content, meta: editedRecord.meta }; }, [kind, name, id] ); const { __unstableCreateUndoLevel, editEntityRecord } = useDispatch(STORE_NAME); const blocks = useMemo(() => { if (!id) { return void 0; } if (editedBlocks) { return editedBlocks; } if (!content || typeof content !== "string") { return EMPTY_ARRAY; } const edits = getEntityRecordEdits(kind, name, id); const isUnedited = !edits || !Object.keys(edits).length; const cackeKey = isUnedited ? getEntityRecord(kind, name, id) : edits; let _blocks = parsedBlocksCache.get(cackeKey); if (!_blocks) { _blocks = parse(content); parsedBlocksCache.set(cackeKey, _blocks); } return _blocks; }, [ kind, name, id, editedBlocks, content, getEntityRecord, getEntityRecordEdits ]); const onChange = useCallback( (newBlocks, options) => { const noChange = blocks === newBlocks; if (noChange) { return __unstableCreateUndoLevel(kind, name, id); } const { selection, ...rest } = options; const edits = { selection, content: ({ blocks: blocksForSerialization = [] }) => __unstableSerializeAndClean(blocksForSerialization), ...updateFootnotesFromMeta(newBlocks, meta) }; editEntityRecord(kind, name, id, edits, { isCached: false, ...rest }); }, [ kind, name, id, blocks, meta, __unstableCreateUndoLevel, editEntityRecord ] ); const onInput = useCallback( (newBlocks, options) => { const { selection, ...rest } = options; const footnotesChanges = updateFootnotesFromMeta(newBlocks, meta); const edits = { selection, ...footnotesChanges }; editEntityRecord(kind, name, id, edits, { isCached: true, ...rest }); }, [kind, name, id, meta, editEntityRecord] ); return [blocks, onInput, onChange]; } export { useEntityBlockEditor as default }; //# sourceMappingURL=use-entity-block-editor.js.map