// @flow strict import * as React from 'react'; import classify from '../../utils/classify'; import {UnstyledButton} from '../Button'; import type {IconType} from '../Icon'; import {Icon} from '../Icon'; import {Truncate} from '../Truncate'; import css from './CollapsibleCard.module.css'; export const COLLAPSIBLE_CARD_SEMANTIC = Object.freeze({ neutral: 'neutral', success: 'success', information: 'information', warning: 'warning', danger: 'danger', }); type ClassNames = $ReadOnly<{ wrapper?: string, title?: string, content?: string, }>; export type CollapsibleCardSemanticType = $Values< typeof COLLAPSIBLE_CARD_SEMANTIC, >; export type CollapsibleCardProps = { id?: string, title: React.Node, children: React.Node, classNames?: ClassNames, isOpen?: boolean, headerIconName?: string, headerIconType?: IconType, semantic?: CollapsibleCardSemanticType, onChange?: ?( e: SyntheticEvent, isOpen: boolean, id?: string, ) => mixed, }; export type CollapsibleCardActionProps = { children: React.Node, className?: string, }; export const CollapsibleCardAction = ({ children, className, }: CollapsibleCardActionProps): React.Node => (
{children}
); export type CollapsibleCardContentProps = { children: React.Node, className?: string, }; export const CollapsibleCardContent = ({ children, className, }: CollapsibleCardActionProps): React.Node => (
{children}
); export const CollapsibleCard: React$AbstractComponent< CollapsibleCardProps, HTMLDivElement, > = React.forwardRef( ( { id, isOpen, onChange, classNames, title, children, semantic = 'neutral', headerIconName, headerIconType = 'solid', }: CollapsibleCardProps, ref, ): React.Node => { const [collapsibleCardIsOpen, setCollapsibleCardIsOpen] = React.useState( Boolean(isOpen), ); React.useEffect(() => { setCollapsibleCardIsOpen(Boolean(isOpen)); }, [isOpen]); return (
{ onChange?.(e, !collapsibleCardIsOpen, id); setCollapsibleCardIsOpen(!collapsibleCardIsOpen); }} >
{!!headerIconName && (
)} {title}
{collapsibleCardIsOpen ? ( ) : ( )}
{collapsibleCardIsOpen && (
{children}
)}
); }, );