Skip to content

Commit ef281cd

Browse files
authored
feat(useIDBKeyval)!: return format changed, add isFinished (#2474)
Co-authored-by: james.sullivan <james.sullivan@pathai.com>
1 parent a860cf8 commit ef281cd

File tree

3 files changed

+37
-10
lines changed

3 files changed

+37
-10
lines changed

packages/integrations/useIDBKeyval/index.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,7 @@ npm install idb-keyval
1919
import { useIDBKeyval } from '@vueuse/integrations/useIDBKeyval'
2020

2121
// bind object
22-
const storedObject = useIDBKeyval('my-idb-keyval-store', { hello: 'hi', greeting: 'Hello' })
22+
const { data: storedObject, isFinished } = useIDBKeyval('my-idb-keyval-store', { hello: 'hi', greeting: 'Hello' })
2323

2424
// update object
2525
storedObject.value.hello = 'hola'

packages/integrations/useIDBKeyval/index.test.ts

Lines changed: 22 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@ const cache = {} as any
66

77
vi.mock('idb-keyval', () => ({
88
get: (key: string) => Promise.resolve(cache[key]),
9-
set: (key: string, value: any) => new Promise((resolve, reject) => {
9+
set: vi.fn((key: string, value: any) => new Promise((resolve, reject) => {
1010
if (value === 'error') {
1111
reject(new Error('set error'))
1212
return
@@ -15,7 +15,7 @@ vi.mock('idb-keyval', () => ({
1515
cache[key] = value
1616

1717
resolve(undefined)
18-
}),
18+
})),
1919
update: (key: string, updater: () => any) => new Promise((resolve, reject) => {
2020
const value = updater()
2121
if (value === 'error') {
@@ -35,16 +35,18 @@ vi.mock('idb-keyval', () => ({
3535
const KEY1 = 'vue-use-idb-keyval-1'
3636
const KEY2 = 'vue-use-idb-keyval-2'
3737
const KEY3 = 'vue-use-idb-keyval-3'
38+
const KEY4 = 'vue-use-idb-keyval-4'
3839
describe('useIDBKeyval', () => {
3940
beforeEach(() => {
41+
vi.clearAllMocks()
4042
console.error = vi.fn()
4143
})
4244

4345
set(KEY3, 'hello')
4446

45-
const data1 = useIDBKeyval(KEY1, { count: 0 })
46-
const data2 = useIDBKeyval(KEY2, ['foo', 'bar'])
47-
const data3 = useIDBKeyval(KEY3, 'world', { shallow: true })
47+
const { data: data1 } = useIDBKeyval(KEY1, { count: 0 })
48+
const { data: data2 } = useIDBKeyval(KEY2, ['foo', 'bar'])
49+
const { data: data3 } = useIDBKeyval(KEY3, 'world', { shallow: true })
4850

4951
it('get/set', async () => {
5052
expect(data1.value).toEqual({ count: 0 })
@@ -97,4 +99,19 @@ describe('useIDBKeyval', () => {
9799

98100
expect(console.error).toHaveBeenCalledTimes(1)
99101
})
102+
it ('isFinished', async () => {
103+
const { isFinished } = useIDBKeyval(KEY4, 'test')
104+
expect(isFinished.value).toBe(false)
105+
106+
await promiseTimeout(50)
107+
108+
expect(isFinished.value).toBe(true)
109+
})
110+
it('writeDefaults false', async () => {
111+
useIDBKeyval(KEY4, 'test', { writeDefaults: false })
112+
113+
await promiseTimeout(50)
114+
115+
expect(set).toHaveBeenCalledTimes(0)
116+
})
100117
})

packages/integrations/useIDBKeyval/index.ts

Lines changed: 14 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,13 @@ export interface UseIDBOptions extends ConfigurableFlush {
2525
* @default false
2626
*/
2727
shallow?: boolean
28+
/**
29+
* Write the default value to the storage when it does not exist
30+
*
31+
* @default true
32+
*/
33+
writeDefaults?: boolean
34+
2835
}
2936

3037
/**
@@ -37,16 +44,18 @@ export function useIDBKeyval<T>(
3744
key: IDBValidKey,
3845
initialValue: MaybeComputedRef<T>,
3946
options: UseIDBOptions = {},
40-
): RemovableRef<T> {
47+
): { data: RemovableRef<T>; isFinished: Ref<boolean> } {
4148
const {
4249
flush = 'pre',
4350
deep = true,
44-
shallow,
51+
shallow = false,
4552
onError = (e) => {
4653
console.error(e)
4754
},
55+
writeDefaults = true,
4856
} = options
4957

58+
const isFinished = ref(false)
5059
const data = (shallow ? shallowRef : ref)(initialValue) as Ref<T>
5160

5261
const rawInit: T = resolveUnref(initialValue)
@@ -55,7 +64,7 @@ export function useIDBKeyval<T>(
5564
try {
5665
const rawValue = await get<T>(key)
5766
if (rawValue === undefined) {
58-
if (rawInit !== undefined && rawInit !== null)
67+
if (rawInit !== undefined && rawInit !== null && writeDefaults)
5968
await set(key, rawInit)
6069
}
6170
else {
@@ -65,6 +74,7 @@ export function useIDBKeyval<T>(
6574
catch (e) {
6675
onError(e)
6776
}
77+
isFinished.value = true
6878
}
6979

7080
read()
@@ -91,5 +101,5 @@ export function useIDBKeyval<T>(
91101

92102
watch(data, () => write(), { flush, deep })
93103

94-
return data as RemovableRef<T>
104+
return { isFinished, data: data as RemovableRef<T> }
95105
}

0 commit comments

Comments
 (0)