Skip to content

Commit

Permalink
Fix too many requests caused by relationship look-ups in web UI (mast…
Browse files Browse the repository at this point in the history
…odon#32042)

Co-authored-by: Claire <[email protected]>
  • Loading branch information
Gargron and ClearlyClaire authored Sep 24, 2024
1 parent f1b6a61 commit 7098851
Show file tree
Hide file tree
Showing 3 changed files with 40 additions and 19 deletions.
23 changes: 16 additions & 7 deletions app/javascript/mastodon/actions/accounts.js
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
import { browserHistory } from 'mastodon/components/router';
import { debounceWithDispatchAndArguments } from 'mastodon/utils/debounce';

import api, { getLinks } from '../api';

Expand Down Expand Up @@ -449,6 +450,20 @@ export function expandFollowingFail(id, error) {
};
}

const debouncedFetchRelationships = debounceWithDispatchAndArguments((dispatch, ...newAccountIds) => {
if (newAccountIds.length === 0) {
return;
}

dispatch(fetchRelationshipsRequest(newAccountIds));

api().get(`/api/v1/accounts/relationships?with_suspended=true&${newAccountIds.map(id => `id[]=${id}`).join('&')}`).then(response => {
dispatch(fetchRelationshipsSuccess({ relationships: response.data }));
}).catch(error => {
dispatch(fetchRelationshipsFail(error));
});
}, { delay: 500 });

export function fetchRelationships(accountIds) {
return (dispatch, getState) => {
const state = getState();
Expand All @@ -460,13 +475,7 @@ export function fetchRelationships(accountIds) {
return;
}

dispatch(fetchRelationshipsRequest(newAccountIds));

api().get(`/api/v1/accounts/relationships?with_suspended=true&${newAccountIds.map(id => `id[]=${id}`).join('&')}`).then(response => {
dispatch(fetchRelationshipsSuccess({ relationships: response.data }));
}).catch(error => {
dispatch(fetchRelationshipsFail(error));
});
debouncedFetchRelationships(dispatch, ...newAccountIds);
};
}

Expand Down
13 changes: 1 addition & 12 deletions app/javascript/mastodon/actions/notifications.js
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,7 @@ import api, { getLinks } from '../api';
import { unescapeHTML } from '../utils/html';
import { requestNotificationPermission } from '../utils/notifications';

import { fetchFollowRequests, fetchRelationships } from './accounts';
import { fetchFollowRequests } from './accounts';
import {
importFetchedAccount,
importFetchedAccounts,
Expand Down Expand Up @@ -56,14 +56,6 @@ defineMessages({
group: { id: 'notifications.group', defaultMessage: '{count} notifications' },
});

const fetchRelatedRelationships = (dispatch, notifications) => {
const accountIds = notifications.filter(item => ['follow', 'follow_request', 'admin.sign_up'].indexOf(item.type) !== -1).map(item => item.account.id);

if (accountIds.length > 0) {
dispatch(fetchRelationships(accountIds));
}
};

export const loadPending = () => ({
type: NOTIFICATIONS_LOAD_PENDING,
});
Expand Down Expand Up @@ -106,8 +98,6 @@ export function updateNotifications(notification, intlMessages, intlLocale) {


dispatch(notificationsUpdate({ notification, preferPendingItems, playSound: playSound && !filtered}));

fetchRelatedRelationships(dispatch, [notification]);
} else if (playSound && !filtered) {
dispatch({
type: NOTIFICATIONS_UPDATE_NOOP,
Expand Down Expand Up @@ -199,7 +189,6 @@ export function expandNotifications({ maxId = undefined, forceLoad = false }) {
dispatch(importFetchedAccounts(response.data.filter(item => item.report).map(item => item.report.target_account)));

dispatch(expandNotificationsSuccess(response.data, next ? next.uri : null, isLoadingMore, isLoadingRecent, isLoadingRecent && preferPendingItems));
fetchRelatedRelationships(dispatch, response.data);
dispatch(submitMarkers());
} catch(error) {
dispatch(expandNotificationsFail(error, isLoadingMore));
Expand Down
23 changes: 23 additions & 0 deletions app/javascript/mastodon/utils/debounce.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,23 @@
import { debounce } from 'lodash';

import type { AppDispatch } from 'mastodon/store';

export const debounceWithDispatchAndArguments = <T>(
fn: (dispatch: AppDispatch, ...args: T[]) => void,
{ delay = 100 },
) => {
let argumentBuffer: T[] = [];
let dispatchBuffer: AppDispatch;

const wrapped = debounce(() => {
const tmpBuffer = argumentBuffer;
argumentBuffer = [];
fn(dispatchBuffer, ...tmpBuffer);
}, delay);

return (dispatch: AppDispatch, ...args: T[]) => {
dispatchBuffer = dispatch;
argumentBuffer.push(...args);
wrapped();
};
};

0 comments on commit 7098851

Please sign in to comment.