diff --git a/app/soapbox/components/status.tsx b/app/soapbox/components/status.tsx index 94e5033f9..a0a05e8bf 100644 --- a/app/soapbox/components/status.tsx +++ b/app/soapbox/components/status.tsx @@ -7,7 +7,7 @@ import { NavLink, useHistory } from 'react-router-dom'; import Icon from 'soapbox/components/icon'; import AccountContainer from 'soapbox/containers/account_container'; import QuotedStatus from 'soapbox/features/status/containers/quoted_status_container'; -import { defaultMediaVisibility, textForScreenReader } from 'soapbox/utils/status'; +import { defaultMediaVisibility, textForScreenReader, getActualStatus } from 'soapbox/utils/status'; import StatusMedia from './status-media'; import StatusReplyMentions from './status-reply-mentions'; @@ -201,11 +201,7 @@ const Status: React.FC = (props) => { }; const _properStatus = (): StatusEntity => { - if (status.reblog && typeof status.reblog === 'object') { - return status.reblog; - } else { - return status; - } + return getActualStatus(status); }; if (!status) return null; diff --git a/app/soapbox/features/status/components/detailed-status.tsx b/app/soapbox/features/status/components/detailed-status.tsx index 1f890f228..250f81257 100644 --- a/app/soapbox/features/status/components/detailed-status.tsx +++ b/app/soapbox/features/status/components/detailed-status.tsx @@ -8,6 +8,7 @@ import StatusContent from 'soapbox/components/status_content'; import { HStack, Text } from 'soapbox/components/ui'; import AccountContainer from 'soapbox/containers/account_container'; import QuotedStatus from 'soapbox/features/status/containers/quoted_status_container'; +import { getActualStatus } from 'soapbox/utils/status'; import StatusInteractionBar from './status-interaction-bar'; @@ -42,12 +43,7 @@ const DetailedStatus: React.FC = ({ onOpenCompareHistoryModal(status); }; - const getActualStatus = () => { - if (!status) return undefined; - return status.reblog && typeof status.reblog === 'object' ? status.reblog : status; - }; - - const actualStatus = getActualStatus(); + const actualStatus = getActualStatus(status); if (!actualStatus) return null; const { account } = actualStatus; if (!account || typeof account !== 'object') return null; diff --git a/app/soapbox/utils/status.ts b/app/soapbox/utils/status.ts index b0890fb20..c78d2fe6c 100644 --- a/app/soapbox/utils/status.ts +++ b/app/soapbox/utils/status.ts @@ -58,3 +58,17 @@ export const textForScreenReader = (intl: IntlShape, status: StatusEntity, reblo return values.join(', '); }; + +/** Get reblogged status if any, otherwise return the original status. */ +// @ts-ignore The type seems right, but TS doesn't like it. +export const getActualStatus: { + (status: StatusEntity): StatusEntity, + (status: undefined): undefined, + (status: null): null, +} = (status) => { + if (status?.reblog && typeof status?.reblog === 'object') { + return status.reblog as StatusEntity; + } else { + return status; + } +};