"use client" import * as React from 'react'; import * as AccordionPrimitive from '@radix-ui/react-accordion'; import { ChevronDownIcon } from '@radix-ui/react-icons'; import { useStoredValue, type StorageType, type UseStoredValueOptions } from '../../../hooks'; import { cn } from '../../../lib/utils'; type AccordionSingleProps = React.ComponentPropsWithoutRef & { type: 'single' storageKey?: string storageType?: StorageType storageTtl?: number } type AccordionMultipleProps = React.ComponentPropsWithoutRef & { type: 'multiple' storageKey?: string storageType?: StorageType storageTtl?: number } export type AccordionProps = AccordionSingleProps | AccordionMultipleProps const Accordion = React.forwardRef< React.ElementRef, AccordionProps >(({ storageKey, storageType, storageTtl, ...props }, ref) => { const storageOptions: UseStoredValueOptions | undefined = storageKey ? { storage: storageType ?? 'local', ttl: storageTtl } : undefined; const isSingle = props.type === 'single'; // For single: persist string; for multiple: persist string[] const initialSingle = (props as AccordionSingleProps).defaultValue ?? ((props as AccordionSingleProps).value as string | undefined) ?? ''; const initialMultiple = (props as AccordionMultipleProps).defaultValue ?? ((props as AccordionMultipleProps).value as string[] | undefined) ?? []; const [storedSingle, setStoredSingle] = useStoredValue( isSingle ? storageKey : undefined, initialSingle, storageOptions, ); const [storedMultiple, setStoredMultiple] = useStoredValue( !isSingle ? storageKey : undefined, initialMultiple, storageOptions, ); if (isSingle) { // Drop ``type`` from ``rest`` — we re-apply it below as a literal so // the Radix discriminated-union narrows correctly; leaving it in // ``rest`` makes TS flag a duplicate (TS2783). const { onValueChange, value, defaultValue, type: _t, ...rest } = props as AccordionSingleProps & { onValueChange?: (v: string) => void }; void _t; const handleValueChange = storageKey ? (newValue: string) => { setStoredSingle(newValue); onValueChange?.(newValue); } : onValueChange; const extraProps = storageKey && value === undefined && storedSingle ? { defaultValue: storedSingle } : defaultValue !== undefined ? { defaultValue } : {}; return ( ); } const { onValueChange, value, defaultValue, type: _t, ...rest } = props as AccordionMultipleProps & { onValueChange?: (v: string[]) => void }; void _t; const handleValueChange = storageKey ? (newValue: string[]) => { setStoredMultiple(newValue); onValueChange?.(newValue); } : onValueChange; const extraProps = storageKey && value === undefined && storedMultiple.length > 0 ? { defaultValue: storedMultiple } : defaultValue !== undefined ? { defaultValue } : {}; return ( ); }) Accordion.displayName = "Accordion" const AccordionItem = React.forwardRef< React.ElementRef, React.ComponentPropsWithoutRef & { key?: React.Key } >(({ className, ...props }, ref) => ( )) AccordionItem.displayName = "AccordionItem" const AccordionTrigger = React.forwardRef< React.ElementRef, React.ComponentPropsWithoutRef >(({ className, children, ...props }, ref) => ( svg]:rotate-180", className )} {...props} > {children} )) AccordionTrigger.displayName = AccordionPrimitive.Trigger.displayName const AccordionContent = React.forwardRef< React.ElementRef, React.ComponentPropsWithoutRef >(({ className, children, ...props }, ref) => (
{children}
)) AccordionContent.displayName = AccordionPrimitive.Content.displayName export { Accordion, AccordionItem, AccordionTrigger, AccordionContent }