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;