diff --git a/README.md b/README.md
index 61843a1c..8a5c2134 100644
--- a/README.md
+++ b/README.md
@@ -23,7 +23,7 @@ Currently, directory assignments are temporarily handpicked by developers throug
### How It Works
-- **Current System**: Developers manually curate directory assignments by reviewing pull requests to the [5chan-multisub.json](https://github.com/bitsocialhq/lists/blob/master/5chan-multisub.json) file.
+- **Current System**: Developers manually curate directory assignments by reviewing pull requests to the [5chan-directories.json](https://github.com/bitsocialhq/lists/blob/master/5chan-directories.json) file.
- **Future System**: Directory board assignments will be determined through gasless voting using pubsub. Community members will vote on which board should be assigned to each directory, and the highest-voted board will automatically become the directory board. This creates a competitive marketplace where board quality and community engagement determine directory placement.
@@ -72,7 +72,7 @@ To have your board appear in a directory on the 5chan homepage:
- Relevant to the directory category
- **99% uptime** (since a board acts like its own server—it's a P2P node)
-2. Open a pull request on GitHub by editing the [5chan-multisub.json](https://github.com/bitsocialhq/lists/blob/master/5chan-multisub.json) file
+2. Open a pull request on GitHub by editing the [5chan-directories.json](https://github.com/bitsocialhq/lists/blob/master/5chan-directories.json) file
3. Add your board's entry with:
- Title: in the format `/directoryCode/ - Title`, e.g. "/biz/ - Business & Finance";
diff --git a/src/app.tsx b/src/app.tsx
index 81f5eba1..5a6d690a 100644
--- a/src/app.tsx
+++ b/src/app.tsx
@@ -9,7 +9,7 @@ import useCreateBoardModalStore from './stores/use-create-board-modal-store';
import useSpecialThemeStore from './stores/use-special-theme-store';
import useIsMobile from './hooks/use-is-mobile';
import useTheme from './hooks/use-theme';
-import { useDefaultSubplebbits } from './hooks/use-default-subplebbits';
+import { useDirectories } from './hooks/use-directories';
import { getSubplebbitAddress, isPostRoute, isPendingPostRoute, isModQueueRoute } from './lib/utils/route-utils';
import styles from './app.module.css';
import FAQ from './views/faq';
@@ -44,8 +44,8 @@ const BoardLayout = () => {
const isInAllView = isAllView(location.pathname);
const isInSubscriptionsView = isSubscriptionsView(location.pathname, useParams());
const isInModView = isModView(location.pathname);
- const defaultSubplebbits = useDefaultSubplebbits();
- const subplebbitAddress = boardIdentifier ? getSubplebbitAddress(boardIdentifier, defaultSubplebbits) : undefined;
+ const directories = useDirectories();
+ const subplebbitAddress = boardIdentifier ? getSubplebbitAddress(boardIdentifier, directories) : undefined;
const pendingPost = useAccountComment({ commentIndex: accountCommentIndex ? parseInt(accountCommentIndex) : undefined });
const { closeCreateBoardModal } = useCreateBoardModalStore();
diff --git a/src/components/board-buttons/board-buttons.tsx b/src/components/board-buttons/board-buttons.tsx
index 381c965f..6ee39ad0 100644
--- a/src/components/board-buttons/board-buttons.tsx
+++ b/src/components/board-buttons/board-buttons.tsx
@@ -3,7 +3,7 @@ import { Link, useLocation, useNavigate, useParams } from 'react-router-dom';
import { useAccountComment, useSubscribe } from '@plebbit/plebbit-react-hooks';
import useSubplebbitsPagesStore from '@plebbit/plebbit-react-hooks/dist/stores/subplebbits-pages';
import { isAllView, isCatalogView, isModView, isModQueueView, isPendingPostView, isPostPageView, isSubscriptionsView } from '../../lib/utils/view-utils';
-import { useDefaultSubplebbits } from '../../hooks/use-default-subplebbits';
+import { useDirectories } from '../../hooks/use-directories';
import { getBoardPath, isDirectoryBoard } from '../../lib/utils/route-utils';
import { useResolvedSubplebbitAddress } from '../../hooks/use-resolved-subplebbit-address';
import useCatalogFiltersStore from '../../stores/use-catalog-filters-store';
@@ -35,7 +35,7 @@ interface BoardButtonsProps {
const CatalogButton = ({ address, isInAllView, isInSubscriptionsView, isInModView }: BoardButtonsProps) => {
const { t } = useTranslation();
const params = useParams();
- const defaultSubplebbits = useDefaultSubplebbits();
+ const directories = useDirectories();
const createCatalogLink = () => {
if (isInAllView) {
@@ -50,9 +50,9 @@ const CatalogButton = ({ address, isInAllView, isInSubscriptionsView, isInModVie
}
let boardPath = '';
if (address) {
- boardPath = getBoardPath(address, defaultSubplebbits);
- } else if (Array.isArray(defaultSubplebbits) && defaultSubplebbits.length > 0 && defaultSubplebbits[0]?.address) {
- boardPath = getBoardPath(defaultSubplebbits[0].address, defaultSubplebbits);
+ boardPath = getBoardPath(address, directories);
+ } else if (Array.isArray(directories) && directories.length > 0 && directories[0]?.address) {
+ boardPath = getBoardPath(directories[0].address, directories);
}
return `/${boardPath}/catalog`;
};
@@ -78,7 +78,7 @@ const SubscribeButton = ({ address }: BoardButtonsProps) => {
const ReturnButton = ({ address, isInAllView, isInSubscriptionsView, isInModView, isInModQueueView }: BoardButtonsProps) => {
const { t } = useTranslation();
const params = useParams();
- const defaultSubplebbits = useDefaultSubplebbits();
+ const directories = useDirectories();
const createReturnLink = () => {
if (isInAllView) {
@@ -99,9 +99,9 @@ const ReturnButton = ({ address, isInAllView, isInSubscriptionsView, isInModView
}
let boardPath = '';
if (address) {
- boardPath = getBoardPath(address, defaultSubplebbits);
- } else if (Array.isArray(defaultSubplebbits) && defaultSubplebbits.length > 0 && defaultSubplebbits[0]?.address) {
- boardPath = getBoardPath(defaultSubplebbits[0].address, defaultSubplebbits);
+ boardPath = getBoardPath(address, directories);
+ } else if (Array.isArray(directories) && directories.length > 0 && directories[0]?.address) {
+ boardPath = getBoardPath(directories[0].address, directories);
}
return `/${boardPath}`;
};
@@ -116,13 +116,13 @@ const ReturnButton = ({ address, isInAllView, isInSubscriptionsView, isInModView
const VoteButton = () => {
const { t } = useTranslation();
const params = useParams();
- const defaultSubplebbits = useDefaultSubplebbits();
+ const directories = useDirectories();
// Get the boardIdentifier from params (try boardIdentifier first, then subplebbitAddress for backward compatibility)
const boardIdentifier = params.boardIdentifier || params.subplebbitAddress;
// Only render the vote button if we're on a directory board route
- if (!boardIdentifier || !isDirectoryBoard(boardIdentifier, defaultSubplebbits)) {
+ if (!boardIdentifier || !isDirectoryBoard(boardIdentifier, directories)) {
return null;
}
@@ -418,9 +418,9 @@ export const MobileBoardButtons = () => {
const { filteredCount, searchText } = useCatalogFiltersStore();
// Check if we should show the vote button (only for directory boards)
- const defaultSubplebbits = useDefaultSubplebbits();
+ const directories = useDirectories();
const boardIdentifier = params.boardIdentifier || params.subplebbitAddress;
- const showVoteButton = boardIdentifier && isDirectoryBoard(boardIdentifier, defaultSubplebbits);
+ const showVoteButton = boardIdentifier && isDirectoryBoard(boardIdentifier, directories);
return (
@@ -539,9 +539,9 @@ export const DesktopBoardButtons = () => {
const { filteredCount, searchText } = useCatalogFiltersStore();
// Check if we should show the vote button (only for directory boards)
- const defaultSubplebbits = useDefaultSubplebbits();
+ const directories = useDirectories();
const boardIdentifier = params.boardIdentifier || params.subplebbitAddress;
- const showVoteButton = boardIdentifier && isDirectoryBoard(boardIdentifier, defaultSubplebbits);
+ const showVoteButton = boardIdentifier && isDirectoryBoard(boardIdentifier, directories);
return (
<>
@@ -655,9 +655,9 @@ const SearchOPsBar = () => {
const isInAllView = isAllView(location.pathname);
const isInSubscriptionsView = isSubscriptionsView(location.pathname, useParams());
const isInModView = isModView(location.pathname);
- const defaultSubplebbits = useDefaultSubplebbits();
+ const directories = useDirectories();
const resolvedAddress = useResolvedSubplebbitAddress();
- const boardPath = resolvedAddress ? getBoardPath(resolvedAddress, defaultSubplebbits) : params?.boardIdentifier || params?.subplebbitAddress;
+ const boardPath = resolvedAddress ? getBoardPath(resolvedAddress, directories) : params?.boardIdentifier || params?.subplebbitAddress;
const handleSearch = (event: React.KeyboardEvent
) => {
if (event.key === 'Enter') {
diff --git a/src/components/board-header/board-header.tsx b/src/components/board-header/board-header.tsx
index a2123a50..920acf00 100644
--- a/src/components/board-header/board-header.tsx
+++ b/src/components/board-header/board-header.tsx
@@ -8,7 +8,7 @@ import Plebbit from '@plebbit/plebbit-js';
import { useStableSubplebbit } from '../../hooks/use-stable-subplebbit';
import { isAllView, isSubscriptionsView, isModView } from '../../lib/utils/view-utils';
import styles from './board-header.module.css';
-import { useMultisubMetadata, useDefaultSubplebbits } from '../../hooks/use-default-subplebbits';
+import { useDirectoriesMetadata, useDirectories } from '../../hooks/use-directories';
import { useResolvedSubplebbitAddress } from '../../hooks/use-resolved-subplebbit-address';
import useIsMobile from '../../hooks/use-is-mobile';
import useIsSubplebbitOffline from '../../hooks/use-is-subplebbit-offline';
@@ -59,11 +59,11 @@ const BoardHeader = () => {
const stableSubplebbit = useStableSubplebbit(subplebbitAddress);
const { address, shortAddress } = stableSubplebbit || {};
- const multisubMetadata = useMultisubMetadata();
- const defaultSubplebbits = useDefaultSubplebbits();
+ const directoriesMetadata = useDirectoriesMetadata();
+ const directories = useDirectories();
// Find matching subplebbit from default list to get its title
- const defaultSubplebbit = subplebbitAddress ? defaultSubplebbits.find((s) => s.address === subplebbitAddress) : null;
+ const defaultSubplebbit = subplebbitAddress ? directories.find((s) => s.address === subplebbitAddress) : null;
// Use accounts store with selector to only subscribe to subscriptions count
const subscriptionsCount = useAccountsStore((state) => {
@@ -74,7 +74,7 @@ const BoardHeader = () => {
const subscriptionsSubtitle = t('subscriptions_subtitle', { count: subscriptionsCount });
const title = isInAllView
- ? multisubMetadata?.title || '/all/ - 5chan Directories'
+ ? directoriesMetadata?.title || '/all/ - 5chan Directories'
: isInSubscriptionsView
? '/subs/ - Subscriptions'
: isInModView
diff --git a/src/components/catalog-row/catalog-row.tsx b/src/components/catalog-row/catalog-row.tsx
index e3cdb44c..19aca254 100644
--- a/src/components/catalog-row/catalog-row.tsx
+++ b/src/components/catalog-row/catalog-row.tsx
@@ -9,7 +9,7 @@ import { shouldShowSnow } from '../../lib/snow';
import { getHasThumbnail } from '../../lib/utils/media-utils';
import { getFormattedTimeAgo } from '../../lib/utils/time-utils';
import { isAllView, isSubscriptionsView } from '../../lib/utils/view-utils';
-import { useDefaultSubplebbits } from '../../hooks/use-default-subplebbits';
+import { useDirectories } from '../../hooks/use-directories';
import { getBoardPath } from '../../lib/utils/route-utils';
import useCatalogFiltersStore from '../../stores/use-catalog-filters-store';
import useCatalogStyleStore from '../../stores/use-catalog-style-store';
@@ -125,8 +125,8 @@ const CatalogPost = memo(
const params = useParams();
const isInAllView = isAllView(location.pathname);
const isInSubscriptionsView = isSubscriptionsView(location.pathname, params);
- const defaultSubplebbits = useDefaultSubplebbits();
- const boardPath = subplebbitAddress ? getBoardPath(subplebbitAddress, defaultSubplebbits) : '';
+ const directories = useDirectories();
+ const boardPath = subplebbitAddress ? getBoardPath(subplebbitAddress, directories) : '';
const postMenuProps = useMemo(() => selectPostMenuProps(post), [post]);
const postLink = boardPath ? `/${boardPath}/thread/${cid}` : `/thread/${cid}`;
diff --git a/src/components/create-board-modal/create-board-modal.tsx b/src/components/create-board-modal/create-board-modal.tsx
index c6d78e52..e8583bb8 100644
--- a/src/components/create-board-modal/create-board-modal.tsx
+++ b/src/components/create-board-modal/create-board-modal.tsx
@@ -42,8 +42,8 @@ const CreateBoardModal = () => {
Submitting to a Directory
Open a PR editing{' '}
-
- 5chan-multisub.json
+
+ 5chan-directories.json
{' '}
with your board's title, address, and NSFW status. Devs will review and merge if approved. 99% uptime is required.
diff --git a/src/components/directory-modal/directory-modal.tsx b/src/components/directory-modal/directory-modal.tsx
index 3edada33..3b9a6c7c 100644
--- a/src/components/directory-modal/directory-modal.tsx
+++ b/src/components/directory-modal/directory-modal.tsx
@@ -50,8 +50,8 @@ const DirectoryModal = () => {
Directory Submission
To submit your board, open a PR editing{' '}
-
- 5chan-multisub.json
+
+ 5chan-directories.json
{' '}
with your board's title, address, and NSFW status. Requirements: 99% uptime (they're P2P nodes), active, well-moderated, and relevant to the
category. Devs will review and approve/reject based on these criteria.
diff --git a/src/components/post-desktop/post-desktop.tsx b/src/components/post-desktop/post-desktop.tsx
index 166d60ac..9d3adf0c 100644
--- a/src/components/post-desktop/post-desktop.tsx
+++ b/src/components/post-desktop/post-desktop.tsx
@@ -11,7 +11,7 @@ import { getFormattedDate, getFormattedTimeAgo } from '../../lib/utils/time-util
import { isValidURL } from '../../lib/utils/url-utils';
import { isAllView, isModQueueView, isPendingPostView, isPostPageView, isSubscriptionsView } from '../../lib/utils/view-utils';
import useModQueueStore from '../../stores/use-mod-queue-store';
-import { useDefaultSubplebbits } from '../../hooks/use-default-subplebbits';
+import { useDirectories } from '../../hooks/use-directories';
import { getBoardPath } from '../../lib/utils/route-utils';
import useAvatarVisibilityStore from '../../stores/use-avatar-visibility-store';
import useAuthorAddressClick from '../../hooks/use-author-address-click';
@@ -85,8 +85,8 @@ const PostInfo = ({
const { showOmittedReplies } = useShowOmittedReplies();
const { imageUrl: avatarImageUrl } = useAuthorAvatar({ author });
const { hideAvatars } = useAvatarVisibilityStore();
- const defaultSubplebbits = useDefaultSubplebbits();
- const boardPath = subplebbitAddress ? getBoardPath(subplebbitAddress, defaultSubplebbits) : undefined;
+ const directories = useDirectories();
+ const boardPath = subplebbitAddress ? getBoardPath(subplebbitAddress, directories) : undefined;
const postMenuProps = useMemo(() => selectPostMenuProps(post), [post]);
const params = useParams();
@@ -453,7 +453,7 @@ const PostMedia = ({
const { url } = commentMediaInfo || {};
let type = commentMediaInfo?.type;
const gifFrameUrl = useFetchGifFirstFrame(url);
- const defaultSubplebbits = useDefaultSubplebbits();
+ const directories = useDirectories();
if (type === 'gif' && gifFrameUrl !== null) {
type = 'animated gif';
@@ -465,7 +465,7 @@ const PostMedia = ({
const [showThumbnail, setShowThumbnail] = useState(true);
const mediaDimensions = getMediaDimensions(commentMediaInfo);
- const boardPath = getBoardPath(subplebbitAddress, defaultSubplebbits);
+ const boardPath = getBoardPath(subplebbitAddress, directories);
return (
@@ -528,8 +528,8 @@ const Reply = ({ postReplyCount, reply, roles, threadNumber }: PostProps) => {
}
const { author, cid, deleted, link, linkHeight, linkWidth, postCid, reason, removed, spoiler, subplebbitAddress, thumbnailUrl, parentCid } = post || {};
- const defaultSubplebbits = useDefaultSubplebbits();
- const boardPath = subplebbitAddress ? getBoardPath(subplebbitAddress, defaultSubplebbits) : undefined;
+ const directories = useDirectories();
+ const boardPath = subplebbitAddress ? getBoardPath(subplebbitAddress, directories) : undefined;
const location = useLocation();
const route = boardPath ? `/${boardPath}/thread/${cid}` : `/thread/${cid}`;
@@ -591,8 +591,8 @@ const PostDesktop = ({
const isInPostPageView = isPostPageView(location.pathname, params);
const isInAllView = isAllView(location.pathname);
const isInSubscriptionsView = isSubscriptionsView(location.pathname, params);
- const defaultSubplebbits = useDefaultSubplebbits();
- const boardPath = subplebbitAddress ? getBoardPath(subplebbitAddress, defaultSubplebbits) : undefined;
+ const directories = useDirectories();
+ const boardPath = subplebbitAddress ? getBoardPath(subplebbitAddress, directories) : undefined;
const { hidden, unhide, hide } = useHide({ cid });
const isHidden = hidden && !isInPostPageView;
diff --git a/src/components/post-desktop/post-menu-desktop/post-menu-desktop.tsx b/src/components/post-desktop/post-menu-desktop/post-menu-desktop.tsx
index 5dbbfe4c..33bf8269 100644
--- a/src/components/post-desktop/post-menu-desktop/post-menu-desktop.tsx
+++ b/src/components/post-desktop/post-menu-desktop/post-menu-desktop.tsx
@@ -9,7 +9,7 @@ import { getCommentMediaInfo } from '../../../lib/utils/media-utils';
import { copyShareLinkToClipboard, isValidURL, type ShareLinkType } from '../../../lib/utils/url-utils';
import { copyToClipboard } from '../../../lib/utils/clipboard-utils';
import { getBoardPath } from '../../../lib/utils/route-utils';
-import { useDefaultSubplebbits } from '../../../hooks/use-default-subplebbits';
+import { useDirectories } from '../../../hooks/use-directories';
import { isAllView, isCatalogView, isPostPageView, isSubscriptionsView } from '../../../lib/utils/view-utils';
import useHide from '../../../hooks/use-hide';
import _ from 'lodash';
@@ -21,8 +21,8 @@ type CopyLinkButtonProps =
const CopyLinkButton = ({ cid, subplebbitAddress, linkType, onClose }: CopyLinkButtonProps) => {
const { t } = useTranslation();
- const defaultSubplebbits = useDefaultSubplebbits();
- const boardIdentifier = getBoardPath(subplebbitAddress, defaultSubplebbits);
+ const directories = useDirectories();
+ const boardIdentifier = getBoardPath(subplebbitAddress, directories);
return (
{
diff --git a/src/components/post-form/post-form.tsx b/src/components/post-form/post-form.tsx
index d920e83b..2cea55fc 100644
--- a/src/components/post-form/post-form.tsx
+++ b/src/components/post-form/post-form.tsx
@@ -9,7 +9,7 @@ import { getHasThumbnail, getLinkMediaInfo } from '../../lib/utils/media-utils';
import { formatMarkdown } from '../../lib/utils/post-utils';
import { isValidURL } from '../../lib/utils/url-utils';
import { isAllView, isCatalogView, isModQueueView, isModView, isPostPageView, isSubscriptionsView } from '../../lib/utils/view-utils';
-import { useDefaultSubplebbits } from '../../hooks/use-default-subplebbits';
+import { useDirectories } from '../../hooks/use-directories';
import { useResolvedSubplebbitAddress } from '../../hooks/use-resolved-subplebbit-address';
import useFetchGifFirstFrame from '../../hooks/use-fetch-gif-first-frame';
import useIsSubplebbitOffline from '../../hooks/use-is-subplebbit-offline';
@@ -71,7 +71,7 @@ const PostFormTable = ({ closeForm, postCid }: { closeForm: () => void; postCid:
const isInModView = isModView(location.pathname);
const isInSubscriptionsView = isSubscriptionsView(location.pathname, useParams());
const subscriptions = account?.subscriptions || [];
- const defaultSubplebbits = useDefaultSubplebbits();
+ const directories = useDirectories();
const { accountSubplebbits } = useAccountSubplebbits();
const accountSubplebbitAddresses = Object.keys(accountSubplebbits);
@@ -338,7 +338,7 @@ const PostFormTable = ({ closeForm, postCid }: { closeForm: () => void; postCid:
);
diff --git a/src/views/mod-queue/mod-queue.tsx b/src/views/mod-queue/mod-queue.tsx
index 6bd3ec93..e7a20f4c 100644
--- a/src/views/mod-queue/mod-queue.tsx
+++ b/src/views/mod-queue/mod-queue.tsx
@@ -4,7 +4,6 @@ import { useParams, Link } from 'react-router-dom';
import { useFeed, Comment, usePublishCommentModeration, useEditedComment, useSubplebbit, useComment } from '@plebbit/plebbit-react-hooks';
import useAccountsStore from '@plebbit/plebbit-react-hooks/dist/stores/accounts';
import { Virtuoso } from 'react-virtuoso';
-import { formatDistanceToNow } from 'date-fns';
import styles from './mod-queue.module.css';
import useModQueueStore from '../../stores/use-mod-queue-store';
import { useAccountSubplebbitsWithMetadata } from '../../hooks/use-account-subplebbits-with-metadata';
@@ -12,7 +11,7 @@ import LoadingEllipsis from '../../components/loading-ellipsis';
import ErrorDisplay from '../../components/error-display/error-display';
import { useFeedStateString } from '../../hooks/use-state-string';
import { getSubplebbitAddress, getBoardPath } from '../../lib/utils/route-utils';
-import { useDefaultSubplebbits, MultisubSubplebbit } from '../../hooks/use-default-subplebbits';
+import { useDirectories, DirectoryCommunity } from '../../hooks/use-directories';
import { useBoardPath } from '../../hooks/use-resolved-subplebbit-address';
import { getHasThumbnail, getCommentMediaInfo } from '../../lib/utils/media-utils';
import { getFormattedDate, getFormattedTimeAgo } from '../../lib/utils/time-utils';
@@ -430,10 +429,10 @@ const ModQueueFeedPost = ({ comment }: { comment: Comment }) => {
};
interface ModQueueBoardFilterProps {
- subplebbits: MultisubSubplebbit[];
+ communities: DirectoryCommunity[];
}
-const ModQueueBoardFilter = ({ subplebbits }: ModQueueBoardFilterProps) => {
+const ModQueueBoardFilter = ({ communities }: ModQueueBoardFilterProps) => {
const { t } = useTranslation();
const { selectedBoardFilter, setSelectedBoardFilter } = useModQueueStore();
@@ -442,12 +441,12 @@ const ModQueueBoardFilter = ({ subplebbits }: ModQueueBoardFilterProps) => {
setSelectedBoardFilter(value);
};
- if (!subplebbits || subplebbits.length === 0) {
+ if (!communities || communities.length === 0) {
return null;
}
// Default to first board if none selected
- const firstBoardAddress = subplebbits.find((sub) => sub.address)?.address;
+ const firstBoardAddress = communities.find((sub) => sub.address)?.address;
const currentFilter = selectedBoardFilter || firstBoardAddress || '';
// Auto-select first board if none is selected
@@ -461,12 +460,12 @@ const ModQueueBoardFilter = ({ subplebbits }: ModQueueBoardFilterProps) => {
-
- {selectedAddress &&
}
+
+ {selectedAddress &&
}