mirror of
https://github.com/mattermost/mattermost-mobile.git
synced 2026-11-09 12:40:12 +00:00
* Expo-Router partial migration * Full migration to ExpoRouter * i18n * add tests * Merge branch 'main' into expo-router * align package-lock.json * i18n * feedback review * feedback review * android 16kb patch * Refactored emoji picker keyboard using a state machine * set android launch_screen in drawables instead of layout * no conditional hooks * remove duplicate call in test * address feedback * fix tests and address more feedback * small corrections * small corrections * small corrections * fix draft test * fix draft test 2 * remove navigateToScreen in draff test * fix nit in draft test * remove doc file * Feedback review * fix snapshots * improve test coverage * fix i18n * Upgrade t o RN 0.83, other dependencies and new architecture (#9737) * library hardware-keyboard android new arch support fix * library rnshare android new arch support fix * library rnutils android new arch support fix * library secure-pdf-viewer add new arch support * Enable new arch on iOS and Android * update emm and network client with new-arch * update intune to use new-arch * performance improvements * fix tests * fixes post input on new-arch * fix android emoji picker * remove doc * run tests in parallel * upgrade to React Native 0.83.9, Expo 55, React 19, and New Architecture Bumps core dependencies to their latest versions: - React Native 0.77.3 → 0.83.9 (New Architecture enabled) - React 18.3.1 → 19.2.5 - Expo SDK 52 → 55 - TypeScript 5.8.3 → 6.0.3 - Node.js 22.16.0 → 24.15.0 - react-native-reanimated 3.17.3 → 4.3.0 - Various other dependency upgrades Migrates iOS AppDelegate from Objective-C to Swift, updates Android build tooling and Gradle wrapper, refreshes all patches and font assets, and adapts app code, tests, and CI workflows throughout for API changes introduced by these upgrades. * remove unecessary dismissKeyboard in notifications * feedback review * update intune to use new-arch * update @mattermost deps * missing i18n string * additional fixes * update fastlane
103 lines
3.1 KiB
TypeScript
103 lines
3.1 KiB
TypeScript
// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.
|
|
// See LICENSE.txt for license information.
|
|
|
|
import {chunk} from 'lodash';
|
|
|
|
import {General} from '@constants';
|
|
import DatabaseManager from '@database/manager';
|
|
import NetworkManager from '@managers/network_manager';
|
|
import {queryRoles} from '@queries/servers/role';
|
|
import {getFullErrorMessage} from '@utils/errors';
|
|
import {logDebug} from '@utils/log';
|
|
|
|
import {forceLogoutIfNecessary} from './session';
|
|
|
|
export type RolesRequest = {
|
|
error?: unknown;
|
|
roles?: Role[];
|
|
}
|
|
|
|
export const fetchRolesIfNeeded = async (
|
|
serverUrl: string, updatedRoles: string[],
|
|
fetchOnly = false, force = false, groupLabel?: RequestGroupLabel,
|
|
): Promise<RolesRequest> => {
|
|
if (!updatedRoles.length) {
|
|
return {roles: []};
|
|
}
|
|
|
|
try {
|
|
const client = NetworkManager.getClient(serverUrl);
|
|
const {database, operator} = DatabaseManager.getServerDatabaseAndOperator(serverUrl);
|
|
|
|
let newRoles;
|
|
if (force) {
|
|
newRoles = updatedRoles;
|
|
} else {
|
|
const existingRoles = await queryRoles(database).fetch();
|
|
|
|
const roleNames = new Set(existingRoles.map((role) => {
|
|
return role.name;
|
|
}));
|
|
|
|
newRoles = updatedRoles.filter((newRole) => {
|
|
return !roleNames.has(newRole);
|
|
});
|
|
}
|
|
|
|
if (!newRoles.length) {
|
|
return {roles: []};
|
|
}
|
|
|
|
const getRolesRequests = [];
|
|
const chunks = chunk(newRoles, General.MAX_GET_ROLES_BY_NAMES);
|
|
for (const roles of chunks) {
|
|
getRolesRequests.push(client.getRolesByNames(roles, groupLabel));
|
|
}
|
|
|
|
const roles = (await Promise.all(getRolesRequests)).flat();
|
|
if (!fetchOnly) {
|
|
await operator.handleRole({
|
|
roles,
|
|
prepareRecordsOnly: false,
|
|
});
|
|
}
|
|
|
|
return {roles};
|
|
} catch (error) {
|
|
logDebug('error on fetchRolesIfNeeded', getFullErrorMessage(error));
|
|
forceLogoutIfNecessary(serverUrl, error);
|
|
return {error};
|
|
}
|
|
};
|
|
|
|
export const fetchRoles = async (
|
|
serverUrl: string, teamMembership?: TeamMembership[], channelMembership?: ChannelMembership[],
|
|
user?: UserProfile, fetchOnly = false, force = false, groupLabel?: RequestGroupLabel,
|
|
) => {
|
|
const rolesToFetch = new Set<string>(user?.roles.split(' ') || []);
|
|
|
|
if (teamMembership?.length) {
|
|
const teamRoles: string[] = [];
|
|
|
|
teamMembership?.forEach((tm) => {
|
|
teamRoles.push(...tm.roles.split(' '));
|
|
});
|
|
|
|
teamRoles.forEach(rolesToFetch.add, rolesToFetch);
|
|
}
|
|
|
|
if (channelMembership?.length) {
|
|
for (let i = 0; i < channelMembership!.length; i++) {
|
|
const member = channelMembership[i];
|
|
member.roles.split(' ').forEach(rolesToFetch.add, rolesToFetch);
|
|
}
|
|
}
|
|
|
|
rolesToFetch.delete('');
|
|
if (rolesToFetch.size > 0) {
|
|
return fetchRolesIfNeeded(serverUrl, Array.from(rolesToFetch), fetchOnly, force, groupLabel);
|
|
}
|
|
|
|
return {roles: []};
|
|
};
|