diff --git a/app/javascript/mastodon/components/status/content.tsx b/app/javascript/mastodon/components/status/content.tsx index 199416cff0c..cdd649300d1 100644 --- a/app/javascript/mastodon/components/status/content.tsx +++ b/app/javascript/mastodon/components/status/content.tsx @@ -1,20 +1,16 @@ import type React from 'react'; import { useCallback, useState } from 'react'; -import { FormattedMessage, useIntl } from 'react-intl'; +import { FormattedMessage } from 'react-intl'; import classNames from 'classnames'; import { CaretRightIcon } from '@phosphor-icons/react'; -import { useIdentity } from '@/mastodon/identity_context'; -import { languages as preloadedLanguages } from '@/mastodon/initial_state'; import type { ExpandedStatusShape, StatusShape, - StatusTranslation, } from '@/mastodon/models/status'; -import { useAppSelector } from '@/mastodon/store'; import { Button } from '../button/redesign'; import { EmojiHTML } from '../emoji/html'; @@ -42,12 +38,6 @@ export const StatusContent: React.FC< className, ...props }) => { - const { signedIn } = useIdentity(); - const targetLanguages = useAppSelector( - (state) => state.server.translationLanguages.item?.[status.language], - ); - const intl = useIntl(); - // Determines if a long post should show the read more button. const [collapsed, setCollapsed] = useState(false); const onRef = useCallback( @@ -70,14 +60,6 @@ export const StatusContent: React.FC< const language = status.translation?.language ?? status.language; const isCollapsed = !!onReadMore && collapsible && collapsed; - const renderTranslate = !!( - onTranslate && - !isCollapsed && - signedIn && - ['public', 'unlisted'].includes(status.visibility) && - status.search_index?.trim().length && - targetLanguages?.includes(intl.locale.replace(/[_-].*/, '')) - ); return (
- )} - {isCollapsed && ( - ); - } - - const language = preloadedLanguages?.find( - (lang) => lang[0] === translation.detected_source_language, - ); - const languageName = language - ? language[1] - : translation.detected_source_language; - const provider = translation.provider; - - return ( -
- - -
- -
-
- ); -}; diff --git a/app/javascript/mastodon/components/status/status.tsx b/app/javascript/mastodon/components/status/status.tsx index f2057d54ffe..1add81732d1 100644 --- a/app/javascript/mastodon/components/status/status.tsx +++ b/app/javascript/mastodon/components/status/status.tsx @@ -28,6 +28,7 @@ import { StatusMeta } from './meta'; import { StatusPrepend } from './prepend'; import { StatusRedesignHeader } from './redesign/header'; import classes from './styles.module.scss'; +import { TranslateButton } from './translate'; import type { StatusContainerProps, StatusContextType } from './types'; type StatusRedesignProps = Merge< @@ -185,6 +186,8 @@ export const StatusRedesign: React.FC = ({ /> )} + + {expanded && ( ; +}> = ({ status, onTranslate }) => { + const { signedIn } = useIdentity(); + const targetLanguages = useAppSelector( + (state) => state.server.translationLanguages.item?.[status.language], + ); + const intl = useIntl(); + + const { translation } = status; + + if ( + !signedIn || + !['public', 'unlisted'].includes(status.visibility) || + status.search_index?.trim().length === 0 || + !targetLanguages?.includes(intl.locale.replace(/[_-].*/, '')) + ) { + return null; + } + + if (!translation || translation.isLoading) { + return ( +
+ +
+ ); + } + + const language = preloadedLanguages?.find( + (lang) => lang[0] === translation.detected_source_language, + ); + const languageName = language + ? language[1] + : translation.detected_source_language; + const provider = translation.provider; + + return ( +
+ + +
+ +
+
+ ); +};