mastodon/app/javascript/flavours/glitch/components/status_icons.jsx

148 lines
4.3 KiB
React
Raw Normal View History

2018-03-13 00:57:28 +00:00
// Package imports.
import PropTypes from 'prop-types';
import { PureComponent } from 'react';
2018-03-13 00:57:28 +00:00
import { defineMessages, injectIntl } from 'react-intl';
import ImmutablePropTypes from 'react-immutable-proptypes';
2018-03-13 00:57:28 +00:00
// Mastodon imports.
import { Icon } from 'flavours/glitch/components/icon';
import { languages } from 'flavours/glitch/initial_state';
2018-03-13 00:57:28 +00:00
import { IconButton } from './icon_button';
import VisibilityIcon from './status_visibility_icon';
2018-03-13 00:57:28 +00:00
// Messages for use with internationalization stuff.
const messages = defineMessages({
collapse: { id: 'status.collapse', defaultMessage: 'Collapse' },
uncollapse: { id: 'status.uncollapse', defaultMessage: 'Uncollapse' },
2019-07-16 13:06:30 +00:00
inReplyTo: { id: 'status.in_reply_to', defaultMessage: 'This toot is a reply' },
2019-07-16 13:23:39 +00:00
previewCard: { id: 'status.has_preview_card', defaultMessage: 'Features an attached preview card' },
pictures: { id: 'status.has_pictures', defaultMessage: 'Features attached pictures' },
2019-07-16 13:06:30 +00:00
poll: { id: 'status.is_poll', defaultMessage: 'This toot is a poll' },
2019-07-16 13:23:39 +00:00
video: { id: 'status.has_video', defaultMessage: 'Features attached videos' },
audio: { id: 'status.has_audio', defaultMessage: 'Features attached audio files' },
localOnly: { id: 'status.local_only', defaultMessage: 'Only visible from your instance' },
2018-03-13 00:57:28 +00:00
});
const LanguageIcon = ({ language }) => {
if (!languages) return null;
const lang = languages.find((lang) => lang[0] === language);
if (!lang) return null;
return (
<span className='text-icon' title={`${lang[2]} (${lang[1]})`} aria-hidden='true'>
{lang[0].toUpperCase()}
</span>
);
};
LanguageIcon.propTypes = {
language: PropTypes.string.isRequired,
};
class StatusIcons extends PureComponent {
2018-03-13 00:57:28 +00:00
static propTypes = {
status: ImmutablePropTypes.map.isRequired,
mediaIcons: PropTypes.arrayOf(PropTypes.string),
2018-03-13 00:57:28 +00:00
collapsible: PropTypes.bool,
collapsed: PropTypes.bool,
setCollapsed: PropTypes.func.isRequired,
2018-03-13 00:57:28 +00:00
intl: PropTypes.object.isRequired,
settings: ImmutablePropTypes.map.isRequired,
2018-03-13 00:57:28 +00:00
};
// Handles clicks on collapsed button
handleCollapsedClick = (e) => {
const { collapsed, setCollapsed } = this.props;
2018-03-13 00:57:28 +00:00
if (e.button === 0) {
setCollapsed(!collapsed);
2018-03-13 00:57:28 +00:00
e.preventDefault();
}
};
2018-03-13 00:57:28 +00:00
mediaIconTitleText (mediaIcon) {
const { intl } = this.props;
2019-07-16 13:06:30 +00:00
const message = {
'link': messages.previewCard,
'picture-o': messages.pictures,
'tasks': messages.poll,
'video-camera': messages.video,
'music': messages.audio,
}[mediaIcon];
return message && intl.formatMessage(message);
2019-07-16 13:06:30 +00:00
}
renderIcon (mediaIcon) {
return (
<Icon
fixedWidth
className='status__media-icon'
key={`media-icon--${mediaIcon}`}
id={mediaIcon}
aria-hidden='true'
title={this.mediaIconTitleText(mediaIcon)}
/>
);
}
2018-03-13 00:57:28 +00:00
// Rendering.
render () {
const {
status,
mediaIcons,
2018-03-13 00:57:28 +00:00
collapsible,
collapsed,
settings,
2018-03-13 00:57:28 +00:00
intl,
} = this.props;
return (
<div className='status__info__icons'>
{settings.get('language') && status.get('language') && <LanguageIcon language={status.get('language')} />}
{settings.get('reply') && status.get('in_reply_to_id', null) !== null ? (
<Icon
className='status__reply-icon'
fixedWidth
id='comment'
aria-hidden='true'
2019-07-16 13:06:30 +00:00
title={intl.formatMessage(messages.inReplyTo)}
/>
) : null}
{settings.get('local_only') && status.get('local_only') &&
<Icon
fixedWidth
id='home'
2019-07-16 13:08:03 +00:00
aria-hidden='true'
title={intl.formatMessage(messages.localOnly)}
/>}
{settings.get('media') && !!mediaIcons && mediaIcons.map(icon => this.renderIcon(icon))}
{settings.get('visibility') && <VisibilityIcon visibility={status.get('visibility')} />}
{collapsible && (
2018-03-13 00:57:28 +00:00
<IconButton
className='status__collapse-button'
animate
2018-03-13 00:57:28 +00:00
active={collapsed}
title={
collapsed ?
intl.formatMessage(messages.uncollapse) :
intl.formatMessage(messages.collapse)
}
icon='angle-double-up'
onClick={this.handleCollapsedClick}
/>
)}
2018-03-13 00:57:28 +00:00
</div>
);
}
}
export default injectIntl(StatusIcons);