doFetchModBlockedList: don't block ui thread #7674

Merged
jessopb merged 2 commits from background-modBlockedList into master 2022-08-12 23:23:04 +02:00

View file

@ -1143,6 +1143,9 @@ export function doCommentModUnBlockAsModerator(commenterUri: string, creatorUri:
export function doFetchModBlockedList() { export function doFetchModBlockedList() {
return async (dispatch: Dispatch, getState: GetState) => { return async (dispatch: Dispatch, getState: GetState) => {
const LOOP_CHUNK_SIZE = 1;
const yieldThread = () => new Promise((resolve) => setTimeout(resolve));
const state = getState(); const state = getState();
const myChannels = selectMyChannelClaims(state); const myChannels = selectMyChannelClaims(state);
if (!myChannels) { if (!myChannels) {
@ -1172,7 +1175,7 @@ export function doFetchModBlockedList() {
}) })
) )
) )
.then((res) => { .then(async (res) => {
let personalBlockList = []; let personalBlockList = [];
let adminBlockList = []; let adminBlockList = [];
let moderatorBlockList = []; let moderatorBlockList = [];
@ -1185,66 +1188,76 @@ export function doFetchModBlockedList() {
const adminTimeoutMap = {}; const adminTimeoutMap = {};
const moderatorTimeoutMap = {}; const moderatorTimeoutMap = {};
const blockListsPerChannel = res.map((r) => r.value); const blockListsPerChannel = [];
blockListsPerChannel for (let i = 0; i < res.length; ++i) {
.sort((a, b) => { blockListsPerChannel.push(res[i].value);
return 1; if (i % 2 === 0) {
}) await yieldThread();
.forEach((channelBlockLists) => { }
const storeList = (fetchedList, blockedList, timeoutMap, blockedByMap) => { }
if (fetchedList) { for (let i = 0; i < blockListsPerChannel.length; ++i) {
fetchedList.forEach((blockedChannel) => { const storeList = async (fetchedList, blockedList, timeoutMap, blockedByMap) => {
if (blockedChannel.blocked_channel_name) { if (fetchedList) {
const channelUri = buildURI({ for (let j = 0; j < fetchedList.length; ++j) {
channelName: blockedChannel.blocked_channel_name, const blockedChannel = fetchedList[j];
channelClaimId: blockedChannel.blocked_channel_id, if (j > 0 && i % LOOP_CHUNK_SIZE === 0) {
}); await yieldThread();
}
if (blockedChannel.blocked_channel_name) {
const channelUri = buildURI({
channelName: blockedChannel.blocked_channel_name,
channelClaimId: blockedChannel.blocked_channel_id,
});
if (!blockedList.find((blockedChannel) => isURIEqual(blockedChannel.channelUri, channelUri))) { if (!blockedList.find((blockedChannel) => isURIEqual(blockedChannel.channelUri, channelUri))) {
blockedList.push({ channelUri, blockedAt: blockedChannel.blocked_at }); blockedList.push({ channelUri, blockedAt: blockedChannel.blocked_at });
if (blockedChannel.banned_for) { if (blockedChannel.banned_for) {
timeoutMap[channelUri] = { timeoutMap[channelUri] = {
blockedAt: blockedChannel.blocked_at, blockedAt: blockedChannel.blocked_at,
bannedFor: blockedChannel.banned_for, bannedFor: blockedChannel.banned_for,
banRemaining: blockedChannel.ban_remaining, banRemaining: blockedChannel.ban_remaining,
}; };
}
}
if (blockedByMap !== undefined) {
const blockedByChannelUri = buildURI({
channelName: blockedChannel.blocked_by_channel_name,
channelClaimId: blockedChannel.blocked_by_channel_id,
});
if (blockedByMap[channelUri]) {
if (!blockedByMap[channelUri].includes(blockedByChannelUri)) {
blockedByMap[channelUri].push(blockedByChannelUri);
}
} else {
blockedByMap[channelUri] = [blockedByChannelUri];
}
} }
} }
});
if (blockedByMap !== undefined) {
const blockedByChannelUri = buildURI({
channelName: blockedChannel.blocked_by_channel_name,
channelClaimId: blockedChannel.blocked_by_channel_id,
});
if (blockedByMap[channelUri]) {
if (!blockedByMap[channelUri].includes(blockedByChannelUri)) {
blockedByMap[channelUri].push(blockedByChannelUri);
}
} else {
blockedByMap[channelUri] = [blockedByChannelUri];
}
}
}
} }
}; }
};
const blocked_channels = channelBlockLists && channelBlockLists.blocked_channels; const channelBlockLists = blockListsPerChannel[i];
const globally_blocked_channels = channelBlockLists && channelBlockLists.globally_blocked_channels; const blocked_channels = channelBlockLists && channelBlockLists.blocked_channels;
const delegated_blocked_channels = channelBlockLists && channelBlockLists.delegated_blocked_channels; const globally_blocked_channels = channelBlockLists && channelBlockLists.globally_blocked_channels;
const delegated_blocked_channels = channelBlockLists && channelBlockLists.delegated_blocked_channels;
storeList(blocked_channels, personalBlockList, personalTimeoutMap); if (i > 0 && i % LOOP_CHUNK_SIZE === 0) {
storeList(globally_blocked_channels, adminBlockList, adminTimeoutMap); await yieldThread();
storeList( }
delegated_blocked_channels,
moderatorBlockList,
moderatorTimeoutMap,
moderatorBlockListDelegatorsMap
);
});
await storeList(blocked_channels, personalBlockList, personalTimeoutMap);
await storeList(globally_blocked_channels, adminBlockList, adminTimeoutMap);
await storeList(
delegated_blocked_channels,
moderatorBlockList,
moderatorTimeoutMap,
moderatorBlockListDelegatorsMap
);
}
dispatch({ dispatch({
type: ACTIONS.COMMENT_MODERATION_BLOCK_LIST_COMPLETED, type: ACTIONS.COMMENT_MODERATION_BLOCK_LIST_COMPLETED,
data: { data: {