2024-03-01 20:42:21 +01:00
|
|
|
import { useEffect, useMemo, useState } from 'react';
|
|
|
|
|
|
2024-05-17 14:55:41 +02:00
|
|
|
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[];
|
|
|
|
|
}
|
|
|
|
|
|
2024-05-17 14:55:41 +02:00
|
|
|
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(() => {
|
2024-05-17 14:55:41 +02:00
|
|
|
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());
|
2024-05-17 14:55:41 +02:00
|
|
|
cacheSubplebbits = multisub.subplebbits;
|
2024-03-01 20:42:21 +01:00
|
|
|
setSubplebbits(multisub.subplebbits);
|
|
|
|
|
} catch (e) {
|
|
|
|
|
console.warn(e);
|
|
|
|
|
}
|
|
|
|
|
})();
|
|
|
|
|
}, []);
|
|
|
|
|
|
2024-05-17 14:55:41 +02:00
|
|
|
return cacheSubplebbits || subplebbits;
|
2024-03-01 20:42:21 +01:00
|
|
|
};
|
|
|
|
|
|
2024-05-17 16:10:38 +02: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();
|
2024-05-17 16:10:38 +02:00
|
|
|
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
|
|
|
};
|
|
|
|
|
|
2024-05-17 14:55:41 +02: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;
|