import { isRef, ref, toValue, type MaybeRefOrGetter, type MaybeRef, type Ref } from 'vue'; // TODO: wip export interface UseToggleOptions { enabledValue?: MaybeRefOrGetter, disabledValue?: MaybeRefOrGetter, } // two overloads // 1. const [state, toggle] = useToggle(nonRefValue, options) // 2. const toggle = useToggle(refValue, options) // 3. const [state, toggle] = useToggle() // true, false by default export function useToggle( initialValue: Ref, options?: UseToggleOptions, ): (value?: V) => V; export function useToggle( initialValue?: V, options?: UseToggleOptions, ): [Ref, (value?: V) => V]; export function useToggle( initialValue: MaybeRef = false, options: UseToggleOptions = {}, ) { const { enabledValue = false, disabledValue = true, } = options; const state = ref(initialValue) as Ref; const toggle = (value?: V) => { if (arguments.length) { state.value = value!; return state.value; } const enabled = toValue(enabledValue); const disabled = toValue(disabledValue); state.value = state.value === enabled ? disabled : enabled; return state.value; }; return isRef(initialValue) ? toggle : [state, toggle]; }