You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
tailchat/client/shared/manager/storage.ts

67 lines
1.5 KiB
TypeScript

import { buildRegFn } from './buildReg';
import { useCallback, useLayoutEffect, useState } from 'react';
export interface StorageObject {
/**
* NOTICE: save set 1
*/
set: (key: string, data: any) => Promise<void>;
get: (key: string, defaultVal?: any) => Promise<any>;
remove: (key: string) => Promise<void>;
save: (key: string, data: any) => Promise<void>;
}
/**
*
*/
export const [getStorage, setStorage] =
buildRegFn<() => StorageObject>('storage');
/**
* hook, gap
*/
const useStorageCache = new Map<string, any>();
/**
*
* @param key
* @param defaultValue
*/
export function useStorage<T = any>(
key: string,
defaultValue?: T
): [T | undefined, { set: (v: T) => void; save: (v: T) => void }] {
const [value, setValue] = useState<T | undefined>(
useStorageCache.get(key) ?? defaultValue
);
useLayoutEffect(() => {
getStorage()
.get(key)
.then((data: T) => {
setValue(data ?? defaultValue);
useStorageCache.set(key, data ?? defaultValue);
});
}, [key]);
const set = useCallback(
(newVal: T) => {
setValue(newVal);
getStorage().set(key, newVal);
useStorageCache.set(key, newVal);
},
[key]
);
const save = useCallback(
(newVal: T) => {
setValue(newVal);
getStorage().save(key, newVal);
useStorageCache.set(key, newVal);
},
[key]
);
return [value, { set, save }];
}