import { ExpandLess as ExpandLessIcon, ExpandMore as ExpandMoreIcon, } from '@mui/icons-material'; import { Box, IconButton } from '@mui/material'; import { FC, 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'; import { BodyText } from '../Text'; const HEADER_SPINNER_LENGTH = '1.2em'; const ExpandablePanel: FC = ({ children, expandInitially: isExpandInitially = false, header, loading: isLoading = false, panelProps, showHeaderSpinner: isShowHeaderSpinner = false, }) => { const [isExpand, setIsExpand] = useState(isExpandInitially); const expandButtonIcon = useMemo( () => (isExpand ? : ), [isExpand], ); const contentHeight = useMemo(() => (isExpand ? 'auto' : '.2em'), [isExpand]); const headerElement = useMemo( () => (typeof header === 'string' ? {header} : header), [header], ); const headerSpinner = useMemo( () => isShowHeaderSpinner && !isExpand && isLoading ? ( ) : undefined, [isExpand, isLoading, isShowHeaderSpinner], ); const content = useMemo( () => isExpand && isLoading ? ( ) : ( {children} ), [children, isExpand, isLoading], ); return ( {headerElement} {headerSpinner} { setIsExpand((previous) => !previous); }} sx={{ color: GREY, padding: '.2em' }} > {expandButtonIcon} {content} ); }; export default ExpandablePanel;