From 882232529902cfe3bb07ef8d367d7b486f4f5378 Mon Sep 17 00:00:00 2001 From: robonen Date: Sat, 5 Oct 2024 04:57:04 +0700 Subject: [PATCH] refactor(packages/vue): make getter param possible for useCached and useCounter --- .../vue/src/composables/useCached/index.test.ts | 17 ++++++++++++----- packages/vue/src/composables/useCached/index.ts | 8 ++++---- .../src/composables/useCounter/index.test.ts | 5 +++++ .../vue/src/composables/useCounter/index.ts | 8 ++++---- 4 files changed, 25 insertions(+), 13 deletions(-) diff --git a/packages/vue/src/composables/useCached/index.test.ts b/packages/vue/src/composables/useCached/index.test.ts index fdc342d..fccc1dc 100644 --- a/packages/vue/src/composables/useCached/index.test.ts +++ b/packages/vue/src/composables/useCached/index.test.ts @@ -1,5 +1,5 @@ import { describe, expect, it } from 'vitest'; -import { ref, nextTick } from 'vue'; +import { ref, nextTick, reactive } from 'vue'; import { useCached } from '.'; const arrayEquals = (a: number[], b: number[]) => a.length === b.length && a.every((v, i) => v === b[i]); @@ -14,10 +14,6 @@ describe('useCached', () => { externalValue.value = 1; await nextTick(); expect(cachedValue.value).toBe(1); - - externalValue.value = 10; - await nextTick(); - expect(cachedValue.value).toBe(10); }); it('custom array comparator', async () => { @@ -41,4 +37,15 @@ describe('useCached', () => { expect(cachedValue.value).not.toEqual(initialValue); expect(cachedValue.value).toEqual([2]); }); + + it('getter source', async () => { + const externalValue = reactive({ value: 0 }); + const cachedValue = useCached(() => externalValue.value); + + expect(cachedValue.value).toBe(0); + + externalValue.value = 1; + await nextTick(); + expect(cachedValue.value).toBe(1); + }); }); \ No newline at end of file diff --git a/packages/vue/src/composables/useCached/index.ts b/packages/vue/src/composables/useCached/index.ts index 7b9b1e1..e45d323 100644 --- a/packages/vue/src/composables/useCached/index.ts +++ b/packages/vue/src/composables/useCached/index.ts @@ -1,4 +1,4 @@ -import { ref, watch, type Ref, type WatchOptions } from 'vue'; +import { ref, watch, toValue, type MaybeRefOrGetter, type Ref, type WatchOptions } from 'vue'; export type Comparator = (a: Value, b: Value) => boolean; @@ -21,13 +21,13 @@ export type Comparator = (a: Value, b: Value) => boolean; * const cachedValue = useCached(externalValue, (a, b) => a === b, { immediate: true }); */ export function useCached( - externalValue: Ref, + externalValue: MaybeRefOrGetter, comparator: Comparator = (a, b) => a === b, watchOptions?: WatchOptions, ): Ref { - const cached = ref(externalValue.value) as Ref; + const cached = ref(toValue(externalValue)) as Ref; - watch(() => externalValue.value, (value) => { + watch(() => toValue(externalValue), (value) => { if (!comparator(value, cached.value)) cached.value = value; }, watchOptions); diff --git a/packages/vue/src/composables/useCounter/index.test.ts b/packages/vue/src/composables/useCounter/index.test.ts index fba7e50..54a0c72 100644 --- a/packages/vue/src/composables/useCounter/index.test.ts +++ b/packages/vue/src/composables/useCounter/index.test.ts @@ -13,6 +13,11 @@ describe('useCounter', () => { expect(count.value).toBe(5); }); + it('initialize count with the provided initial value from a getter', () => { + const { count } = useCounter(() => 5); + expect(count.value).toBe(5); + }); + it('increment count by 1 by default', () => { const { count, increment } = useCounter(0); increment(); diff --git a/packages/vue/src/composables/useCounter/index.ts b/packages/vue/src/composables/useCounter/index.ts index 6b42ba4..48c5d79 100644 --- a/packages/vue/src/composables/useCounter/index.ts +++ b/packages/vue/src/composables/useCounter/index.ts @@ -1,4 +1,4 @@ -import { ref, unref, type MaybeRef, type Ref } from 'vue'; +import { ref, toValue, type MaybeRefOrGetter, type Ref } from 'vue'; import { clamp } from '@robonen/stdlib'; export interface UseCounterOptions { @@ -33,11 +33,11 @@ export interface UseConterReturn { * const { count, increment, decrement, set, get, reset } = useCounter(0, { min: 0, max: 10 }); */ export function useCounter( - initialValue: MaybeRef = 0, + initialValue: MaybeRefOrGetter = 0, options: UseCounterOptions = {}, ): UseConterReturn { - let _initialValue = unref(initialValue); - const count = ref(initialValue); + let _initialValue = toValue(initialValue); + const count = ref(_initialValue); const { min = Number.MIN_SAFE_INTEGER,