/ src / hooks / use-hide.ts
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;