Merge commit '774e1189d26fffd914107a4236f6287043c988f8' into glitch-soc/merge-upstream

local
Claire 7 months ago
commit 4a9cdfb928
  1. 3
      .eslintrc.js
  2. 2
      app/javascript/mastodon/actions/alerts.js
  3. 6
      app/javascript/mastodon/actions/importer/normalizer.js
  4. 2
      app/javascript/mastodon/components/column.jsx
  5. 2
      app/javascript/mastodon/components/poll.jsx
  6. 2
      app/javascript/mastodon/components/status.jsx
  7. 2
      app/javascript/mastodon/features/compose/components/navigation_bar.jsx
  8. 16
      app/javascript/mastodon/features/compose/components/search.jsx
  9. 6
      app/javascript/mastodon/features/explore/results.jsx
  10. 2
      app/javascript/mastodon/features/firehose/index.jsx
  11. 8
      app/javascript/mastodon/features/interaction_modal/index.jsx
  12. 2
      app/javascript/mastodon/features/reblogs/index.jsx
  13. 2
      app/javascript/mastodon/features/report/comment.jsx
  14. 2
      app/javascript/mastodon/features/status/components/detailed_status.jsx
  15. 4
      app/javascript/mastodon/features/ui/components/header.jsx
  16. 2
      app/javascript/mastodon/features/ui/components/modal_root.jsx
  17. 2
      app/javascript/mastodon/features/ui/components/sign_in_banner.jsx
  18. 2
      app/javascript/packs/application.js
  19. 10
      streaming/index.js

@ -9,7 +9,6 @@ module.exports = {
'plugin:import/recommended', 'plugin:import/recommended',
'plugin:promise/recommended', 'plugin:promise/recommended',
'plugin:jsdoc/recommended', 'plugin:jsdoc/recommended',
'plugin:prettier/recommended',
], ],
env: { env: {
@ -63,7 +62,9 @@ module.exports = {
'consistent-return': 'error', 'consistent-return': 'error',
'dot-notation': 'error', 'dot-notation': 'error',
eqeqeq: ['error', 'always', { 'null': 'ignore' }], eqeqeq: ['error', 'always', { 'null': 'ignore' }],
'indent': ['error', 2],
'jsx-quotes': ['error', 'prefer-single'], 'jsx-quotes': ['error', 'prefer-single'],
'semi': ['error', 'always'],
'no-case-declarations': 'off', 'no-case-declarations': 'off',
'no-catch-shadow': 'error', 'no-catch-shadow': 'error',
'no-console': [ 'no-console': [

@ -56,4 +56,4 @@ export const showAlertForError = (error, skipNotFound = false) => {
title: messages.unexpectedTitle, title: messages.unexpectedTitle,
message: messages.unexpectedMessage, message: messages.unexpectedMessage,
}); });
} };

@ -104,7 +104,7 @@ export function normalizeStatus(status, normalOldStatus) {
normalStatus.media_attachments.forEach(item => { normalStatus.media_attachments.forEach(item => {
const oldItem = list.find(i => i.get('id') === item.id); const oldItem = list.find(i => i.get('id') === item.id);
if (oldItem && oldItem.get('description') === item.description) { if (oldItem && oldItem.get('description') === item.description) {
item.translation = oldItem.get('translation') item.translation = oldItem.get('translation');
} }
}); });
} }
@ -137,13 +137,13 @@ export function normalizePoll(poll, normalOldPoll) {
...option, ...option,
voted: poll.own_votes && poll.own_votes.includes(index), voted: poll.own_votes && poll.own_votes.includes(index),
titleHtml: emojify(escapeTextContentForBrowser(option.title), emojiMap), titleHtml: emojify(escapeTextContentForBrowser(option.title), emojiMap),
} };
if (normalOldPoll && normalOldPoll.getIn(['options', index, 'title']) === option.title) { if (normalOldPoll && normalOldPoll.getIn(['options', index, 'title']) === option.title) {
normalOption.translation = normalOldPoll.getIn(['options', index, 'translation']); normalOption.translation = normalOldPoll.getIn(['options', index, 'translation']);
} }
return normalOption return normalOption;
}); });
return normalPoll; return normalPoll;

@ -22,7 +22,7 @@ export default class Column extends PureComponent {
scrollable = document.scrollingElement; scrollable = document.scrollingElement;
} else { } else {
scrollable = this.node.querySelector('.scrollable'); scrollable = this.node.querySelector('.scrollable');
} }
if (!scrollable) { if (!scrollable) {
return; return;

@ -132,7 +132,7 @@ class Poll extends ImmutablePureComponent {
handleReveal = () => { handleReveal = () => {
this.setState({ revealed: true }); this.setState({ revealed: true });
} };
renderOption (option, optionIndex, showResults) { renderOption (option, optionIndex, showResults) {
const { poll, lang, disabled, intl } = this.props; const { poll, lang, disabled, intl } = this.props;

@ -199,7 +199,7 @@ class Status extends ImmutablePureComponent {
} else if (attachments.getIn([0, 'type']) === 'audio') { } else if (attachments.getIn([0, 'type']) === 'audio') {
return '16 / 9'; return '16 / 9';
} else { } else {
return (attachments.size === 1 && attachments.getIn([0, 'meta', 'small', 'aspect'])) ? attachments.getIn([0, 'meta', 'small', 'aspect']) : '3 / 2' return (attachments.size === 1 && attachments.getIn([0, 'meta', 'small', 'aspect'])) ? attachments.getIn([0, 'meta', 'small', 'aspect']) : '3 / 2';
} }
} }

@ -20,7 +20,7 @@ export default class NavigationBar extends ImmutablePureComponent {
}; };
render () { render () {
const username = this.props.account.get('acct') const username = this.props.account.get('acct');
return ( return (
<div className='navigation-bar'> <div className='navigation-bar'>
<Link to={`/@${username}`}> <Link to={`/@${username}`}>

@ -57,14 +57,14 @@ class Search extends PureComponent {
}; };
defaultOptions = [ defaultOptions = [
{ label: <><mark>has:</mark> <FormattedList type='disjunction' value={['media', 'poll', 'embed']} /></>, action: e => { e.preventDefault(); this._insertText('has:') } }, { label: <><mark>has:</mark> <FormattedList type='disjunction' value={['media', 'poll', 'embed']} /></>, action: e => { e.preventDefault(); this._insertText('has:'); } },
{ label: <><mark>is:</mark> <FormattedList type='disjunction' value={['reply', 'sensitive']} /></>, action: e => { e.preventDefault(); this._insertText('is:') } }, { label: <><mark>is:</mark> <FormattedList type='disjunction' value={['reply', 'sensitive']} /></>, action: e => { e.preventDefault(); this._insertText('is:'); } },
{ label: <><mark>language:</mark> <FormattedMessage id='search_popout.language_code' defaultMessage='ISO language code' /></>, action: e => { e.preventDefault(); this._insertText('language:') } }, { label: <><mark>language:</mark> <FormattedMessage id='search_popout.language_code' defaultMessage='ISO language code' /></>, action: e => { e.preventDefault(); this._insertText('language:'); } },
{ label: <><mark>from:</mark> <FormattedMessage id='search_popout.user' defaultMessage='user' /></>, action: e => { e.preventDefault(); this._insertText('from:') } }, { label: <><mark>from:</mark> <FormattedMessage id='search_popout.user' defaultMessage='user' /></>, action: e => { e.preventDefault(); this._insertText('from:'); } },
{ label: <><mark>before:</mark> <FormattedMessage id='search_popout.specific_date' defaultMessage='specific date' /></>, action: e => { e.preventDefault(); this._insertText('before:') } }, { label: <><mark>before:</mark> <FormattedMessage id='search_popout.specific_date' defaultMessage='specific date' /></>, action: e => { e.preventDefault(); this._insertText('before:'); } },
{ label: <><mark>during:</mark> <FormattedMessage id='search_popout.specific_date' defaultMessage='specific date' /></>, action: e => { e.preventDefault(); this._insertText('during:') } }, { label: <><mark>during:</mark> <FormattedMessage id='search_popout.specific_date' defaultMessage='specific date' /></>, action: e => { e.preventDefault(); this._insertText('during:'); } },
{ label: <><mark>after:</mark> <FormattedMessage id='search_popout.specific_date' defaultMessage='specific date' /></>, action: e => { e.preventDefault(); this._insertText('after:') } }, { label: <><mark>after:</mark> <FormattedMessage id='search_popout.specific_date' defaultMessage='specific date' /></>, action: e => { e.preventDefault(); this._insertText('after:'); } },
{ label: <><mark>in:</mark> <FormattedList type='disjunction' value={['all', 'library']} /></>, action: e => { e.preventDefault(); this._insertText('in:') } } { label: <><mark>in:</mark> <FormattedList type='disjunction' value={['all', 'library']} /></>, action: e => { e.preventDefault(); this._insertText('in:'); } }
]; ];
setRef = c => { setRef = c => {

@ -80,7 +80,7 @@ class Results extends PureComponent {
} }
return null; return null;
}; }
handleSelectAll = () => { handleSelectAll = () => {
const { submittedType, dispatch } = this.props; const { submittedType, dispatch } = this.props;
@ -116,7 +116,7 @@ class Results extends PureComponent {
} }
this.setState({ type: 'hashtags' }); this.setState({ type: 'hashtags' });
} };
handleSelectStatuses = () => { handleSelectStatuses = () => {
const { submittedType, dispatch } = this.props; const { submittedType, dispatch } = this.props;
@ -128,7 +128,7 @@ class Results extends PureComponent {
} }
this.setState({ type: 'statuses' }); this.setState({ type: 'statuses' });
} };
handleLoadMoreAccounts = () => this._loadMore('accounts'); handleLoadMoreAccounts = () => this._loadMore('accounts');
handleLoadMoreStatuses = () => this._loadMore('statuses'); handleLoadMoreStatuses = () => this._loadMore('statuses');

@ -199,7 +199,7 @@ const Firehose = ({ feedType, multiColumn }) => {
</Helmet> </Helmet>
</Column> </Column>
); );
} };
Firehose.propTypes = { Firehose.propTypes = {
multiColumn: PropTypes.bool, multiColumn: PropTypes.bool,

@ -27,9 +27,9 @@ const mapStateToProps = (state, { accountId }) => ({
const mapDispatchToProps = (dispatch) => ({ const mapDispatchToProps = (dispatch) => ({
onSignupClick() { onSignupClick() {
dispatch(closeModal({ dispatch(closeModal({
modalType: undefined, modalType: undefined,
ignoreFocus: false, ignoreFocus: false,
})); }));
dispatch(openModal({ modalType: 'CLOSED_REGISTRATIONS' })); dispatch(openModal({ modalType: 'CLOSED_REGISTRATIONS' }));
}, },
}); });
@ -187,7 +187,7 @@ class LoginForm extends React.PureComponent {
setIFrameRef = (iframe) => { setIFrameRef = (iframe) => {
this.iframeRef = iframe; this.iframeRef = iframe;
} };
handleFocus = () => { handleFocus = () => {
this.setState({ expanded: true }); this.setState({ expanded: true });

@ -45,7 +45,7 @@ class Reblogs extends ImmutablePureComponent {
if (!this.props.accountIds) { if (!this.props.accountIds) {
this.props.dispatch(fetchReblogs(this.props.params.statusId)); this.props.dispatch(fetchReblogs(this.props.params.statusId));
} }
}; }
handleRefresh = () => { handleRefresh = () => {
this.props.dispatch(fetchReblogs(this.props.params.statusId)); this.props.dispatch(fetchReblogs(this.props.params.statusId));

@ -104,7 +104,7 @@ const Comment = ({ comment, domain, statusIds, isRemote, isSubmitting, selectedD
</div> </div>
</> </>
); );
} };
Comment.propTypes = { Comment.propTypes = {
comment: PropTypes.string.isRequired, comment: PropTypes.string.isRequired,

@ -132,7 +132,7 @@ class DetailedStatus extends ImmutablePureComponent {
} else if (attachments.getIn([0, 'type']) === 'audio') { } else if (attachments.getIn([0, 'type']) === 'audio') {
return '16 / 9'; return '16 / 9';
} else { } else {
return (attachments.size === 1 && attachments.getIn([0, 'meta', 'small', 'aspect'])) ? attachments.getIn([0, 'meta', 'small', 'aspect']) : '3 / 2' return (attachments.size === 1 && attachments.getIn([0, 'meta', 'small', 'aspect'])) ? attachments.getIn([0, 'meta', 'small', 'aspect']) : '3 / 2';
} }
} }

@ -76,8 +76,8 @@ class Header extends PureComponent {
if (sso_redirect) { if (sso_redirect) {
content = ( content = (
<a href={sso_redirect} data-method='post' className='button button--block button-tertiary'><FormattedMessage id='sign_in_banner.sso_redirect' defaultMessage='Login or Register' /></a> <a href={sso_redirect} data-method='post' className='button button--block button-tertiary'><FormattedMessage id='sign_in_banner.sso_redirect' defaultMessage='Login or Register' /></a>
) );
} else { } else {
let signupButton; let signupButton;

@ -117,7 +117,7 @@ export default class ModalRoot extends PureComponent {
<BundleContainer fetchComponent={MODAL_COMPONENTS[type]} loading={this.renderLoading(type)} error={this.renderError} renderDelay={200}> <BundleContainer fetchComponent={MODAL_COMPONENTS[type]} loading={this.renderLoading(type)} error={this.renderError} renderDelay={200}>
{(SpecificComponent) => { {(SpecificComponent) => {
const ref = typeof SpecificComponent !== 'function' ? this.setModalRef : undefined; const ref = typeof SpecificComponent !== 'function' ? this.setModalRef : undefined;
return <SpecificComponent {...props} onChangeBackgroundColor={this.setBackgroundColor} onClose={this.handleClose} ref={ref} /> return <SpecificComponent {...props} onChangeBackgroundColor={this.setBackgroundColor} onClose={this.handleClose} ref={ref} />;
}} }}
</BundleContainer> </BundleContainer>

@ -25,7 +25,7 @@ const SignInBanner = () => {
<p><FormattedMessage id='sign_in_banner.text' defaultMessage='Login to follow profiles or hashtags, favorite, share and reply to posts. You can also interact from your account on a different server.' /></p> <p><FormattedMessage id='sign_in_banner.text' defaultMessage='Login to follow profiles or hashtags, favorite, share and reply to posts. You can also interact from your account on a different server.' /></p>
<a href={sso_redirect} data-method='post' className='button button--block button-tertiary'><FormattedMessage id='sign_in_banner.sso_redirect' defaultMessage='Login or Register' /></a> <a href={sso_redirect} data-method='post' className='button button--block button-tertiary'><FormattedMessage id='sign_in_banner.sso_redirect' defaultMessage='Login or Register' /></a>
</div> </div>
) );
} }
if (registrationsOpen) { if (registrationsOpen) {

@ -1,5 +1,5 @@
import './public-path'; import './public-path';
import main from "mastodon/main" import main from "mastodon/main";
import { start } from '../mastodon/common'; import { start } from '../mastodon/common';
import { loadLocale } from '../mastodon/locales'; import { loadLocale } from '../mastodon/locales';

@ -256,7 +256,7 @@ const startServer = async () => {
CHANNEL_NAMES.forEach(( channel ) => { CHANNEL_NAMES.forEach(( channel ) => {
connectedChannels.set({ type: 'websocket', channel }, 0); connectedChannels.set({ type: 'websocket', channel }, 0);
connectedChannels.set({ type: 'eventsource', channel }, 0); connectedChannels.set({ type: 'eventsource', channel }, 0);
}) });
// Prime the counters so that we don't loose metrics between restarts. // Prime the counters so that we don't loose metrics between restarts.
// Unfortunately counters don't support the set() API, so instead I'm using // Unfortunately counters don't support the set() API, so instead I'm using
@ -1317,7 +1317,7 @@ const startServer = async () => {
log.verbose(request.requestId, 'Subscription error:', err.toString()); log.verbose(request.requestId, 'Subscription error:', err.toString());
socket.send(JSON.stringify({ error: err.toString() })); socket.send(JSON.stringify({ error: err.toString() }));
}); });
} };
const removeSubscription = (subscriptions, channelIds, request) => { const removeSubscription = (subscriptions, channelIds, request) => {
@ -1337,7 +1337,7 @@ const startServer = async () => {
subscription.stopHeartbeat(); subscription.stopHeartbeat();
delete subscriptions[channelIds.join(';')]; delete subscriptions[channelIds.join(';')];
} };
/** /**
* @param {WebSocketSession} session * @param {WebSocketSession} session
@ -1357,7 +1357,7 @@ const startServer = async () => {
socket.send(JSON.stringify({ error: "Error unsubscribing from channel" })); socket.send(JSON.stringify({ error: "Error unsubscribing from channel" }));
} }
}); });
} };
/** /**
* @param {WebSocketSession} session * @param {WebSocketSession} session
@ -1435,7 +1435,7 @@ const startServer = async () => {
const subscriptions = Object.keys(session.subscriptions); const subscriptions = Object.keys(session.subscriptions);
subscriptions.forEach(channelIds => { subscriptions.forEach(channelIds => {
removeSubscription(session.subscriptions, channelIds.split(';'), req) removeSubscription(session.subscriptions, channelIds.split(';'), req);
}); });
// Decrement the metrics for connected clients: // Decrement the metrics for connected clients:

Loading…
Cancel
Save