MCPcopy Create free account
hub / github.com/adobe/react-spectrum / useCollectionRender

Function useCollectionRender

packages/@react-spectrum/s2/src/Breadcrumbs.tsx:450–560  ·  view source on GitHub ↗
(collection: Collection<Node<unknown>>)

Source from the content-addressed store, hash-verified

448};
449
450let useCollectionRender = (collection: Collection<Node<unknown>>) => {
451 let {containerRef, onAction} = useContext(CollapseContext) ?? {};
452 let [visibleItems, setVisibleItems] = useState(collection.size);
453 let {size = 'M'} = useContext(InternalBreadcrumbsContext);
454
455 let children = useMemo(() => {
456 let result: Node<any>[] = [];
457 for (let key of collection.getKeys()) {
458 result.push(collection.getItem(key)!);
459 }
460 return result;
461 }, [collection]);
462
463 let listRef = useRef<HTMLDivElement | null>(null);
464 let updateOverflow = useCallback(() => {
465 let currListRef: HTMLDivElement | null = listRef.current;
466 if (!currListRef) {
467 setVisibleItems(collection.size);
468 return;
469 }
470 let container = currListRef.parentElement;
471 if (!container) {
472 setVisibleItems(collection.size);
473 return;
474 }
475
476 let listItems = Array.from(
477 currListRef.querySelectorAll('[data-hidden-breadcrumb]')
478 ) as HTMLLIElement[];
479 let folder = currListRef.querySelector('button') as HTMLButtonElement;
480 if (listItems.length <= 0) {
481 setVisibleItems(collection.size);
482 return;
483 }
484 let containerWidth = container.offsetWidth;
485 let containerGap = parseInt(getComputedStyle(container).gap, 10);
486 let folderGap = parseInt(getComputedStyle(folder).marginInlineStart, 10);
487 let newVisibleItems = 0;
488 let maxVisibleItems = MAX_VISIBLE_ITEMS;
489
490 let widths: Array<number> = [];
491 let totalWidth = 0;
492 for (let breadcrumb of listItems) {
493 let width = breadcrumb.offsetWidth + 1; // offsetWidth is rounded down
494 widths.push(width);
495 totalWidth += width;
496 }
497
498 // can we fit all the items without collapsing
499 if (
500 totalWidth <= containerWidth - collection.size * containerGap &&
501 collection.size <= MAX_VISIBLE_ITEMS
502 ) {
503 setVisibleItems(collection.size);
504 return;
505 }
506
507 // we know there is always at least one item because of the listItems.length check up above

Callers 2

CollectionRootFunction · 0.70
CollectionBranchFunction · 0.70

Calls 7

useResizeObserverFunction · 0.90
updateOverflowFunction · 0.85
pushMethod · 0.80
sliceMethod · 0.80
getKeysMethod · 0.65
getItemMethod · 0.65
renderMethod · 0.45

Tested by

no test coverage detected