/*! * Copyright (c) Microsoft. All rights reserved. * Licensed under the MIT license. See LICENSE file in the project. */ import type { IGroup } from '@fluentui/react' import { memo, useCallback, useMemo, useRef, useState } from 'react' import { Else, If, Then } from 'react-if' import { useCountChildren, useLevelButtonProps } from './GroupHeader.hooks.js' import { Bold, HeaderContainer, HeaderDetailsText, LevelButton, } from './GroupHeader.styles.js' import type { GroupHeaderProps } from './GroupHeader.types.js' export const GroupHeader: React.FC> = memo(function GroupHeader({ columnName, props, children, lazyLoadGroups }) { const { group, onToggleCollapse } = props const ref = useRef() // whether the element toggle is manual or by visibility on scroll const [manualToggle, setManualToggle] = useState(false) // trigger as soon as the element becomes visible const countChildren = useCountChildren() const onManualLevelToggle = useCallback(() => { setManualToggle(true) onToggleCollapse?.(group as IGroup) }, [group, onToggleCollapse, setManualToggle]) const shouldLazyLoad = useMemo((): boolean => { return lazyLoadGroups && (group?.level as number) > 0 && !manualToggle }, [group, lazyLoadGroups, manualToggle]) const levelButtonProps = useLevelButtonProps(group?.isCollapsed) return ( { ref.current = shouldLazyLoad ? element : undefined }} groupLevel={group?.level as number} > {children} {columnName ? `${columnName} - ` : ''} {group?.name} Children: {group?.count} {group?.children && ( Total Items: {countChildren(group?.children)} )} ) })