UNPKG

@gechiui/block-editor

Version:
174 lines (146 loc) 5.28 kB
"use strict"; var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault"); Object.defineProperty(exports, "__esModule", { value: true }); exports.BlockListItems = BlockListItems; exports.IntersectionObserver = void 0; exports.default = BlockList; var _element = require("@gechiui/element"); var _classnames = _interopRequireDefault(require("classnames")); var _data = require("@gechiui/data"); var _compose = require("@gechiui/compose"); var _block = _interopRequireDefault(require("./block")); var _blockListAppender = _interopRequireDefault(require("../block-list-appender")); var _useInBetweenInserter = require("./use-in-between-inserter"); var _store = require("../../store"); var _preParsePatterns = require("../../utils/pre-parse-patterns"); var _layout = require("./layout"); var _backCompat = _interopRequireDefault(require("../block-tools/back-compat")); var _blockSelectionClearer = require("../block-selection-clearer"); var _innerBlocks = require("../inner-blocks"); var _context = require("../block-edit/context"); /** * External dependencies */ /** * GeChiUI dependencies */ /** * Internal dependencies */ const elementContext = (0, _element.createContext)(); const IntersectionObserver = (0, _element.createContext)(); exports.IntersectionObserver = IntersectionObserver; function Root(_ref) { let { className, ...settings } = _ref; const [element, setElement] = (0, _element.useState)(); const isLargeViewport = (0, _compose.useViewportMatch)('medium'); const { isOutlineMode, isFocusMode, isNavigationMode } = (0, _data.useSelect)(select => { const { getSettings, isNavigationMode: _isNavigationMode } = select(_store.store); const { outlineMode, focusMode } = getSettings(); return { isOutlineMode: outlineMode, isFocusMode: focusMode, isNavigationMode: _isNavigationMode() }; }, []); const innerBlocksProps = (0, _innerBlocks.useInnerBlocksProps)({ ref: (0, _compose.useMergeRefs)([(0, _blockSelectionClearer.useBlockSelectionClearer)(), (0, _useInBetweenInserter.useInBetweenInserter)(), setElement]), className: (0, _classnames.default)('is-root-container', className, { 'is-outline-mode': isOutlineMode, 'is-focus-mode': isFocusMode && isLargeViewport, 'is-navigate-mode': isNavigationMode }) }, settings); return (0, _element.createElement)(elementContext.Provider, { value: element }, (0, _element.createElement)("div", innerBlocksProps)); } function BlockList(settings) { (0, _preParsePatterns.usePreParsePatterns)(); return (0, _element.createElement)(_backCompat.default, null, (0, _element.createElement)(_context.BlockEditContextProvider, { value: _context.DEFAULT_BLOCK_EDIT_CONTEXT }, (0, _element.createElement)(Root, settings))); } BlockList.__unstableElementContext = elementContext; function Items(_ref2) { let { placeholder, rootClientId, renderAppender, __experimentalAppenderTagName, __experimentalLayout: layout = _layout.defaultLayout } = _ref2; const [intersectingBlocks, setIntersectingBlocks] = (0, _element.useState)(new Set()); const intersectionObserver = (0, _element.useMemo)(() => { const { IntersectionObserver: Observer } = window; if (!Observer) { return; } return new Observer(entries => { setIntersectingBlocks(oldIntersectingBlocks => { const newIntersectingBlocks = new Set(oldIntersectingBlocks); for (const entry of entries) { const clientId = entry.target.getAttribute('data-block'); const action = entry.isIntersecting ? 'add' : 'delete'; newIntersectingBlocks[action](clientId); } return newIntersectingBlocks; }); }); }, [setIntersectingBlocks]); const { order, selectedBlocks } = (0, _data.useSelect)(select => { const { getBlockOrder, getSelectedBlockClientIds } = select(_store.store); return { order: getBlockOrder(rootClientId), selectedBlocks: getSelectedBlockClientIds() }; }, [rootClientId]); return (0, _element.createElement)(_layout.LayoutProvider, { value: layout }, (0, _element.createElement)(IntersectionObserver.Provider, { value: intersectionObserver }, order.map(clientId => (0, _element.createElement)(_data.AsyncModeProvider, { key: clientId, value: // Only provide data asynchronously if the block is // not visible and not selected. !intersectingBlocks.has(clientId) && !selectedBlocks.includes(clientId) }, (0, _element.createElement)(_block.default, { rootClientId: rootClientId, clientId: clientId })))), order.length < 1 && placeholder, (0, _element.createElement)(_blockListAppender.default, { tagName: __experimentalAppenderTagName, rootClientId: rootClientId, renderAppender: renderAppender })); } function BlockListItems(props) { // This component needs to always be synchronous as it's the one changing // the async mode depending on the block selection. return (0, _element.createElement)(_data.AsyncModeProvider, { value: false }, (0, _element.createElement)(Items, props)); } //# sourceMappingURL=index.js.map