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;