import { ExpandLess, ExpandMore } from '@mui/icons-material'; import { Box, Collapse, ListItemButton, IconButton as MuiIconButton, Tooltip, Typography } from '@mui/material'; import { useCallback, useState } from 'react'; import { useTranslation } from 'react-i18next'; import { makeStyles } from 'tss-react/mui'; import type { Group } from './Inputs/models'; interface Props { children: React.ReactNode; className?: string; defaultIsOpen?: boolean; group?: Group; hasGroupTitle: boolean; isCollapsible: boolean; } const useStyles = makeStyles()((theme) => ({ expandCollapseIcon: { justifySelf: 'flex-end' }, groupTitleContainer: { alignItems: 'center', columnGap: theme.spacing(1), display: 'flex', flexDirection: 'row' }, title: {}, tooltip: { maxWidth: theme.spacing(60) } })); const CollapsibleGroup = ({ children, isCollapsible, group, hasGroupTitle, defaultIsOpen = false, className }: Props): JSX.Element => { const { classes, cx } = useStyles(); const { t } = useTranslation(); const [isOpen, setIsOpen] = useState(isCollapsible && defaultIsOpen); const toggle = (): void => { setIsOpen((currentIsOpen) => !currentIsOpen); }; const containerClassName = className || ''; const CollapseIcon = isOpen ? ExpandLess : ExpandMore; const ContainerComponent = useCallback( ({ children: containerComponentChildren }: Pick): JSX.Element => isCollapsible ? ( {containerComponentChildren} ) : ( {containerComponentChildren} ), [ isCollapsible, classes.groupTitleContainer, containerClassName, cx, group?.name, toggle ] ); return ( <> {hasGroupTitle && (
{t(group?.name as string)} {group?.EndIcon && ( : ''} > )} {isCollapsible && }
)} {isCollapsible ? {children} : children} ); }; export default CollapsibleGroup;