lobe-chat
1const PREV_KEY = 'LOBE_GLOBAL';2
3// LOBE_PREFERENCE for userStore
4// LOBE_GLOBAL_PREFERENCE for globalStore
5type StorageKey = 'LOBE_PREFERENCE' | 'LOBE_SYSTEM_STATUS';6
7export class AsyncLocalStorage<State> {8private storageKey: StorageKey;9
10constructor(storageKey: StorageKey) {11this.storageKey = storageKey;12
13// skip server side rendering14if (typeof window === 'undefined') return;15
16// migrate old data17if (localStorage.getItem(PREV_KEY)) {18const data = JSON.parse(localStorage.getItem(PREV_KEY) || '{}');19
20const preference = data.state.preference;21
22if (data.state?.preference) {23localStorage.setItem('LOBE_PREFERENCE', JSON.stringify(preference));24}25localStorage.removeItem(PREV_KEY);26}27}28
29async saveToLocalStorage(state: object) {30const data = await this.getFromLocalStorage();31
32localStorage.setItem(this.storageKey, JSON.stringify({ ...data, ...state }));33}34
35async getFromLocalStorage(key: StorageKey = this.storageKey): Promise<State> {36return JSON.parse(localStorage.getItem(key) || '{}');37}38}
39