mirror of
https://github.com/bitsocialnet/5chan.git
synced 2026-08-03 07:41:04 +02:00
feat(subscriptions): use useAccountSubplebbitAddresses for deduplicated addresses
Integrate bitsocial-react-hooks#16: replace raw useAccountsStore access with useAccountSubplebbitAddresses so .eth/.bso aliases are deduplicated under .bso.
This commit is contained in:
+2
-14
@@ -1,7 +1,6 @@
|
|||||||
import { lazy, Suspense, useEffect } from 'react';
|
import { lazy, Suspense, useEffect } from 'react';
|
||||||
import { Navigate, Outlet, Route, Routes, useLocation, useParams } from 'react-router-dom';
|
import { Navigate, Outlet, Route, Routes, useLocation, useParams } from 'react-router-dom';
|
||||||
import { useAccount, useAccountComment, useSubplebbit } from '@bitsocialhq/bitsocial-react-hooks';
|
import { useAccount, useAccountComment, useSubplebbit } from '@bitsocialhq/bitsocial-react-hooks';
|
||||||
import useAccountsStore from '@bitsocialhq/bitsocial-react-hooks/dist/stores/accounts';
|
|
||||||
import { initSnow, removeSnow } from './lib/snow';
|
import { initSnow, removeSnow } from './lib/snow';
|
||||||
import { isAllView, isCatalogView, isModView, isSubscriptionsView } from './lib/utils/view-utils';
|
import { isAllView, isCatalogView, isModView, isSubscriptionsView } from './lib/utils/view-utils';
|
||||||
import { preloadThemeAssets } from './lib/utils/preload-utils';
|
import { preloadThemeAssets } from './lib/utils/preload-utils';
|
||||||
@@ -9,6 +8,7 @@ import useReplyModalStore from './stores/use-reply-modal-store';
|
|||||||
import useCreateBoardModalStore from './stores/use-create-board-modal-store';
|
import useCreateBoardModalStore from './stores/use-create-board-modal-store';
|
||||||
import useSpecialThemeStore from './stores/use-special-theme-store';
|
import useSpecialThemeStore from './stores/use-special-theme-store';
|
||||||
import useIsMobile from './hooks/use-is-mobile';
|
import useIsMobile from './hooks/use-is-mobile';
|
||||||
|
import { useAccountSubplebbitAddresses } from './hooks/use-account-subplebbit-addresses';
|
||||||
import useTheme from './hooks/use-theme';
|
import useTheme from './hooks/use-theme';
|
||||||
import { useDirectories } from './hooks/use-directories';
|
import { useDirectories } from './hooks/use-directories';
|
||||||
import { useResolvedSubplebbitAddress } from './hooks/use-resolved-subplebbit-address';
|
import { useResolvedSubplebbitAddress } from './hooks/use-resolved-subplebbit-address';
|
||||||
@@ -237,19 +237,7 @@ const ModQueueRoute = () => {
|
|||||||
const accountAddress = account?.author?.address;
|
const accountAddress = account?.author?.address;
|
||||||
const subplebbitAddress = useResolvedSubplebbitAddress();
|
const subplebbitAddress = useResolvedSubplebbitAddress();
|
||||||
const subplebbit = useSubplebbit({ subplebbitAddress });
|
const subplebbit = useSubplebbit({ subplebbitAddress });
|
||||||
|
const accountSubplebbitAddresses = useAccountSubplebbitAddresses();
|
||||||
const accountSubplebbitAddresses = useAccountsStore(
|
|
||||||
(state) => {
|
|
||||||
const activeAccountId = state.activeAccountId;
|
|
||||||
const activeAccount = activeAccountId ? state.accounts[activeAccountId] : undefined;
|
|
||||||
const accountSubplebbits = activeAccount?.subplebbits || {};
|
|
||||||
return Object.keys(accountSubplebbits);
|
|
||||||
},
|
|
||||||
(prev, next) => {
|
|
||||||
if (prev.length !== next.length) return false;
|
|
||||||
return prev.every((val, idx) => val === next[idx]);
|
|
||||||
},
|
|
||||||
);
|
|
||||||
|
|
||||||
if (!account) {
|
if (!account) {
|
||||||
return null;
|
return null;
|
||||||
|
|||||||
@@ -5,6 +5,7 @@ import getShortAddress from '../../lib/get-short-address';
|
|||||||
import { useAccountComment } from '@bitsocialhq/bitsocial-react-hooks';
|
import { useAccountComment } from '@bitsocialhq/bitsocial-react-hooks';
|
||||||
import useAccountsStore from '@bitsocialhq/bitsocial-react-hooks/dist/stores/accounts';
|
import useAccountsStore from '@bitsocialhq/bitsocial-react-hooks/dist/stores/accounts';
|
||||||
import { isAllView, isCatalogView, isModView, isSubscriptionsView } from '../../lib/utils/view-utils';
|
import { isAllView, isCatalogView, isModView, isSubscriptionsView } from '../../lib/utils/view-utils';
|
||||||
|
import { useAccountSubplebbitAddresses } from '../../hooks/use-account-subplebbit-addresses';
|
||||||
import { useDirectories, useDirectoriesMetadata, DirectoryCommunity } from '../../hooks/use-directories';
|
import { useDirectories, useDirectoriesMetadata, DirectoryCommunity } from '../../hooks/use-directories';
|
||||||
import { useBoardPath, useResolvedSubplebbitAddress } from '../../hooks/use-resolved-subplebbit-address';
|
import { useBoardPath, useResolvedSubplebbitAddress } from '../../hooks/use-resolved-subplebbit-address';
|
||||||
import { getBoardPath, extractDirectoryFromTitle } from '../../lib/utils/route-utils';
|
import { getBoardPath, extractDirectoryFromTitle } from '../../lib/utils/route-utils';
|
||||||
@@ -116,18 +117,7 @@ const BoardsBarDesktop = () => {
|
|||||||
},
|
},
|
||||||
);
|
);
|
||||||
|
|
||||||
const accountSubplebbitAddresses = useAccountsStore(
|
const accountSubplebbitAddresses = useAccountSubplebbitAddresses();
|
||||||
(state) => {
|
|
||||||
const activeAccountId = state.activeAccountId;
|
|
||||||
const activeAccount = activeAccountId ? state.accounts[activeAccountId] : undefined;
|
|
||||||
const accountSubplebbits = activeAccount?.subplebbits || {};
|
|
||||||
return Object.keys(accountSubplebbits);
|
|
||||||
},
|
|
||||||
(prev, next) => {
|
|
||||||
if (prev.length !== next.length) return false;
|
|
||||||
return prev.every((val, idx) => val === next[idx]);
|
|
||||||
},
|
|
||||||
);
|
|
||||||
|
|
||||||
// Show all subscriptions when enabled; no separate per-address tracking (avoids drift when subscribing from board-buttons)
|
// Show all subscriptions when enabled; no separate per-address tracking (avoids drift when subscribing from board-buttons)
|
||||||
const visibleSubscriptionAddresses = showSubscriptionsInBoardsBar ? subscriptions : [];
|
const visibleSubscriptionAddresses = showSubscriptionsInBoardsBar ? subscriptions : [];
|
||||||
@@ -330,18 +320,7 @@ const BoardsBarMobile = ({ subplebbitAddress }: { subplebbitAddress?: string })
|
|||||||
const boardPath = useBoardPath(subplebbitAddress);
|
const boardPath = useBoardPath(subplebbitAddress);
|
||||||
const selectValue = isInAllView ? 'all' : isInSubscriptionsView ? 'subs' : isInModView ? 'mod' : boardPath || subplebbitAddress;
|
const selectValue = isInAllView ? 'all' : isInSubscriptionsView ? 'subs' : isInModView ? 'mod' : boardPath || subplebbitAddress;
|
||||||
|
|
||||||
const accountSubplebbitAddresses = useAccountsStore(
|
const accountSubplebbitAddresses = useAccountSubplebbitAddresses();
|
||||||
(state) => {
|
|
||||||
const activeAccountId = state.activeAccountId;
|
|
||||||
const activeAccount = activeAccountId ? state.accounts[activeAccountId] : undefined;
|
|
||||||
const accountSubplebbits = activeAccount?.subplebbits || {};
|
|
||||||
return Object.keys(accountSubplebbits);
|
|
||||||
},
|
|
||||||
(prev, next) => {
|
|
||||||
if (prev.length !== next.length) return false;
|
|
||||||
return prev.every((val, idx) => val === next[idx]);
|
|
||||||
},
|
|
||||||
);
|
|
||||||
|
|
||||||
// Check if current subplebbit is a directory board
|
// Check if current subplebbit is a directory board
|
||||||
const currentIsDirectoryBoard = directoryBoards.some((board) => board.address === subplebbitAddress);
|
const currentIsDirectoryBoard = directoryBoards.some((board) => board.address === subplebbitAddress);
|
||||||
|
|||||||
@@ -1,13 +1,14 @@
|
|||||||
import { useEffect, useRef, useState } from 'react';
|
import { useEffect, useRef, useState } from 'react';
|
||||||
import { useTranslation } from 'react-i18next';
|
import { useTranslation } from 'react-i18next';
|
||||||
import { useLocation, useNavigate, useParams } from 'react-router-dom';
|
import { useLocation, useNavigate, useParams } from 'react-router-dom';
|
||||||
import { Comment, setAccount, useAccount, useAccountComment, useAccountSubplebbits, useEditedComment } from '@bitsocialhq/bitsocial-react-hooks';
|
import { Comment, setAccount, useAccount, useAccountComment, useEditedComment } from '@bitsocialhq/bitsocial-react-hooks';
|
||||||
import getShortAddress from '../../lib/get-short-address';
|
import getShortAddress from '../../lib/get-short-address';
|
||||||
import useSubplebbitsStore from '@bitsocialhq/bitsocial-react-hooks/dist/stores/subplebbits';
|
import useSubplebbitsStore from '@bitsocialhq/bitsocial-react-hooks/dist/stores/subplebbits';
|
||||||
import useSubplebbitsPagesStore from '@bitsocialhq/bitsocial-react-hooks/dist/stores/subplebbits-pages';
|
import useSubplebbitsPagesStore from '@bitsocialhq/bitsocial-react-hooks/dist/stores/subplebbits-pages';
|
||||||
import { getLinkMediaInfo } from '../../lib/utils/media-utils';
|
import { getLinkMediaInfo } from '../../lib/utils/media-utils';
|
||||||
import { isValidURL } from '../../lib/utils/url-utils';
|
import { isValidURL } from '../../lib/utils/url-utils';
|
||||||
import { isAllView, isCatalogView, isModQueueView, isModView, isPostPageView, isSubscriptionsView } from '../../lib/utils/view-utils';
|
import { isAllView, isCatalogView, isModQueueView, isModView, isPostPageView, isSubscriptionsView } from '../../lib/utils/view-utils';
|
||||||
|
import { useAccountSubplebbitAddresses } from '../../hooks/use-account-subplebbit-addresses';
|
||||||
import { useDirectories, useDirectoryByAddress } from '../../hooks/use-directories';
|
import { useDirectories, useDirectoryByAddress } from '../../hooks/use-directories';
|
||||||
import { useResolvedSubplebbitAddress } from '../../hooks/use-resolved-subplebbit-address';
|
import { useResolvedSubplebbitAddress } from '../../hooks/use-resolved-subplebbit-address';
|
||||||
import useFetchGifFirstFrame from '../../hooks/use-fetch-gif-first-frame';
|
import useFetchGifFirstFrame from '../../hooks/use-fetch-gif-first-frame';
|
||||||
@@ -326,8 +327,7 @@ const PostFormTable = ({ closeForm, postCid }: { closeForm: () => void; postCid:
|
|||||||
const requirePostLinkIsMediaFeature = directoryEntry?.features?.requirePostLinkIsMedia;
|
const requirePostLinkIsMediaFeature = directoryEntry?.features?.requirePostLinkIsMedia;
|
||||||
const requirePostLinkIsMedia = requirePostLinkIsMediaFeature === true || (requirePostLinkIsMediaFeature === undefined && (isInAllView || isInSubscriptionsView));
|
const requirePostLinkIsMedia = requirePostLinkIsMediaFeature === true || (requirePostLinkIsMediaFeature === undefined && (isInAllView || isInSubscriptionsView));
|
||||||
|
|
||||||
const { accountSubplebbits } = useAccountSubplebbits();
|
const accountSubplebbitAddresses = useAccountSubplebbitAddresses();
|
||||||
const accountSubplebbitAddresses = Object.keys(accountSubplebbits);
|
|
||||||
|
|
||||||
const [lengthError, setLengthError] = useState<string | null>(null);
|
const [lengthError, setLengthError] = useState<string | null>(null);
|
||||||
|
|
||||||
|
|||||||
@@ -0,0 +1,8 @@
|
|||||||
|
import { useMemo } from 'react';
|
||||||
|
import { useAccountSubplebbits } from '@bitsocialhq/bitsocial-react-hooks';
|
||||||
|
|
||||||
|
export const useAccountSubplebbitAddresses = (): string[] => {
|
||||||
|
const { accountSubplebbits } = useAccountSubplebbits({ onlyIfCached: true });
|
||||||
|
|
||||||
|
return useMemo(() => Object.keys(accountSubplebbits), [accountSubplebbits]);
|
||||||
|
};
|
||||||
@@ -1,22 +1,16 @@
|
|||||||
import useAccountsStore from '@bitsocialhq/bitsocial-react-hooks/dist/stores/accounts';
|
import { useMemo } from 'react';
|
||||||
|
import { useAccountSubplebbits } from '@bitsocialhq/bitsocial-react-hooks';
|
||||||
import { DirectoryCommunity } from './use-directories';
|
import { DirectoryCommunity } from './use-directories';
|
||||||
|
|
||||||
export const useAccountSubplebbitsWithMetadata = (): DirectoryCommunity[] => {
|
export const useAccountSubplebbitsWithMetadata = (): DirectoryCommunity[] => {
|
||||||
const subplebbitsWithMetadata = useAccountsStore(
|
const { accountSubplebbits } = useAccountSubplebbits({ onlyIfCached: true });
|
||||||
(state) => {
|
|
||||||
const activeAccountId = state.activeAccountId;
|
|
||||||
const activeAccount = activeAccountId ? state.accounts[activeAccountId] : undefined;
|
|
||||||
const accountSubplebbits = activeAccount?.subplebbits || {};
|
|
||||||
return Object.entries(accountSubplebbits).map(([address, sub]) => ({
|
|
||||||
address,
|
|
||||||
title: (sub as any).title,
|
|
||||||
}));
|
|
||||||
},
|
|
||||||
(prev, next) => {
|
|
||||||
if (prev.length !== next.length) return false;
|
|
||||||
return prev.every((item, idx) => item.address === next[idx].address && item.title === next[idx].title);
|
|
||||||
},
|
|
||||||
);
|
|
||||||
|
|
||||||
return subplebbitsWithMetadata;
|
return useMemo(
|
||||||
|
() =>
|
||||||
|
Object.values(accountSubplebbits).map((sub) => ({
|
||||||
|
address: (sub as any).address,
|
||||||
|
title: (sub as any).title,
|
||||||
|
})),
|
||||||
|
[accountSubplebbits],
|
||||||
|
);
|
||||||
};
|
};
|
||||||
|
|||||||
@@ -1,12 +1,13 @@
|
|||||||
import { useCallback, useEffect, useMemo, useRef } from 'react';
|
import { useCallback, useEffect, useMemo, useRef } from 'react';
|
||||||
import { Link, useLocation, useNavigate, useNavigationType, useParams } from 'react-router-dom';
|
import { Link, useLocation, useNavigate, useNavigationType, useParams } from 'react-router-dom';
|
||||||
import { Comment, useAccount, useAccountComments, useAccountSubplebbits, useFeed, useSubplebbit } from '@bitsocialhq/bitsocial-react-hooks';
|
import { Comment, useAccount, useAccountComments, useFeed, useSubplebbit } from '@bitsocialhq/bitsocial-react-hooks';
|
||||||
import { useSubplebbitField } from '../../hooks/use-stable-subplebbit';
|
import { useSubplebbitField } from '../../hooks/use-stable-subplebbit';
|
||||||
import { Virtuoso, VirtuosoHandle, StateSnapshot } from 'react-virtuoso';
|
import { Virtuoso, VirtuosoHandle, StateSnapshot } from 'react-virtuoso';
|
||||||
import { useTranslation } from 'react-i18next';
|
import { useTranslation } from 'react-i18next';
|
||||||
import styles from './board.module.css';
|
import styles from './board.module.css';
|
||||||
import mobileFooterStyles from '../../components/footer/footer.module.css';
|
import mobileFooterStyles from '../../components/footer/footer.module.css';
|
||||||
import { shouldShowSnow } from '../../lib/snow';
|
import { shouldShowSnow } from '../../lib/snow';
|
||||||
|
import { useAccountSubplebbitAddresses } from '../../hooks/use-account-subplebbit-addresses';
|
||||||
import { useDirectoryAddresses, useDirectories, useDirectoryByAddress } from '../../hooks/use-directories';
|
import { useDirectoryAddresses, useDirectories, useDirectoryByAddress } from '../../hooks/use-directories';
|
||||||
import { useFilteredDirectoryAddresses } from '../../hooks/use-filtered-directory-addresses';
|
import { useFilteredDirectoryAddresses } from '../../hooks/use-filtered-directory-addresses';
|
||||||
import { useResolvedSubplebbitAddress } from '../../hooks/use-resolved-subplebbit-address';
|
import { useResolvedSubplebbitAddress } from '../../hooks/use-resolved-subplebbit-address';
|
||||||
@@ -115,8 +116,7 @@ const Board = ({ feedCacheKey, viewType, boardIdentifier: boardIdentifierProp, i
|
|||||||
const account = useAccount();
|
const account = useAccount();
|
||||||
const subscriptions = account?.subscriptions;
|
const subscriptions = account?.subscriptions;
|
||||||
|
|
||||||
const { accountSubplebbits } = useAccountSubplebbits();
|
const accountSubplebbitAddresses = useAccountSubplebbitAddresses();
|
||||||
const accountSubplebbitAddresses = Object.keys(accountSubplebbits);
|
|
||||||
|
|
||||||
const subplebbitAddresses = useMemo(() => {
|
const subplebbitAddresses = useMemo(() => {
|
||||||
if (isInAllView) {
|
if (isInAllView) {
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
import { Link, useNavigate } from 'react-router-dom';
|
import { Link, useNavigate } from 'react-router-dom';
|
||||||
import { useTranslation } from 'react-i18next';
|
import { useTranslation } from 'react-i18next';
|
||||||
import useAccountsStore from '@bitsocialhq/bitsocial-react-hooks/dist/stores/accounts';
|
import { useAccountSubplebbitAddresses } from '../../../hooks/use-account-subplebbit-addresses';
|
||||||
import { useDirectoriesState, useDirectories, DirectoryCommunity } from '../../../hooks/use-directories';
|
import { useDirectoriesState, useDirectories, DirectoryCommunity } from '../../../hooks/use-directories';
|
||||||
import { getBoardPath } from '../../../lib/utils/route-utils';
|
import { getBoardPath } from '../../../lib/utils/route-utils';
|
||||||
import useDisclaimerModalStore from '../../../stores/use-disclaimer-modal-store';
|
import useDisclaimerModalStore from '../../../stores/use-disclaimer-modal-store';
|
||||||
@@ -64,14 +64,7 @@ const BoardsList = ({ multisub }: { multisub: DirectoryCommunity[] }) => {
|
|||||||
const { useCatalogLinks, boardFilter } = useBoardsFilterStore();
|
const { useCatalogLinks, boardFilter } = useBoardsFilterStore();
|
||||||
const directories = useDirectories();
|
const directories = useDirectories();
|
||||||
|
|
||||||
const accountSubplebbitAddresses = useAccountsStore(
|
const accountSubplebbitAddresses = useAccountSubplebbitAddresses();
|
||||||
(state) => {
|
|
||||||
const activeAccountId = state.activeAccountId;
|
|
||||||
const activeAccount = activeAccountId ? state.accounts[activeAccountId] : undefined;
|
|
||||||
return Object.keys(activeAccount?.subplebbits || {});
|
|
||||||
},
|
|
||||||
(prev, next) => prev.length === next.length && prev.every((val, idx) => val === next[idx]),
|
|
||||||
);
|
|
||||||
|
|
||||||
const handleLinkClick = (e: React.MouseEvent<HTMLAnchorElement>, address: string) => {
|
const handleLinkClick = (e: React.MouseEvent<HTMLAnchorElement>, address: string) => {
|
||||||
e.preventDefault();
|
e.preventDefault();
|
||||||
|
|||||||
@@ -2,7 +2,6 @@ import React, { useMemo, useState, useEffect, useCallback, memo } from 'react';
|
|||||||
import { useTranslation } from 'react-i18next';
|
import { useTranslation } from 'react-i18next';
|
||||||
import { useParams, Link } from 'react-router-dom';
|
import { useParams, Link } from 'react-router-dom';
|
||||||
import { useFeed, Comment, usePublishCommentModeration, useEditedComment, useSubplebbit, useComment } from '@bitsocialhq/bitsocial-react-hooks';
|
import { useFeed, Comment, usePublishCommentModeration, useEditedComment, useSubplebbit, useComment } from '@bitsocialhq/bitsocial-react-hooks';
|
||||||
import useAccountsStore from '@bitsocialhq/bitsocial-react-hooks/dist/stores/accounts';
|
|
||||||
import { Virtuoso } from 'react-virtuoso';
|
import { Virtuoso } from 'react-virtuoso';
|
||||||
import styles from './mod-queue.module.css';
|
import styles from './mod-queue.module.css';
|
||||||
import useModQueueStore from '../../stores/use-mod-queue-store';
|
import useModQueueStore from '../../stores/use-mod-queue-store';
|
||||||
@@ -19,6 +18,7 @@ import useFeedResetStore from '../../stores/use-feed-reset-store';
|
|||||||
import useChallengesStore from '../../stores/use-challenges-store';
|
import useChallengesStore from '../../stores/use-challenges-store';
|
||||||
import { alertChallengeVerificationFailed } from '../../lib/utils/challenge-utils';
|
import { alertChallengeVerificationFailed } from '../../lib/utils/challenge-utils';
|
||||||
import Tooltip from '../../components/tooltip';
|
import Tooltip from '../../components/tooltip';
|
||||||
|
import { useAccountSubplebbitAddresses } from '../../hooks/use-account-subplebbit-addresses';
|
||||||
import useIsMobile from '../../hooks/use-is-mobile';
|
import useIsMobile from '../../hooks/use-is-mobile';
|
||||||
import { useCurrentTime } from '../../hooks/use-current-time';
|
import { useCurrentTime } from '../../hooks/use-current-time';
|
||||||
import { Post } from '../post/post';
|
import { Post } from '../post/post';
|
||||||
@@ -693,18 +693,7 @@ const ModQueueButtonContent = ({ feed, alertThresholdSeconds, boardIdentifier, i
|
|||||||
export const ModQueueButton = ({ boardIdentifier, isMobile }: ModQueueButtonProps) => {
|
export const ModQueueButton = ({ boardIdentifier, isMobile }: ModQueueButtonProps) => {
|
||||||
const { getAlertThresholdSeconds } = useModQueueStore();
|
const { getAlertThresholdSeconds } = useModQueueStore();
|
||||||
|
|
||||||
const accountSubplebbitAddresses = useAccountsStore(
|
const accountSubplebbitAddresses = useAccountSubplebbitAddresses();
|
||||||
(state) => {
|
|
||||||
const activeAccountId = state.activeAccountId;
|
|
||||||
const activeAccount = activeAccountId ? state.accounts[activeAccountId] : undefined;
|
|
||||||
const accountSubplebbits = activeAccount?.subplebbits || {};
|
|
||||||
return Object.keys(accountSubplebbits);
|
|
||||||
},
|
|
||||||
(prev, next) => {
|
|
||||||
if (prev.length !== next.length) return false;
|
|
||||||
return prev.every((val, idx) => val === next[idx]);
|
|
||||||
},
|
|
||||||
);
|
|
||||||
|
|
||||||
const directories = useDirectories();
|
const directories = useDirectories();
|
||||||
|
|
||||||
@@ -756,18 +745,7 @@ const ModQueueView = ({ boardIdentifier: propBoardIdentifier }: ModQueueViewProp
|
|||||||
const { selectedBoardFilter, viewMode } = useModQueueStore();
|
const { selectedBoardFilter, viewMode } = useModQueueStore();
|
||||||
const isMobile = useIsMobile();
|
const isMobile = useIsMobile();
|
||||||
|
|
||||||
const accountSubplebbitAddresses = useAccountsStore(
|
const accountSubplebbitAddresses = useAccountSubplebbitAddresses();
|
||||||
(state) => {
|
|
||||||
const activeAccountId = state.activeAccountId;
|
|
||||||
const activeAccount = activeAccountId ? state.accounts[activeAccountId] : undefined;
|
|
||||||
const accountSubplebbits = activeAccount?.subplebbits || {};
|
|
||||||
return Object.keys(accountSubplebbits);
|
|
||||||
},
|
|
||||||
(prev, next) => {
|
|
||||||
if (prev.length !== next.length) return false;
|
|
||||||
return prev.every((val, idx) => val === next[idx]);
|
|
||||||
},
|
|
||||||
);
|
|
||||||
|
|
||||||
const directories = useDirectories();
|
const directories = useDirectories();
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user