mirror of
				https://github.com/imezx/Warp.git
				synced 2025-10-31 10:19:17 +00:00 
			
		
		
		
	
		
			
	
	
		
			68 lines
		
	
	
	
		
			1.6 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
		
		
			
		
	
	
			68 lines
		
	
	
	
		
			1.6 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
|  | import { toValue } from '@vueuse/shared'; | ||
|  | import { watchPausable } from '@vueuse/core'; | ||
|  | import { ref, shallowRef } from 'vue-demi'; | ||
|  | import { get, set, del, update } from 'idb-keyval'; | ||
|  | 
 | ||
|  | function useIDBKeyval(key, initialValue, options = {}) { | ||
|  |   const { | ||
|  |     flush = "pre", | ||
|  |     deep = true, | ||
|  |     shallow = false, | ||
|  |     onError = (e) => { | ||
|  |       console.error(e); | ||
|  |     }, | ||
|  |     writeDefaults = true | ||
|  |   } = options; | ||
|  |   const isFinished = ref(false); | ||
|  |   const data = (shallow ? shallowRef : ref)(initialValue); | ||
|  |   const rawInit = toValue(initialValue); | ||
|  |   async function read() { | ||
|  |     try { | ||
|  |       const rawValue = await get(key); | ||
|  |       if (rawValue === void 0) { | ||
|  |         if (rawInit !== void 0 && rawInit !== null && writeDefaults) | ||
|  |           await set(key, rawInit); | ||
|  |       } else { | ||
|  |         data.value = rawValue; | ||
|  |       } | ||
|  |     } catch (e) { | ||
|  |       onError(e); | ||
|  |     } | ||
|  |     isFinished.value = true; | ||
|  |   } | ||
|  |   read(); | ||
|  |   async function write() { | ||
|  |     try { | ||
|  |       if (data.value == null) { | ||
|  |         await del(key); | ||
|  |       } else { | ||
|  |         if (Array.isArray(data.value)) | ||
|  |           await update(key, () => JSON.parse(JSON.stringify(data.value))); | ||
|  |         else if (typeof data.value === "object") | ||
|  |           await update(key, () => ({ ...data.value })); | ||
|  |         else | ||
|  |           await update(key, () => data.value); | ||
|  |       } | ||
|  |     } catch (e) { | ||
|  |       onError(e); | ||
|  |     } | ||
|  |   } | ||
|  |   const { | ||
|  |     pause: pauseWatch, | ||
|  |     resume: resumeWatch | ||
|  |   } = watchPausable(data, () => write(), { flush, deep }); | ||
|  |   async function setData(value) { | ||
|  |     pauseWatch(); | ||
|  |     data.value = value; | ||
|  |     await write(); | ||
|  |     resumeWatch(); | ||
|  |   } | ||
|  |   return { | ||
|  |     set: setData, | ||
|  |     isFinished, | ||
|  |     data | ||
|  |   }; | ||
|  | } | ||
|  | 
 | ||
|  | export { useIDBKeyval }; |