(collection: Collection<Node<unknown>>)
| 448 | }; |
| 449 | |
| 450 | let 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 |
no test coverage detected