diff --git a/app/actions/websocket/index.ts b/app/actions/websocket/index.ts index 5a75cc0195..ce1451d06d 100644 --- a/app/actions/websocket/index.ts +++ b/app/actions/websocket/index.ts @@ -20,6 +20,7 @@ import {queryCommonSystemValues, queryConfig, queryWebSocketLastDisconnected} fr import {queryCurrentUser} from '@queries/servers/user'; import {handleChannelDeletedEvent, handleUserRemovedEvent} from './channel'; +import {handlePreferenceChangedEvent, handlePreferencesChangedEvent, handlePreferencesDeletedEvent} from './preferences'; import {handleLeaveTeamEvent} from './teams'; import type {Model} from '@nozbe/watermelondb'; @@ -242,17 +243,17 @@ export async function handleEvent(serverUrl: string, msg: any) { // return dispatch(handleDirectAddedEvent(msg)); case WebsocketEvents.PREFERENCE_CHANGED: + handlePreferenceChangedEvent(serverUrl, msg); break; - // return dispatch(handlePreferenceChangedEvent(msg)); case WebsocketEvents.PREFERENCES_CHANGED: + handlePreferencesChangedEvent(serverUrl, msg); break; - // return dispatch(handlePreferencesChangedEvent(msg)); case WebsocketEvents.PREFERENCES_DELETED: + handlePreferencesDeletedEvent(serverUrl, msg); break; - // return dispatch(handlePreferencesDeletedEvent(msg)); case WebsocketEvents.STATUS_CHANGED: break; diff --git a/app/actions/websocket/preferences.ts b/app/actions/websocket/preferences.ts new file mode 100644 index 0000000000..5e24cd1fd6 --- /dev/null +++ b/app/actions/websocket/preferences.ts @@ -0,0 +1,62 @@ +// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved. +// See LICENSE.txt for license information. + +import {deletePreferences} from '@app/queries/servers/preference'; +import DatabaseManager from '@database/manager'; +import {WebSocketMessage} from '@typings/api/websocket'; + +export async function handlePreferenceChangedEvent(serverUrl: string, msg: WebSocketMessage): Promise { + const database = DatabaseManager.serverDatabases[serverUrl]; + if (!database) { + return; + } + + try { + const preference = JSON.parse(msg.data.preference) as PreferenceType; + const operator = database?.operator; + if (operator) { + operator.handlePreferences({ + prepareRecordsOnly: false, + preferences: [preference], + sync: true, + }); + } + } catch (error) { + // Do nothing + } +} + +export async function handlePreferencesChangedEvent(serverUrl: string, msg: WebSocketMessage): Promise { + const database = DatabaseManager.serverDatabases[serverUrl]; + if (!database) { + return; + } + + try { + const preferences = JSON.parse(msg.data.preferences) as PreferenceType[]; + const operator = database?.operator; + if (operator) { + operator.handlePreferences({ + prepareRecordsOnly: false, + preferences, + sync: true, + }); + } + } catch (error) { + // Do nothing + } +} + +export async function handlePreferencesDeletedEvent(serverUrl: string, msg: WebSocketMessage): Promise { + const database = DatabaseManager.serverDatabases[serverUrl]; + if (!database) { + return; + } + + try { + const preferences = JSON.parse(msg.data.preferences) as PreferenceType[]; + deletePreferences(database, preferences); + } catch { + // Do nothing + } +} diff --git a/app/queries/servers/preference.ts b/app/queries/servers/preference.ts index f66a8ad76c..3290f04dc9 100644 --- a/app/queries/servers/preference.ts +++ b/app/queries/servers/preference.ts @@ -1,10 +1,11 @@ // Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved. // See LICENSE.txt for license information. -import {Database, Q} from '@nozbe/watermelondb'; +import {Database, Model, Q} from '@nozbe/watermelondb'; import {Preferences} from '@constants'; import {MM_TABLES} from '@constants/database'; +import {ServerDatabase} from '@typings/database/database'; import {queryCurrentTeamId} from './system'; @@ -46,3 +47,21 @@ export const queryThemeForCurrentTeam = async (database: Database) => { return undefined; }; + +export const deletePreferences = async (database: ServerDatabase, preferences: PreferenceType[]): Promise => { + try { + const preparedModels: Model[] = []; + for await (const pref of preferences) { + const myPrefs = await queryPreferencesByCategoryAndName(database.database, pref.category, pref.name); + for (const p of myPrefs) { + preparedModels.push(p.prepareDestroyPermanently()); + } + } + if (preparedModels.length) { + await database.operator.batchRecords(preparedModels); + } + return true; + } catch (error) { + return false; + } +}; diff --git a/types/api/websocket.ts b/types/api/websocket.ts new file mode 100644 index 0000000000..a429dc6c52 --- /dev/null +++ b/types/api/websocket.ts @@ -0,0 +1,16 @@ +// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved. +// See LICENSE.txt for license information. + +export type WebsocketBroadcast = { + omit_users: Dictionary; + user_id: string; + channel_id: string; + team_id: string; +} + +export type WebSocketMessage = { + event: string; + data: any; + broadcast: WebsocketBroadcast; + seq: number; +}