48 lines
1.1 KiB
TypeScript
48 lines
1.1 KiB
TypeScript
import type { StateStorage } from 'zustand/middleware';
|
|
import { safeLocalStorage } from '@/app/utils';
|
|
import { clear, del, get, set } from 'idb-keyval';
|
|
|
|
const localStorage = safeLocalStorage();
|
|
|
|
class IndexedDBStorage implements StateStorage {
|
|
public async getItem(name: string): Promise<string | null> {
|
|
try {
|
|
const value = (await get(name)) || localStorage.getItem(name);
|
|
return value;
|
|
} catch (error) {
|
|
return localStorage.getItem(name);
|
|
}
|
|
}
|
|
|
|
public async setItem(name: string, value: string): Promise<void> {
|
|
try {
|
|
const _value = JSON.parse(value);
|
|
if (!_value?.state?._hasHydrated) {
|
|
console.warn('skip setItem', name);
|
|
return;
|
|
}
|
|
await set(name, value);
|
|
} catch (error) {
|
|
localStorage.setItem(name, value);
|
|
}
|
|
}
|
|
|
|
public async removeItem(name: string): Promise<void> {
|
|
try {
|
|
await del(name);
|
|
} catch (error) {
|
|
localStorage.removeItem(name);
|
|
}
|
|
}
|
|
|
|
public async clear(): Promise<void> {
|
|
try {
|
|
await clear();
|
|
} catch (error) {
|
|
localStorage.clear();
|
|
}
|
|
}
|
|
}
|
|
|
|
export const indexedDBStorage = new IndexedDBStorage();
|