@react-aria/collections 3.0.0-nightly-74cac946a-250317 → 3.0.0-nightly-e00dc8373-250318
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/Document.main.js +107 -87
- package/dist/Document.main.js.map +1 -1
- package/dist/Document.mjs +107 -87
- package/dist/Document.module.js +107 -87
- package/dist/Document.module.js.map +1 -1
- package/package.json +5 -5
- package/src/Document.ts +128 -101
|
@@ -1 +1 @@
|
|
|
1
|
-
{"mappings":"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","sources":["packages/@react-aria/collections/src/Document.ts"],"sourcesContent":["/*\n * Copyright 2024 Adobe. All rights reserved.\n * This file is licensed to you under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License. You may obtain a copy\n * of the License at http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software distributed under\n * the License is distributed on an \"AS IS\" BASIS, WITHOUT WARRANTIES OR REPRESENTATIONS\n * OF ANY KIND, either express or implied. See the License for the specific language\n * governing permissions and limitations under the License.\n */\n\nimport {BaseCollection, CollectionNode, Mutable} from './BaseCollection';\nimport {CSSProperties, ForwardedRef, ReactElement, ReactNode} from 'react';\nimport {Node} from '@react-types/shared';\n\n// This Collection implementation is perhaps a little unusual. It works by rendering the React tree into a\n// Portal to a fake DOM implementation. This gives us efficient access to the tree of rendered objects, and\n// supports React features like composition and context. We use this fake DOM to access the full set of elements\n// before we render into the real DOM, which allows us to render a subset of the elements (e.g. virtualized scrolling),\n// and compute properties like the total number of items. It also enables keyboard navigation, selection, and other features.\n// React takes care of efficiently rendering components and updating the collection for us via this fake DOM.\n//\n// The DOM is a mutable API, and React expects the node instances to remain stable over time. So the implementation is split\n// into two parts. Each mutable fake DOM node owns an instance of an immutable collection node. When a fake DOM node is updated,\n// it queues a second render for the collection. Multiple updates to a collection can be queued at once. Collection nodes are\n// lazily copied on write, so only the changed nodes need to be cloned. During the second render, the new immutable collection\n// is finalized by updating the map of Key -> Node with the new cloned nodes. Then the new collection is frozen so it can no\n// longer be mutated, and returned to the calling component to render.\n\n/**\n * A mutable node in the fake DOM tree. When mutated, it marks itself as dirty\n * and queues an update with the owner document.\n */\nexport class BaseNode<T> {\n private _firstChild: ElementNode<T> | null = null;\n private _lastChild: ElementNode<T> | null = null;\n private _previousSibling: ElementNode<T> | null = null;\n private _nextSibling: ElementNode<T> | null = null;\n private _parentNode: BaseNode<T> | null = null;\n private _minInvalidChildIndex: ElementNode<T> | null = null;\n ownerDocument: Document<T, any>;\n\n constructor(ownerDocument: Document<T, any>) {\n this.ownerDocument = ownerDocument;\n }\n\n *[Symbol.iterator](): Iterator<ElementNode<T>> {\n let node = this.firstChild;\n while (node) {\n yield node;\n node = node.nextSibling;\n }\n }\n\n get firstChild(): ElementNode<T> | null {\n return this._firstChild;\n }\n\n set firstChild(firstChild: ElementNode<T> | null) {\n this._firstChild = firstChild;\n this.ownerDocument.markDirty(this);\n }\n\n get lastChild(): ElementNode<T> | null {\n return this._lastChild;\n }\n\n set lastChild(lastChild: ElementNode<T> | null) {\n this._lastChild = lastChild;\n this.ownerDocument.markDirty(this);\n }\n\n get previousSibling(): ElementNode<T> | null {\n return this._previousSibling;\n }\n\n set previousSibling(previousSibling: ElementNode<T> | null) {\n this._previousSibling = previousSibling;\n this.ownerDocument.markDirty(this);\n }\n\n get nextSibling(): ElementNode<T> | null {\n return this._nextSibling;\n }\n\n set nextSibling(nextSibling: ElementNode<T> | null) {\n this._nextSibling = nextSibling;\n this.ownerDocument.markDirty(this);\n }\n\n get parentNode(): BaseNode<T> | null {\n return this._parentNode;\n }\n\n set parentNode(parentNode: BaseNode<T> | null) {\n this._parentNode = parentNode;\n this.ownerDocument.markDirty(this);\n }\n\n get isConnected(): boolean {\n return this.parentNode?.isConnected || false;\n }\n\n private invalidateChildIndices(child: ElementNode<T>): void {\n if (this._minInvalidChildIndex == null || child.index < this._minInvalidChildIndex.index) {\n this._minInvalidChildIndex = child;\n }\n }\n\n updateChildIndices(): void {\n let node = this._minInvalidChildIndex;\n while (node) {\n node.index = node.previousSibling ? node.previousSibling.index + 1 : 0;\n node = node.nextSibling;\n }\n this._minInvalidChildIndex = null;\n }\n\n appendChild(child: ElementNode<T>): void {\n this.ownerDocument.startTransaction();\n if (child.parentNode) {\n child.parentNode.removeChild(child);\n }\n\n if (this.firstChild == null) {\n this.firstChild = child;\n }\n\n if (this.lastChild) {\n this.lastChild.nextSibling = child;\n child.index = this.lastChild.index + 1;\n child.previousSibling = this.lastChild;\n } else {\n child.previousSibling = null;\n child.index = 0;\n }\n\n child.parentNode = this;\n child.nextSibling = null;\n this.lastChild = child;\n\n this.ownerDocument.markDirty(this);\n if (child.hasSetProps) {\n // Only add the node to the collection if we already received props for it.\n // Otherwise wait until then so we have the correct id for the node.\n this.ownerDocument.addNode(child);\n }\n\n this.ownerDocument.endTransaction();\n this.ownerDocument.queueUpdate();\n }\n\n insertBefore(newNode: ElementNode<T>, referenceNode: ElementNode<T>): void {\n if (referenceNode == null) {\n return this.appendChild(newNode);\n }\n\n this.ownerDocument.startTransaction();\n if (newNode.parentNode) {\n newNode.parentNode.removeChild(newNode);\n }\n\n newNode.nextSibling = referenceNode;\n newNode.previousSibling = referenceNode.previousSibling;\n newNode.index = referenceNode.index;\n\n if (this.firstChild === referenceNode) {\n this.firstChild = newNode;\n } else if (referenceNode.previousSibling) {\n referenceNode.previousSibling.nextSibling = newNode;\n }\n\n referenceNode.previousSibling = newNode;\n newNode.parentNode = referenceNode.parentNode;\n\n this.invalidateChildIndices(referenceNode);\n\n if (newNode.hasSetProps) {\n this.ownerDocument.addNode(newNode);\n }\n\n this.ownerDocument.endTransaction();\n this.ownerDocument.queueUpdate();\n }\n\n removeChild(child: ElementNode<T>): void {\n if (child.parentNode !== this || !this.ownerDocument.isMounted) {\n return;\n }\n\n this.ownerDocument.startTransaction();\n \n if (child.nextSibling) {\n this.invalidateChildIndices(child.nextSibling);\n child.nextSibling.previousSibling = child.previousSibling;\n }\n\n if (child.previousSibling) {\n child.previousSibling.nextSibling = child.nextSibling;\n }\n\n if (this.firstChild === child) {\n this.firstChild = child.nextSibling;\n }\n\n if (this.lastChild === child) {\n this.lastChild = child.previousSibling;\n }\n\n child.parentNode = null;\n child.nextSibling = null;\n child.previousSibling = null;\n child.index = 0;\n\n this.ownerDocument.removeNode(child);\n this.ownerDocument.endTransaction();\n this.ownerDocument.queueUpdate();\n }\n\n addEventListener(): void {}\n removeEventListener(): void {}\n}\n\n/**\n * A mutable element node in the fake DOM tree. It owns an immutable\n * Collection Node which is copied on write.\n */\nexport class ElementNode<T> extends BaseNode<T> {\n nodeType = 8; // COMMENT_NODE (we'd use ELEMENT_NODE but React DevTools will fail to get its dimensions)\n node: CollectionNode<T>;\n private _index: number = 0;\n hasSetProps = false;\n\n constructor(type: string, ownerDocument: Document<T, any>) {\n super(ownerDocument);\n this.node = new CollectionNode(type, `react-aria-${++ownerDocument.nodeId}`);\n // Start a transaction so that no updates are emitted from the collection\n // until the props for this node are set. We don't know the real id for the\n // node until then, so we need to avoid emitting collections in an inconsistent state.\n this.ownerDocument.startTransaction();\n }\n\n get index(): number {\n return this._index;\n }\n\n set index(index: number) {\n this._index = index;\n this.ownerDocument.markDirty(this);\n }\n\n get level(): number {\n if (this.parentNode instanceof ElementNode) {\n return this.parentNode.level + (this.node.type === 'item' ? 1 : 0);\n }\n\n return 0;\n }\n\n updateNode(): void {\n let node = this.ownerDocument.getMutableNode(this);\n node.index = this.index;\n node.level = this.level;\n node.parentKey = this.parentNode instanceof ElementNode ? this.parentNode.node.key : null;\n node.prevKey = this.previousSibling?.node.key ?? null;\n node.nextKey = this.nextSibling?.node.key ?? null;\n node.hasChildNodes = !!this.firstChild;\n node.firstChildKey = this.firstChild?.node.key ?? null;\n node.lastChildKey = this.lastChild?.node.key ?? null;\n\n // Update the colIndex of sibling nodes if this node has a colSpan.\n if ((node.colSpan != null || node.colIndex != null) && this.nextSibling) {\n // This queues the next sibling for update, which means this happens recursively.\n let nextColIndex = (node.colIndex ?? node.index) + (node.colSpan ?? 1);\n if (nextColIndex !== this.nextSibling.node.colIndex) {\n let siblingNode = this.ownerDocument.getMutableNode(this.nextSibling);\n siblingNode.colIndex = nextColIndex;\n }\n }\n }\n\n setProps<E extends Element>(obj: {[key: string]: any}, ref: ForwardedRef<E>, rendered?: ReactNode, render?: (node: Node<T>) => ReactElement): void {\n let node = this.ownerDocument.getMutableNode(this);\n let {value, textValue, id, ...props} = obj;\n props.ref = ref;\n node.props = props;\n node.rendered = rendered;\n node.render = render;\n node.value = value;\n node.textValue = textValue || (typeof props.children === 'string' ? props.children : '') || obj['aria-label'] || '';\n if (id != null && id !== node.key) {\n if (this.hasSetProps) {\n throw new Error('Cannot change the id of an item');\n }\n node.key = id;\n }\n\n if (props.colSpan != null) {\n node.colSpan = props.colSpan;\n }\n\n // If this is the first time props have been set, end the transaction started in the constructor\n // so this node can be emitted.\n if (!this.hasSetProps) {\n this.ownerDocument.addNode(this);\n this.ownerDocument.endTransaction();\n this.hasSetProps = true;\n }\n\n this.ownerDocument.queueUpdate();\n }\n\n get style(): CSSProperties {\n return {};\n }\n\n hasAttribute(): void {}\n setAttribute(): void {}\n setAttributeNS(): void {}\n removeAttribute(): void {}\n}\n\n/**\n * A mutable Document in the fake DOM. It owns an immutable Collection instance,\n * which is lazily copied on write during updates.\n */\nexport class Document<T, C extends BaseCollection<T> = BaseCollection<T>> extends BaseNode<T> {\n nodeType = 11; // DOCUMENT_FRAGMENT_NODE\n ownerDocument = this;\n dirtyNodes: Set<BaseNode<T>> = new Set();\n isSSR = false;\n nodeId = 0;\n nodesByProps = new WeakMap<object, ElementNode<T>>();\n isMounted = true;\n private collection: C;\n private collectionMutated: boolean;\n private mutatedNodes: Set<ElementNode<T>> = new Set();\n private subscriptions: Set<() => void> = new Set();\n private transactionCount = 0;\n private queuedRender = false;\n private inSubscription = false;\n\n constructor(collection: C) {\n // @ts-ignore\n super(null);\n this.collection = collection;\n this.collectionMutated = true;\n }\n\n get isConnected(): boolean {\n return this.isMounted;\n }\n\n createElement(type: string): ElementNode<T> {\n return new ElementNode(type, this);\n }\n\n /**\n * Lazily gets a mutable instance of a Node. If the node has already\n * been cloned during this update cycle, it just returns the existing one.\n */\n getMutableNode(element: ElementNode<T>): Mutable<CollectionNode<T>> {\n let node = element.node;\n if (!this.mutatedNodes.has(element)) {\n node = element.node.clone();\n this.mutatedNodes.add(element);\n element.node = node;\n }\n this.markDirty(element);\n return node;\n }\n\n private getMutableCollection() {\n if (!this.isSSR && !this.collectionMutated) {\n this.collection = this.collection.clone();\n this.collectionMutated = true;\n }\n\n return this.collection;\n }\n\n markDirty(node: BaseNode<T>): void {\n this.dirtyNodes.add(node);\n }\n\n startTransaction(): void {\n this.transactionCount++;\n }\n\n endTransaction(): void {\n this.transactionCount--;\n }\n\n addNode(element: ElementNode<T>): void {\n let collection = this.getMutableCollection();\n if (!collection.getItem(element.node.key)) {\n collection.addNode(element.node);\n\n for (let child of element) {\n this.addNode(child);\n }\n }\n\n this.markDirty(element);\n }\n\n removeNode(node: ElementNode<T>): void {\n for (let child of node) {\n this.removeNode(child);\n }\n\n let collection = this.getMutableCollection();\n collection.removeNode(node.node.key);\n this.markDirty(node);\n }\n\n /** Finalizes the collection update, updating all nodes and freezing the collection. */\n getCollection(): C {\n if (this.transactionCount > 0) {\n return this.collection;\n }\n\n this.updateCollection();\n\n // Reset queuedRender to false when getCollection is called during render.\n if (!this.inSubscription) {\n this.queuedRender = false;\n }\n\n return this.collection;\n }\n\n updateCollection(): void {\n // First, update the indices of dirty element children.\n for (let element of this.dirtyNodes) {\n element.updateChildIndices();\n }\n\n // Next, update dirty collection nodes.\n for (let element of this.dirtyNodes) {\n if (element instanceof ElementNode && element.isConnected) {\n element.updateNode();\n }\n }\n\n this.dirtyNodes.clear();\n\n // Finally, update the collection.\n if (this.mutatedNodes.size || this.collectionMutated) {\n let collection = this.getMutableCollection();\n for (let element of this.mutatedNodes) {\n if (element.isConnected) {\n collection.addNode(element.node);\n }\n }\n\n this.mutatedNodes.clear();\n collection.commit(this.firstChild?.node.key ?? null, this.lastChild?.node.key ?? null, this.isSSR);\n }\n\n this.collectionMutated = false;\n }\n\n queueUpdate(): void {\n // Don't emit any updates if there is a transaction in progress.\n // queueUpdate should be called again after the transaction.\n if (this.dirtyNodes.size === 0 || this.transactionCount > 0 || this.queuedRender) {\n return;\n }\n\n // Only trigger subscriptions once during an update, when the first item changes.\n // React's useSyncExternalStore will call getCollection immediately, to check whether the snapshot changed.\n // If so, React will queue a render to happen after the current commit to our fake DOM finishes.\n // We track whether getCollection is called in a subscription, and once it is called during render,\n // we reset queuedRender back to false.\n this.queuedRender = true;\n this.inSubscription = true;\n for (let fn of this.subscriptions) {\n fn();\n }\n this.inSubscription = false;\n }\n\n subscribe(fn: () => void) {\n this.subscriptions.add(fn);\n return (): boolean => this.subscriptions.delete(fn);\n }\n\n resetAfterSSR(): void {\n if (this.isSSR) {\n this.isSSR = false;\n this.firstChild = null;\n this.lastChild = null;\n this.nodeId = 0;\n }\n }\n}\n"],"names":[],"version":3,"file":"Document.module.js.map"}
|
|
1
|
+
{"mappings":"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","sources":["packages/@react-aria/collections/src/Document.ts"],"sourcesContent":["/*\n * Copyright 2024 Adobe. All rights reserved.\n * This file is licensed to you under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License. You may obtain a copy\n * of the License at http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software distributed under\n * the License is distributed on an \"AS IS\" BASIS, WITHOUT WARRANTIES OR REPRESENTATIONS\n * OF ANY KIND, either express or implied. See the License for the specific language\n * governing permissions and limitations under the License.\n */\n\nimport {BaseCollection, CollectionNode, Mutable} from './BaseCollection';\nimport {CSSProperties, ForwardedRef, ReactElement, ReactNode} from 'react';\nimport {Node} from '@react-types/shared';\n\n// This Collection implementation is perhaps a little unusual. It works by rendering the React tree into a\n// Portal to a fake DOM implementation. This gives us efficient access to the tree of rendered objects, and\n// supports React features like composition and context. We use this fake DOM to access the full set of elements\n// before we render into the real DOM, which allows us to render a subset of the elements (e.g. virtualized scrolling),\n// and compute properties like the total number of items. It also enables keyboard navigation, selection, and other features.\n// React takes care of efficiently rendering components and updating the collection for us via this fake DOM.\n//\n// The DOM is a mutable API, and React expects the node instances to remain stable over time. So the implementation is split\n// into two parts. Each mutable fake DOM node owns an instance of an immutable collection node. When a fake DOM node is updated,\n// it queues a second render for the collection. Multiple updates to a collection can be queued at once. Collection nodes are\n// lazily copied on write, so only the changed nodes need to be cloned. During the second render, the new immutable collection\n// is finalized by updating the map of Key -> Node with the new cloned nodes. Then the new collection is frozen so it can no\n// longer be mutated, and returned to the calling component to render.\n\n/**\n * A mutable node in the fake DOM tree. When mutated, it marks itself as dirty\n * and queues an update with the owner document.\n */\nexport class BaseNode<T> {\n private _firstChild: ElementNode<T> | null = null;\n private _lastChild: ElementNode<T> | null = null;\n private _previousSibling: ElementNode<T> | null = null;\n private _nextSibling: ElementNode<T> | null = null;\n private _parentNode: BaseNode<T> | null = null;\n private _minInvalidChildIndex: ElementNode<T> | null = null;\n ownerDocument: Document<T, any>;\n\n constructor(ownerDocument: Document<T, any>) {\n this.ownerDocument = ownerDocument;\n }\n\n *[Symbol.iterator](): Iterator<ElementNode<T>> {\n let node = this.firstChild;\n while (node) {\n yield node;\n node = node.nextSibling;\n }\n }\n\n get firstChild(): ElementNode<T> | null {\n return this._firstChild;\n }\n\n set firstChild(firstChild: ElementNode<T> | null) {\n this._firstChild = firstChild;\n this.ownerDocument.markDirty(this);\n }\n\n get lastChild(): ElementNode<T> | null {\n return this._lastChild;\n }\n\n set lastChild(lastChild: ElementNode<T> | null) {\n this._lastChild = lastChild;\n this.ownerDocument.markDirty(this);\n }\n\n get previousSibling(): ElementNode<T> | null {\n return this._previousSibling;\n }\n\n set previousSibling(previousSibling: ElementNode<T> | null) {\n this._previousSibling = previousSibling;\n this.ownerDocument.markDirty(this);\n }\n\n get nextSibling(): ElementNode<T> | null {\n return this._nextSibling;\n }\n\n set nextSibling(nextSibling: ElementNode<T> | null) {\n this._nextSibling = nextSibling;\n this.ownerDocument.markDirty(this);\n }\n\n get parentNode(): BaseNode<T> | null {\n return this._parentNode;\n }\n\n set parentNode(parentNode: BaseNode<T> | null) {\n this._parentNode = parentNode;\n this.ownerDocument.markDirty(this);\n }\n\n get isConnected(): boolean {\n return this.parentNode?.isConnected || false;\n }\n\n private invalidateChildIndices(child: ElementNode<T>): void {\n if (this._minInvalidChildIndex == null || child.index < this._minInvalidChildIndex.index) {\n this._minInvalidChildIndex = child;\n }\n }\n\n updateChildIndices(): void {\n let node = this._minInvalidChildIndex;\n while (node) {\n node.index = node.previousSibling ? node.previousSibling.index + 1 : 0;\n node = node.nextSibling;\n }\n this._minInvalidChildIndex = null;\n }\n\n appendChild(child: ElementNode<T>): void {\n if (child.parentNode) {\n child.parentNode.removeChild(child);\n }\n\n if (this.firstChild == null) {\n this.firstChild = child;\n }\n\n if (this.lastChild) {\n this.lastChild.nextSibling = child;\n child.index = this.lastChild.index + 1;\n child.previousSibling = this.lastChild;\n } else {\n child.previousSibling = null;\n child.index = 0;\n }\n\n child.parentNode = this;\n child.nextSibling = null;\n this.lastChild = child;\n\n this.ownerDocument.markDirty(this);\n this.ownerDocument.queueUpdate();\n }\n\n insertBefore(newNode: ElementNode<T>, referenceNode: ElementNode<T>): void {\n if (referenceNode == null) {\n return this.appendChild(newNode);\n }\n\n if (newNode.parentNode) {\n newNode.parentNode.removeChild(newNode);\n }\n\n newNode.nextSibling = referenceNode;\n newNode.previousSibling = referenceNode.previousSibling;\n newNode.index = referenceNode.index;\n\n if (this.firstChild === referenceNode) {\n this.firstChild = newNode;\n } else if (referenceNode.previousSibling) {\n referenceNode.previousSibling.nextSibling = newNode;\n }\n\n referenceNode.previousSibling = newNode;\n newNode.parentNode = referenceNode.parentNode;\n\n this.invalidateChildIndices(referenceNode);\n this.ownerDocument.queueUpdate();\n }\n\n removeChild(child: ElementNode<T>): void {\n if (child.parentNode !== this || !this.ownerDocument.isMounted) {\n return;\n }\n \n if (child.nextSibling) {\n this.invalidateChildIndices(child.nextSibling);\n child.nextSibling.previousSibling = child.previousSibling;\n }\n\n if (child.previousSibling) {\n child.previousSibling.nextSibling = child.nextSibling;\n }\n\n if (this.firstChild === child) {\n this.firstChild = child.nextSibling;\n }\n\n if (this.lastChild === child) {\n this.lastChild = child.previousSibling;\n }\n\n child.parentNode = null;\n child.nextSibling = null;\n child.previousSibling = null;\n child.index = 0;\n\n this.ownerDocument.markDirty(child);\n this.ownerDocument.queueUpdate();\n }\n\n addEventListener(): void {}\n removeEventListener(): void {}\n\n get previousVisibleSibling(): ElementNode<T> | null {\n let node = this.previousSibling;\n while (node && node.isHidden) {\n node = node.previousSibling;\n }\n return node;\n }\n\n get nextVisibleSibling(): ElementNode<T> | null {\n let node = this.nextSibling;\n while (node && node.isHidden) {\n node = node.nextSibling;\n }\n return node;\n }\n\n get firstVisibleChild(): ElementNode<T> | null {\n let node = this.firstChild;\n while (node && node.isHidden) {\n node = node.nextSibling;\n }\n return node;\n }\n\n get lastVisibleChild(): ElementNode<T> | null {\n let node = this.lastChild;\n while (node && node.isHidden) {\n node = node.previousSibling;\n }\n return node;\n }\n}\n\n/**\n * A mutable element node in the fake DOM tree. It owns an immutable\n * Collection Node which is copied on write.\n */\nexport class ElementNode<T> extends BaseNode<T> {\n nodeType = 8; // COMMENT_NODE (we'd use ELEMENT_NODE but React DevTools will fail to get its dimensions)\n node: CollectionNode<T>;\n isMutated = true;\n private _index: number = 0;\n hasSetProps = false;\n isHidden = false;\n\n constructor(type: string, ownerDocument: Document<T, any>) {\n super(ownerDocument);\n this.node = new CollectionNode(type, `react-aria-${++ownerDocument.nodeId}`);\n }\n\n get index(): number {\n return this._index;\n }\n\n set index(index: number) {\n this._index = index;\n this.ownerDocument.markDirty(this);\n }\n\n get level(): number {\n if (this.parentNode instanceof ElementNode) {\n return this.parentNode.level + (this.node.type === 'item' ? 1 : 0);\n }\n\n return 0;\n }\n\n /**\n * Lazily gets a mutable instance of a Node. If the node has already\n * been cloned during this update cycle, it just returns the existing one.\n */\n private getMutableNode(): Mutable<CollectionNode<T>> {\n if (!this.isMutated) {\n this.node = this.node.clone();\n this.isMutated = true;\n }\n \n this.ownerDocument.markDirty(this);\n return this.node;\n }\n\n updateNode(): void {\n let nextSibling = this.nextVisibleSibling;\n let node = this.getMutableNode();\n node.index = this.index;\n node.level = this.level;\n node.parentKey = this.parentNode instanceof ElementNode ? this.parentNode.node.key : null;\n node.prevKey = this.previousVisibleSibling?.node.key ?? null;\n node.nextKey = nextSibling?.node.key ?? null;\n node.hasChildNodes = !!this.firstChild;\n node.firstChildKey = this.firstVisibleChild?.node.key ?? null;\n node.lastChildKey = this.lastVisibleChild?.node.key ?? null;\n\n // Update the colIndex of sibling nodes if this node has a colSpan.\n if ((node.colSpan != null || node.colIndex != null) && nextSibling) {\n // This queues the next sibling for update, which means this happens recursively.\n let nextColIndex = (node.colIndex ?? node.index) + (node.colSpan ?? 1);\n if (nextColIndex !== nextSibling.node.colIndex) {\n let siblingNode = nextSibling.getMutableNode();\n siblingNode.colIndex = nextColIndex;\n }\n }\n }\n\n setProps<E extends Element>(obj: {[key: string]: any}, ref: ForwardedRef<E>, rendered?: ReactNode, render?: (node: Node<T>) => ReactElement): void {\n let node = this.getMutableNode();\n let {value, textValue, id, ...props} = obj;\n props.ref = ref;\n node.props = props;\n node.rendered = rendered;\n node.render = render;\n node.value = value;\n node.textValue = textValue || (typeof props.children === 'string' ? props.children : '') || obj['aria-label'] || '';\n if (id != null && id !== node.key) {\n if (this.hasSetProps) {\n throw new Error('Cannot change the id of an item');\n }\n node.key = id;\n }\n\n if (props.colSpan != null) {\n node.colSpan = props.colSpan;\n }\n\n this.hasSetProps = true;\n this.ownerDocument.queueUpdate();\n }\n\n get style(): CSSProperties {\n // React sets display: none to hide elements during Suspense.\n // We'll handle this by setting the element to hidden and invalidating\n // its siblings/parent. Hidden elements remain in the Document, but\n // are removed from the Collection.\n let element = this;\n return {\n get display() {\n return element.isHidden ? 'none' : '';\n },\n set display(value) {\n let isHidden = value === 'none';\n if (element.isHidden !== isHidden) {\n // Mark parent node dirty if this element is currently the first or last visible child.\n if (element.parentNode?.firstVisibleChild === element || element.parentNode?.lastVisibleChild === element) {\n element.ownerDocument.markDirty(element.parentNode);\n }\n\n // Mark sibling visible elements dirty.\n let prev = element.previousVisibleSibling;\n let next = element.nextVisibleSibling;\n if (prev) {\n element.ownerDocument.markDirty(prev);\n }\n if (next) {\n element.ownerDocument.markDirty(next);\n }\n\n // Mark self dirty.\n element.isHidden = isHidden;\n element.ownerDocument.markDirty(element);\n }\n }\n };\n }\n\n hasAttribute(): void {}\n setAttribute(): void {}\n setAttributeNS(): void {}\n removeAttribute(): void {}\n}\n\n/**\n * A mutable Document in the fake DOM. It owns an immutable Collection instance,\n * which is lazily copied on write during updates.\n */\nexport class Document<T, C extends BaseCollection<T> = BaseCollection<T>> extends BaseNode<T> {\n nodeType = 11; // DOCUMENT_FRAGMENT_NODE\n ownerDocument = this;\n dirtyNodes: Set<BaseNode<T>> = new Set();\n isSSR = false;\n nodeId = 0;\n nodesByProps = new WeakMap<object, ElementNode<T>>();\n isMounted = true;\n private collection: C;\n private nextCollection: C | null = null;\n private subscriptions: Set<() => void> = new Set();\n private queuedRender = false;\n private inSubscription = false;\n\n constructor(collection: C) {\n // @ts-ignore\n super(null);\n this.collection = collection;\n this.nextCollection = collection;\n }\n\n get isConnected(): boolean {\n return this.isMounted;\n }\n\n createElement(type: string): ElementNode<T> {\n return new ElementNode(type, this);\n }\n\n private getMutableCollection() {\n if (!this.nextCollection) {\n this.nextCollection = this.collection.clone();\n }\n\n return this.nextCollection;\n }\n\n markDirty(node: BaseNode<T>): void {\n this.dirtyNodes.add(node);\n }\n\n private addNode(element: ElementNode<T>): void {\n if (element.isHidden) {\n return;\n }\n\n let collection = this.getMutableCollection();\n if (!collection.getItem(element.node.key)) {\n for (let child of element) {\n this.addNode(child);\n }\n }\n\n collection.addNode(element.node);\n }\n\n private removeNode(node: ElementNode<T>): void {\n for (let child of node) {\n this.removeNode(child);\n }\n\n let collection = this.getMutableCollection();\n collection.removeNode(node.node.key);\n }\n\n /** Finalizes the collection update, updating all nodes and freezing the collection. */\n getCollection(): C {\n // If in a subscription update, return a clone of the existing collection.\n // This ensures React will queue a render. React will call getCollection again\n // during render, at which point all the updates will be complete and we can return\n // the new collection.\n if (this.inSubscription) {\n return this.collection.clone();\n }\n\n // Reset queuedRender to false when getCollection is called during render.\n this.queuedRender = false;\n\n this.updateCollection();\n return this.collection;\n }\n\n updateCollection(): void {\n // First, update the indices of dirty element children.\n for (let element of this.dirtyNodes) {\n element.updateChildIndices();\n }\n\n // Next, update dirty collection nodes.\n for (let element of this.dirtyNodes) {\n if (element instanceof ElementNode) {\n if (element.isConnected && !element.isHidden) {\n element.updateNode();\n this.addNode(element);\n } else {\n this.removeNode(element);\n }\n\n element.isMutated = false;\n }\n }\n\n this.dirtyNodes.clear();\n\n // Finally, update the collection.\n if (this.nextCollection) {\n this.nextCollection.commit(this.firstVisibleChild?.node.key ?? null, this.lastVisibleChild?.node.key ?? null, this.isSSR);\n if (!this.isSSR) {\n this.collection = this.nextCollection;\n this.nextCollection = null;\n }\n }\n }\n\n queueUpdate(): void {\n if (this.dirtyNodes.size === 0 || this.queuedRender) {\n return;\n }\n \n // Only trigger subscriptions once during an update, when the first item changes.\n // React's useSyncExternalStore will call getCollection immediately, to check whether the snapshot changed.\n // If so, React will queue a render to happen after the current commit to our fake DOM finishes.\n // We track whether getCollection is called in a subscription, and once it is called during render,\n // we reset queuedRender back to false.\n this.queuedRender = true;\n this.inSubscription = true;\n for (let fn of this.subscriptions) {\n fn();\n }\n this.inSubscription = false;\n }\n\n subscribe(fn: () => void) {\n this.subscriptions.add(fn);\n return (): boolean => this.subscriptions.delete(fn);\n }\n\n resetAfterSSR(): void {\n if (this.isSSR) {\n this.isSSR = false;\n this.firstChild = null;\n this.lastChild = null;\n this.nodeId = 0;\n }\n }\n}\n"],"names":[],"version":3,"file":"Document.module.js.map"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@react-aria/collections",
|
|
3
|
-
"version": "3.0.0-nightly-
|
|
3
|
+
"version": "3.0.0-nightly-e00dc8373-250318",
|
|
4
4
|
"description": "Spectrum UI components in React",
|
|
5
5
|
"license": "Apache-2.0",
|
|
6
6
|
"main": "dist/main.js",
|
|
@@ -22,10 +22,10 @@
|
|
|
22
22
|
"url": "https://github.com/adobe/react-spectrum"
|
|
23
23
|
},
|
|
24
24
|
"dependencies": {
|
|
25
|
-
"@react-aria/interactions": "3.0.0-nightly-
|
|
26
|
-
"@react-aria/ssr": "3.0.0-nightly-
|
|
27
|
-
"@react-aria/utils": "3.0.0-nightly-
|
|
28
|
-
"@react-types/shared": "3.0.0-nightly-
|
|
25
|
+
"@react-aria/interactions": "3.0.0-nightly-e00dc8373-250318",
|
|
26
|
+
"@react-aria/ssr": "3.0.0-nightly-e00dc8373-250318",
|
|
27
|
+
"@react-aria/utils": "3.0.0-nightly-e00dc8373-250318",
|
|
28
|
+
"@react-types/shared": "3.0.0-nightly-e00dc8373-250318",
|
|
29
29
|
"@swc/helpers": "^0.5.0",
|
|
30
30
|
"use-sync-external-store": "^1.4.0"
|
|
31
31
|
},
|
package/src/Document.ts
CHANGED
|
@@ -118,7 +118,6 @@ export class BaseNode<T> {
|
|
|
118
118
|
}
|
|
119
119
|
|
|
120
120
|
appendChild(child: ElementNode<T>): void {
|
|
121
|
-
this.ownerDocument.startTransaction();
|
|
122
121
|
if (child.parentNode) {
|
|
123
122
|
child.parentNode.removeChild(child);
|
|
124
123
|
}
|
|
@@ -141,13 +140,6 @@ export class BaseNode<T> {
|
|
|
141
140
|
this.lastChild = child;
|
|
142
141
|
|
|
143
142
|
this.ownerDocument.markDirty(this);
|
|
144
|
-
if (child.hasSetProps) {
|
|
145
|
-
// Only add the node to the collection if we already received props for it.
|
|
146
|
-
// Otherwise wait until then so we have the correct id for the node.
|
|
147
|
-
this.ownerDocument.addNode(child);
|
|
148
|
-
}
|
|
149
|
-
|
|
150
|
-
this.ownerDocument.endTransaction();
|
|
151
143
|
this.ownerDocument.queueUpdate();
|
|
152
144
|
}
|
|
153
145
|
|
|
@@ -156,7 +148,6 @@ export class BaseNode<T> {
|
|
|
156
148
|
return this.appendChild(newNode);
|
|
157
149
|
}
|
|
158
150
|
|
|
159
|
-
this.ownerDocument.startTransaction();
|
|
160
151
|
if (newNode.parentNode) {
|
|
161
152
|
newNode.parentNode.removeChild(newNode);
|
|
162
153
|
}
|
|
@@ -175,12 +166,6 @@ export class BaseNode<T> {
|
|
|
175
166
|
newNode.parentNode = referenceNode.parentNode;
|
|
176
167
|
|
|
177
168
|
this.invalidateChildIndices(referenceNode);
|
|
178
|
-
|
|
179
|
-
if (newNode.hasSetProps) {
|
|
180
|
-
this.ownerDocument.addNode(newNode);
|
|
181
|
-
}
|
|
182
|
-
|
|
183
|
-
this.ownerDocument.endTransaction();
|
|
184
169
|
this.ownerDocument.queueUpdate();
|
|
185
170
|
}
|
|
186
171
|
|
|
@@ -188,8 +173,6 @@ export class BaseNode<T> {
|
|
|
188
173
|
if (child.parentNode !== this || !this.ownerDocument.isMounted) {
|
|
189
174
|
return;
|
|
190
175
|
}
|
|
191
|
-
|
|
192
|
-
this.ownerDocument.startTransaction();
|
|
193
176
|
|
|
194
177
|
if (child.nextSibling) {
|
|
195
178
|
this.invalidateChildIndices(child.nextSibling);
|
|
@@ -213,13 +196,44 @@ export class BaseNode<T> {
|
|
|
213
196
|
child.previousSibling = null;
|
|
214
197
|
child.index = 0;
|
|
215
198
|
|
|
216
|
-
this.ownerDocument.
|
|
217
|
-
this.ownerDocument.endTransaction();
|
|
199
|
+
this.ownerDocument.markDirty(child);
|
|
218
200
|
this.ownerDocument.queueUpdate();
|
|
219
201
|
}
|
|
220
202
|
|
|
221
203
|
addEventListener(): void {}
|
|
222
204
|
removeEventListener(): void {}
|
|
205
|
+
|
|
206
|
+
get previousVisibleSibling(): ElementNode<T> | null {
|
|
207
|
+
let node = this.previousSibling;
|
|
208
|
+
while (node && node.isHidden) {
|
|
209
|
+
node = node.previousSibling;
|
|
210
|
+
}
|
|
211
|
+
return node;
|
|
212
|
+
}
|
|
213
|
+
|
|
214
|
+
get nextVisibleSibling(): ElementNode<T> | null {
|
|
215
|
+
let node = this.nextSibling;
|
|
216
|
+
while (node && node.isHidden) {
|
|
217
|
+
node = node.nextSibling;
|
|
218
|
+
}
|
|
219
|
+
return node;
|
|
220
|
+
}
|
|
221
|
+
|
|
222
|
+
get firstVisibleChild(): ElementNode<T> | null {
|
|
223
|
+
let node = this.firstChild;
|
|
224
|
+
while (node && node.isHidden) {
|
|
225
|
+
node = node.nextSibling;
|
|
226
|
+
}
|
|
227
|
+
return node;
|
|
228
|
+
}
|
|
229
|
+
|
|
230
|
+
get lastVisibleChild(): ElementNode<T> | null {
|
|
231
|
+
let node = this.lastChild;
|
|
232
|
+
while (node && node.isHidden) {
|
|
233
|
+
node = node.previousSibling;
|
|
234
|
+
}
|
|
235
|
+
return node;
|
|
236
|
+
}
|
|
223
237
|
}
|
|
224
238
|
|
|
225
239
|
/**
|
|
@@ -229,16 +243,14 @@ export class BaseNode<T> {
|
|
|
229
243
|
export class ElementNode<T> extends BaseNode<T> {
|
|
230
244
|
nodeType = 8; // COMMENT_NODE (we'd use ELEMENT_NODE but React DevTools will fail to get its dimensions)
|
|
231
245
|
node: CollectionNode<T>;
|
|
246
|
+
isMutated = true;
|
|
232
247
|
private _index: number = 0;
|
|
233
248
|
hasSetProps = false;
|
|
249
|
+
isHidden = false;
|
|
234
250
|
|
|
235
251
|
constructor(type: string, ownerDocument: Document<T, any>) {
|
|
236
252
|
super(ownerDocument);
|
|
237
253
|
this.node = new CollectionNode(type, `react-aria-${++ownerDocument.nodeId}`);
|
|
238
|
-
// Start a transaction so that no updates are emitted from the collection
|
|
239
|
-
// until the props for this node are set. We don't know the real id for the
|
|
240
|
-
// node until then, so we need to avoid emitting collections in an inconsistent state.
|
|
241
|
-
this.ownerDocument.startTransaction();
|
|
242
254
|
}
|
|
243
255
|
|
|
244
256
|
get index(): number {
|
|
@@ -258,30 +270,45 @@ export class ElementNode<T> extends BaseNode<T> {
|
|
|
258
270
|
return 0;
|
|
259
271
|
}
|
|
260
272
|
|
|
273
|
+
/**
|
|
274
|
+
* Lazily gets a mutable instance of a Node. If the node has already
|
|
275
|
+
* been cloned during this update cycle, it just returns the existing one.
|
|
276
|
+
*/
|
|
277
|
+
private getMutableNode(): Mutable<CollectionNode<T>> {
|
|
278
|
+
if (!this.isMutated) {
|
|
279
|
+
this.node = this.node.clone();
|
|
280
|
+
this.isMutated = true;
|
|
281
|
+
}
|
|
282
|
+
|
|
283
|
+
this.ownerDocument.markDirty(this);
|
|
284
|
+
return this.node;
|
|
285
|
+
}
|
|
286
|
+
|
|
261
287
|
updateNode(): void {
|
|
262
|
-
let
|
|
288
|
+
let nextSibling = this.nextVisibleSibling;
|
|
289
|
+
let node = this.getMutableNode();
|
|
263
290
|
node.index = this.index;
|
|
264
291
|
node.level = this.level;
|
|
265
292
|
node.parentKey = this.parentNode instanceof ElementNode ? this.parentNode.node.key : null;
|
|
266
|
-
node.prevKey = this.
|
|
267
|
-
node.nextKey =
|
|
293
|
+
node.prevKey = this.previousVisibleSibling?.node.key ?? null;
|
|
294
|
+
node.nextKey = nextSibling?.node.key ?? null;
|
|
268
295
|
node.hasChildNodes = !!this.firstChild;
|
|
269
|
-
node.firstChildKey = this.
|
|
270
|
-
node.lastChildKey = this.
|
|
296
|
+
node.firstChildKey = this.firstVisibleChild?.node.key ?? null;
|
|
297
|
+
node.lastChildKey = this.lastVisibleChild?.node.key ?? null;
|
|
271
298
|
|
|
272
299
|
// Update the colIndex of sibling nodes if this node has a colSpan.
|
|
273
|
-
if ((node.colSpan != null || node.colIndex != null) &&
|
|
300
|
+
if ((node.colSpan != null || node.colIndex != null) && nextSibling) {
|
|
274
301
|
// This queues the next sibling for update, which means this happens recursively.
|
|
275
302
|
let nextColIndex = (node.colIndex ?? node.index) + (node.colSpan ?? 1);
|
|
276
|
-
if (nextColIndex !==
|
|
277
|
-
let siblingNode =
|
|
303
|
+
if (nextColIndex !== nextSibling.node.colIndex) {
|
|
304
|
+
let siblingNode = nextSibling.getMutableNode();
|
|
278
305
|
siblingNode.colIndex = nextColIndex;
|
|
279
306
|
}
|
|
280
307
|
}
|
|
281
308
|
}
|
|
282
309
|
|
|
283
310
|
setProps<E extends Element>(obj: {[key: string]: any}, ref: ForwardedRef<E>, rendered?: ReactNode, render?: (node: Node<T>) => ReactElement): void {
|
|
284
|
-
let node = this.
|
|
311
|
+
let node = this.getMutableNode();
|
|
285
312
|
let {value, textValue, id, ...props} = obj;
|
|
286
313
|
props.ref = ref;
|
|
287
314
|
node.props = props;
|
|
@@ -300,19 +327,44 @@ export class ElementNode<T> extends BaseNode<T> {
|
|
|
300
327
|
node.colSpan = props.colSpan;
|
|
301
328
|
}
|
|
302
329
|
|
|
303
|
-
|
|
304
|
-
// so this node can be emitted.
|
|
305
|
-
if (!this.hasSetProps) {
|
|
306
|
-
this.ownerDocument.addNode(this);
|
|
307
|
-
this.ownerDocument.endTransaction();
|
|
308
|
-
this.hasSetProps = true;
|
|
309
|
-
}
|
|
310
|
-
|
|
330
|
+
this.hasSetProps = true;
|
|
311
331
|
this.ownerDocument.queueUpdate();
|
|
312
332
|
}
|
|
313
333
|
|
|
314
334
|
get style(): CSSProperties {
|
|
315
|
-
|
|
335
|
+
// React sets display: none to hide elements during Suspense.
|
|
336
|
+
// We'll handle this by setting the element to hidden and invalidating
|
|
337
|
+
// its siblings/parent. Hidden elements remain in the Document, but
|
|
338
|
+
// are removed from the Collection.
|
|
339
|
+
let element = this;
|
|
340
|
+
return {
|
|
341
|
+
get display() {
|
|
342
|
+
return element.isHidden ? 'none' : '';
|
|
343
|
+
},
|
|
344
|
+
set display(value) {
|
|
345
|
+
let isHidden = value === 'none';
|
|
346
|
+
if (element.isHidden !== isHidden) {
|
|
347
|
+
// Mark parent node dirty if this element is currently the first or last visible child.
|
|
348
|
+
if (element.parentNode?.firstVisibleChild === element || element.parentNode?.lastVisibleChild === element) {
|
|
349
|
+
element.ownerDocument.markDirty(element.parentNode);
|
|
350
|
+
}
|
|
351
|
+
|
|
352
|
+
// Mark sibling visible elements dirty.
|
|
353
|
+
let prev = element.previousVisibleSibling;
|
|
354
|
+
let next = element.nextVisibleSibling;
|
|
355
|
+
if (prev) {
|
|
356
|
+
element.ownerDocument.markDirty(prev);
|
|
357
|
+
}
|
|
358
|
+
if (next) {
|
|
359
|
+
element.ownerDocument.markDirty(next);
|
|
360
|
+
}
|
|
361
|
+
|
|
362
|
+
// Mark self dirty.
|
|
363
|
+
element.isHidden = isHidden;
|
|
364
|
+
element.ownerDocument.markDirty(element);
|
|
365
|
+
}
|
|
366
|
+
}
|
|
367
|
+
};
|
|
316
368
|
}
|
|
317
369
|
|
|
318
370
|
hasAttribute(): void {}
|
|
@@ -334,10 +386,8 @@ export class Document<T, C extends BaseCollection<T> = BaseCollection<T>> extend
|
|
|
334
386
|
nodesByProps = new WeakMap<object, ElementNode<T>>();
|
|
335
387
|
isMounted = true;
|
|
336
388
|
private collection: C;
|
|
337
|
-
private
|
|
338
|
-
private mutatedNodes: Set<ElementNode<T>> = new Set();
|
|
389
|
+
private nextCollection: C | null = null;
|
|
339
390
|
private subscriptions: Set<() => void> = new Set();
|
|
340
|
-
private transactionCount = 0;
|
|
341
391
|
private queuedRender = false;
|
|
342
392
|
private inSubscription = false;
|
|
343
393
|
|
|
@@ -345,7 +395,7 @@ export class Document<T, C extends BaseCollection<T> = BaseCollection<T>> extend
|
|
|
345
395
|
// @ts-ignore
|
|
346
396
|
super(null);
|
|
347
397
|
this.collection = collection;
|
|
348
|
-
this.
|
|
398
|
+
this.nextCollection = collection;
|
|
349
399
|
}
|
|
350
400
|
|
|
351
401
|
get isConnected(): boolean {
|
|
@@ -356,78 +406,56 @@ export class Document<T, C extends BaseCollection<T> = BaseCollection<T>> extend
|
|
|
356
406
|
return new ElementNode(type, this);
|
|
357
407
|
}
|
|
358
408
|
|
|
359
|
-
/**
|
|
360
|
-
* Lazily gets a mutable instance of a Node. If the node has already
|
|
361
|
-
* been cloned during this update cycle, it just returns the existing one.
|
|
362
|
-
*/
|
|
363
|
-
getMutableNode(element: ElementNode<T>): Mutable<CollectionNode<T>> {
|
|
364
|
-
let node = element.node;
|
|
365
|
-
if (!this.mutatedNodes.has(element)) {
|
|
366
|
-
node = element.node.clone();
|
|
367
|
-
this.mutatedNodes.add(element);
|
|
368
|
-
element.node = node;
|
|
369
|
-
}
|
|
370
|
-
this.markDirty(element);
|
|
371
|
-
return node;
|
|
372
|
-
}
|
|
373
|
-
|
|
374
409
|
private getMutableCollection() {
|
|
375
|
-
if (!this.
|
|
376
|
-
this.
|
|
377
|
-
this.collectionMutated = true;
|
|
410
|
+
if (!this.nextCollection) {
|
|
411
|
+
this.nextCollection = this.collection.clone();
|
|
378
412
|
}
|
|
379
413
|
|
|
380
|
-
return this.
|
|
414
|
+
return this.nextCollection;
|
|
381
415
|
}
|
|
382
416
|
|
|
383
417
|
markDirty(node: BaseNode<T>): void {
|
|
384
418
|
this.dirtyNodes.add(node);
|
|
385
419
|
}
|
|
386
420
|
|
|
387
|
-
|
|
388
|
-
|
|
389
|
-
|
|
390
|
-
|
|
391
|
-
endTransaction(): void {
|
|
392
|
-
this.transactionCount--;
|
|
393
|
-
}
|
|
421
|
+
private addNode(element: ElementNode<T>): void {
|
|
422
|
+
if (element.isHidden) {
|
|
423
|
+
return;
|
|
424
|
+
}
|
|
394
425
|
|
|
395
|
-
addNode(element: ElementNode<T>): void {
|
|
396
426
|
let collection = this.getMutableCollection();
|
|
397
427
|
if (!collection.getItem(element.node.key)) {
|
|
398
|
-
collection.addNode(element.node);
|
|
399
|
-
|
|
400
428
|
for (let child of element) {
|
|
401
429
|
this.addNode(child);
|
|
402
430
|
}
|
|
403
431
|
}
|
|
404
432
|
|
|
405
|
-
|
|
433
|
+
collection.addNode(element.node);
|
|
406
434
|
}
|
|
407
435
|
|
|
408
|
-
removeNode(node: ElementNode<T>): void {
|
|
436
|
+
private removeNode(node: ElementNode<T>): void {
|
|
409
437
|
for (let child of node) {
|
|
410
438
|
this.removeNode(child);
|
|
411
439
|
}
|
|
412
440
|
|
|
413
441
|
let collection = this.getMutableCollection();
|
|
414
442
|
collection.removeNode(node.node.key);
|
|
415
|
-
this.markDirty(node);
|
|
416
443
|
}
|
|
417
444
|
|
|
418
445
|
/** Finalizes the collection update, updating all nodes and freezing the collection. */
|
|
419
446
|
getCollection(): C {
|
|
420
|
-
|
|
421
|
-
|
|
447
|
+
// If in a subscription update, return a clone of the existing collection.
|
|
448
|
+
// This ensures React will queue a render. React will call getCollection again
|
|
449
|
+
// during render, at which point all the updates will be complete and we can return
|
|
450
|
+
// the new collection.
|
|
451
|
+
if (this.inSubscription) {
|
|
452
|
+
return this.collection.clone();
|
|
422
453
|
}
|
|
423
454
|
|
|
424
|
-
this.updateCollection();
|
|
425
|
-
|
|
426
455
|
// Reset queuedRender to false when getCollection is called during render.
|
|
427
|
-
|
|
428
|
-
this.queuedRender = false;
|
|
429
|
-
}
|
|
456
|
+
this.queuedRender = false;
|
|
430
457
|
|
|
458
|
+
this.updateCollection();
|
|
431
459
|
return this.collection;
|
|
432
460
|
}
|
|
433
461
|
|
|
@@ -439,36 +467,35 @@ export class Document<T, C extends BaseCollection<T> = BaseCollection<T>> extend
|
|
|
439
467
|
|
|
440
468
|
// Next, update dirty collection nodes.
|
|
441
469
|
for (let element of this.dirtyNodes) {
|
|
442
|
-
if (element instanceof ElementNode
|
|
443
|
-
element.
|
|
470
|
+
if (element instanceof ElementNode) {
|
|
471
|
+
if (element.isConnected && !element.isHidden) {
|
|
472
|
+
element.updateNode();
|
|
473
|
+
this.addNode(element);
|
|
474
|
+
} else {
|
|
475
|
+
this.removeNode(element);
|
|
476
|
+
}
|
|
477
|
+
|
|
478
|
+
element.isMutated = false;
|
|
444
479
|
}
|
|
445
480
|
}
|
|
446
481
|
|
|
447
482
|
this.dirtyNodes.clear();
|
|
448
483
|
|
|
449
484
|
// Finally, update the collection.
|
|
450
|
-
if (this.
|
|
451
|
-
|
|
452
|
-
|
|
453
|
-
|
|
454
|
-
|
|
455
|
-
}
|
|
485
|
+
if (this.nextCollection) {
|
|
486
|
+
this.nextCollection.commit(this.firstVisibleChild?.node.key ?? null, this.lastVisibleChild?.node.key ?? null, this.isSSR);
|
|
487
|
+
if (!this.isSSR) {
|
|
488
|
+
this.collection = this.nextCollection;
|
|
489
|
+
this.nextCollection = null;
|
|
456
490
|
}
|
|
457
|
-
|
|
458
|
-
this.mutatedNodes.clear();
|
|
459
|
-
collection.commit(this.firstChild?.node.key ?? null, this.lastChild?.node.key ?? null, this.isSSR);
|
|
460
491
|
}
|
|
461
|
-
|
|
462
|
-
this.collectionMutated = false;
|
|
463
492
|
}
|
|
464
493
|
|
|
465
494
|
queueUpdate(): void {
|
|
466
|
-
|
|
467
|
-
// queueUpdate should be called again after the transaction.
|
|
468
|
-
if (this.dirtyNodes.size === 0 || this.transactionCount > 0 || this.queuedRender) {
|
|
495
|
+
if (this.dirtyNodes.size === 0 || this.queuedRender) {
|
|
469
496
|
return;
|
|
470
497
|
}
|
|
471
|
-
|
|
498
|
+
|
|
472
499
|
// Only trigger subscriptions once during an update, when the first item changes.
|
|
473
500
|
// React's useSyncExternalStore will call getCollection immediately, to check whether the snapshot changed.
|
|
474
501
|
// If so, React will queue a render to happen after the current commit to our fake DOM finishes.
|