[Gekidou MM-39724] - Teams Websocket Events (#5858)

This commit is contained in:
Jason Frerich
2022-02-01 05:59:24 -06:00
committed by GitHub
parent fc29b4b974
commit c162cb0cdd
3 changed files with 66 additions and 8 deletions

View File

@@ -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,

View File

@@ -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;

View File

@@ -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());
}
}