import * as React from 'react'; import classnames from 'classnames'; import { Container } from '../../modules/Container/Container'; import ILocalContainerProps from '../../../common/structures/ILocalContainerProps'; import AccordionItem from './AccordionItem'; export interface Props extends ILocalContainerProps { allowMultipleOpenItems?: boolean; clickArea?: 'icon' | 'all'; } const Accordion: React.FC = ({ allowMultipleOpenItems, children, className, clickArea = 'icon', container, id, style, }) => { const [lastOpenedItemId, setLastOpenedItemId] = React.useState(); const [openedItemsLookup, setOpenedItemsLookup] = React.useState<{[key: string]: boolean}>({}); const onToggle = (itemId: string | undefined) => { // toggle if already open otherwise set new item to open setLastOpenedItemId((lastOpenedItemId) => itemId === lastOpenedItemId ? undefined : itemId); if (itemId) { setOpenedItemsLookup((openedItemsLookup) => ({ ...openedItemsLookup, [itemId]: !openedItemsLookup[itemId], })); } }; const isItemOpen = (itemId: string | undefined) => { return allowMultipleOpenItems ? itemId && !!openedItemsLookup[itemId] : itemId === lastOpenedItemId; } return (
{ React.Children.map(children, (child: React.ReactNode, index: number) => { if (!child) { return; } const childPlus: React.ReactNode & {props?: any[]} = child; return ( <> {/* directly render children, if possible, thereby removing the wrapper (aka 'child') */} {childPlus?.props?.children || child} ); })}
); }; export default Accordion;