import React, { forwardRef, HTMLAttributes, useContext, useEffect, useId, useRef, useState, } from 'react' import PropTypes from 'prop-types' import classNames from 'classnames' import { CAccordionContext } from './CAccordionContext' import { CAccordionItemContext } from './CAccordionItemContext' export interface CAccordionItemProps extends HTMLAttributes { /** * The id global attribute defines an identifier (ID) that must be unique in the whole document. */ id?: string /** * A string of all className you want applied to the base component. */ className?: string /** * Item key. */ itemKey?: number | string } export const CAccordionItem = forwardRef( ({ children, className, id, itemKey, ...rest }, ref) => { const uniqueId = useId() const _id = id ?? uniqueId const _itemKey = useRef(itemKey ?? _id) const { _activeItemKey, alwaysOpen, setActiveKey } = useContext(CAccordionContext) const [visible, setVisible] = useState(Boolean(_activeItemKey === _itemKey.current)) useEffect(() => { if (!alwaysOpen && visible) { setActiveKey(_itemKey.current) } }, [visible]) useEffect(() => { setVisible(Boolean(_activeItemKey === _itemKey.current)) }, [_activeItemKey]) return (
{children}
) } ) CAccordionItem.propTypes = { children: PropTypes.node, className: PropTypes.string, itemKey: PropTypes.oneOfType([PropTypes.number, PropTypes.string]), } CAccordionItem.displayName = 'CAccordionItem'