import { useCallback, useEffect } from 'react'; import { FormattedMessage } from 'react-intl'; import { useHistory } from 'react-router'; import { List as ImmutableList } from 'immutable'; import AddIcon from '@/material-icons/400-24px/add.svg?react'; import { fetchEndorsedAccounts } from 'mastodon/actions/accounts'; import { AccountListItem } from 'mastodon/components/account_list_item'; import { ColumnBackButton } from 'mastodon/components/column_back_button'; import { LoadingIndicator } from 'mastodon/components/loading_indicator'; import { RemoteHint } from 'mastodon/components/remote_hint'; import { Article, ItemList, Scrollable, } from 'mastodon/components/scrollable_list/components'; import type { TruncatedListItemInfo } from 'mastodon/components/truncated_list'; import { TruncatedListItems } from 'mastodon/components/truncated_list'; import { AccountHeader } from 'mastodon/features/account_timeline/components/account_header'; import BundleColumnError from 'mastodon/features/ui/components/bundle_column_error'; import Column from 'mastodon/features/ui/components/column'; import { useAccount } from 'mastodon/hooks/useAccount'; import { useAccountId } from 'mastodon/hooks/useAccountId'; import { useAccountVisibility } from 'mastodon/hooks/useAccountVisibility'; import { useAppDispatch, useAppSelector } from 'mastodon/store'; import { useAccountCollections } from '../collections'; import { CollectionListItem } from '../collections/components/collection_list_item'; import { areCollectionsEnabled } from '../collections/utils'; import { EmptyMessage } from './components/empty_message'; import { Subheading, SubheadingLink } from './components/subheading'; const collectionsEnabled = areCollectionsEnabled(); const AccountFeatured: React.FC<{ multiColumn: boolean }> = ({ multiColumn, }) => { const accountId = useAccountId(); const account = useAccount(accountId); const { suspended, blockedBy, hidden } = useAccountVisibility(accountId); const forceEmptyState = suspended || blockedBy || hidden; const dispatch = useAppDispatch(); const history = useHistory(); useEffect(() => { if (account && !account.show_featured) { history.push(`/@${account.acct}`); } }, [account, history]); useEffect(() => { if (accountId) { void dispatch(fetchEndorsedAccounts({ accountId })); } }, [accountId, dispatch]); const featuredAccountIds = useAppSelector( (state) => state.user_lists.getIn( ['featured_accounts', accountId, 'items'], ImmutableList(), ) as ImmutableList, ); const { collections, status: collectionsLoadStatus } = useAccountCollections(accountId); const { listedCollections = [], unlistedCollections = [] } = Object.groupBy( collections, (item) => item.discoverable && !!item.item_count ? 'listedCollections' : 'unlistedCollections', ); const renderListItem = useCallback( ({ item, index, totalListLength, isLastElement, }: TruncatedListItemInfo<(typeof listedCollections)[number]>) => ( ), [], ); const hasCollections = collectionsEnabled && collectionsLoadStatus === 'idle' && listedCollections.length > 0; const hasFeaturedAccounts = !featuredAccountIds.isEmpty(); const isLoading = !accountId || (collectionsEnabled && collectionsLoadStatus !== 'idle'); if (accountId === null) { return ; } if (isLoading) { return (
); } if (!hasFeaturedAccounts && !hasCollections) { return ( ); } return ( {accountId && ( )} {!featuredAccountIds.isEmpty() && ( <> {featuredAccountIds.map((featuredAccountId, index) => (
))}
)} {collectionsEnabled && ( <>

{hasCollections ? ( ), subtitle: ( ), }} renderListItem={renderListItem} /> ) : (
); }; const AccountFeaturedWrapper = ({ children, accountId, }: React.PropsWithChildren<{ accountId?: string }>) => { return (
{accountId && } {children}
); }; // eslint-disable-next-line import/no-default-export export default AccountFeatured;