import { useCallback, useState } from "react"; export interface UseControllableValueParams { value: TValue | undefined; defaultValue: TValue | undefined; onValueChange?: (value: TValue) => void; } export function useControllableValue({ value: controlledValue, defaultValue, onValueChange, }: UseControllableValueParams): readonly [ TValue | undefined, (next: TValue) => void, ] { const [internalValue, setInternalValue] = useState(defaultValue); const value = controlledValue ?? internalValue; const setValue = useCallback( (next: TValue) => { if (controlledValue === undefined) { setInternalValue(next); } if (next !== value) { onValueChange?.(next); } }, [controlledValue, onValueChange, value], ); return [value, setValue] as const; }