From 4670a01ae73db4414fca1fd28048b4c647ca9d76 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Daniel=20Espino=20Garc=C3=ADa?= Date: Mon, 14 Aug 2023 10:01:55 +0200 Subject: [PATCH] Handle Mark Multiple Channels as Read (#7467) * Handle Mark Multiple Channels as Read * Use allSettled --- app/actions/websocket/channel.ts | 38 ++++++++++++++++++++++++++++++++ app/actions/websocket/index.ts | 5 +++++ app/constants/websocket.ts | 1 + 3 files changed, 44 insertions(+) diff --git a/app/actions/websocket/channel.ts b/app/actions/websocket/channel.ts index aa10a0fa5..088920cbc 100644 --- a/app/actions/websocket/channel.ts +++ b/app/actions/websocket/channel.ts @@ -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> = []; + 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((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 { diff --git a/app/actions/websocket/index.ts b/app/actions/websocket/index.ts index d05243b9e..a2862aa3a 100644 --- a/app/actions/websocket/index.ts +++ b/app/actions/websocket/index.ts @@ -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; diff --git a/app/constants/websocket.ts b/app/constants/websocket.ts index ec1089e04..39ba559e4 100644 --- a/app/constants/websocket.ts +++ b/app/constants/websocket.ts @@ -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',