diff --git a/app/soapbox/features/admin/components/report_status.js b/app/soapbox/features/admin/components/report_status.js
deleted file mode 100644
index 721dfdfb2..000000000
--- a/app/soapbox/features/admin/components/report_status.js
+++ /dev/null
@@ -1,129 +0,0 @@
-import noop from 'lodash/noop';
-import React from 'react';
-import ImmutablePropTypes from 'react-immutable-proptypes';
-import ImmutablePureComponent from 'react-immutable-pure-component';
-import { injectIntl, defineMessages } from 'react-intl';
-import { connect } from 'react-redux';
-
-import { openModal } from 'soapbox/actions/modals';
-import { deleteStatusModal } from 'soapbox/actions/moderation';
-import StatusContent from 'soapbox/components/status_content';
-import DropdownMenu from 'soapbox/containers/dropdown_menu_container';
-import Bundle from 'soapbox/features/ui/components/bundle';
-import { MediaGallery, Video, Audio } from 'soapbox/features/ui/util/async-components';
-
-const messages = defineMessages({
- viewStatus: { id: 'admin.reports.actions.view_status', defaultMessage: 'View post' },
- deleteStatus: { id: 'admin.statuses.actions.delete_status', defaultMessage: 'Delete post' },
-});
-
-export default @connect()
-@injectIntl
-class ReportStatus extends ImmutablePureComponent {
-
- static propTypes = {
- status: ImmutablePropTypes.record.isRequired,
- report: ImmutablePropTypes.map,
- };
-
- makeMenu = () => {
- const { intl, status } = this.props;
- const acct = status.getIn(['account', 'acct']);
-
- return [{
- text: intl.formatMessage(messages.viewStatus, { acct: `@${acct}` }),
- to: `/@${acct}/posts/${status.get('id')}`,
- icon: require('@tabler/icons/icons/pencil.svg'),
- }, {
- text: intl.formatMessage(messages.deleteStatus, { acct: `@${acct}` }),
- action: this.handleDeleteStatus,
- icon: require('@tabler/icons/icons/trash.svg'),
- destructive: true,
- }];
- }
-
- getMedia = () => {
- const { status } = this.props;
-
- if (status.get('media_attachments').size > 0) {
- if (status.get('media_attachments').some(item => item.get('type') === 'unknown')) {
- // Do nothing
- } else if (status.getIn(['media_attachments', 0, 'type']) === 'video') {
- const video = status.getIn(['media_attachments', 0]);
-
- return (
-
- {Component => (
-
- )}
-
- );
- } else if (status.getIn(['media_attachments', 0, 'type']) === 'audio') {
- const audio = status.getIn(['media_attachments', 0]);
-
- return (
-
- {Component => (
-
- )}
-
- );
- } else {
- return (
-
- {Component => }
-
- );
- }
- }
-
- return null;
- }
-
- handleOpenMedia = (media, index) => {
- const { dispatch } = this.props;
- dispatch(openModal('MEDIA', { media, index }));
- }
-
- handleDeleteStatus = () => {
- const { intl, dispatch, status } = this.props;
- const statusId = status.get('id');
- dispatch(deleteStatusModal(intl, statusId));
- }
-
- render() {
- const { status } = this.props;
- const media = this.getMedia();
- const menu = this.makeMenu();
-
- return (
-
- );
- }
-
-}
diff --git a/app/soapbox/features/admin/components/report_status.tsx b/app/soapbox/features/admin/components/report_status.tsx
new file mode 100644
index 000000000..00755a6c4
--- /dev/null
+++ b/app/soapbox/features/admin/components/report_status.tsx
@@ -0,0 +1,134 @@
+import noop from 'lodash/noop';
+import React from 'react';
+import { useIntl, defineMessages } from 'react-intl';
+
+import { openModal } from 'soapbox/actions/modals';
+import { deleteStatusModal } from 'soapbox/actions/moderation';
+import StatusContent from 'soapbox/components/status_content';
+import DropdownMenu from 'soapbox/containers/dropdown_menu_container';
+import Bundle from 'soapbox/features/ui/components/bundle';
+import { MediaGallery, Video, Audio } from 'soapbox/features/ui/util/async-components';
+import { useAppDispatch } from 'soapbox/hooks';
+
+import type { Map as ImmutableMap } from 'immutable';
+import type { Status, Attachment } from 'soapbox/types/entities';
+
+const messages = defineMessages({
+ viewStatus: { id: 'admin.reports.actions.view_status', defaultMessage: 'View post' },
+ deleteStatus: { id: 'admin.statuses.actions.delete_status', defaultMessage: 'Delete post' },
+});
+
+interface IReportStatus {
+ status: Status,
+ report?: ImmutableMap,
+}
+
+const ReportStatus: React.FC = ({ status }) => {
+ const intl = useIntl();
+ const dispatch = useAppDispatch();
+
+ const handleOpenMedia = (media: Attachment, index: number) => {
+ dispatch(openModal('MEDIA', { media, index }));
+ };
+
+ const handleDeleteStatus = () => {
+ dispatch(deleteStatusModal(intl, status.id));
+ };
+
+ const makeMenu = () => {
+ const acct = status.getIn(['account', 'acct']);
+
+ return [{
+ text: intl.formatMessage(messages.viewStatus, { acct: `@${acct}` }),
+ to: `/@${acct}/posts/${status.get('id')}`,
+ icon: require('@tabler/icons/icons/pencil.svg'),
+ }, {
+ text: intl.formatMessage(messages.deleteStatus, { acct: `@${acct}` }),
+ action: handleDeleteStatus,
+ icon: require('@tabler/icons/icons/trash.svg'),
+ destructive: true,
+ }];
+ };
+
+ const getMedia = () => {
+ const firstAttachment = status.media_attachments.get(0);
+
+ if (firstAttachment) {
+ if (status.media_attachments.some(item => item.type === 'unknown')) {
+ // Do nothing
+ } else if (firstAttachment.type === 'video') {
+ const video = firstAttachment;
+
+ return (
+
+ {(Component: any) => (
+
+ )}
+
+ );
+ } else if (firstAttachment.type === 'audio') {
+ const audio = firstAttachment;
+
+ return (
+
+ {(Component: any) => (
+
+ )}
+
+ );
+ } else {
+ return (
+
+ {(Component: any) => (
+
+ )}
+
+ );
+ }
+ }
+
+ return null;
+ };
+
+ const media = getMedia();
+ const menu = makeMenu();
+
+ return (
+
+ );
+};
+
+export default ReportStatus;