UNPKG

@wordpress/block-editor

Version:
68 lines (59 loc) 2.47 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.default = useNoRecursiveRenders; var _element = require("@wordpress/element"); var _context = require("../block-edit/context"); /** * WordPress dependencies */ /** * Internal dependencies */ const RenderedRefsContext = (0, _element.createContext)({}); /** * Immutably adds an unique identifier to a set scoped for a given block type. * * @param {Object} renderedBlocks Rendered blocks grouped by block name * @param {string} blockName Name of the block. * @param {*} uniqueId Any value that acts as a unique identifier for a block instance. * * @return {Object} The list of rendered blocks grouped by block name. */ function addToBlockType(renderedBlocks, blockName, uniqueId) { const result = { ...renderedBlocks, [blockName]: renderedBlocks[blockName] ? new Set(renderedBlocks[blockName]) : new Set() }; result[blockName].add(uniqueId); return result; } /** * A React hook for keeping track of blocks previously rendered up in the block * tree. Blocks susceptible to recursion can use this hook in their `Edit` * function to prevent said recursion. * * @param {*} uniqueId Any value that acts as a unique identifier for a block instance. * * @return {[boolean, Function]} A tuple of: * - a boolean describing whether the provided id * has already been rendered; * - a React context provider to be used to wrap * other elements. */ function useNoRecursiveRenders(uniqueId) { var _previouslyRenderedBl; const previouslyRenderedBlocks = (0, _element.useContext)(RenderedRefsContext); const { name: blockName } = (0, _context.useBlockEditContext)(); const hasAlreadyRendered = Boolean((_previouslyRenderedBl = previouslyRenderedBlocks[blockName]) === null || _previouslyRenderedBl === void 0 ? void 0 : _previouslyRenderedBl.has(uniqueId)); const newRenderedBlocks = (0, _element.useMemo)(() => addToBlockType(previouslyRenderedBlocks, blockName, uniqueId), [previouslyRenderedBlocks, blockName, uniqueId]); const Provider = (0, _element.useCallback)(({ children }) => (0, _element.createElement)(RenderedRefsContext.Provider, { value: newRenderedBlocks }, children), [newRenderedBlocks]); return [hasAlreadyRendered, Provider]; } //# sourceMappingURL=index.js.map