foxact
Version:
React Hooks/Utils done right. For browser, SSR, and React Server Components.
31 lines (29 loc) • 1.27 kB
TypeScript
type StorageType = 'localStorage' | 'sessionStorage';
type NotUndefined<T> = T extends undefined ? never : T;
type StateHookTuple<T> = readonly [T, React.Dispatch<React.SetStateAction<T | null>>];
type CustomStorageEvent = CustomEvent<string>;
declare global {
interface WindowEventMap {
'foxact-use-local-storage': CustomStorageEvent;
'foxact-use-session-storage': CustomStorageEvent;
}
}
type Serializer<T> = (value: T) => string;
type Deserializer<T> = (value: string) => T;
interface UseStorageRawOption {
raw: true;
}
interface UseStorageParserOption<T> {
raw?: false;
serializer: Serializer<T>;
deserializer: Deserializer<T>;
}
declare function createStorage(type: StorageType): {
useStorage: {
<T>(key: string, serverValue: NotUndefined<T>, options?: UseStorageRawOption | UseStorageParserOption<T>): StateHookTuple<T>;
<T>(key: string, serverValue?: undefined, options?: UseStorageRawOption | UseStorageParserOption<T>): StateHookTuple<T | null>;
};
useSetStorage: <T>(key: string, serializer: Serializer<T>) => (v: T | null) => void;
};
export { createStorage };
export type { Deserializer, NotUndefined, Serializer, StateHookTuple, StorageType, UseStorageParserOption, UseStorageRawOption };