/ src / hooks / use-subplebbits-stats.ts
use-subplebbits-stats.ts
 1  import { useEffect, useMemo } from 'react';
 2  import { useAccount, useSubplebbits } from '@plebbit/plebbit-react-hooks';
 3  import { create } from 'zustand';
 4  
 5  const pendingFetchCid: { [cid: string]: boolean } = {};
 6  
 7  const useSubplebbitsStats = (options: any) => {
 8    const { subplebbitAddresses, accountName } = options || {};
 9    const account = useAccount({ accountName });
10    const { subplebbits } = useSubplebbits({ subplebbitAddresses });
11  
12    const { setSubplebbitStats, subplebbitsStats } = useSubplebbitsStatsStore();
13  
14    useEffect(() => {
15      if (!subplebbitAddresses || subplebbitAddresses.length === 0 || !account) {
16        return;
17      }
18  
19      subplebbits.forEach((subplebbit) => {
20        if (subplebbit && subplebbit.statsCid && !subplebbitsStats[subplebbit.address] && !pendingFetchCid[subplebbit.statsCid]) {
21          pendingFetchCid[subplebbit.statsCid] = true;
22          account.plebbit
23            .fetchCid(subplebbit.statsCid)
24            .then((fetchedStats: any) => {
25              setSubplebbitStats(subplebbit.address, JSON.parse(fetchedStats));
26            })
27            .catch((error: any) => {
28              pendingFetchCid[subplebbit.statsCid] = false;
29              console.error('Fetching subplebbit stats failed', { subplebbitAddress: subplebbit.address, error });
30            });
31        }
32      });
33    }, [account, subplebbits, setSubplebbitStats, subplebbitsStats, subplebbitAddresses]);
34  
35    return useMemo(() => {
36      return subplebbitAddresses.reduce((acc: any, address: any) => {
37        acc[address] = subplebbitsStats[address] || { loading: true };
38        return acc;
39      }, {});
40    }, [subplebbitsStats, subplebbitAddresses]);
41  };
42  
43  export type SubplebbitsStatsState = {
44    subplebbitsStats: { [subplebbitAddress: string]: any };
45    setSubplebbitStats: Function;
46  };
47  
48  const useSubplebbitsStatsStore = create<SubplebbitsStatsState>((set) => ({
49    subplebbitsStats: {},
50    setSubplebbitStats: (subplebbitAddress: string, subplebbitStats: any) =>
51      set((state) => ({
52        subplebbitsStats: { ...state.subplebbitsStats, [subplebbitAddress]: subplebbitStats },
53      })),
54  }));
55  
56  export default useSubplebbitsStats;