@wordpress/core-data
Version:
Access to and manipulation of core WordPress entities.
103 lines (102 loc) • 3.1 kB
JavaScript
// 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