// @flow strict import * as React from 'react'; import classify from '../../utils/classify'; import {Button} from '../Button'; import {Toggle} from '../Toggle'; import css from './Accordion.module.css'; export type AccordionClassNames = $ReadOnly<{ wrapper?: string, headerWrapper?: string, header?: string, content?: string, }>; export type AccordionPropsType = { id: string, header: React.Node, children: React.Node, classNames?: AccordionClassNames, isOpen?: boolean, disabled?: boolean, showToggle?: boolean, onChange?: ?(id?: string, isOpen: boolean) => mixed, onToggle?: ?(id?: string, checked?: boolean) => mixed, }; export const Accordion: React$AbstractComponent< AccordionPropsType, HTMLDivElement, > = React.forwardRef( ( { id, header, onChange, onToggle, disabled = false, classNames, isOpen = false, showToggle = false, children, }: AccordionPropsType, ref, ) => { const [accordionIsOpen, setAccordionIsOpen] = React.useState(isOpen); const [checked, setChecked] = React.useState(false); const handleToggle = () => { setChecked(!checked); onToggle?.(id, !checked); }; const handleAccordionClick = () => { if (!disabled) { onChange?.(id, !accordionIsOpen); setAccordionIsOpen((prev) => !prev); } }; React.useEffect(() => { setAccordionIsOpen(isOpen); }, [isOpen]); return (
{showToggle && (
{ e.stopPropagation(); // prevent toggle click from triggering accordion toggle }} >
)} {header}
{accordionIsOpen && (
{children}
)}
); }, ); Accordion.displayName = 'Accordion';