use-default-subplebbits.ts
1 import { useEffect, useMemo, useState } from 'react'; 2 3 export interface MultisubMetadata { 4 title: string; 5 description: string; 6 createdAt: number; 7 updatedAt: number; 8 } 9 10 export interface MultisubSubplebbit { 11 title?: string; 12 address: string; 13 tags?: string[]; 14 features?: string[]; 15 } 16 17 let cacheSubplebbits: MultisubSubplebbit[] | null = null; 18 let cacheMetadata: MultisubMetadata | null = null; 19 20 const useDefaultSubplebbits = () => { 21 const [subplebbits, setSubplebbits] = useState<MultisubSubplebbit[]>([]); 22 23 useEffect(() => { 24 if (cacheSubplebbits) { 25 return; 26 } 27 (async () => { 28 try { 29 const multisub = await fetch( 30 'https://raw.githubusercontent.com/plebbit/temporary-default-subplebbits/master/multisub.json', 31 // { cache: 'no-cache' } 32 ).then((res) => res.json()); 33 cacheSubplebbits = multisub.subplebbits; 34 setSubplebbits(multisub.subplebbits); 35 } catch (e) { 36 console.warn(e); 37 } 38 })(); 39 }, []); 40 41 return cacheSubplebbits || subplebbits; 42 }; 43 44 export const categorizeSubplebbits = (subplebbits: MultisubSubplebbit[]) => { 45 const plebbitSubs = subplebbits.filter((sub) => sub.tags?.includes('plebbit')); 46 const interestsSubs = subplebbits.filter( 47 (sub) => sub.tags?.includes('topic') && !sub.tags?.includes('plebbit') && !sub.tags?.includes('country') && !sub.tags?.includes('international'), 48 ); 49 const randomSubs = subplebbits.filter((sub) => sub.tags?.includes('random') && !sub.tags?.includes('plebbit')); 50 const internationalSubs = subplebbits.filter((sub) => sub.tags?.includes('international') || sub.tags?.includes('country')); 51 const projectsSubs = subplebbits.filter((sub) => sub.tags?.includes('project') && !sub.tags?.includes('plebbit') && !sub.tags?.includes('topic')); 52 53 return { plebbitSubs, interestsSubs, randomSubs, internationalSubs, projectsSubs }; 54 }; 55 56 export const useDefaultSubplebbitAddresses = () => { 57 const defaultSubplebbits = useDefaultSubplebbits(); 58 const categorizedSubplebbits = useMemo(() => categorizeSubplebbits(defaultSubplebbits), [defaultSubplebbits]); 59 return useMemo( 60 () => 61 [ 62 ...categorizedSubplebbits.plebbitSubs, 63 ...categorizedSubplebbits.projectsSubs, 64 ...categorizedSubplebbits.interestsSubs, 65 ...categorizedSubplebbits.randomSubs, 66 ...categorizedSubplebbits.internationalSubs, 67 ].map((subplebbit) => subplebbit.address), 68 [categorizedSubplebbits], 69 ); 70 }; 71 72 export const useMultisubMetadata = () => { 73 const [metadata, setMetadata] = useState<MultisubMetadata | null>(null); 74 75 useEffect(() => { 76 if (cacheMetadata) { 77 return; 78 } 79 (async () => { 80 try { 81 const multisub = await fetch( 82 'https://raw.githubusercontent.com/plebbit/temporary-default-subplebbits/master/multisub.json', 83 // { cache: 'no-cache' } 84 ).then((res) => res.json()); 85 const { title, description, createdAt, updatedAt } = multisub; 86 const metadata: MultisubMetadata = { title, description, createdAt, updatedAt }; 87 cacheMetadata = metadata; 88 setMetadata(metadata); 89 } catch (e) { 90 console.warn(e); 91 } 92 })(); 93 }, []); 94 95 return cacheMetadata || metadata; 96 }; 97 98 export default useDefaultSubplebbits;