mirror of
https://github.com/glitch-soc/mastodon.git
synced 2025-12-16 17:29:14 +00:00
[Glitch] Remove the outgoing_quotes feature flag, making the feature unconditional
Port e1f7847b64 to glitch-soc
Signed-off-by: Claire <claire.github-309c@sitedethib.com>
This commit is contained in:
@@ -3,7 +3,7 @@ import type { Meta, StoryObj } from '@storybook/react-vite';
|
|||||||
import type { StatusVisibility } from '@/flavours/glitch/api_types/statuses';
|
import type { StatusVisibility } from '@/flavours/glitch/api_types/statuses';
|
||||||
import { statusFactoryState } from '@/testing/factories';
|
import { statusFactoryState } from '@/testing/factories';
|
||||||
|
|
||||||
import { LegacyReblogButton, StatusBoostButton } from './boost_button';
|
import { BoostButton } from './boost_button';
|
||||||
|
|
||||||
interface StoryProps {
|
interface StoryProps {
|
||||||
visibility: StatusVisibility;
|
visibility: StatusVisibility;
|
||||||
@@ -38,10 +38,7 @@ const meta = {
|
|||||||
},
|
},
|
||||||
},
|
},
|
||||||
render: (args) => (
|
render: (args) => (
|
||||||
<StatusBoostButton
|
<BoostButton status={argsToStatus(args)} counters={args.reblogCount > 0} />
|
||||||
status={argsToStatus(args)}
|
|
||||||
counters={args.reblogCount > 0}
|
|
||||||
/>
|
|
||||||
),
|
),
|
||||||
} satisfies Meta<StoryProps>;
|
} satisfies Meta<StoryProps>;
|
||||||
|
|
||||||
@@ -78,12 +75,3 @@ export const Mine: Story = {
|
|||||||
},
|
},
|
||||||
},
|
},
|
||||||
};
|
};
|
||||||
|
|
||||||
export const Legacy: Story = {
|
|
||||||
render: (args) => (
|
|
||||||
<LegacyReblogButton
|
|
||||||
status={argsToStatus(args)}
|
|
||||||
counters={args.reblogCount > 0}
|
|
||||||
/>
|
|
||||||
),
|
|
||||||
};
|
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
import { useCallback, useMemo } from 'react';
|
import { useCallback, useMemo } from 'react';
|
||||||
import type { FC, KeyboardEvent, MouseEvent, MouseEventHandler } from 'react';
|
import type { FC, KeyboardEvent, MouseEvent } from 'react';
|
||||||
|
|
||||||
import { useIntl } from 'react-intl';
|
import { useIntl } from 'react-intl';
|
||||||
|
|
||||||
@@ -11,7 +11,6 @@ import { openModal } from '@/flavours/glitch/actions/modal';
|
|||||||
import type { ActionMenuItem } from '@/flavours/glitch/models/dropdown_menu';
|
import type { ActionMenuItem } from '@/flavours/glitch/models/dropdown_menu';
|
||||||
import type { Status } from '@/flavours/glitch/models/status';
|
import type { Status } from '@/flavours/glitch/models/status';
|
||||||
import { useAppDispatch, useAppSelector } from '@/flavours/glitch/store';
|
import { useAppDispatch, useAppSelector } from '@/flavours/glitch/store';
|
||||||
import { isFeatureEnabled } from '@/flavours/glitch/utils/environment';
|
|
||||||
import type { SomeRequired } from '@/flavours/glitch/utils/types';
|
import type { SomeRequired } from '@/flavours/glitch/utils/types';
|
||||||
|
|
||||||
import type { RenderItemFn, RenderItemFnHandlers } from '../dropdown_menu';
|
import type { RenderItemFn, RenderItemFnHandlers } from '../dropdown_menu';
|
||||||
@@ -47,10 +46,7 @@ interface ReblogButtonProps {
|
|||||||
|
|
||||||
type ActionMenuItemWithIcon = SomeRequired<ActionMenuItem, 'icon'>;
|
type ActionMenuItemWithIcon = SomeRequired<ActionMenuItem, 'icon'>;
|
||||||
|
|
||||||
export const StatusBoostButton: FC<ReblogButtonProps> = ({
|
export const BoostButton: FC<ReblogButtonProps> = ({ status, counters }) => {
|
||||||
status,
|
|
||||||
counters,
|
|
||||||
}) => {
|
|
||||||
const intl = useIntl();
|
const intl = useIntl();
|
||||||
const dispatch = useAppDispatch();
|
const dispatch = useAppDispatch();
|
||||||
const statusState = useAppSelector((state) =>
|
const statusState = useAppSelector((state) =>
|
||||||
@@ -192,65 +188,3 @@ const ReblogMenuItem: FC<ReblogMenuItemProps> = ({
|
|||||||
</li>
|
</li>
|
||||||
);
|
);
|
||||||
};
|
};
|
||||||
|
|
||||||
// Legacy helpers
|
|
||||||
|
|
||||||
// Switch between the legacy and new reblog button based on feature flag.
|
|
||||||
export const BoostButton: FC<ReblogButtonProps> = (props) => {
|
|
||||||
if (isFeatureEnabled('outgoing_quotes')) {
|
|
||||||
return <StatusBoostButton {...props} />;
|
|
||||||
}
|
|
||||||
return <LegacyReblogButton {...props} />;
|
|
||||||
};
|
|
||||||
|
|
||||||
export const LegacyReblogButton: FC<ReblogButtonProps> = ({
|
|
||||||
status,
|
|
||||||
counters,
|
|
||||||
}) => {
|
|
||||||
const intl = useIntl();
|
|
||||||
const statusState = useAppSelector((state) =>
|
|
||||||
selectStatusState(state, status),
|
|
||||||
);
|
|
||||||
|
|
||||||
const { title, meta, iconComponent, disabled } = useMemo(
|
|
||||||
() => boostItemState(statusState),
|
|
||||||
[statusState],
|
|
||||||
);
|
|
||||||
|
|
||||||
const dispatch = useAppDispatch();
|
|
||||||
const handleClick: MouseEventHandler = useCallback(
|
|
||||||
(event) => {
|
|
||||||
if (statusState.isLoggedIn) {
|
|
||||||
dispatch(toggleReblog(status.get('id') as string, event.shiftKey));
|
|
||||||
} else {
|
|
||||||
dispatch(
|
|
||||||
openModal({
|
|
||||||
modalType: 'INTERACTION',
|
|
||||||
modalProps: {
|
|
||||||
accountId: status.getIn(['account', 'id']),
|
|
||||||
url: status.get('uri'),
|
|
||||||
},
|
|
||||||
}),
|
|
||||||
);
|
|
||||||
}
|
|
||||||
},
|
|
||||||
[dispatch, status, statusState.isLoggedIn],
|
|
||||||
);
|
|
||||||
|
|
||||||
return (
|
|
||||||
<IconButton
|
|
||||||
disabled={disabled}
|
|
||||||
active={!!status.get('reblogged')}
|
|
||||||
title={intl.formatMessage(meta ?? title)}
|
|
||||||
icon='retweet'
|
|
||||||
iconComponent={iconComponent}
|
|
||||||
onClick={!disabled ? handleClick : undefined}
|
|
||||||
counter={
|
|
||||||
counters
|
|
||||||
? (status.get('reblogs_count') as number) +
|
|
||||||
(status.get('quotes_count') as number)
|
|
||||||
: undefined
|
|
||||||
}
|
|
||||||
/>
|
|
||||||
);
|
|
||||||
};
|
|
||||||
|
|||||||
@@ -26,7 +26,6 @@ import { me } from '../../initial_state';
|
|||||||
|
|
||||||
import { IconButton } from '../icon_button';
|
import { IconButton } from '../icon_button';
|
||||||
import { RelativeTimestamp } from '../relative_timestamp';
|
import { RelativeTimestamp } from '../relative_timestamp';
|
||||||
import { isFeatureEnabled } from '../../utils/environment';
|
|
||||||
import { BoostButton } from '../status/boost_button';
|
import { BoostButton } from '../status/boost_button';
|
||||||
import { RemoveQuoteHint } from './remove_quote_hint';
|
import { RemoveQuoteHint } from './remove_quote_hint';
|
||||||
|
|
||||||
@@ -254,7 +253,7 @@ class StatusActionBar extends ImmutablePureComponent {
|
|||||||
|
|
||||||
if (writtenByMe || withDismiss) {
|
if (writtenByMe || withDismiss) {
|
||||||
menu.push({ text: intl.formatMessage(mutingConversation ? messages.unmuteConversation : messages.muteConversation), action: this.handleConversationMuteClick });
|
menu.push({ text: intl.formatMessage(mutingConversation ? messages.unmuteConversation : messages.muteConversation), action: this.handleConversationMuteClick });
|
||||||
if (writtenByMe && isFeatureEnabled('outgoing_quotes') && !['private', 'direct'].includes(status.get('visibility'))) {
|
if (writtenByMe && !['private', 'direct'].includes(status.get('visibility'))) {
|
||||||
menu.push({ text: intl.formatMessage(messages.quotePolicyChange), action: this.handleQuotePolicyChange });
|
menu.push({ text: intl.formatMessage(messages.quotePolicyChange), action: this.handleQuotePolicyChange });
|
||||||
}
|
}
|
||||||
menu.push(null);
|
menu.push(null);
|
||||||
|
|||||||
@@ -35,7 +35,6 @@ import {
|
|||||||
import Status from 'flavours/glitch/components/status';
|
import Status from 'flavours/glitch/components/status';
|
||||||
import { deleteModal } from 'flavours/glitch/initial_state';
|
import { deleteModal } from 'flavours/glitch/initial_state';
|
||||||
import { makeGetStatus, makeGetPictureInPicture } from 'flavours/glitch/selectors';
|
import { makeGetStatus, makeGetPictureInPicture } from 'flavours/glitch/selectors';
|
||||||
import { isFeatureEnabled } from 'flavours/glitch/utils/environment';
|
|
||||||
|
|
||||||
import { setStatusQuotePolicy } from '../actions/statuses_typed';
|
import { setStatusQuotePolicy } from '../actions/statuses_typed';
|
||||||
|
|
||||||
@@ -85,9 +84,7 @@ const mapDispatchToProps = (dispatch, { contextType }) => ({
|
|||||||
},
|
},
|
||||||
|
|
||||||
onQuote (status) {
|
onQuote (status) {
|
||||||
if (isFeatureEnabled('outgoing_quotes')) {
|
|
||||||
dispatch(quoteComposeById(status.get('id')));
|
dispatch(quoteComposeById(status.get('id')));
|
||||||
}
|
|
||||||
},
|
},
|
||||||
|
|
||||||
onReblog (status, e) {
|
onReblog (status, e) {
|
||||||
|
|||||||
@@ -12,14 +12,12 @@ import type { ApiQuotePolicy } from '@/flavours/glitch/api_types/quotes';
|
|||||||
import type { StatusVisibility } from '@/flavours/glitch/api_types/statuses';
|
import type { StatusVisibility } from '@/flavours/glitch/api_types/statuses';
|
||||||
import { Icon } from '@/flavours/glitch/components/icon';
|
import { Icon } from '@/flavours/glitch/components/icon';
|
||||||
import { useAppSelector, useAppDispatch } from '@/flavours/glitch/store';
|
import { useAppSelector, useAppDispatch } from '@/flavours/glitch/store';
|
||||||
import { isFeatureEnabled } from '@/flavours/glitch/utils/environment';
|
|
||||||
import AlternateEmailIcon from '@/material-icons/400-24px/alternate_email.svg?react';
|
import AlternateEmailIcon from '@/material-icons/400-24px/alternate_email.svg?react';
|
||||||
import LockIcon from '@/material-icons/400-24px/lock.svg?react';
|
import LockIcon from '@/material-icons/400-24px/lock.svg?react';
|
||||||
import PublicIcon from '@/material-icons/400-24px/public.svg?react';
|
import PublicIcon from '@/material-icons/400-24px/public.svg?react';
|
||||||
import QuietTimeIcon from '@/material-icons/400-24px/quiet_time.svg?react';
|
import QuietTimeIcon from '@/material-icons/400-24px/quiet_time.svg?react';
|
||||||
|
|
||||||
import type { VisibilityModalCallback } from '../../ui/components/visibility_modal';
|
import type { VisibilityModalCallback } from '../../ui/components/visibility_modal';
|
||||||
import PrivacyDropdownContainer from '../containers/privacy_dropdown_container';
|
|
||||||
|
|
||||||
import { messages as privacyMessages } from './privacy_dropdown';
|
import { messages as privacyMessages } from './privacy_dropdown';
|
||||||
|
|
||||||
@@ -43,9 +41,6 @@ interface PrivacyDropdownProps {
|
|||||||
}
|
}
|
||||||
|
|
||||||
export const VisibilityButton: FC<PrivacyDropdownProps> = (props) => {
|
export const VisibilityButton: FC<PrivacyDropdownProps> = (props) => {
|
||||||
if (!isFeatureEnabled('outgoing_quotes')) {
|
|
||||||
return <PrivacyDropdownContainer {...props} />;
|
|
||||||
}
|
|
||||||
return <PrivacyModalButton {...props} />;
|
return <PrivacyModalButton {...props} />;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|||||||
@@ -9,7 +9,6 @@ import ImmutablePureComponent from 'react-immutable-pure-component';
|
|||||||
import InfoIcon from '@/material-icons/400-24px/info.svg?react';
|
import InfoIcon from '@/material-icons/400-24px/info.svg?react';
|
||||||
import Column from 'flavours/glitch/components/column';
|
import Column from 'flavours/glitch/components/column';
|
||||||
import ColumnHeader from 'flavours/glitch/components/column_header';
|
import ColumnHeader from 'flavours/glitch/components/column_header';
|
||||||
import { isFeatureEnabled } from 'flavours/glitch/utils/environment';
|
|
||||||
|
|
||||||
const messages = defineMessages({
|
const messages = defineMessages({
|
||||||
heading: { id: 'keyboard_shortcuts.heading', defaultMessage: 'Keyboard Shortcuts' },
|
heading: { id: 'keyboard_shortcuts.heading', defaultMessage: 'Keyboard Shortcuts' },
|
||||||
@@ -63,12 +62,10 @@ class KeyboardShortcuts extends ImmutablePureComponent {
|
|||||||
<td><kbd>b</kbd></td>
|
<td><kbd>b</kbd></td>
|
||||||
<td><FormattedMessage id='keyboard_shortcuts.boost' defaultMessage='to boost' /></td>
|
<td><FormattedMessage id='keyboard_shortcuts.boost' defaultMessage='to boost' /></td>
|
||||||
</tr>
|
</tr>
|
||||||
{isFeatureEnabled('outgoing_quotes') && (
|
|
||||||
<tr>
|
<tr>
|
||||||
<td><kbd>q</kbd></td>
|
<td><kbd>q</kbd></td>
|
||||||
<td><FormattedMessage id='keyboard_shortcuts.quote' defaultMessage='Quote post' /></td>
|
<td><FormattedMessage id='keyboard_shortcuts.quote' defaultMessage='Quote post' /></td>
|
||||||
</tr>
|
</tr>
|
||||||
)}
|
|
||||||
<tr>
|
<tr>
|
||||||
<td><kbd>d</kbd></td>
|
<td><kbd>d</kbd></td>
|
||||||
<td><FormattedMessage id='keyboard_shortcuts.bookmark' defaultMessage='to bookmark' /></td>
|
<td><FormattedMessage id='keyboard_shortcuts.bookmark' defaultMessage='to bookmark' /></td>
|
||||||
|
|||||||
@@ -20,7 +20,6 @@ import { accountAdminLink, statusAdminLink } from 'flavours/glitch/utils/backend
|
|||||||
import { IconButton } from '../../../components/icon_button';
|
import { IconButton } from '../../../components/icon_button';
|
||||||
import { Dropdown } from 'flavours/glitch/components/dropdown_menu';
|
import { Dropdown } from 'flavours/glitch/components/dropdown_menu';
|
||||||
import { me } from '../../../initial_state';
|
import { me } from '../../../initial_state';
|
||||||
import { isFeatureEnabled } from '@/flavours/glitch/utils/environment';
|
|
||||||
import { BoostButton } from '@/flavours/glitch/components/status/boost_button';
|
import { BoostButton } from '@/flavours/glitch/components/status/boost_button';
|
||||||
|
|
||||||
const messages = defineMessages({
|
const messages = defineMessages({
|
||||||
@@ -199,7 +198,7 @@ class ActionBar extends PureComponent {
|
|||||||
}
|
}
|
||||||
|
|
||||||
menu.push({ text: intl.formatMessage(mutingConversation ? messages.unmuteConversation : messages.muteConversation), action: this.handleConversationMuteClick });
|
menu.push({ text: intl.formatMessage(mutingConversation ? messages.unmuteConversation : messages.muteConversation), action: this.handleConversationMuteClick });
|
||||||
if (isFeatureEnabled('outgoing_quotes') && !['private', 'direct'].includes(status.get('visibility'))) {
|
if (!['private', 'direct'].includes(status.get('visibility'))) {
|
||||||
menu.push({ text: intl.formatMessage(messages.quotePolicyChange), action: this.handleQuotePolicyChange });
|
menu.push({ text: intl.formatMessage(messages.quotePolicyChange), action: this.handleQuotePolicyChange });
|
||||||
}
|
}
|
||||||
menu.push(null);
|
menu.push(null);
|
||||||
|
|||||||
@@ -12,11 +12,7 @@ export function isProduction() {
|
|||||||
else return import.meta.env.PROD;
|
else return import.meta.env.PROD;
|
||||||
}
|
}
|
||||||
|
|
||||||
export type Features =
|
export type Features = 'modern_emojis' | 'fasp' | 'http_message_signatures';
|
||||||
| 'modern_emojis'
|
|
||||||
| 'outgoing_quotes'
|
|
||||||
| 'fasp'
|
|
||||||
| 'http_message_signatures';
|
|
||||||
|
|
||||||
export function isFeatureEnabled(feature: Features) {
|
export function isFeatureEnabled(feature: Features) {
|
||||||
return initialState?.features.includes(feature) ?? false;
|
return initialState?.features.includes(feature) ?? false;
|
||||||
|
|||||||
Reference in New Issue
Block a user