~cytrogen/masto-fe

9cde97cabcb3b1c40632950d681ac3d11218e164 — Cytrogen 14 days ago 96ba9cb + a4bd5b0
Merge PR #84: Confirmation dialogs

Adds local settings to toggle confirmation dialogs for boost, favourite,
delete, and unfollow actions. Replaces server-side boostModal/deleteModal
globals with client-side local_settings.

From: Ittihadyya (https://codeberg.org/superseriousbusiness/masto-fe-standalone/pulls/84)
M app/javascript/flavours/glitch/containers/status_container.js => app/javascript/flavours/glitch/containers/status_container.js +20 -16
@@ 38,7 38,6 @@ import {
  undoStatusTranslation,
} from "flavours/glitch/actions/statuses";
import Status from "flavours/glitch/components/status";
import { boostModal, favouriteModal, deleteModal } from "flavours/glitch/initial_state";
import { makeGetStatus, makeGetPictureInPicture } from "flavours/glitch/selectors";

import { showAlertForError } from "../actions/alerts";


@@ 127,7 126,7 @@ const mapDispatchToProps = (dispatch, { intl, contextType }) => ({
      let state = getState();
      if (state.getIn(["local_settings", "confirm_boost_missing_media_description"]) && status.get("media_attachments").some(item => !item.get("description")) && !status.get("reblogged")) {
        dispatch(initBoostModal({ status, onReblog: this.onModalReblog, missingMediaDescription: true }));
      } else if (e.shiftKey || !boostModal) {
      } else if (e.shiftKey || !state.getIn(['local_settings', 'confirm_boost']) || status.get('reblogged')) {
        this.onModalReblog(status);
      } else {
        dispatch(initBoostModal({ status, onReblog: this.onModalReblog }));


@@ 148,10 147,12 @@ const mapDispatchToProps = (dispatch, { intl, contextType }) => ({
  },

  onFavourite (status, e) {
    dispatch((_, getState) => {
    let state = getState();
    if (status.get("favourited")) {
      dispatch(unfavourite(status));
    } else {
      if (e.shiftKey || !favouriteModal) {
      if (e.shiftKey || !state.getIn(['local_settings', 'confirm_favourite'])) {
        this.onModalFavourite(status);
      } else {
        dispatch(openModal({


@@ 162,7 163,7 @@ const mapDispatchToProps = (dispatch, { intl, contextType }) => ({
          },
        }));
      }
    }
    }});
  },

  onPin (status) {


@@ 184,18 185,21 @@ const mapDispatchToProps = (dispatch, { intl, contextType }) => ({
  },

  onDelete (status, history, withRedraft = false) {
    if (!deleteModal) {
      dispatch(deleteStatus(status.get("id"), history, withRedraft));
    } else {
      dispatch(openModal({
        modalType: "CONFIRM",
        modalProps: {
          message: intl.formatMessage(withRedraft ? messages.redraftMessage : messages.deleteMessage),
          confirm: intl.formatMessage(withRedraft ? messages.redraftConfirm : messages.deleteConfirm),
          onConfirm: () => dispatch(deleteStatus(status.get("id"), history, withRedraft)),
        },
      }));
    }
    dispatch((_, getState) => {
      let state = getState();
      if (!state.getIn(['local_settings', 'confirm_delete'])) {
        dispatch(deleteStatus(status.get("id"), history, withRedraft));
      } else {
        dispatch(openModal({
          modalType: "CONFIRM",
          modalProps: {
            message: intl.formatMessage(withRedraft ? messages.redraftMessage : messages.deleteMessage),
            confirm: intl.formatMessage(withRedraft ? messages.redraftConfirm : messages.deleteConfirm),
            onConfirm: () => dispatch(deleteStatus(status.get("id"), history, withRedraft)),
          },
        }));
      }
    });
  },

  onEdit (status, history) {

M app/javascript/flavours/glitch/features/local_settings/page/index.jsx => app/javascript/flavours/glitch/features/local_settings/page/index.jsx +36 -0
@@ 109,6 109,42 @@ class LocalSettingsPage extends PureComponent {
          <FormattedMessage id='settings.rewrite_mentions' defaultMessage='Rewrite mentions in displayed statuses' />
        </LocalSettingsPageItem>
        <section>
          <h2><FormattedMessage id='settings.confirmation_dialogs' defaultMessage='Confirmation Dialogs'/></h2>
          <LocalSettingsPageItem
            settings={settings}
            item={['confirm_unfollow']}
            id='mastodon-settings--confirm_unfollow'
            onChange={onChange}
          >
            <FormattedMessage id='settings.confirm_unfollow' defaultMessage='Show a confirmation dialog before unfollowing an account' />
          </LocalSettingsPageItem> 
          <LocalSettingsPageItem
            settings={settings}
            item={['confirm_delete']}
            id='mastodon-settings--confirm_delete'
            onChange={onChange}
          >
            <FormattedMessage id='settings.confirm_delete' defaultMessage='Show a confirmation dialog before deleting a post' />
          </LocalSettingsPageItem>
          <LocalSettingsPageItem
            settings={settings}
            item={['confirm_boost']}
            id='mastodon-settings--confirm_boost'
            onChange={onChange}
          >
            <FormattedMessage id='settings.confirm_boost' defaultMessage='Show a confirmation dialog before boosting a post' />
          </LocalSettingsPageItem>
          <LocalSettingsPageItem
            settings={settings}
            item={['confirm_favourite']}
            id='mastodon-settings--confirm_favourite'
            onChange={onChange}
          >
            <FormattedMessage id='settings.confirm_favourite' defaultMessage='Show a confirmation dialog before favouriting a post' />
          </LocalSettingsPageItem>
          
        </section>
        <section>
          <h2><FormattedMessage id='settings.notifications_opts' defaultMessage='Notifications options' /></h2>
          <LocalSettingsPageItem
            settings={settings}

M app/javascript/flavours/glitch/features/status/index.jsx => app/javascript/flavours/glitch/features/status/index.jsx +5 -6
@@ 52,7 52,6 @@ import ScrollContainer from "flavours/glitch/containers/scroll_container";
import StatusContainer from "flavours/glitch/containers/status_container";
import BundleColumnError from "flavours/glitch/features/ui/components/bundle_column_error";
import Column from "flavours/glitch/features/ui/components/column";
import { boostModal, favouriteModal, deleteModal } from "flavours/glitch/initial_state";
import { makeGetStatus, makeGetPictureInPicture } from "flavours/glitch/selectors";
import { autoUnfoldCW } from "flavours/glitch/utils/content_warning";



@@ 275,14 274,14 @@ class Status extends ImmutablePureComponent {
  };

  handleFavouriteClick = (status, e) => {
    const { dispatch } = this.props;
    const { settings, dispatch } = this.props;
    const { signedIn } = this.context.identity;

    if (signedIn) {
      if (status.get("favourited")) {
        dispatch(unfavourite(status));
      } else {
        if ((e && e.shiftKey) || !favouriteModal) {
        if ((e && e.shiftKey) || !settings.get('confirm_favourite')) {
          this.handleModalFavourite(status);
        } else {
          dispatch(openModal({


@@ 361,7 360,7 @@ class Status extends ImmutablePureComponent {
    if (signedIn) {
      if (settings.get("confirm_boost_missing_media_description") && status.get("media_attachments").some(item => !item.get("description")) && !status.get("reblogged")) {
        dispatch(initBoostModal({ status, onReblog: this.handleModalReblog, missingMediaDescription: true }));
      } else if ((e && e.shiftKey) || !boostModal) {
      } else if ((e && e.shiftKey) || !settings.get('confirm_boost') || status.get('reblogged')) {
        this.handleModalReblog(status);
      } else {
        dispatch(initBoostModal({ status, onReblog: this.handleModalReblog }));


@@ 387,9 386,9 @@ class Status extends ImmutablePureComponent {
  };

  handleDeleteClick = (status, history, withRedraft = false) => {
    const { dispatch, intl } = this.props;
    const { settings, dispatch, intl } = this.props;

    if (!deleteModal) {
    if (!settings.get('confirm_delete')) {
      dispatch(deleteStatus(status.get("id"), history, withRedraft));
    } else {
      dispatch(openModal({

M app/javascript/flavours/glitch/locales/en.json => app/javascript/flavours/glitch/locales/en.json +4 -0
@@ 163,6 163,10 @@
  "settings.rewrite_mentions_acct": "Rewrite with username and domain (when the account is remote)",
  "settings.rewrite_mentions_no": "Do not rewrite mentions",
  "settings.rewrite_mentions_username": "Rewrite with username",
  "settings.confirm_unfollow": "Show a confirmation dialog before unfollowing an account",
  "settings.confirm_boost": "Show a confirmation dialog before boosting",
  "settings.confirm_delete": "Show a confirmation dialog before deleting a post",
  "settings.confirm_favourite": "Show a confirmation dialog before favouriting a post",
  "settings.shared_settings_link": "user preferences",
  "settings.show_action_bar": "Show action buttons in collapsed toots",
  "settings.show_content_type_choice": "Show content-type choice when authoring toots",

M app/javascript/flavours/glitch/reducers/local_settings.js => app/javascript/flavours/glitch/reducers/local_settings.js +4 -0
@@ 22,6 22,10 @@ const initialState = ImmutableMap({
  show_content_type_choice: true,
  tag_misleading_links: true,
  rewrite_mentions: "no",
  confirm_unfollow: true,
  confirm_delete: true,
  confirm_boost: false,
  confirm_favourite: false,
  content_warnings : ImmutableMap({
    auto_unfold  : false,
    filter       : null,