/ src / stores / use-anon-mode-store.ts
use-anon-mode-store.ts
 1  import { create } from 'zustand';
 2  import localForageLru from '@plebbit/plebbit-react-hooks/dist/lib/localforage-lru/index.js';
 3  
 4  interface AnonModeState {
 5    anonMode: boolean;
 6    threadSigners: { [key: string]: any };
 7    addressSigners: { [address: string]: any };
 8    setAnonMode: (mode: boolean) => void;
 9    setThreadSigner: (postCid: string, signer: any) => void;
10    getThreadSigner: (postCid: string) => any | undefined;
11    setAddressSigner: (signer: any) => void;
12    getAddressSigner: (address: string) => any | undefined;
13  }
14  
15  const anonModeStore = localForageLru.createInstance({
16    name: 'anonModeStore',
17    size: 1000,
18  });
19  
20  const useAnonModeStore = create<AnonModeState>((set, get) => ({
21    anonMode: true,
22    threadSigners: {},
23    addressSigners: {},
24    setAnonMode: (mode: boolean) => {
25      set({ anonMode: mode });
26      anonModeStore.setItem('anonMode', mode);
27    },
28    setThreadSigner: (postCid: string, signer: any) => {
29      set((state) => ({
30        threadSigners: { ...state.threadSigners, [postCid]: signer },
31      }));
32      anonModeStore.setItem(`threadSigner_${postCid}`, signer);
33    },
34    getThreadSigner: (postCid: string) => {
35      const state = get();
36      if (state.threadSigners[postCid]) {
37        return state.threadSigners[postCid];
38      }
39      return null;
40    },
41    setAddressSigner: (signer: any) => {
42      set((state) => ({
43        addressSigners: { ...state.addressSigners, [signer.address]: signer },
44      }));
45      anonModeStore.setItem(`addressSigner_${signer.address}`, signer);
46    },
47    getAddressSigner: (address: string) => {
48      const state = get();
49      if (state.addressSigners[address]) {
50        return state.addressSigners[address];
51      }
52      return null;
53    },
54  }));
55  
56  const initializeAnonModeStore = async () => {
57    const entries: [string, any][] = await anonModeStore.entries();
58    const threadSigners: { [key: string]: any } = {};
59    const addressSigners: { [key: string]: any } = {};
60    let anonMode = true;
61  
62    entries.forEach(([key, value]) => {
63      if (key === 'anonMode') {
64        anonMode = value;
65      } else if (key.startsWith('threadSigner_')) {
66        const postCid = key.replace('threadSigner_', '');
67        threadSigners[postCid] = value;
68      } else if (key.startsWith('addressSigner_')) {
69        const address = key.replace('addressSigner_', '');
70        addressSigners[address] = value;
71      }
72    });
73  
74    useAnonModeStore.setState({
75      anonMode,
76      threadSigners,
77      addressSigners,
78    });
79  };
80  
81  initializeAnonModeStore();
82  
83  export default useAnonModeStore;