import React, { useEffect } from 'react' import CollapseIcon from './collapse-icon' import useTheme from '../use-theme' import Expand from '../shared/expand' import { useCollapseContext } from './collapse-context' import useCurrentState from '../utils/use-current-state' import CollapseGroup from './collapse-group' import logWarning from '../utils/use-warning' interface Props { title: React.ReactNode | string subtitle?: React.ReactNode | string initialVisible?: boolean shadow?: boolean className?: string index?: number } const defaultProps = { className: '', shadow: false, initialVisible: false } type NativeAttrs = Omit, keyof Props> export type CollapseProps = Props & typeof defaultProps & NativeAttrs const Collapse: React.FC> = ({ children, title, subtitle, initialVisible, shadow, className, index, ...props }) => { const theme = useTheme() const [visible, setVisible, visibleRef] = useCurrentState(initialVisible) const { values, updateValues } = useCollapseContext() if (!title) { logWarning('"title" is required.', 'Collapse') } useEffect(() => { if (!values.length) return const isActive = !!values.find((item) => item === index) setVisible(isActive) }, [values.join(',')]) const clickHandler = () => { const next = !visibleRef.current setVisible(next) updateValues && updateValues(index, next) } return (

{title}

{subtitle &&
{subtitle}
}
{children}
) } Collapse.defaultProps = defaultProps type CollapseComponent

= React.FC

& { Group: typeof CollapseGroup } type ComponentProps = Partial & Omit & NativeAttrs export default Collapse as CollapseComponent