This commit is contained in:
65
src/persistence/storage.ts
Normal file
65
src/persistence/storage.ts
Normal file
@@ -0,0 +1,65 @@
|
||||
export type JsonStorage = Pick<Storage, 'getItem' | 'setItem' | 'removeItem'>;
|
||||
|
||||
export function isRecord(value: unknown): value is Record<string, unknown> {
|
||||
return Boolean(value) && typeof value === 'object' && !Array.isArray(value);
|
||||
}
|
||||
|
||||
export function getJsonStorage(storage?: JsonStorage | null) {
|
||||
if (storage !== undefined) {
|
||||
return storage;
|
||||
}
|
||||
|
||||
if (typeof window === 'undefined') {
|
||||
return null;
|
||||
}
|
||||
|
||||
return window.localStorage;
|
||||
}
|
||||
|
||||
export function readStoredJson<T>({
|
||||
key,
|
||||
parse,
|
||||
storage,
|
||||
}: {
|
||||
key: string;
|
||||
parse: (value: unknown) => T | null;
|
||||
storage?: JsonStorage | null;
|
||||
}) {
|
||||
const resolvedStorage = getJsonStorage(storage);
|
||||
if (!resolvedStorage) {
|
||||
return null;
|
||||
}
|
||||
|
||||
const raw = resolvedStorage.getItem(key);
|
||||
if (!raw) {
|
||||
return null;
|
||||
}
|
||||
|
||||
try {
|
||||
return parse(JSON.parse(raw));
|
||||
} catch {
|
||||
return null;
|
||||
}
|
||||
}
|
||||
|
||||
export function writeStoredJson({
|
||||
key,
|
||||
value,
|
||||
storage,
|
||||
}: {
|
||||
key: string;
|
||||
value: unknown;
|
||||
storage?: JsonStorage | null;
|
||||
}) {
|
||||
const resolvedStorage = getJsonStorage(storage);
|
||||
if (!resolvedStorage) {
|
||||
return false;
|
||||
}
|
||||
|
||||
resolvedStorage.setItem(key, JSON.stringify(value));
|
||||
return true;
|
||||
}
|
||||
|
||||
export function removeStoredJson(key: string, storage?: JsonStorage | null) {
|
||||
getJsonStorage(storage)?.removeItem(key);
|
||||
}
|
||||
Reference in New Issue
Block a user