forked from Ivasoft/mattermost-mobile
[Gekidou MM-39728] - Websocket Events - Preferences (#5865)
This commit is contained in:
@@ -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;
|
||||
|
||||
|
||||
62
app/actions/websocket/preferences.ts
Normal file
62
app/actions/websocket/preferences.ts
Normal file
@@ -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<void> {
|
||||
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<void> {
|
||||
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<void> {
|
||||
const database = DatabaseManager.serverDatabases[serverUrl];
|
||||
if (!database) {
|
||||
return;
|
||||
}
|
||||
|
||||
try {
|
||||
const preferences = JSON.parse(msg.data.preferences) as PreferenceType[];
|
||||
deletePreferences(database, preferences);
|
||||
} catch {
|
||||
// Do nothing
|
||||
}
|
||||
}
|
||||
@@ -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<Boolean> => {
|
||||
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;
|
||||
}
|
||||
};
|
||||
|
||||
16
types/api/websocket.ts
Normal file
16
types/api/websocket.ts
Normal file
@@ -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<boolean>;
|
||||
user_id: string;
|
||||
channel_id: string;
|
||||
team_id: string;
|
||||
}
|
||||
|
||||
export type WebSocketMessage = {
|
||||
event: string;
|
||||
data: any;
|
||||
broadcast: WebsocketBroadcast;
|
||||
seq: number;
|
||||
}
|
||||
Reference in New Issue
Block a user