bigbuffet-rw/app/soapbox/features/admin/components/report_status.js

130 lines
4.3 KiB
JavaScript
Raw Normal View History

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/modal';
import { deleteStatusModal } from 'soapbox/actions/moderation';
import StatusContent from 'soapbox/components/status_content';
import DropdownMenu from 'soapbox/containers/dropdown_menu_container';
2020-12-31 21:16:50 -08:00
import Bundle from 'soapbox/features/ui/components/bundle';
import { MediaGallery, Video, Audio } from 'soapbox/features/ui/util/async-components';
const messages = defineMessages({
2020-12-31 20:40:13 -08:00
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.map.isRequired,
report: ImmutablePropTypes.map,
};
makeMenu = () => {
const { intl, status } = this.props;
2020-12-31 20:40:13 -08:00
const acct = status.getIn(['account', 'acct']);
return [{
2020-12-31 20:40:13 -08:00
text: intl.formatMessage(messages.viewStatus, { acct: `@${acct}` }),
to: `/@${acct}/posts/${status.get('id')}`,
icon: require('@tabler/icons/icons/pencil.svg'),
2020-12-31 20:40:13 -08:00
}, {
text: intl.formatMessage(messages.deleteStatus, { acct: `@${acct}` }),
action: this.handleDeleteStatus,
icon: require('@tabler/icons/icons/trash.svg'),
destructive: true,
}];
}
2020-12-31 21:16:50 -08:00
getMedia = () => {
const { status } = this.props;
if (status.get('media_attachments').size > 0) {
if (status.get('media_attachments').some(item => item.get('type') === 'unknown')) {
2021-08-03 12:29:36 -07:00
// Do nothing
2020-12-31 21:16:50 -08:00
} else if (status.getIn(['media_attachments', 0, 'type']) === 'video') {
const video = status.getIn(['media_attachments', 0]);
return (
<Bundle fetchComponent={Video} loading={this.renderLoadingVideoPlayer} >
{Component => (
<Component
preview={video.get('preview_url')}
blurhash={video.get('blurhash')}
src={video.get('url')}
alt={video.get('description')}
2021-05-17 15:02:23 -07:00
aspectRatio={video.getIn(['meta', 'original', 'aspect'])}
2020-12-31 21:16:50 -08:00
width={239}
height={110}
inline
sensitive={status.get('sensitive')}
onOpenVideo={noop}
/>
)}
</Bundle>
);
} else if (status.getIn(['media_attachments', 0, 'type']) === 'audio') {
const audio = status.getIn(['media_attachments', 0]);
return (
<Bundle fetchComponent={Audio} loading={this.renderLoadingAudioPlayer} >
{Component => (
<Component
src={audio.get('url')}
alt={audio.get('description')}
inline
sensitive={status.get('sensitive')}
onOpenAudio={noop}
/>
)}
</Bundle>
);
} else {
return (
<Bundle fetchComponent={MediaGallery} loading={this.renderLoadingMediaGallery} >
{Component => <Component media={status.get('media_attachments')} sensitive={status.get('sensitive')} height={110} onOpenMedia={this.handleOpenMedia} />}
</Bundle>
);
}
}
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;
2020-12-31 21:16:50 -08:00
const media = this.getMedia();
const menu = this.makeMenu();
return (
<div className='admin-report__status'>
2020-12-31 21:16:50 -08:00
<div className='admin-report__status-content'>
<StatusContent status={status} />
{media}
</div>
<div className='admin-report__status-actions'>
<DropdownMenu items={menu} src={require('@tabler/icons/icons/dots-vertical.svg')} direction='right' />
</div>
</div>
);
}
}