import { useEffect } from 'react'; import { defineMessages, useIntl, FormattedMessage } from 'react-intl'; import { Helmet } from 'react-helmet'; import { Link } from 'react-router-dom'; import AddIcon from '@/material-icons/400-24px/add.svg?react'; import CollectionsFilledIcon from '@/material-icons/400-24px/category-fill.svg?react'; import SquigglyArrow from '@/svg-icons/squiggly_arrow.svg?react'; import { Column } from 'mastodon/components/column'; import { ColumnHeader } from 'mastodon/components/column_header'; import { DisplayNameSimple } from 'mastodon/components/display_name/simple'; import { Icon } from 'mastodon/components/icon'; import { ItemList, Scrollable, } from 'mastodon/components/scrollable_list/components'; import { useAccount } from 'mastodon/hooks/useAccount'; import { useAccountId, useCurrentAccountId } from 'mastodon/hooks/useAccountId'; import { fetchAccountCollections, selectAccountCollections, } from 'mastodon/reducers/slices/collections'; import { useAppSelector, useAppDispatch } from 'mastodon/store'; import { CollectionListItem } from './components/collection_list_item'; import { messages as editorMessages, MaxCollectionsCallout, userCollectionLimit, } from './editor'; import { areCollectionsEnabled } from './utils'; const messages = defineMessages({ headingMe: { id: 'column.my_collections', defaultMessage: 'My collections' }, headingOther: { id: 'column.other_collections', defaultMessage: 'Collections by {name}', }, }); export function useAccountCollections(accountId: string | null | undefined) { const dispatch = useAppDispatch(); useEffect(() => { if (accountId && areCollectionsEnabled()) { void dispatch(fetchAccountCollections({ accountId })); } }, [dispatch, accountId]); return useAppSelector((state) => selectAccountCollections(state, accountId)); } export const Collections: React.FC<{ multiColumn?: boolean; }> = ({ multiColumn }) => { const intl = useIntl(); const me = useCurrentAccountId(); const accountId = useAccountId(); const account = useAccount(accountId); const { collections, status } = useAccountCollections(accountId); const emptyMessage = status === 'error' || !accountId ? ( ) : ( <>
); const canCreateMoreCollections = collections.length < userCollectionLimit; const isOwnCollection = accountId === me; const titleMessage = isOwnCollection ? messages.headingMe : messages.headingOther; const pageTitle = intl.formatMessage(titleMessage, { name: account?.get('display_name'), }); const pageTitleHtml = intl.formatMessage(titleMessage, { name: , }); return ( ) } /> {status === 'idle' && !canCreateMoreCollections && ( )} {collections.map((item, index) => ( ))} {pageTitle} ); };