use-hide.ts
1 import { useCallback } from 'react'; 2 import { create } from 'zustand'; 3 import localForageLru from '@plebbit/plebbit-react-hooks/dist/lib/localforage-lru/index.js'; 4 5 interface HideStoreState { 6 hiddenCids: { [key: string]: boolean }; 7 hide: (cid: string) => void; 8 unhide: (cid: string) => void; 9 } 10 11 const hideStore = localForageLru.createInstance({ 12 name: 'hideStore', 13 size: 1000, 14 }); 15 16 const useHideStore = create<HideStoreState>((set) => ({ 17 hiddenCids: {}, 18 hide: (cid: string) => { 19 set((state) => ({ 20 hiddenCids: { ...state.hiddenCids, [cid]: true }, 21 })); 22 hideStore.setItem(cid, true); 23 }, 24 unhide: (cid: string) => { 25 set((state) => { 26 const newHiddenCids = { ...state.hiddenCids }; 27 delete newHiddenCids[cid]; 28 return { hiddenCids: newHiddenCids }; 29 }); 30 hideStore.removeItem(cid); 31 }, 32 })); 33 34 const initializeHideStore = async () => { 35 const entries: [string, boolean][] = await hideStore.entries(); 36 const hiddenCids: { [key: string]: boolean } = {}; 37 entries.forEach(([key, value]) => { 38 hiddenCids[key] = value; 39 }); 40 41 useHideStore.setState((state) => ({ 42 hiddenCids: { ...hiddenCids, ...state.hiddenCids }, 43 })); 44 }; 45 46 initializeHideStore(); 47 48 const useHide = ({ cid }: { cid: string }) => { 49 const hiddenCids = useHideStore((state) => state.hiddenCids); 50 const hide = useHideStore((state) => state.hide); 51 const unhide = useHideStore((state) => state.unhide); 52 53 const hidden = !!hiddenCids[cid]; 54 55 const hideCallback = useCallback(() => hide(cid), [hide, cid]); 56 const unhideCallback = useCallback(() => unhide(cid), [unhide, cid]); 57 58 return { hidden, hide: hideCallback, unhide: unhideCallback }; 59 }; 60 61 export default useHide;