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