forked from cybrespace/mastodon
		
	Put poll options behind content warnings (#10983)
* Put poll options behind CWs in WebUI * Put polls behind CWs on public pages * Add poll icon to public pages CWs * Revert to not showing an icon in the CW button
This commit is contained in:
		
							parent
							
								
									20dda5cca0
								
							
						
					
					
						commit
						e9ddd5a159
					
				
					 6 changed files with 36 additions and 27 deletions
				
			
		| 
						 | 
					@ -16,7 +16,6 @@ import { MediaGallery, Video } from '../features/ui/util/async-components';
 | 
				
			||||||
import { HotKeys } from 'react-hotkeys';
 | 
					import { HotKeys } from 'react-hotkeys';
 | 
				
			||||||
import classNames from 'classnames';
 | 
					import classNames from 'classnames';
 | 
				
			||||||
import Icon from 'mastodon/components/icon';
 | 
					import Icon from 'mastodon/components/icon';
 | 
				
			||||||
import PollContainer from 'mastodon/containers/poll_container';
 | 
					 | 
				
			||||||
import { displayMedia } from '../initial_state';
 | 
					import { displayMedia } from '../initial_state';
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// We use the component (and not the container) since we do not want
 | 
					// We use the component (and not the container) since we do not want
 | 
				
			||||||
| 
						 | 
					@ -321,9 +320,7 @@ class Status extends ImmutablePureComponent {
 | 
				
			||||||
      status  = status.get('reblog');
 | 
					      status  = status.get('reblog');
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    if (status.get('poll')) {
 | 
					    if (status.get('media_attachments').size > 0) {
 | 
				
			||||||
      media = <PollContainer pollId={status.get('poll')} />;
 | 
					 | 
				
			||||||
    } else if (status.get('media_attachments').size > 0) {
 | 
					 | 
				
			||||||
      if (this.props.muted) {
 | 
					      if (this.props.muted) {
 | 
				
			||||||
        media = (
 | 
					        media = (
 | 
				
			||||||
          <AttachmentList
 | 
					          <AttachmentList
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -5,6 +5,7 @@ import { isRtl } from '../rtl';
 | 
				
			||||||
import { FormattedMessage } from 'react-intl';
 | 
					import { FormattedMessage } from 'react-intl';
 | 
				
			||||||
import Permalink from './permalink';
 | 
					import Permalink from './permalink';
 | 
				
			||||||
import classnames from 'classnames';
 | 
					import classnames from 'classnames';
 | 
				
			||||||
 | 
					import PollContainer from 'mastodon/containers/poll_container';
 | 
				
			||||||
import Icon from 'mastodon/components/icon';
 | 
					import Icon from 'mastodon/components/icon';
 | 
				
			||||||
 | 
					
 | 
				
			||||||
const MAX_HEIGHT = 642; // 20px * 32 (+ 2px padding at the top)
 | 
					const MAX_HEIGHT = 642; // 20px * 32 (+ 2px padding at the top)
 | 
				
			||||||
| 
						 | 
					@ -191,6 +192,8 @@ export default class StatusContent extends React.PureComponent {
 | 
				
			||||||
          {mentionsPlaceholder}
 | 
					          {mentionsPlaceholder}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
          <div tabIndex={!hidden ? 0 : null} className={`status__content__text ${!hidden ? 'status__content__text--visible' : ''}`} style={directionStyle} dangerouslySetInnerHTML={content} lang={status.get('language')} />
 | 
					          <div tabIndex={!hidden ? 0 : null} className={`status__content__text ${!hidden ? 'status__content__text--visible' : ''}`} style={directionStyle} dangerouslySetInnerHTML={content} lang={status.get('language')} />
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					          {!hidden && !!status.get('poll') && <PollContainer pollId={status.get('poll')} />}
 | 
				
			||||||
        </div>
 | 
					        </div>
 | 
				
			||||||
      );
 | 
					      );
 | 
				
			||||||
    } else if (this.props.onClick) {
 | 
					    } else if (this.props.onClick) {
 | 
				
			||||||
| 
						 | 
					@ -212,9 +215,13 @@ export default class StatusContent extends React.PureComponent {
 | 
				
			||||||
        output.push(readMoreButton);
 | 
					        output.push(readMoreButton);
 | 
				
			||||||
      }
 | 
					      }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					      if (status.get('poll')) {
 | 
				
			||||||
 | 
					        output.push(<PollContainer pollId={status.get('poll')} />);
 | 
				
			||||||
 | 
					      }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
      return output;
 | 
					      return output;
 | 
				
			||||||
    } else {
 | 
					    } else {
 | 
				
			||||||
      return (
 | 
					      const output = [
 | 
				
			||||||
        <div
 | 
					        <div
 | 
				
			||||||
          tabIndex='0'
 | 
					          tabIndex='0'
 | 
				
			||||||
          ref={this.setRef}
 | 
					          ref={this.setRef}
 | 
				
			||||||
| 
						 | 
					@ -222,8 +229,14 @@ export default class StatusContent extends React.PureComponent {
 | 
				
			||||||
          style={directionStyle}
 | 
					          style={directionStyle}
 | 
				
			||||||
          dangerouslySetInnerHTML={content}
 | 
					          dangerouslySetInnerHTML={content}
 | 
				
			||||||
          lang={status.get('language')}
 | 
					          lang={status.get('language')}
 | 
				
			||||||
        />
 | 
					        />,
 | 
				
			||||||
      );
 | 
					      ];
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					      if (status.get('poll')) {
 | 
				
			||||||
 | 
					        output.push(<PollContainer pollId={status.get('poll')} />);
 | 
				
			||||||
 | 
					      }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					      return output;
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -13,7 +13,6 @@ import Video from '../../video';
 | 
				
			||||||
import scheduleIdleTask from '../../ui/util/schedule_idle_task';
 | 
					import scheduleIdleTask from '../../ui/util/schedule_idle_task';
 | 
				
			||||||
import classNames from 'classnames';
 | 
					import classNames from 'classnames';
 | 
				
			||||||
import Icon from 'mastodon/components/icon';
 | 
					import Icon from 'mastodon/components/icon';
 | 
				
			||||||
import PollContainer from 'mastodon/containers/poll_container';
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
export default class DetailedStatus extends ImmutablePureComponent {
 | 
					export default class DetailedStatus extends ImmutablePureComponent {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -107,9 +106,7 @@ export default class DetailedStatus extends ImmutablePureComponent {
 | 
				
			||||||
      outerStyle.height = `${this.state.height}px`;
 | 
					      outerStyle.height = `${this.state.height}px`;
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    if (status.get('poll')) {
 | 
					    if (status.get('media_attachments').size > 0) {
 | 
				
			||||||
      media = <PollContainer pollId={status.get('poll')} />;
 | 
					 | 
				
			||||||
    } else if (status.get('media_attachments').size > 0) {
 | 
					 | 
				
			||||||
      if (status.getIn(['media_attachments', 0, 'type']) === 'video') {
 | 
					      if (status.getIn(['media_attachments', 0, 'type']) === 'video') {
 | 
				
			||||||
        const video = status.getIn(['media_attachments', 0]);
 | 
					        const video = status.getIn(['media_attachments', 0]);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -126,15 +126,15 @@ function main() {
 | 
				
			||||||
    return false;
 | 
					    return false;
 | 
				
			||||||
  });
 | 
					  });
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  delegate(document, '.status__content__spoiler-link', 'click', ({ target }) => {
 | 
					  delegate(document, '.status__content__spoiler-link', 'click', function() {
 | 
				
			||||||
    const contentEl = target.parentNode.parentNode.querySelector('.e-content');
 | 
					    const contentEl = this.parentNode.parentNode.querySelector('.e-content');
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    if (contentEl.style.display === 'block') {
 | 
					    if (contentEl.style.display === 'block') {
 | 
				
			||||||
      contentEl.style.display = 'none';
 | 
					      contentEl.style.display = 'none';
 | 
				
			||||||
      target.parentNode.style.marginBottom = 0;
 | 
					      this.parentNode.style.marginBottom = 0;
 | 
				
			||||||
    } else {
 | 
					    } else {
 | 
				
			||||||
      contentEl.style.display = 'block';
 | 
					      contentEl.style.display = 'block';
 | 
				
			||||||
      target.parentNode.style.marginBottom = null;
 | 
					      this.parentNode.style.marginBottom = null;
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    return false;
 | 
					    return false;
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -19,13 +19,14 @@
 | 
				
			||||||
    - if status.spoiler_text?
 | 
					    - if status.spoiler_text?
 | 
				
			||||||
      %p{ :style => ('margin-bottom: 0' unless current_account&.user&.setting_expand_spoilers) }<
 | 
					      %p{ :style => ('margin-bottom: 0' unless current_account&.user&.setting_expand_spoilers) }<
 | 
				
			||||||
        %span.p-summary> #{Formatter.instance.format_spoiler(status, autoplay: autoplay)} 
 | 
					        %span.p-summary> #{Formatter.instance.format_spoiler(status, autoplay: autoplay)} 
 | 
				
			||||||
        %a.status__content__spoiler-link{ href: '#' }= t('statuses.show_more')
 | 
					        %button.status__content__spoiler-link= t('statuses.show_more')
 | 
				
			||||||
    .e-content{ lang: status.language, style: "display: #{!current_account&.user&.setting_expand_spoilers && status.spoiler_text? ? 'none' : 'block'}; direction: #{rtl_status?(status) ? 'rtl' : 'ltr'}" }= Formatter.instance.format(status, custom_emojify: true, autoplay: autoplay)
 | 
					    .e-content{ lang: status.language, style: "display: #{!current_account&.user&.setting_expand_spoilers && status.spoiler_text? ? 'none' : 'block'}; direction: #{rtl_status?(status) ? 'rtl' : 'ltr'}" }
 | 
				
			||||||
 | 
					      = Formatter.instance.format(status, custom_emojify: true, autoplay: autoplay)
 | 
				
			||||||
 | 
					      - if status.preloadable_poll
 | 
				
			||||||
 | 
					        = react_component :poll, disabled: true, poll: ActiveModelSerializers::SerializableResource.new(status.preloadable_poll, serializer: REST::PollSerializer, scope: current_user, scope_name: :current_user).as_json do
 | 
				
			||||||
 | 
					          = render partial: 'stream_entries/poll', locals: { status: status, poll: status.preloadable_poll, autoplay: autoplay }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  - if status.preloadable_poll
 | 
					  - if !status.media_attachments.empty?
 | 
				
			||||||
    = react_component :poll, disabled: true, poll: ActiveModelSerializers::SerializableResource.new(status.preloadable_poll, serializer: REST::PollSerializer, scope: current_user, scope_name: :current_user).as_json do
 | 
					 | 
				
			||||||
      = render partial: 'stream_entries/poll', locals: { status: status, poll: status.preloadable_poll, autoplay: autoplay }
 | 
					 | 
				
			||||||
  - elsif !status.media_attachments.empty?
 | 
					 | 
				
			||||||
    - if status.media_attachments.first.video?
 | 
					    - if status.media_attachments.first.video?
 | 
				
			||||||
      - video = status.media_attachments.first
 | 
					      - video = status.media_attachments.first
 | 
				
			||||||
      = react_component :video, src: video.file.url(:original), preview: video.file.url(:small), blurhash: video.blurhash, sensitive: !current_account&.user&.show_all_media? && status.sensitive? || current_account&.user&.hide_all_media?, width: 670, height: 380, detailed: true, inline: true, alt: video.description do
 | 
					      = react_component :video, src: video.file.url(:original), preview: video.file.url(:small), blurhash: video.blurhash, sensitive: !current_account&.user&.show_all_media? && status.sensitive? || current_account&.user&.hide_all_media?, width: 670, height: 380, detailed: true, inline: true, alt: video.description do
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -23,13 +23,14 @@
 | 
				
			||||||
    - if status.spoiler_text?
 | 
					    - if status.spoiler_text?
 | 
				
			||||||
      %p{ :style => ('margin-bottom: 0' unless current_account&.user&.setting_expand_spoilers) }<
 | 
					      %p{ :style => ('margin-bottom: 0' unless current_account&.user&.setting_expand_spoilers) }<
 | 
				
			||||||
        %span.p-summary> #{Formatter.instance.format_spoiler(status, autoplay: autoplay)} 
 | 
					        %span.p-summary> #{Formatter.instance.format_spoiler(status, autoplay: autoplay)} 
 | 
				
			||||||
        %a.status__content__spoiler-link{ href: '#' }= t('statuses.show_more')
 | 
					        %button.status__content__spoiler-link= t('statuses.show_more')
 | 
				
			||||||
    .e-content{ lang: status.language, style: "display: #{!current_account&.user&.setting_expand_spoilers && status.spoiler_text? ? 'none' : 'block'}; direction: #{rtl_status?(status) ? 'rtl' : 'ltr'}" }= Formatter.instance.format(status, custom_emojify: true, autoplay: autoplay)
 | 
					    .e-content{ lang: status.language, style: "display: #{!current_account&.user&.setting_expand_spoilers && status.spoiler_text? ? 'none' : 'block'}; direction: #{rtl_status?(status) ? 'rtl' : 'ltr'}" }
 | 
				
			||||||
 | 
					      = Formatter.instance.format(status, custom_emojify: true, autoplay: autoplay)
 | 
				
			||||||
 | 
					      - if status.preloadable_poll
 | 
				
			||||||
 | 
					        = react_component :poll, disabled: true, poll: ActiveModelSerializers::SerializableResource.new(status.preloadable_poll, serializer: REST::PollSerializer, scope: current_user, scope_name: :current_user).as_json do
 | 
				
			||||||
 | 
					          = render partial: 'stream_entries/poll', locals: { status: status, poll: status.preloadable_poll, autoplay: autoplay }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  - if status.preloadable_poll
 | 
					  - if !status.media_attachments.empty?
 | 
				
			||||||
    = react_component :poll, disabled: true, poll: ActiveModelSerializers::SerializableResource.new(status.preloadable_poll, serializer: REST::PollSerializer, scope: current_user, scope_name: :current_user).as_json do
 | 
					 | 
				
			||||||
      = render partial: 'stream_entries/poll', locals: { status: status, poll: status.preloadable_poll, autoplay: autoplay }
 | 
					 | 
				
			||||||
  - elsif !status.media_attachments.empty?
 | 
					 | 
				
			||||||
    - if status.media_attachments.first.video?
 | 
					    - if status.media_attachments.first.video?
 | 
				
			||||||
      - video = status.media_attachments.first
 | 
					      - video = status.media_attachments.first
 | 
				
			||||||
      = react_component :video, src: video.file.url(:original), preview: video.file.url(:small), blurhash: video.blurhash, sensitive: !current_account&.user&.show_all_media? && status.sensitive? || current_account&.user&.hide_all_media?, width: 610, height: 343, inline: true, alt: video.description do
 | 
					      = react_component :video, src: video.file.url(:original), preview: video.file.url(:small), blurhash: video.blurhash, sensitive: !current_account&.user&.show_all_media? && status.sensitive? || current_account&.user&.hide_all_media?, width: 610, height: 343, inline: true, alt: video.description do
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
		Loading…
	
	Add table
		
		Reference in a new issue