forked from Ivasoft/mattermost-mobile
[Gekidou MM-39724] - Teams Websocket Events (#5858)
This commit is contained in:
@@ -12,7 +12,7 @@ export type RolesRequest = {
|
||||
roles?: Role[];
|
||||
}
|
||||
|
||||
export const fetchRolesIfNeeded = async (serverUrl: string, updatedRoles: string[]): Promise<RolesRequest> => {
|
||||
export const fetchRolesIfNeeded = async (serverUrl: string, updatedRoles: string[], fetchOnly = false): Promise<RolesRequest> => {
|
||||
if (!updatedRoles.length) {
|
||||
return {roles: []};
|
||||
}
|
||||
@@ -43,7 +43,7 @@ export const fetchRolesIfNeeded = async (serverUrl: string, updatedRoles: string
|
||||
try {
|
||||
const roles = await client.getRolesByNames(newRoles);
|
||||
|
||||
if (roles.length) {
|
||||
if (!fetchOnly && roles.length) {
|
||||
await operator.handleRole({
|
||||
roles,
|
||||
prepareRecordsOnly: false,
|
||||
|
||||
@@ -22,7 +22,7 @@ import {queryCurrentUser} from '@queries/servers/user';
|
||||
import {handleChannelDeletedEvent, handleUserAddedToChannelEvent, handleUserRemovedFromChannelEvent} from './channel';
|
||||
import {handleNewPostEvent, handlePostDeleted, handlePostEdited, handlePostUnread} from './posts';
|
||||
import {handlePreferenceChangedEvent, handlePreferencesChangedEvent, handlePreferencesDeletedEvent} from './preferences';
|
||||
import {handleLeaveTeamEvent} from './teams';
|
||||
import {handleLeaveTeamEvent, handleUserAddedToTeamEvent, handleUpdateTeamEvent} from './teams';
|
||||
import {handleUserUpdatedEvent} from './users';
|
||||
|
||||
import type {Model} from '@nozbe/watermelondb';
|
||||
@@ -171,13 +171,12 @@ export async function handleEvent(serverUrl: string, msg: WebSocketMessage) {
|
||||
handleLeaveTeamEvent(serverUrl, msg);
|
||||
break;
|
||||
case WebsocketEvents.UPDATE_TEAM:
|
||||
handleUpdateTeamEvent(serverUrl, msg);
|
||||
break;
|
||||
|
||||
// return dispatch(handleUpdateTeamEvent(msg));
|
||||
case WebsocketEvents.ADDED_TO_TEAM:
|
||||
handleUserAddedToTeamEvent(serverUrl, msg);
|
||||
break;
|
||||
|
||||
// return dispatch(handleTeamAddedEvent(msg));
|
||||
case WebsocketEvents.USER_ADDED:
|
||||
handleUserAddedToChannelEvent(serverUrl, msg);
|
||||
break;
|
||||
|
||||
@@ -1,16 +1,18 @@
|
||||
// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.
|
||||
// See LICENSE.txt for license information.
|
||||
|
||||
import {Model} from '@nozbe/watermelondb';
|
||||
import {DeviceEventEmitter} from 'react-native';
|
||||
|
||||
import {removeUserFromTeam} from '@actions/local/team';
|
||||
import {fetchAllTeams, handleTeamChange} from '@actions/remote/team';
|
||||
import {fetchRolesIfNeeded} from '@actions/remote/role';
|
||||
import {fetchAllTeams, handleTeamChange, fetchMyTeam} from '@actions/remote/team';
|
||||
import {updateUsersNoLongerVisible} from '@actions/remote/user';
|
||||
import Events from '@constants/events';
|
||||
import DatabaseManager from '@database/manager';
|
||||
import {queryActiveServer} from '@queries/app/servers';
|
||||
import {queryCurrentTeamId} from '@queries/servers/system';
|
||||
import {queryLastTeam} from '@queries/servers/team';
|
||||
import {queryLastTeam, prepareMyTeams} from '@queries/servers/team';
|
||||
import {queryCurrentUser} from '@queries/servers/user';
|
||||
import {dismissAllModals, popToRoot} from '@screens/navigation';
|
||||
|
||||
@@ -50,3 +52,60 @@ export async function handleLeaveTeamEvent(serverUrl: string, msg: WebSocketMess
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
export async function handleUpdateTeamEvent(serverUrl: string, msg: WebSocketMessage) {
|
||||
const database = DatabaseManager.serverDatabases[serverUrl];
|
||||
if (!database) {
|
||||
return;
|
||||
}
|
||||
|
||||
try {
|
||||
const team = JSON.parse(msg.data.team) as Team;
|
||||
database.operator.handleTeam({
|
||||
teams: [team],
|
||||
prepareRecordsOnly: false,
|
||||
});
|
||||
} catch {
|
||||
// Do nothing
|
||||
}
|
||||
}
|
||||
|
||||
export async function handleUserAddedToTeamEvent(serverUrl: string, msg: WebSocketMessage) {
|
||||
const database = DatabaseManager.serverDatabases[serverUrl];
|
||||
if (!database) {
|
||||
return;
|
||||
}
|
||||
|
||||
const {teams, memberships: teamMemberships} = await fetchMyTeam(serverUrl, msg.data.team_id, true);
|
||||
|
||||
const modelPromises: Array<Promise<Model[]>> = [];
|
||||
if (teams?.length && teamMemberships?.length) {
|
||||
const myMember = teamMemberships[0];
|
||||
if (myMember.roles) {
|
||||
const rolesToLoad = new Set<string>();
|
||||
for (const role of myMember.roles.split(' ')) {
|
||||
rolesToLoad.add(role);
|
||||
}
|
||||
const serverRoles = await fetchRolesIfNeeded(serverUrl, Array.from(rolesToLoad), true);
|
||||
if (serverRoles.roles!.length) {
|
||||
const preparedRoleModels = database.operator.handleRole({
|
||||
roles: serverRoles.roles!,
|
||||
prepareRecordsOnly: true,
|
||||
});
|
||||
modelPromises.push(preparedRoleModels);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (teams && teamMemberships) {
|
||||
const preparedTeamModels = prepareMyTeams(database.operator, teams, teamMemberships);
|
||||
if (preparedTeamModels) {
|
||||
modelPromises.push(...preparedTeamModels);
|
||||
}
|
||||
}
|
||||
|
||||
if (modelPromises.length) {
|
||||
const models = await Promise.all(modelPromises);
|
||||
await database.operator.batchRecords(models.flat());
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user