import { useCallback } from 'react'; import classNames from 'classnames'; import { Helmet } from 'react-helmet'; import { openModal } from '@/mastodon/actions/modal'; import { AccountBio } from '@/mastodon/components/account_bio'; import { Avatar } from '@/mastodon/components/avatar'; import { AnimateEmojiProvider } from '@/mastodon/components/emoji/context'; import FollowRequestNoteContainer from '@/mastodon/features/account/containers/follow_request_note_container'; import { useLayout } from '@/mastodon/hooks/useLayout'; import { useVisibility } from '@/mastodon/hooks/useVisibility'; import { autoPlayGif, me, domain as localDomain, } from '@/mastodon/initial_state'; import type { Account } from '@/mastodon/models/account'; import { getAccountHidden } from '@/mastodon/selectors/accounts'; import { useAppSelector, useAppDispatch } from '@/mastodon/store'; import { AccountName } from './account_name'; import { AccountSubscriptionForm } from './account_subscription_form'; import { AccountBadges } from './badges'; import { AccountButtons } from './buttons'; import { FamiliarFollowers } from './familiar_followers'; import { AccountHeaderFields } from './fields'; import { MemorialNote } from './memorial_note'; import { MovedNote } from './moved_note'; import { AccountNote as AccountNoteRedesign } from './note'; import { AccountNumberFields } from './number_fields'; import redesignClasses from './redesign.module.scss'; import { AccountTabs } from './tabs'; const titleFromAccount = (account: Account) => { const displayName = account.display_name; const acct = account.acct === account.username ? `${account.username}@${localDomain}` : account.acct; const prefix = displayName.trim().length === 0 ? account.username : displayName; return `${prefix} (@${acct})`; }; export const AccountHeader: React.FC<{ accountId: string; hideTabs?: boolean; }> = ({ accountId, hideTabs }) => { const dispatch = useAppDispatch(); const account = useAppSelector((state) => state.accounts.get(accountId)); const relationship = useAppSelector((state) => state.relationships.get(accountId), ); const hidden = useAppSelector((state) => getAccountHidden(state, accountId)); const handleOpenAvatar = useCallback( (e: React.MouseEvent) => { if (e.button !== 0 || e.ctrlKey || e.metaKey) { return; } e.preventDefault(); if (!account) { return; } dispatch( openModal({ modalType: 'IMAGE', modalProps: { src: account.avatar, alt: '', }, }), ); }, [dispatch, account], ); const { layout } = useLayout(); const { observedRef, isIntersecting } = useVisibility({ observerOptions: { rootMargin: layout === 'mobile' ? '0px 0px -55px 0px' : '', // Height of bottom nav bar. }, }); if (!account) { return null; } const suspendedOrHidden = hidden || account.suspended; const isLocal = !account.acct.includes('@'); const isMe = me && account.id === me; return (