Add option to not automatically unfold content warnings matching a regexp

Fixes #678
master
Thibaut Girka 6 years ago committed by ThibG
parent 5c400a2842
commit c6942a5283
  1. 14
      app/javascript/flavours/glitch/components/status.js
  2. 13
      app/javascript/flavours/glitch/features/local_settings/page/index.js
  3. 8
      app/javascript/flavours/glitch/features/status/index.js
  4. 1
      app/javascript/flavours/glitch/reducers/local_settings.js
  5. 19
      app/javascript/flavours/glitch/util/content_warning.js

@ -13,6 +13,7 @@ import { MediaGallery, Video } from 'flavours/glitch/util/async-components';
import { HotKeys } from 'react-hotkeys';
import NotificationOverlayContainer from 'flavours/glitch/features/notifications/containers/overlay_container';
import classNames from 'classnames';
import { autoUnfoldCW } from 'flavours/glitch/util/content_warning';
// We use the component (and not the container) since we do not want
// to use the progress bar to show download progress
@ -56,7 +57,7 @@ export default class Status extends ImmutablePureComponent {
state = {
isCollapsed: false,
autoCollapsed: false,
isExpanded: this.props.settings.getIn(['content_warnings', 'auto_unfold']),
isExpanded: undefined,
}
// Avoid checking props that are functions (and whose equality will always
@ -124,6 +125,17 @@ export default class Status extends ImmutablePureComponent {
updated = true;
}
if (nextProps.expanded === undefined &&
prevState.isExpanded === undefined &&
update.isExpanded === undefined
) {
const isExpanded = autoUnfoldCW(nextProps.settings, nextProps.status);
if (isExpanded !== undefined) {
update.isExpanded = isExpanded;
updated = true;
}
}
return updated ? update : null;
}

@ -17,6 +17,7 @@ const messages = defineMessages({
side_arm_keep: { id: 'settings.side_arm_reply_mode.keep', defaultMessage: 'Keep secondary toot button to set privacy' },
side_arm_copy: { id: 'settings.side_arm_reply_mode.copy', defaultMessage: 'Copy privacy setting of the toot being replied to' },
side_arm_restrict: { id: 'settings.side_arm_reply_mode.restrict', defaultMessage: 'Restrict privacy setting to that of the toot being replied to' },
regexp: { id: 'settings.content_warnings.regexp', defaultMessage: 'Regular expression' },
});
@injectIntl
@ -122,7 +123,7 @@ export default class LocalSettingsPage extends React.PureComponent {
</section>
</div>
),
({ onChange, settings }) => (
({ intl, onChange, settings }) => (
<div className='glitch local-settings__page content_warnings'>
<h1><FormattedMessage id='settings.content_warnings' defaultMessage='Content warnings' /></h1>
<LocalSettingsPageItem
@ -133,6 +134,16 @@ export default class LocalSettingsPage extends React.PureComponent {
>
<FormattedMessage id='settings.enable_content_warnings_auto_unfold' defaultMessage='Automatically unfold content-warnings' />
</LocalSettingsPageItem>
<LocalSettingsPageItem
settings={settings}
item={['content_warnings', 'filter']}
id='mastodon-settings--content_warnings-auto_unfold'
onChange={onChange}
dependsOn={[['content_warnings', 'auto_unfold']]}
placeholder={intl.formatMessage(messages.regexp)}
>
<FormattedMessage id='settings.content_warnings_filter' defaultMessage='Content warnings to not automatically unfold:' />
</LocalSettingsPageItem>
</div>
),
({ onChange, settings }) => (

@ -38,6 +38,7 @@ import ImmutablePureComponent from 'react-immutable-pure-component';
import { HotKeys } from 'react-hotkeys';
import { boostModal, favouriteModal, deleteModal } from 'flavours/glitch/util/initial_state';
import { attachFullscreenListener, detachFullscreenListener, isFullscreen } from 'flavours/glitch/util/fullscreen';
import { autoUnfoldCW } from 'flavours/glitch/util/content_warning';
const messages = defineMessages({
deleteConfirm: { id: 'confirmations.delete.confirm', defaultMessage: 'Delete' },
@ -82,7 +83,7 @@ export default class Status extends ImmutablePureComponent {
state = {
fullscreen: false,
isExpanded: this.props.settings.getIn(['content_warnings', 'auto_unfold']),
isExpanded: undefined,
threadExpanded: undefined,
};
@ -95,9 +96,14 @@ export default class Status extends ImmutablePureComponent {
}
componentWillReceiveProps (nextProps) {
if (this.state.isExpanded === undefined) {
const isExpanded = autoUnfoldCW(nextProps.settings, nextProps.status);
if (isExpanded !== undefined) this.setState({ isExpanded: isExpanded });
}
if (nextProps.params.statusId !== this.props.params.statusId && nextProps.params.statusId) {
this._scrolledIntoView = false;
this.props.dispatch(fetchStatus(nextProps.params.statusId));
this.setState({ isExpanded: autoUnfoldCW(nextProps.settings, nextProps.status) });
}
}

@ -16,6 +16,7 @@ const initialState = ImmutableMap({
confirm_missing_media_description: false,
content_warnings : ImmutableMap({
auto_unfold : false,
filter : null,
}),
collapsed : ImmutableMap({
enabled : true,

@ -0,0 +1,19 @@
export function autoUnfoldCW (settings, status) {
if (!settings.getIn(['content_warnings', 'auto_unfold'])) {
return false;
}
const rawRegex = settings.getIn(['content_warnings', 'filter']);
let regex = null;
try {
regex = rawRegex && new RegExp(rawRegex.trim(), 'i');
} catch (e) {
// Bad regex, don't affect filters
}
if (!(status && regex)) {
return undefined;
}
return !regex.test(status.get('spoiler_text'));
}
Loading…
Cancel
Save