Handle Mark Multiple Channels as Read (#7467)
* Handle Mark Multiple Channels as Read * Use allSettled
This commit is contained in:
parent
5386e58beb
commit
4670a01ae7
3 changed files with 44 additions and 0 deletions
|
|
@ -18,6 +18,7 @@ import {deleteChannelMembership, getChannelById, prepareMyChannelsForTeam, getCu
|
|||
import {getConfig, getCurrentChannelId} from '@queries/servers/system';
|
||||
import {getCurrentUser, getTeammateNameDisplay, getUserById} from '@queries/servers/user';
|
||||
import EphemeralStore from '@store/ephemeral_store';
|
||||
import MyChannelModel from '@typings/database/models/servers/my_channel';
|
||||
import {logDebug} from '@utils/log';
|
||||
|
||||
import type {Model} from '@nozbe/watermelondb';
|
||||
|
|
@ -122,6 +123,43 @@ export async function handleChannelViewedEvent(serverUrl: string, msg: any) {
|
|||
}
|
||||
}
|
||||
|
||||
export async function handleMultipleChannelsViewedEvent(serverUrl: string, msg: any) {
|
||||
try {
|
||||
const {database, operator} = DatabaseManager.getServerDatabaseAndOperator(serverUrl);
|
||||
|
||||
const {channel_times: channelTimes} = msg.data;
|
||||
|
||||
const activeServerUrl = await DatabaseManager.getActiveServerUrl();
|
||||
const currentChannelId = await getCurrentChannelId(database);
|
||||
|
||||
const promises: Array<ReturnType<typeof markChannelAsViewed>> = [];
|
||||
for (const id of Object.keys(channelTimes)) {
|
||||
if (activeServerUrl === serverUrl && (currentChannelId === id || EphemeralStore.isSwitchingToChannel(id))) {
|
||||
continue;
|
||||
}
|
||||
promises.push(markChannelAsViewed(serverUrl, id, false, true));
|
||||
}
|
||||
|
||||
const members = (await Promise.allSettled(promises)).reduce<MyChannelModel[]>((acum, v) => {
|
||||
if (v.status === 'rejected') {
|
||||
return acum;
|
||||
}
|
||||
|
||||
const value = v.value;
|
||||
if (value.member) {
|
||||
acum.push(value.member);
|
||||
}
|
||||
return acum;
|
||||
}, []);
|
||||
|
||||
if (members.length) {
|
||||
operator.batchRecords(members, 'handleMultipleCahnnelViewedEvent');
|
||||
}
|
||||
} catch {
|
||||
// do nothing
|
||||
}
|
||||
}
|
||||
|
||||
// This event is triggered by changes in the notify props or in the roles.
|
||||
export async function handleChannelMemberUpdatedEvent(serverUrl: string, msg: any) {
|
||||
try {
|
||||
|
|
|
|||
|
|
@ -58,6 +58,7 @@ import {handleChannelConvertedEvent, handleChannelCreatedEvent,
|
|||
handleChannelUnarchiveEvent,
|
||||
handleChannelUpdatedEvent,
|
||||
handleChannelViewedEvent,
|
||||
handleMultipleChannelsViewedEvent,
|
||||
handleDirectAddedEvent,
|
||||
handleUserAddedToChannelEvent,
|
||||
handleUserRemovedFromChannelEvent} from './channel';
|
||||
|
|
@ -254,6 +255,10 @@ export async function handleEvent(serverUrl: string, msg: WebSocketMessage) {
|
|||
handleChannelViewedEvent(serverUrl, msg);
|
||||
break;
|
||||
|
||||
case WebsocketEvents.MULTIPLE_CHANNELS_VIEWED:
|
||||
handleMultipleChannelsViewedEvent(serverUrl, msg);
|
||||
break;
|
||||
|
||||
case WebsocketEvents.CHANNEL_MEMBER_UPDATED:
|
||||
handleChannelMemberUpdatedEvent(serverUrl, msg);
|
||||
break;
|
||||
|
|
|
|||
|
|
@ -20,6 +20,7 @@ const WebsocketEvents = {
|
|||
CHANNEL_UNARCHIVED: 'channel_restored',
|
||||
CHANNEL_UPDATED: 'channel_updated',
|
||||
CHANNEL_VIEWED: 'channel_viewed',
|
||||
MULTIPLE_CHANNELS_VIEWED: 'multiple_channels_viewed',
|
||||
CHANNEL_MEMBER_UPDATED: 'channel_member_updated',
|
||||
CHANNEL_SCHEME_UPDATED: 'channel_scheme_updated',
|
||||
DIRECT_ADDED: 'direct_added',
|
||||
|
|
|
|||
Loading…
Reference in a new issue