'use client';
import * as React from 'react';
import { useUIPersistedState } from '../../../lib/persist';
const SCOPE_SINGLE = 'accordion:single';
const SCOPE_MULTIPLE = 'accordion:multiple';
export interface UseAccordionSingleResult {
/** Currently open item id, or empty string if all closed. */
value: string;
setValue: (next: string) => void;
reset: () => void;
}
export interface UseAccordionMultipleResult {
/** List of open item ids. */
value: string[];
setValue: (next: string[]) => void;
reset: () => void;
}
/**
* Persist a single-mode Accordion's open item.
*
* @example
* const { value, setValue } = useAccordionSingleState('sidebar-groups');
* ...
*/
export function useAccordionSingleState(
key: string,
defaultValue = '',
): UseAccordionSingleResult {
const sanitize = React.useCallback(
(raw: string) => (typeof raw === 'string' ? raw : undefined),
[],
);
const persisted = useUIPersistedState(SCOPE_SINGLE, key, defaultValue, { sanitize });
return {
value: persisted.value,
setValue: persisted.setValue,
reset: persisted.reset,
};
}
/**
* Persist a multiple-mode Accordion's open items.
*
* @example
* const { value, setValue } = useAccordionMultipleState('sidebar-groups', ['general']);
* ...
*/
export function useAccordionMultipleState(
key: string,
defaultValue: string[] = [],
): UseAccordionMultipleResult {
const sanitize = React.useCallback(
(raw: string[]) =>
Array.isArray(raw) && raw.every((v) => typeof v === 'string') ? raw : undefined,
[],
);
const persisted = useUIPersistedState(SCOPE_MULTIPLE, key, defaultValue, { sanitize });
return {
value: persisted.value,
setValue: persisted.setValue,
reset: persisted.reset,
};
}