Files
5chan/src/hooks/use-default-subplebbits.ts
T

99 lines
3.2 KiB
TypeScript
Raw Normal View History

2024-03-01 20:42:21 +01:00
import { useEffect, useMemo, useState } from 'react';
export interface MultisubMetadata {
title: string;
description: string;
createdAt: number;
updatedAt: number;
}
2024-05-04 16:56:49 +02:00
export interface MultisubSubplebbit {
2024-03-01 20:42:21 +01:00
title?: string;
address: string;
tags?: string[];
features?: string[];
}
let cacheSubplebbits: MultisubSubplebbit[] | null = null;
let cacheMetadata: MultisubMetadata | null = null;
2024-03-01 20:42:21 +01:00
const useDefaultSubplebbits = () => {
2024-05-04 16:56:49 +02:00
const [subplebbits, setSubplebbits] = useState<MultisubSubplebbit[]>([]);
2024-03-01 20:42:21 +01:00
useEffect(() => {
if (cacheSubplebbits) {
2024-03-01 20:42:21 +01:00
return;
}
(async () => {
try {
const multisub = await fetch(
'https://raw.githubusercontent.com/plebbit/temporary-default-subplebbits/master/multisub.json',
// { cache: 'no-cache' }
).then((res) => res.json());
cacheSubplebbits = multisub.subplebbits;
2024-03-01 20:42:21 +01:00
setSubplebbits(multisub.subplebbits);
} catch (e) {
console.warn(e);
}
})();
}, []);
return cacheSubplebbits || subplebbits;
2024-03-01 20:42:21 +01:00
};
export const categorizeSubplebbits = (subplebbits: MultisubSubplebbit[]) => {
const plebbitSubs = subplebbits.filter((sub) => sub.tags?.includes('plebbit'));
const interestsSubs = subplebbits.filter(
(sub) => sub.tags?.includes('topic') && !sub.tags?.includes('plebbit') && !sub.tags?.includes('country') && !sub.tags?.includes('international'),
);
const randomSubs = subplebbits.filter((sub) => sub.tags?.includes('random') && !sub.tags?.includes('plebbit'));
const internationalSubs = subplebbits.filter((sub) => sub.tags?.includes('international') || sub.tags?.includes('country'));
const projectsSubs = subplebbits.filter((sub) => sub.tags?.includes('project') && !sub.tags?.includes('plebbit') && !sub.tags?.includes('topic'));
return { plebbitSubs, interestsSubs, randomSubs, internationalSubs, projectsSubs };
};
2024-03-01 20:42:21 +01:00
export const useDefaultSubplebbitAddresses = () => {
const defaultSubplebbits = useDefaultSubplebbits();
const categorizedSubplebbits = useMemo(() => categorizeSubplebbits(defaultSubplebbits), [defaultSubplebbits]);
return useMemo(
() =>
[
...categorizedSubplebbits.plebbitSubs,
...categorizedSubplebbits.projectsSubs,
...categorizedSubplebbits.interestsSubs,
...categorizedSubplebbits.randomSubs,
...categorizedSubplebbits.internationalSubs,
].map((subplebbit) => subplebbit.address),
[categorizedSubplebbits],
);
2024-03-01 20:42:21 +01:00
};
export const useMultisubMetadata = () => {
const [metadata, setMetadata] = useState<MultisubMetadata | null>(null);
useEffect(() => {
if (cacheMetadata) {
return;
}
(async () => {
try {
const multisub = await fetch(
'https://raw.githubusercontent.com/plebbit/temporary-default-subplebbits/master/multisub.json',
// { cache: 'no-cache' }
).then((res) => res.json());
const { title, description, createdAt, updatedAt } = multisub;
const metadata: MultisubMetadata = { title, description, createdAt, updatedAt };
cacheMetadata = metadata;
setMetadata(metadata);
} catch (e) {
console.warn(e);
}
})();
}, []);
return cacheMetadata || metadata;
};
2024-03-01 20:42:21 +01:00
export default useDefaultSubplebbits;