import { ExpandLess as ExpandLessIcon, ExpandMore as ExpandMoreIcon, } from '@mui/icons-material'; import { Box, IconButton } from '@mui/material'; import { FC, ReactNode, useMemo, useState } from 'react'; import { GREY } from '../../lib/consts/DEFAULT_THEME'; import FlexBox from '../FlexBox'; import InnerPanel from './InnerPanel'; import InnerPanelBody from './InnerPanelBody'; import InnerPanelHeader from './InnerPanelHeader'; import Spinner from '../Spinner'; type ExpandablePanelOptionalProps = { isExpandInitially?: boolean; isLoading?: boolean; }; type ExpandablePanelProps = ExpandablePanelOptionalProps & { header: ReactNode; }; const EXPANDABLE_PANEL_DEFAULT_PROPS: Required = { isExpandInitially: false, isLoading: false, }; const ExpandablePanel: FC = ({ children, header, isExpandInitially = EXPANDABLE_PANEL_DEFAULT_PROPS.isExpandInitially, isLoading = EXPANDABLE_PANEL_DEFAULT_PROPS.isLoading, }) => { const [isExpand, setIsExpand] = useState(isExpandInitially); const expandButtonIcon = useMemo( () => (isExpand ? : ), [isExpand], ); const contentHeight = useMemo(() => (isExpand ? 'auto' : '.2em'), [isExpand]); const headerSpinner = useMemo(() => { const spinnerLength = '1.2em'; return !isExpand && isLoading ? ( ) : undefined; }, [isExpand, isLoading]); const content = useMemo( () => isExpand && isLoading ? ( ) : ( {children} ), [children, isExpand, isLoading], ); return ( {header} {headerSpinner} { setIsExpand((previous) => !previous); }} sx={{ color: GREY, padding: '.2em' }} > {expandButtonIcon} {content} ); }; ExpandablePanel.defaultProps = EXPANDABLE_PANEL_DEFAULT_PROPS; export default ExpandablePanel;