UNPKG

react-bootstrap

Version:

Bootstrap 5 components built with React

66 lines (65 loc) 2.25 kB
"use client"; import * as React from 'react'; import { useContext } from 'react'; import classNames from 'classnames'; import AccordionContext, { isAccordionItemSelected } from './AccordionContext'; import AccordionItemContext from './AccordionItemContext'; import { useBootstrapPrefix } from './ThemeProvider'; import { jsx as _jsx } from "react/jsx-runtime"; export function useAccordionButton(eventKey, onClick) { const { activeEventKey, onSelect, alwaysOpen } = useContext(AccordionContext); return e => { /* Compare the event key in context with the given event key. If they are the same, then collapse the component. */ let eventKeyPassed = eventKey === activeEventKey ? null : eventKey; if (alwaysOpen) { if (Array.isArray(activeEventKey)) { if (activeEventKey.includes(eventKey)) { eventKeyPassed = activeEventKey.filter(k => k !== eventKey); } else { eventKeyPassed = [...activeEventKey, eventKey]; } } else { // activeEventKey is undefined. eventKeyPassed = [eventKey]; } } onSelect == null || onSelect(eventKeyPassed, e); onClick == null || onClick(e); }; } const AccordionButton = /*#__PURE__*/React.forwardRef(({ // Need to define the default "as" during prop destructuring to be compatible with styled-components github.com/react-bootstrap/react-bootstrap/issues/3595 as: Component = 'button', bsPrefix, className, onClick, ...props }, ref) => { bsPrefix = useBootstrapPrefix(bsPrefix, 'accordion-button'); const { eventKey } = useContext(AccordionItemContext); const accordionOnClick = useAccordionButton(eventKey, onClick); const { activeEventKey } = useContext(AccordionContext); if (Component === 'button') { props.type = 'button'; } return /*#__PURE__*/_jsx(Component, { ref: ref, onClick: accordionOnClick, ...props, "aria-expanded": Array.isArray(activeEventKey) ? activeEventKey.includes(eventKey) : eventKey === activeEventKey, className: classNames(className, bsPrefix, !isAccordionItemSelected(activeEventKey, eventKey) && 'collapsed') }); }); AccordionButton.displayName = 'AccordionButton'; export default AccordionButton;