From 4d5290980435d0b67a3fb511a7fe16aae87424bc Mon Sep 17 00:00:00 2001 From: robonen Date: Fri, 31 May 2024 01:19:56 +0700 Subject: [PATCH] feat(packages/vue): add useToggle composable --- .../vue/src/composables/useToggle/index.ts | 49 +++++++++++++++++++ 1 file changed, 49 insertions(+) create mode 100644 packages/vue/src/composables/useToggle/index.ts diff --git a/packages/vue/src/composables/useToggle/index.ts b/packages/vue/src/composables/useToggle/index.ts new file mode 100644 index 0000000..29d488b --- /dev/null +++ b/packages/vue/src/composables/useToggle/index.ts @@ -0,0 +1,49 @@ +import { isRef, ref, toValue, type MaybeRefOrGetter, type MaybeRef, type Ref } from 'vue'; + +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]; +}