--- /dev/null
+import React from 'react';
+import PropTypes from 'prop-types';
+import ImmutablePropTypes from 'react-immutable-proptypes';
+import ImmutablePureComponent from 'react-immutable-pure-component';
+import { MediaGallery, Video, Audio } from 'flavours/glitch/util/async-components';
+import Bundle from 'flavours/glitch/features/ui/components/bundle';
+import noop from 'lodash/noop';
+
+export default class MediaAttachments extends ImmutablePureComponent {
+
+ static propTypes = {
+ status: ImmutablePropTypes.map.isRequired,
+ height: PropTypes.number,
+ width: PropTypes.number,
+ revealed: PropTypes.bool,
+ };
+
+ static defaultProps = {
+ height: 110,
+ width: 239,
+ };
+
+ updateOnProps = [
+ 'status',
+ ];
+
+ renderLoadingMediaGallery = () => {
+ const { height, width } = this.props;
+
+ return (
+ <div className='media-gallery' style={{ height, width }} />
+ );
+ }
+
+ renderLoadingVideoPlayer = () => {
+ const { height, width } = this.props;
+
+ return (
+ <div className='video-player' style={{ height, width }} />
+ );
+ }
+
+ renderLoadingAudioPlayer = () => {
+ const { height, width } = this.props;
+
+ return (
+ <div className='audio-player' style={{ height, width }} />
+ );
+ }
+
+ render () {
+ const { status, width, height, revealed } = this.props;
+ const mediaAttachments = status.get('media_attachments');
+
+ if (mediaAttachments.size === 0) {
+ return null;
+ }
+
+ if (mediaAttachments.getIn([0, 'type']) === 'audio') {
+ const audio = mediaAttachments.get(0);
+
+ return (
+ <Bundle fetchComponent={Audio} loading={this.renderLoadingAudioPlayer} >
+ {Component => (
+ <Component
+ src={audio.get('url')}
+ alt={audio.get('description')}
+ width={width}
+ height={height}
+ poster={audio.get('preview_url') || status.getIn(['account', 'avatar_static'])}
+ backgroundColor={audio.getIn(['meta', 'colors', 'background'])}
+ foregroundColor={audio.getIn(['meta', 'colors', 'foreground'])}
+ accentColor={audio.getIn(['meta', 'colors', 'accent'])}
+ duration={audio.getIn(['meta', 'original', 'duration'], 0)}
+ />
+ )}
+ </Bundle>
+ );
+ } else if (mediaAttachments.getIn([0, 'type']) === 'video') {
+ const video = mediaAttachments.get(0);
+
+ return (
+ <Bundle fetchComponent={Video} loading={this.renderLoadingVideoPlayer} >
+ {Component => (
+ <Component
+ preview={video.get('preview_url')}
+ frameRate={video.getIn(['meta', 'original', 'frame_rate'])}
+ blurhash={video.get('blurhash')}
+ src={video.get('url')}
+ alt={video.get('description')}
+ width={width}
+ height={height}
+ inline
+ sensitive={status.get('sensitive')}
+ revealed={revealed}
+ onOpenVideo={noop}
+ />
+ )}
+ </Bundle>
+ );
+ } else {
+ return (
+ <Bundle fetchComponent={MediaGallery} loading={this.renderLoadingMediaGallery} >
+ {Component => (
+ <Component
+ media={mediaAttachments}
+ sensitive={status.get('sensitive')}
+ defaultWidth={width}
+ revealed={revealed}
+ height={height}
+ onOpenMedia={noop}
+ />
+ )}
+ </Bundle>
+ );
+ }
+ }
+
+}
import React from 'react';
import PropTypes from 'prop-types';
import ImmutablePropTypes from 'react-immutable-proptypes';
-import noop from 'lodash/noop';
import StatusContent from 'flavours/glitch/components/status_content';
-import { MediaGallery, Video } from 'flavours/glitch/util/async-components';
-import Bundle from 'flavours/glitch/features/ui/components/bundle';
import Avatar from 'flavours/glitch/components/avatar';
import DisplayName from 'flavours/glitch/components/display_name';
import RelativeTimestamp from 'flavours/glitch/components/relative_timestamp';
import Option from './option';
+import MediaAttachments from 'flavours/glitch/components/media_attachments';
export default class StatusCheckBox extends React.PureComponent {
render () {
const { status, checked } = this.props;
- let media = null;
-
if (status.get('reblog')) {
return null;
}
- if (status.get('media_attachments').size > 0) {
- if (status.get('media_attachments').some(item => item.get('type') === 'unknown')) {
-
- } else if (status.getIn(['media_attachments', 0, 'type']) === 'video') {
- const video = status.getIn(['media_attachments', 0]);
-
- media = (
- <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')}
- width={239}
- height={110}
- inline
- sensitive={status.get('sensitive')}
- revealed={false}
- onOpenVideo={noop}
- />
- )}
- </Bundle>
- );
- } else {
- media = (
- <Bundle fetchComponent={MediaGallery} loading={this.renderLoadingMediaGallery} >
- {Component => (
- <Component
- media={status.get('media_attachments')}
- sensitive={status.get('sensitive')}
- revealed={false}
- height={110}
- onOpenMedia={noop}
- />
- )}
- </Bundle>
- );
- }
- }
-
const labelComponent = (
<div className='status-check-box__status poll__option__text'>
<div className='detailed-status__display-name'>
<div><DisplayName account={status.get('account')} /> ยท <RelativeTimestamp timestamp={status.get('created_at')} /></div>
</div>
- <StatusContent status={status} media={media} />
+ <StatusContent status={status} media={<MediaAttachments status={status} revealed={false} />} />
</div>
);
import InlineAccount from 'flavours/glitch/components/inline_account';
import IconButton from 'flavours/glitch/components/icon_button';
import RelativeTimestamp from 'flavours/glitch/components/relative_timestamp';
+import MediaAttachments from 'flavours/glitch/components/media_attachments';
const mapStateToProps = (state, { statusId }) => ({
versions: state.getIn(['history', statusId, 'items']),
)}
<div className='status__content__text status__content__text--visible translate' dangerouslySetInnerHTML={content} />
+
+ {!!currentVersion.get('poll') && (
+ <div className='poll'>
+ <ul>
+ {currentVersion.getIn(['poll', 'options']).map(option => (
+ <li key={option.get('title')}>
+ <span className='poll__input disabled' />
+
+ <span
+ className='poll__option__text translate'
+ dangerouslySetInnerHTML={{ __html: emojify(escapeTextContentForBrowser(option.get('title')), emojiMap) }}
+ />
+ </li>
+ ))}
+ </ul>
+ </div>
+ )}
+
+ <MediaAttachments status={currentVersion} />
</div>
</div>
</div>