From c162cb0cdd87a1b1352c208185df0da05870d78e Mon Sep 17 00:00:00 2001 From: Jason Frerich Date: Tue, 1 Feb 2022 05:59:24 -0600 Subject: [PATCH] [Gekidou MM-39724] - Teams Websocket Events (#5858) --- app/actions/remote/role.ts | 4 +-- app/actions/websocket/index.ts | 7 ++-- app/actions/websocket/teams.ts | 63 ++++++++++++++++++++++++++++++++-- 3 files changed, 66 insertions(+), 8 deletions(-) diff --git a/app/actions/remote/role.ts b/app/actions/remote/role.ts index e695f6c3a..4ca243d69 100644 --- a/app/actions/remote/role.ts +++ b/app/actions/remote/role.ts @@ -12,7 +12,7 @@ export type RolesRequest = { roles?: Role[]; } -export const fetchRolesIfNeeded = async (serverUrl: string, updatedRoles: string[]): Promise => { +export const fetchRolesIfNeeded = async (serverUrl: string, updatedRoles: string[], fetchOnly = false): Promise => { 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, diff --git a/app/actions/websocket/index.ts b/app/actions/websocket/index.ts index 6da5ae24d..8e5f51a36 100644 --- a/app/actions/websocket/index.ts +++ b/app/actions/websocket/index.ts @@ -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; diff --git a/app/actions/websocket/teams.ts b/app/actions/websocket/teams.ts index 6115bcf7f..2231a5910 100644 --- a/app/actions/websocket/teams.ts +++ b/app/actions/websocket/teams.ts @@ -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> = []; + if (teams?.length && teamMemberships?.length) { + const myMember = teamMemberships[0]; + if (myMember.roles) { + const rolesToLoad = new Set(); + 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()); + } +}