import type { MouseEventHandler } from 'react'; import { useCallback, useState } from 'react'; import { defineMessages, FormattedMessage, useIntl } from 'react-intl'; import classNames from 'classnames'; import { useHistory } from 'react-router'; import type Immutable from 'immutable'; import RepeatIcon from '@/material-icons/400-24px/repeat.svg?react'; import AttachmentList from 'mastodon/components/attachment_list'; import { Icon } from 'mastodon/components/icon'; import { VisibilityIcon } from 'mastodon/components/visibility_icon'; import PrivacyDropdown from 'mastodon/features/compose/components/privacy_dropdown'; import type { Account } from 'mastodon/models/account'; import type { Status, StatusVisibility } from 'mastodon/models/status'; import { useAppSelector } from 'mastodon/store'; import { Avatar } from '../../../components/avatar'; import { Button } from '../../../components/button'; import { DisplayName } from '../../../components/display_name'; import { RelativeTimestamp } from '../../../components/relative_timestamp'; import StatusContent from '../../../components/status_content'; const messages = defineMessages({ cancel_reblog: { id: 'status.cancel_reblog_private', defaultMessage: 'Unboost', }, reblog: { id: 'status.reblog', defaultMessage: 'Boost' }, }); export const BoostModal: React.FC<{ status: Status; onClose: () => void; onReblog: (status: Status, privacy: StatusVisibility) => void; }> = ({ status, onReblog, onClose }) => { const intl = useIntl(); const history = useHistory(); const default_privacy = useAppSelector( // eslint-disable-next-line @typescript-eslint/no-unsafe-call, @typescript-eslint/no-unsafe-member-access (state) => state.compose.get('default_privacy') as StatusVisibility, ); const account = status.get('account') as Account; const statusVisibility = status.get('visibility') as StatusVisibility; const [privacy, setPrivacy] = useState( statusVisibility === 'private' ? 'private' : default_privacy, ); const onPrivacyChange = useCallback((value: StatusVisibility) => { setPrivacy(value); }, []); const handleReblog = useCallback(() => { onReblog(status, privacy); onClose(); }, [onClose, onReblog, status, privacy]); const handleAccountClick = useCallback( (e) => { if (e.button === 0 && !(e.ctrlKey || e.metaKey)) { e.preventDefault(); onClose(); history.push(`/@${account.acct}`); } }, [history, onClose, account], ); const buttonText = status.get('reblogged') ? messages.cancel_reblog : messages.reblog; const findContainer = useCallback( () => document.getElementsByClassName('modal-root__container')[0], [], ); return (
{/* @ts-expect-error Expected until StatusContent is typed */} {(status.get('media_attachments') as Immutable.List).size > 0 && ( )}
Shift + ), }} />
{statusVisibility !== 'private' && !status.get('reblogged') && ( )}
); };