1
0
mirror of https://github.com/robonen/tools.git synced 2026-03-20 02:44:45 +00:00

feat(packages/vue): add useToggle composable

This commit is contained in:
2024-05-31 01:19:56 +07:00
parent 4ce8babde2
commit 4d52909804

View File

@@ -0,0 +1,49 @@
import { isRef, ref, toValue, type MaybeRefOrGetter, type MaybeRef, type Ref } from 'vue';
export interface UseToggleOptions<Enabled, Disabled> {
enabledValue?: MaybeRefOrGetter<Enabled>,
disabledValue?: MaybeRefOrGetter<Disabled>,
}
// 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<V extends Enabled | Disabled, Enabled = true, Disabled = false>(
initialValue: Ref<V>,
options?: UseToggleOptions<Enabled, Disabled>,
): (value?: V) => V;
export function useToggle<V extends Enabled | Disabled, Enabled = true, Disabled = false>(
initialValue?: V,
options?: UseToggleOptions<Enabled, Disabled>,
): [Ref<V>, (value?: V) => V];
export function useToggle<V extends Enabled | Disabled, Enabled = true, Disabled = false>(
initialValue: MaybeRef<V> = false,
options: UseToggleOptions<Enabled, Disabled> = {},
) {
const {
enabledValue = false,
disabledValue = true,
} = options;
const state = ref(initialValue) as Ref<V>;
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];
}