feat(multisubs): add catalog view

This commit is contained in:
plebeius.eth
2024-05-17 16:39:02 +02:00
parent f7ce6890ec
commit cc2a640ae2
4 changed files with 37 additions and 18 deletions
+12 -10
View File
@@ -1,12 +1,14 @@
import { useTranslation } from 'react-i18next'; import { useTranslation } from 'react-i18next';
import { Link, useLocation, useParams } from 'react-router-dom'; import { Link, useLocation, useNavigate, useParams } from 'react-router-dom';
import { useAccountComment, useSubscribe } from '@plebbit/plebbit-react-hooks'; import { useAccountComment, useSubscribe } from '@plebbit/plebbit-react-hooks';
import styles from './board-buttons.module.css'; import styles from './board-buttons.module.css';
import { isAllView, isCatalogView, isPendingPostView, isPostPageView, isSubscriptionsView } from '../../lib/utils/view-utils'; import { isAllView, isCatalogView, isPendingPostView, isPostPageView, isSubscriptionsView } from '../../lib/utils/view-utils';
interface BoardButtonsProps { interface BoardButtonsProps {
isInAllView?: boolean;
address: string | undefined; address: string | undefined;
isInCatalogView?: boolean; isInCatalogView?: boolean;
isInSubscriptionsView?: boolean;
} }
const OptionsButton = () => { const OptionsButton = () => {
@@ -14,13 +16,12 @@ const OptionsButton = () => {
return <button className='button'>{t('options')}</button>; return <button className='button'>{t('options')}</button>;
}; };
const CatalogButton = ({ address, isInCatalogView }: BoardButtonsProps) => { const CatalogButton = ({ address, isInAllView, isInCatalogView, isInSubscriptionsView }: BoardButtonsProps) => {
const { t } = useTranslation(); const { t } = useTranslation();
return ( const navigate = useNavigate();
<button className='button'> const link = isInAllView ? `/p/all/catalog` : isInSubscriptionsView ? `/p/subscriptions/catalog` : isInCatalogView ? `/p/${address}` : `/p/${address}/catalog`;
<Link to={isInCatalogView ? `/p/${address}` : `/p/${address}/catalog`}>{t(isInCatalogView ? 'return' : 'catalog')}</Link>
</button> return <button className='button'>{isInCatalogView ? <span onClick={() => navigate(-1)}>{t('return')}</span> : <Link to={link}>{t('catalog')}</Link>}</button>;
);
}; };
const SubscribeButton = ({ address }: BoardButtonsProps) => { const SubscribeButton = ({ address }: BoardButtonsProps) => {
@@ -58,7 +59,7 @@ export const MobileBoardButtons = () => {
const accountComment = useAccountComment({ commentIndex: params?.accountCommentIndex as any }); const accountComment = useAccountComment({ commentIndex: params?.accountCommentIndex as any });
const subplebbitAddress = params?.subplebbitAddress || accountComment?.subplebbitAddress; const subplebbitAddress = params?.subplebbitAddress || accountComment?.subplebbitAddress;
const isInPostView = isPostPageView(location.pathname, params); const isInPostView = isPostPageView(location.pathname, params);
const isInCatalogView = isCatalogView(location.pathname, params); const isInCatalogView = isCatalogView(location.pathname);
const isInPendingPostPage = isPendingPostView(location.pathname, params); const isInPendingPostPage = isPendingPostView(location.pathname, params);
return ( return (
@@ -89,7 +90,7 @@ export const DesktopBoardButtons = () => {
const location = useLocation(); const location = useLocation();
const accountComment = useAccountComment({ commentIndex: params?.accountCommentIndex as any }); const accountComment = useAccountComment({ commentIndex: params?.accountCommentIndex as any });
const subplebbitAddress = params?.subplebbitAddress || accountComment?.subplebbitAddress; const subplebbitAddress = params?.subplebbitAddress || accountComment?.subplebbitAddress;
const isInCatalogView = isCatalogView(location.pathname, params); const isInCatalogView = isCatalogView(location.pathname);
const isInAllView = isAllView(location.pathname); const isInAllView = isAllView(location.pathname);
const isInPendingPostPage = isPendingPostView(location.pathname, params); const isInPendingPostPage = isPendingPostView(location.pathname, params);
const isInPostView = isPostPageView(location.pathname, params); const isInPostView = isPostPageView(location.pathname, params);
@@ -108,7 +109,8 @@ export const DesktopBoardButtons = () => {
</> </>
) : ( ) : (
<> <>
[<OptionsButton />] [<CatalogButton address={subplebbitAddress} isInCatalogView={isInCatalogView} />] [<OptionsButton />] [
<CatalogButton address={subplebbitAddress} isInAllView={isInAllView} isInCatalogView={isInCatalogView} isInSubscriptionsView={isInSubscriptionsView} />]
{!(isInAllView || isInSubscriptionsView) && ( {!(isInAllView || isInSubscriptionsView) && (
<span className={styles.subscribeButton}> <span className={styles.subscribeButton}>
[<SubscribeButton address={subplebbitAddress} />] [<SubscribeButton address={subplebbitAddress} />]
+2 -2
View File
@@ -9,7 +9,7 @@ const BoardNavDesktop = () => {
const { t } = useTranslation(); const { t } = useTranslation();
const location = useLocation(); const location = useLocation();
const params = useParams(); const params = useParams();
const isInCatalogView = isCatalogView(location.pathname, params); const isInCatalogView = isCatalogView(location.pathname);
const subplebbits = useDefaultSubplebbits(); const subplebbits = useDefaultSubplebbits();
const { plebbitSubs, interestsSubs, randomSubs, internationalSubs, projectsSubs } = categorizeSubplebbits(subplebbits); const { plebbitSubs, interestsSubs, randomSubs, internationalSubs, projectsSubs } = categorizeSubplebbits(subplebbits);
@@ -49,7 +49,7 @@ const BoardNavMobile = ({ subplebbitAddress }: { subplebbitAddress: string }) =>
const location = useLocation(); const location = useLocation();
const params = useParams(); const params = useParams();
const isInAllView = isAllView(location.pathname); const isInAllView = isAllView(location.pathname);
const isInCatalogView = isCatalogView(location.pathname, params); const isInCatalogView = isCatalogView(location.pathname);
const isInSubscriptionsView = isSubscriptionsView(location.pathname); const isInSubscriptionsView = isSubscriptionsView(location.pathname);
const selectValue = isInAllView ? 'all' : isInSubscriptionsView ? 'subscriptions' : subplebbitAddress; const selectValue = isInAllView ? 'all' : isInSubscriptionsView ? 'subscriptions' : subplebbitAddress;
+3 -4
View File
@@ -8,9 +8,8 @@ export const isAllView = (pathname: string): boolean => {
return pathname.startsWith('/p/all'); return pathname.startsWith('/p/all');
}; };
export const isCatalogView = (pathname: string, params: ParamsType): boolean => { export const isCatalogView = (pathname: string): boolean => {
const decodedPathname = decodeURIComponent(pathname); return pathname.endsWith('/catalog') || pathname.endsWith('/catalog/settings');
return params.subplebbitAddress ? decodedPathname.startsWith(`/p/${params.subplebbitAddress}/catalog`) : false;
}; };
export const isDescriptionView = (pathname: string, params: ParamsType): boolean => { export const isDescriptionView = (pathname: string, params: ParamsType): boolean => {
@@ -45,7 +44,7 @@ export const isSubscriptionsView = (pathname: string): boolean => {
export const isNotFoundView = (pathname: string, params: ParamsType): boolean => { export const isNotFoundView = (pathname: string, params: ParamsType): boolean => {
return ( return (
!isCatalogView(pathname, params) && !isCatalogView(pathname) &&
!isDescriptionView(pathname, params) && !isDescriptionView(pathname, params) &&
!isHomeView(pathname) && !isHomeView(pathname) &&
!isPendingPostView(pathname, params) && !isPendingPostView(pathname, params) &&
+20 -2
View File
@@ -1,8 +1,10 @@
import { useEffect, useMemo, useRef } from 'react'; import { useEffect, useMemo, useRef } from 'react';
import { useLocation, useParams } from 'react-router-dom'; import { useLocation, useParams } from 'react-router-dom';
import { useTranslation } from 'react-i18next'; import { useTranslation } from 'react-i18next';
import { Subplebbit, useFeed, useSubplebbit } from '@plebbit/plebbit-react-hooks'; import { useAccount, Subplebbit, useFeed, useSubplebbit } from '@plebbit/plebbit-react-hooks';
import { Virtuoso, VirtuosoHandle, StateSnapshot } from 'react-virtuoso'; import { Virtuoso, VirtuosoHandle, StateSnapshot } from 'react-virtuoso';
import { isAllView, isSubscriptionsView } from '../../lib/utils/view-utils';
import { useDefaultSubplebbitAddresses } from '../../hooks/use-default-subplebbits';
import useFeedStateString from '../../hooks/use-feed-state-string'; import useFeedStateString from '../../hooks/use-feed-state-string';
import useWindowWidth from '../../hooks/use-window-width'; import useWindowWidth from '../../hooks/use-window-width';
import CatalogRow from '../../components/catalog-row'; import CatalogRow from '../../components/catalog-row';
@@ -72,7 +74,23 @@ const Catalog = () => {
const { t } = useTranslation(); const { t } = useTranslation();
const location = useLocation(); const location = useLocation();
const { subplebbitAddress } = useParams<{ subplebbitAddress: string }>(); const { subplebbitAddress } = useParams<{ subplebbitAddress: string }>();
const subplebbitAddresses = useMemo(() => [subplebbitAddress], [subplebbitAddress]) as string[];
const isInAllView = isAllView(location.pathname);
const defaultSubplebbitAddresses = useDefaultSubplebbitAddresses();
const account = useAccount();
const subscriptions = account?.subscriptions;
const isInSubscriptionsView = isSubscriptionsView(location.pathname);
const subplebbitAddresses = useMemo(() => {
if (isInAllView) {
return defaultSubplebbitAddresses;
}
if (isInSubscriptionsView) {
return subscriptions || [];
}
return [subplebbitAddress];
}, [isInAllView, isInSubscriptionsView, subplebbitAddress, defaultSubplebbitAddresses, subscriptions]);
const columnCount = Math.floor(useWindowWidth() / columnWidth); const columnCount = Math.floor(useWindowWidth() / columnWidth);
// postPerPage based on columnCount for optimized feed, dont change value after first render // postPerPage based on columnCount for optimized feed, dont change value after first render