import React, { useContext } from 'react'; import { Accordion } from '@digigov/react-core/Accordion'; import { AccordionSection, type AccordionSectionProps, } from '@digigov/react-core/AccordionSection'; import { Button, ButtonProps } from '@digigov/react-core/Button'; import { AccordionItemId, useAccordion, UseAccordionReturn, } from '@digigov/ui/content/Accordion/hooks'; export interface ButtonAccordionAutoProps extends ButtonProps {} export interface AccordionSectionAutoProps extends AccordionSectionProps { id: string; } const AccordionContext = React.createContext(null); export const AccordionAuto = ({ singleOpen, defaultOpen, children, ...props }: { singleOpen?: boolean; defaultOpen?: AccordionItemId; children: React.ReactNode; }) => { const accordion = useAccordion({ singleOpen, defaultOpen, }); return ( {children} ); }; export const useAccordionContext = (): UseAccordionReturn | null => { const context = useContext(AccordionContext); if (context === null) { throw new Error( 'AccordionContext must be used within an AccordionProvider' ); } return context; }; export const AccordionSectionAuto = React.forwardRef< HTMLDetailsElement, AccordionSectionAutoProps >(function AccordionSectionAuto({ id, ...props }, ref) { const context = useAccordionContext(); if (!context) { throw new Error( 'AccordionSectionAuto must be used within an AccordionProvider' ); } const { section } = context; return ( ); }); export const AccordionOpenAllButtonAuto = React.forwardRef< HTMLButtonElement, ButtonAccordionAutoProps >(function AccordionOpenAllButtonAuto(props, ref) { const context = useAccordionContext(); if (!context) { throw new Error( 'AccordionOpenAllButtonAuto must be used within an AccordionProvider' ); } const { openAll, hasOpen } = context; return !hasOpen ? (