release-2.6 #4

Merged
rv merged 7 commits from Ivasoft/mattermost-mobile:release-2.6 into release-2.6 2023-07-25 13:08:49 +00:00
24 changed files with 225 additions and 84 deletions

View File

@@ -110,8 +110,8 @@ android {
applicationId "com.mattermost.rnbeta"
minSdkVersion rootProject.ext.minSdkVersion
targetSdkVersion rootProject.ext.targetSdkVersion
versionCode 476
versionName "2.5.1"
versionCode 479
versionName "2.6.0"
testBuildType System.getProperty('testBuildType', 'debug')
testInstrumentationRunner 'androidx.test.runner.AndroidJUnitRunner'
}

View File

@@ -21,7 +21,7 @@ public class Network {
private static final Promise emptyPromise = new ResolvePromise();
public static void init(Context context) {
final ReactApplicationContext reactContext = new ReactApplicationContext(context);
final ReactApplicationContext reactContext = (APIClientModule.context == null) ? new ReactApplicationContext(context) : APIClientModule.context;
clientModule = new APIClientModule(reactContext);
createClientOptions();
}

View File

@@ -221,6 +221,11 @@ public class MattermostManagedModule extends ReactContextBaseJavaModule {
}
}
@ReactMethod
public void invalidateKeychainCache(String serverUrl) {
// Not using cache
}
private static class SaveDataTask extends GuardedResultAsyncTask<Object> {
private final WeakReference<Context> weakContext;
private final String fromFile;

View File

@@ -180,6 +180,13 @@ export const backgroundNotification = async (serverUrl: string, notification: No
};
export const openNotification = async (serverUrl: string, notification: NotificationWithData) => {
// Wait for initial launch to kick in if needed
await new Promise((r) => setTimeout(r, 500));
if (EphemeralStore.getProcessingNotification() === notification.identifier) {
return {};
}
EphemeralStore.setNotificationTapped(true);
const channelId = notification.payload!.channel_id!;

View File

@@ -13,13 +13,13 @@ import {useTheme} from '@context/theme';
import {nonBreakingString} from '@utils/strings';
import {makeStyleSheetFromTheme, changeOpacity} from '@utils/theme';
import {typography} from '@utils/typography';
import {displayUsername, getUserCustomStatus, isBot, isCustomStatusExpired, isGuest, isShared} from '@utils/user';
import {displayUsername, getUserCustomStatus, isBot, isCustomStatusExpired, isDeactivated, isGuest, isShared} from '@utils/user';
import type UserModel from '@typings/database/models/servers/user';
type AtMentionItemProps = {
FooterComponent?: ReactNode;
user: UserProfile | UserModel;
user?: UserProfile | UserModel;
containerStyle?: StyleProp<ViewStyle>;
currentUserId: string;
includeMargin?: boolean;
@@ -115,13 +115,12 @@ const UserItem = ({
const bot = user ? isBot(user) : false;
const guest = user ? isGuest(user.roles) : false;
const shared = user ? isShared(user) : false;
const deactivated = user ? isDeactivated(user) : false;
const isCurrentUser = currentUserId === user?.id;
const customStatus = getUserCustomStatus(user);
const customStatusExpired = isCustomStatusExpired(user);
const deleteAt = 'deleteAt' in user ? user.deleteAt : user.delete_at;
let displayName = displayUsername(user, locale, teammateNameDisplay);
const showTeammateDisplay = displayName !== user?.username;
if (isCurrentUser) {
@@ -142,11 +141,15 @@ const UserItem = ({
}, [disabled, padding, includeMargin]);
const onPress = useCallback(() => {
onUserPress?.(user);
if (user) {
onUserPress?.(user);
}
}, [user, onUserPress]);
const onLongPress = useCallback(() => {
onUserLongPress?.(user);
if (user) {
onUserLongPress?.(user);
}
}, [user, onUserLongPress]);
return (
@@ -175,15 +178,15 @@ const UserItem = ({
testID={`${userItemTestId}.display_name`}
>
{nonBreakingString(displayName)}
{Boolean(showTeammateDisplay) && (
{Boolean(showTeammateDisplay) && Boolean(user?.username) && (
<Text
style={style.rowUsername}
testID={`${userItemTestId}.username`}
>
{nonBreakingString(` @${user!.username}`)}
{nonBreakingString(` @${user?.username}`)}
</Text>
)}
{Boolean(deleteAt) && (
{deactivated && (
<Text
style={style.rowUsername}
testID={`${userItemTestId}.deactivated`}

View File

@@ -12,8 +12,17 @@ import SessionManager from '@managers/session_manager';
import WebsocketManager from '@managers/websocket_manager';
import {registerScreens} from '@screens/index';
import {registerNavigationListeners} from '@screens/navigation';
import EphemeralStore from '@store/ephemeral_store';
import NavigationStore from '@store/navigation_store';
// Controls whether the main initialization (database, etc...) is done, either on app launch
// or on the Share Extension, for example.
let baseAppInitialized = false;
// Controls whether the app initialization (websockets, screen listeners, etc...) is done, mainly
// on app launch
let mainAppInitialized = false;
let alreadyInitialized = false;
let serverCredentials: ServerCredential[];
// Fallback Polyfill for Promise.allSettle
@@ -31,8 +40,8 @@ Promise.allSettled = Promise.allSettled || (<T>(promises: Array<Promise<T>>) =>
));
export async function initialize() {
if (!alreadyInitialized) {
alreadyInitialized = true;
if (!baseAppInitialized) {
baseAppInitialized = true;
serverCredentials = await getAllServerCredentials();
const serverUrls = serverCredentials.map((credential) => credential.serverUrl);
@@ -46,12 +55,25 @@ export async function initialize() {
}
export async function start() {
if (baseAppInitialized) {
// Clean relevant information on ephemeral stores
NavigationStore.reset();
EphemeralStore.setCurrentThreadId('');
EphemeralStore.setProcessingNotification('');
}
await initialize();
PushNotifications.init(serverCredentials.length > 0);
if (!mainAppInitialized) {
mainAppInitialized = true;
PushNotifications.init(serverCredentials.length > 0);
registerNavigationListeners();
registerScreens();
await WebsocketManager.init(serverCredentials);
}
registerNavigationListeners();
registerScreens();
await WebsocketManager.init(serverCredentials);
initialLaunch();
}

View File

@@ -42,7 +42,9 @@ export const initialLaunch = async () => {
tapped = delivered.find((d) => (d as unknown as NotificationData).ack_id === notification?.payload.ack_id) == null;
}
if (initialNotificationTypes.includes(notification?.payload?.type) && tapped) {
return launchAppFromNotification(convertToNotificationData(notification!), true);
const notificationData = convertToNotificationData(notification!);
EphemeralStore.setProcessingNotification(notificationData.identifier);
return launchAppFromNotification(notificationData, true);
}
const coldStart = notification ? (tapped || AppState.currentState === 'active') : true;

View File

@@ -22,6 +22,7 @@ import {getThemeFromState} from '@screens/navigation';
import EphemeralStore from '@store/ephemeral_store';
import {deleteFileCache, deleteFileCacheByDir} from '@utils/file';
import {isMainActivity} from '@utils/helpers';
import {invalidateKeychainCache} from '@utils/mattermost_managed';
import {addNewServer} from '@utils/server';
import type {LaunchType} from '@typings/launch';
@@ -115,6 +116,7 @@ class SessionManager {
private terminateSession = async (serverUrl: string, removeServer: boolean) => {
cancelSessionNotification(serverUrl);
await removeServerCredentials(serverUrl);
invalidateKeychainCache(serverUrl);
PushNotifications.removeServerNotifications(serverUrl);
NetworkManager.invalidateClient(serverUrl);

View File

@@ -14,6 +14,7 @@ import {NOT_READY} from '@constants/screens';
import {getDefaultThemeByAppearance} from '@context/theme';
import EphemeralStore from '@store/ephemeral_store';
import NavigationStore from '@store/navigation_store';
import {logError} from '@utils/log';
import {appearanceControlledScreens, mergeNavigationOptions} from '@utils/navigation';
import {changeOpacity, setNavigatorStyles} from '@utils/theme';
@@ -449,6 +450,11 @@ export function goToScreen(name: AvailableScreens, title: string, passProps = {}
const theme = getThemeFromState();
const isDark = tinyColor(theme.sidebarBg).isDark();
const componentId = NavigationStore.getVisibleScreen();
if (!componentId) {
logError('Trying to go to screen without any screen on the navigation store');
return '';
}
const defaultOptions: Options = {
layout: {
componentBackgroundColor: theme.centerChannelBg,

View File

@@ -1,26 +1,31 @@
// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.
// See LICENSE.txt for license information.
import React from 'react';
import React, {useEffect} from 'react';
import {useIntl} from 'react-intl';
import {Keyboard} from 'react-native';
import {fetchUsersByIds} from '@actions/remote/user';
import UserItem from '@components/user_item';
import {Screens} from '@constants';
import {useServerUrl} from '@context/server';
import {useTheme} from '@context/theme';
import {dismissBottomSheet, openAsBottomSheet} from '@screens/navigation';
import type ReactionModel from '@typings/database/models/servers/reaction';
import type UserModel from '@typings/database/models/servers/user';
type Props = {
channelId: string;
location: string;
user: UserModel;
reaction: ReactionModel;
user?: UserModel;
}
const Reactor = ({channelId, location, user}: Props) => {
const Reactor = ({channelId, location, reaction, user}: Props) => {
const intl = useIntl();
const theme = useTheme();
const serverUrl = useServerUrl();
const openUserProfile = async () => {
if (user) {
await dismissBottomSheet(Screens.REACTIONS);
@@ -34,6 +39,12 @@ const Reactor = ({channelId, location, user}: Props) => {
}
};
useEffect(() => {
if (!user) {
fetchUsersByIds(serverUrl, [reaction.userId]);
}
}, []);
return (
<UserItem
user={user}

View File

@@ -38,6 +38,16 @@ class EphemeralStore {
private notificationTapped = false;
private enablingCRT = false;
// There are some corner cases where the react context is not loaded (and therefore
// launch will be called) but the notification callbacks are registered. This is used
// so the notification is processed only once (preferably on launch).
private processingNotification = '';
setProcessingNotification = (v: string) => {
this.processingNotification = v;
};
getProcessingNotification = () => this.processingNotification;
addLoadingMessagesForChannel = (serverUrl: string, channelId: string) => {
if (!this.loadingMessagesForChannel[serverUrl]) {
this.loadingMessagesForChannel[serverUrl] = new Set();

View File

@@ -9,6 +9,13 @@ class NavigationStore {
private visibleTab = 'Home';
private tosOpen = false;
reset = () => {
this.screensInStack = [];
this.modalsInStack = [];
this.visibleTab = 'Home';
this.tosOpen = false;
};
addModalToStack = (modalId: AvailableScreens) => {
this.removeModalFromStack(modalId);
this.addScreenToStack(modalId);

View File

@@ -64,3 +64,7 @@ export const deleteEntititesFile = (callback?: (success: boolean) => void) => {
callback(true);
}
};
export const invalidateKeychainCache = (serverUrl: string) => {
MattermostManaged.invalidateKeychainCache(serverUrl);
};

View File

@@ -234,6 +234,10 @@ export function isShared(user: UserProfile | UserModel): boolean {
return ('remoteId' in user) ? Boolean(user.remoteId) : Boolean(user.remote_id);
}
export function isDeactivated(user: UserProfile | UserModel): boolean {
return Boolean('deleteAt' in user ? user.deleteAt : user.delete_at);
}
export function removeUserFromList(userId: string, originalList: UserProfile[]): UserProfile[] {
const list = [...originalList];
for (let i = list.length - 1; i >= 0; i--) {

View File

@@ -8,7 +8,7 @@ import {RUNNING_E2E} from 'react-native-dotenv';
import 'react-native-gesture-handler';
import {Navigation} from 'react-native-navigation';
import {initialize, start} from './app/init/app';
import {start} from './app/init/app';
import setFontFamily from './app/utils/font_family';
import {logInfo} from './app/utils/log';
@@ -59,6 +59,5 @@ if (Platform.OS === 'android') {
}
Navigation.events().registerAppLaunchedListener(async () => {
await initialize();
start();
});

View File

@@ -100,6 +100,10 @@ public class Keychain: NSObject {
return nil
}
public func invalidateToken(for serverUrl: String) {
tokenCache.removeValue(forKey: serverUrl)
}
private func buildIdentityQuery(for host: String) throws -> [CFString: Any] {
guard let hostData = host.data(using: .utf8) else {

View File

@@ -42,4 +42,8 @@ import Gekidou
return nil
}
@objc func invalidateToken(for url: String) {
Keychain.default.invalidateToken(for: url)
}
}

View File

@@ -1923,7 +1923,7 @@
CODE_SIGN_ENTITLEMENTS = Mattermost/Mattermost.entitlements;
CODE_SIGN_IDENTITY = "iPhone Developer";
"CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer";
CURRENT_PROJECT_VERSION = 476;
CURRENT_PROJECT_VERSION = 479;
DEVELOPMENT_TEAM = UQ8HT4Q2XM;
ENABLE_BITCODE = NO;
HEADER_SEARCH_PATHS = (
@@ -1967,7 +1967,7 @@
CODE_SIGN_ENTITLEMENTS = Mattermost/Mattermost.entitlements;
CODE_SIGN_IDENTITY = "iPhone Developer";
"CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer";
CURRENT_PROJECT_VERSION = 476;
CURRENT_PROJECT_VERSION = 479;
DEVELOPMENT_TEAM = UQ8HT4Q2XM;
ENABLE_BITCODE = NO;
HEADER_SEARCH_PATHS = (
@@ -2110,7 +2110,7 @@
CODE_SIGN_IDENTITY = "iPhone Developer";
"CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer";
CODE_SIGN_STYLE = Automatic;
CURRENT_PROJECT_VERSION = 476;
CURRENT_PROJECT_VERSION = 479;
DEBUG_INFORMATION_FORMAT = dwarf;
DEVELOPMENT_TEAM = UQ8HT4Q2XM;
GCC_C_LANGUAGE_STANDARD = gnu11;
@@ -2159,7 +2159,7 @@
"CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer";
CODE_SIGN_STYLE = Automatic;
COPY_PHASE_STRIP = NO;
CURRENT_PROJECT_VERSION = 476;
CURRENT_PROJECT_VERSION = 479;
DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym";
DEVELOPMENT_TEAM = UQ8HT4Q2XM;
GCC_C_LANGUAGE_STANDARD = gnu11;

View File

@@ -21,7 +21,7 @@
<key>CFBundlePackageType</key>
<string>APPL</string>
<key>CFBundleShortVersionString</key>
<string>2.5.1</string>
<string>2.6.0</string>
<key>CFBundleSignature</key>
<string>????</string>
<key>CFBundleURLTypes</key>
@@ -37,7 +37,7 @@
</dict>
</array>
<key>CFBundleVersion</key>
<string>476</string>
<string>479</string>
<key>ITSAppUsesNonExemptEncryption</key>
<false/>
<key>LSRequiresIPhoneOS</key>

View File

@@ -153,6 +153,10 @@ RCT_EXPORT_METHOD(removeListeners:(double)count) {
// Keep: Required for RN built in Event Emitter Calls.
}
RCT_EXPORT_METHOD(invalidateKeychainCache:(NSString *) serverUrl)
{
[[GekidouWrapper default] invalidateTokenFor:serverUrl];
}
RCT_EXPORT_METHOD(createThumbnail:(NSDictionary *)config findEventsWithResolver:(RCTPromiseResolveBlock)resolve rejecter:(RCTPromiseRejectBlock)reject)
{

View File

@@ -19,9 +19,9 @@
<key>CFBundlePackageType</key>
<string>XPC!</string>
<key>CFBundleShortVersionString</key>
<string>2.5.1</string>
<string>2.6.0</string>
<key>CFBundleVersion</key>
<string>476</string>
<string>479</string>
<key>UIAppFonts</key>
<array>
<string>OpenSans-Bold.ttf</string>

View File

@@ -19,9 +19,9 @@
<key>CFBundlePackageType</key>
<string>XPC!</string>
<key>CFBundleShortVersionString</key>
<string>2.5.1</string>
<string>2.6.0</string>
<key>CFBundleVersion</key>
<string>476</string>
<string>479</string>
<key>NSExtension</key>
<dict>
<key>NSExtensionPointIdentifier</key>

143
package-lock.json generated
View File

@@ -1,6 +1,6 @@
{
"name": "mattermost-mobile",
"version": "2.5.1",
"version": "2.6.0",
"lockfileVersion": 2,
"requires": true,
"packages": {
@@ -22261,7 +22261,8 @@
"version": "7.21.0-placeholder-for-preset-env.2",
"resolved": "https://registry.npmjs.org/@babel/plugin-proposal-private-property-in-object/-/plugin-proposal-private-property-in-object-7.21.0-placeholder-for-preset-env.2.tgz",
"integrity": "sha512-SOSkfJDddaM7mak6cPEpswyTRnuRltl429hMraQEglW+OkovnCzsiszTmsrlY//qLFjCpQDFRvjdm2wA5pPm9w==",
"requires": {}
"requires": {
}
},
"@babel/plugin-proposal-unicode-property-regex": {
"version": "7.18.6",
@@ -24098,7 +24099,8 @@
"version": "1.3.5",
"resolved": "https://registry.npmjs.org/@mattermost/react-native-emm/-/react-native-emm-1.3.5.tgz",
"integrity": "sha512-REdUEsm/RA6lI1Rt4b009jvWn28f7H+e27gd4hlNk6zesIh/dlfiHwYfInW/vwbNFBdSPpvHy7Qi2mdcvrNqhg==",
"requires": {}
"requires": {
}
},
"@mattermost/react-native-network-client": {
"version": "1.3.4",
@@ -24144,7 +24146,8 @@
"version": "0.2.3",
"resolved": "https://registry.npmjs.org/@mattermost/react-native-turbo-log/-/react-native-turbo-log-0.2.3.tgz",
"integrity": "sha512-usWyD8zVAHzrYqgPH1ne5I14gCOkhS2mefK58g5v4DewZfCm0/Uc0w8MRuPS/9jyOPPq1rUZj8U1AqKgEne9tQ==",
"requires": {}
"requires": {
}
},
"@msgpack/msgpack": {
"version": "2.8.0",
@@ -24240,13 +24243,15 @@
"version": "5.6.0",
"resolved": "https://registry.npmjs.org/@react-native-camera-roll/camera-roll/-/camera-roll-5.6.0.tgz",
"integrity": "sha512-a/GYwnBTxj1yKWB9m/qy8GzjowSocML8NbLT81wdMh0JzZYXCLze51BR2cb8JNDgRPzA9xe7KpD3j9qQOSOjag==",
"requires": {}
"requires": {
}
},
"@react-native-clipboard/clipboard": {
"version": "1.11.2",
"resolved": "https://registry.npmjs.org/@react-native-clipboard/clipboard/-/clipboard-1.11.2.tgz",
"integrity": "sha512-bHyZVW62TuleiZsXNHS1Pv16fWc0fh8O9WvBzl4h2fykqZRW9a+Pv/RGTH56E3X2PqzHP38K5go8zmCZUoIsoQ==",
"requires": {}
"requires": {
}
},
"@react-native-community/cli": {
"version": "10.2.4",
@@ -25403,7 +25408,8 @@
"version": "9.3.10",
"resolved": "https://registry.npmjs.org/@react-native-community/netinfo/-/netinfo-9.3.10.tgz",
"integrity": "sha512-OwnqoJUp/4sa9e3ju+wQavAa8l0fiA3DheeLMKzKxtKeAe0CA7bNxWRM752JvRQ6A/igPnt1V0zSlu5owvQEuA==",
"requires": {}
"requires": {
}
},
"@react-native-cookies/cookies": {
"version": "6.2.1",
@@ -25479,7 +25485,8 @@
"version": "1.3.17",
"resolved": "https://registry.npmjs.org/@react-navigation/elements/-/elements-1.3.17.tgz",
"integrity": "sha512-sui8AzHm6TxeEvWT/NEXlz3egYvCUog4tlXA4Xlb2Vxvy3purVXDq/XsM56lJl344U5Aj/jDzkVanOTMWyk4UA==",
"requires": {}
"requires": {
}
},
"@react-navigation/native": {
"version": "6.1.6",
@@ -25763,63 +25770,72 @@
"version": "0.10.3",
"resolved": "https://registry.npmjs.org/@stream-io/flat-list-mvcp/-/flat-list-mvcp-0.10.3.tgz",
"integrity": "sha512-2ZK8piYlEfKIPZrH8BpZz9uj8HZcUvMCV0X7qSLSAc/vhLOANBfR0SSn0OaWPbqb2mFGAd4FxmLSPp1zKEYuaw==",
"requires": {}
"requires": {
}
},
"@svgr/babel-plugin-add-jsx-attribute": {
"version": "6.0.0",
"resolved": "https://registry.npmjs.org/@svgr/babel-plugin-add-jsx-attribute/-/babel-plugin-add-jsx-attribute-6.0.0.tgz",
"integrity": "sha512-MdPdhdWLtQsjd29Wa4pABdhWbaRMACdM1h31BY+c6FghTZqNGT7pEYdBoaGeKtdTOBC/XNFQaKVj+r/Ei2ryWA==",
"dev": true,
"requires": {}
"requires": {
}
},
"@svgr/babel-plugin-remove-jsx-attribute": {
"version": "6.0.0",
"resolved": "https://registry.npmjs.org/@svgr/babel-plugin-remove-jsx-attribute/-/babel-plugin-remove-jsx-attribute-6.0.0.tgz",
"integrity": "sha512-aVdtfx9jlaaxc3unA6l+M9YRnKIZjOhQPthLKqmTXC8UVkBLDRGwPKo+r8n3VZN8B34+yVajzPTZ+ptTSuZZCw==",
"dev": true,
"requires": {}
"requires": {
}
},
"@svgr/babel-plugin-remove-jsx-empty-expression": {
"version": "6.0.0",
"resolved": "https://registry.npmjs.org/@svgr/babel-plugin-remove-jsx-empty-expression/-/babel-plugin-remove-jsx-empty-expression-6.0.0.tgz",
"integrity": "sha512-Ccj42ApsePD451AZJJf1QzTD1B/BOU392URJTeXFxSK709i0KUsGtbwyiqsKu7vsYxpTM0IA5clAKDyf9RCZyA==",
"dev": true,
"requires": {}
"requires": {
}
},
"@svgr/babel-plugin-replace-jsx-attribute-value": {
"version": "6.0.0",
"resolved": "https://registry.npmjs.org/@svgr/babel-plugin-replace-jsx-attribute-value/-/babel-plugin-replace-jsx-attribute-value-6.0.0.tgz",
"integrity": "sha512-88V26WGyt1Sfd1emBYmBJRWMmgarrExpKNVmI9vVozha4kqs6FzQJ/Kp5+EYli1apgX44518/0+t9+NU36lThQ==",
"dev": true,
"requires": {}
"requires": {
}
},
"@svgr/babel-plugin-svg-dynamic-title": {
"version": "6.0.0",
"resolved": "https://registry.npmjs.org/@svgr/babel-plugin-svg-dynamic-title/-/babel-plugin-svg-dynamic-title-6.0.0.tgz",
"integrity": "sha512-F7YXNLfGze+xv0KMQxrl2vkNbI9kzT9oDK55/kUuymh1ACyXkMV+VZWX1zEhSTfEKh7VkHVZGmVtHg8eTZ6PRg==",
"dev": true,
"requires": {}
"requires": {
}
},
"@svgr/babel-plugin-svg-em-dimensions": {
"version": "6.0.0",
"resolved": "https://registry.npmjs.org/@svgr/babel-plugin-svg-em-dimensions/-/babel-plugin-svg-em-dimensions-6.0.0.tgz",
"integrity": "sha512-+rghFXxdIqJNLQK08kwPBD3Z22/0b2tEZ9lKiL/yTfuyj1wW8HUXu4bo/XkogATIYuXSghVQOOCwURXzHGKyZA==",
"dev": true,
"requires": {}
"requires": {
}
},
"@svgr/babel-plugin-transform-react-native-svg": {
"version": "6.0.0",
"resolved": "https://registry.npmjs.org/@svgr/babel-plugin-transform-react-native-svg/-/babel-plugin-transform-react-native-svg-6.0.0.tgz",
"integrity": "sha512-VaphyHZ+xIKv5v0K0HCzyfAaLhPGJXSk2HkpYfXIOKb7DjLBv0soHDxNv6X0vr2titsxE7klb++u7iOf7TSrFQ==",
"dev": true,
"requires": {}
"requires": {
}
},
"@svgr/babel-plugin-transform-svg-component": {
"version": "6.1.0",
"resolved": "https://registry.npmjs.org/@svgr/babel-plugin-transform-svg-component/-/babel-plugin-transform-svg-component-6.1.0.tgz",
"integrity": "sha512-1zacrn08K5RyV2NtXahOZ5Im/+aB1Y0LVh6QpzwgQV05sY7H5Npq+OcW/UqXbfB2Ua/WnHsFossFQqigCjarYg==",
"dev": true,
"requires": {}
"requires": {
}
},
"@svgr/babel-preset": {
"version": "6.1.0",
@@ -26602,7 +26618,8 @@
"resolved": "https://registry.npmjs.org/@webpack-cli/configtest/-/configtest-1.1.0.tgz",
"integrity": "sha512-ttOkEkoalEHa7RaFYpM0ErK1xc4twg3Am9hfHhL7MVqlHebnkYd2wuI/ZqTDj0cVzZho6PdinY0phFZV3O0Mzg==",
"dev": true,
"requires": {}
"requires": {
}
},
"@webpack-cli/info": {
"version": "1.4.0",
@@ -26618,7 +26635,8 @@
"resolved": "https://registry.npmjs.org/@webpack-cli/serve/-/serve-1.6.0.tgz",
"integrity": "sha512-ZkVeqEmRpBV2GHvjjUZqEai2PpUbuq8Bqd//vEYsp63J8WyexI8ppCqVS3Zs0QADf6aWuPdU+0XsPI647PVlQA==",
"dev": true,
"requires": {}
"requires": {
}
},
"@xtuc/ieee754": {
"version": "1.2.0",
@@ -26673,14 +26691,16 @@
"integrity": "sha512-m7VZ3jwz4eK6A4Vtt8Ew1/mNbP24u0FhdyfA7fSvnJR6LMdfOYnmuIrrJAgrYfYJ10F/otaHTtrtrtmHdMNzEw==",
"dev": true,
"peer": true,
"requires": {}
"requires": {
}
},
"acorn-jsx": {
"version": "5.3.2",
"resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz",
"integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==",
"dev": true,
"requires": {}
"requires": {
}
},
"adm-zip": {
"version": "0.5.9",
@@ -26742,7 +26762,8 @@
"integrity": "sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==",
"dev": true,
"peer": true,
"requires": {}
"requires": {
}
},
"anser": {
"version": "1.4.10",
@@ -26978,7 +26999,8 @@
"version": "7.0.0-bridge.0",
"resolved": "https://registry.npmjs.org/babel-core/-/babel-core-7.0.0-bridge.0.tgz",
"integrity": "sha512-poPX9mZH/5CSanm50Q+1toVci6pv5KSRv/5TWCwtzQS5XEwn40BcCrgIeMFWP9CKKIniKXNxoIOnOq4VVlGXhg==",
"requires": {}
"requires": {
}
},
"babel-jest": {
"version": "29.5.0",
@@ -29002,7 +29024,8 @@
"resolved": "https://registry.npmjs.org/eslint-config-prettier/-/eslint-config-prettier-8.5.0.tgz",
"integrity": "sha512-obmWKLUNCnhtQRKc+tmnYuQl0pFU1ibYJQ5BGhTVB08bHe9wC8qUeG7c08dj9XX+AuPj1YSGSQIHl1pnDHZR0Q==",
"dev": true,
"requires": {}
"requires": {
}
},
"eslint-import-resolver-node": {
"version": "0.3.7",
@@ -29090,7 +29113,8 @@
"resolved": "https://registry.npmjs.org/eslint-plugin-header/-/eslint-plugin-header-3.1.1.tgz",
"integrity": "sha512-9vlKxuJ4qf793CmeeSrZUvVClw6amtpghq3CuWcB5cUNnWHQhgcqy5eF8oVKFk1G3Y/CbchGfEaw3wiIJaNmVg==",
"dev": true,
"requires": {}
"requires": {
}
},
"eslint-plugin-import": {
"version": "2.27.5",
@@ -29226,7 +29250,8 @@
"resolved": "https://registry.npmjs.org/eslint-plugin-react-hooks/-/eslint-plugin-react-hooks-4.6.0.tgz",
"integrity": "sha512-oFc7Itz9Qxh2x4gNHStv3BqJq54ExXmfC+a1NjAta66IAN87Wu0R/QArgIS9qKzX3dXKPI9H5crl9QchNMY9+g==",
"dev": true,
"requires": {}
"requires": {
}
},
"eslint-plugin-react-native": {
"version": "4.0.0",
@@ -31601,7 +31626,8 @@
"resolved": "https://registry.npmjs.org/jest-pnp-resolver/-/jest-pnp-resolver-1.2.3.tgz",
"integrity": "sha512-+3NpwQEnRoIBtx4fyhblQDPgJI0H1IEIkX7ShLUjPGA7TtUTvI1oiKi3SR4oBR0hQhQR80l4WAe5RrXBwWMA8w==",
"dev": true,
"requires": {}
"requires": {
}
},
"jest-regex-util": {
"version": "29.4.3",
@@ -34981,7 +35007,8 @@
"version": "1.0.3",
"resolved": "https://registry.npmjs.org/react-freeze/-/react-freeze-1.0.3.tgz",
"integrity": "sha512-ZnXwLQnGzrDpHBHiC56TXFXvmolPeMjTn1UOm610M4EXGzbEDR7oOIyS2ZiItgbs6eZc4oU/a0hpk8PrcKvv5g==",
"requires": {}
"requires": {
}
},
"react-intl": {
"version": "6.4.4",
@@ -35159,7 +35186,8 @@
"version": "2.4.1",
"resolved": "https://registry.npmjs.org/react-native-background-timer/-/react-native-background-timer-2.4.1.tgz",
"integrity": "sha512-TE4Kiy7jUyv+hugxDxitzu38sW1NqjCk4uE5IgU2WevLv7sZacaBc6PZKOShNRPGirLl1NWkaG3LDEkdb9Um5g==",
"requires": {}
"requires": {
}
},
"react-native-button": {
"version": "3.1.0",
@@ -35212,13 +35240,15 @@
"version": "1.6.4",
"resolved": "https://registry.npmjs.org/react-native-create-thumbnail/-/react-native-create-thumbnail-1.6.4.tgz",
"integrity": "sha512-JWuKXswDXtqUPfuqh6rjCVMvTSSG3kUtwvSK/YdaNU0i+nZKxeqHmt/CO2+TyI/WSUFynGVmWT1xOHhCZAFsRQ==",
"requires": {}
"requires": {
}
},
"react-native-device-info": {
"version": "10.6.0",
"resolved": "https://registry.npmjs.org/react-native-device-info/-/react-native-device-info-10.6.0.tgz",
"integrity": "sha512-/MmINdojWdw2/9rwYpH/dX+1gFP0o78p8yYPjwxiPhoySSL2rZaNi+Mq9VwC+zFi/yQmJUvHntkKSw2KUc7rFw==",
"requires": {}
"requires": {
}
},
"react-native-document-picker": {
"version": "9.0.1",
@@ -35255,19 +35285,22 @@
"version": "2.10.10",
"resolved": "https://registry.npmjs.org/react-native-exception-handler/-/react-native-exception-handler-2.10.10.tgz",
"integrity": "sha512-otAXGoZDl1689OoUJWN/rXxVbdoZ3xcmyF1uq/CsizdLwwyZqVGd6d+p/vbYvnF996FfEyAEBnHrdFxulTn51w==",
"requires": {}
"requires": {
}
},
"react-native-fast-image": {
"version": "8.6.3",
"resolved": "https://registry.npmjs.org/react-native-fast-image/-/react-native-fast-image-8.6.3.tgz",
"integrity": "sha512-Sdw4ESidXCXOmQ9EcYguNY2swyoWmx53kym2zRsvi+VeFCHEdkO+WG1DK+6W81juot40bbfLNhkc63QnWtesNg==",
"requires": {}
"requires": {
}
},
"react-native-file-viewer": {
"version": "2.1.5",
"resolved": "https://registry.npmjs.org/react-native-file-viewer/-/react-native-file-viewer-2.1.5.tgz",
"integrity": "sha512-MGC6sx9jsqHdefhVQ6o0akdsPGpkXgiIbpygb2Sg4g4bh7v6K1cardLV1NwGB9A6u1yICOSDT/MOC//9Ez6EUg==",
"requires": {}
"requires": {
}
},
"react-native-fs": {
"version": "2.20.0",
@@ -35306,19 +35339,22 @@
"version": "2.0.3",
"resolved": "https://registry.npmjs.org/react-native-haptic-feedback/-/react-native-haptic-feedback-2.0.3.tgz",
"integrity": "sha512-7+qvcxXZts/hA+HOOIFyM1x9m9fn/TJVSTgXaoQ8uT4gLc97IMvqHQ559tDmnlth+hHMzd3HRMpmRLWoKPL0DA==",
"requires": {}
"requires": {
}
},
"react-native-hw-keyboard-event": {
"version": "0.0.4",
"resolved": "https://registry.npmjs.org/react-native-hw-keyboard-event/-/react-native-hw-keyboard-event-0.0.4.tgz",
"integrity": "sha512-G8qp0nm17PHigLb/axgdF9xg51BKCG2p1AGeq//J/luLp5zNczIcQJh+nm02R1MeEUE3e53wqO4LMe0MV3raZg==",
"requires": {}
"requires": {
}
},
"react-native-image-picker": {
"version": "5.4.2",
"resolved": "https://registry.npmjs.org/react-native-image-picker/-/react-native-image-picker-5.4.2.tgz",
"integrity": "sha512-C/k3cYAh8fBImoGEwmiChNwHx9fJGqAIu2E4BUJdI1XlL17tSYjfTDx/bsuF4amZwa7hxZdQnZmpk0EnwIEUaw==",
"requires": {}
"requires": {
}
},
"react-native-in-app-review": {
"version": "4.3.3",
@@ -35328,13 +35364,15 @@
"react-native-incall-manager": {
"version": "git+ssh://git@github.com/react-native-webrtc/react-native-incall-manager.git#6d927ef24c6e47c6134177a4bb14a71054f85b65",
"from": "react-native-incall-manager@4.0.1",
"requires": {}
"requires": {
}
},
"react-native-iphone-x-helper": {
"version": "1.3.1",
"resolved": "https://registry.npmjs.org/react-native-iphone-x-helper/-/react-native-iphone-x-helper-1.3.1.tgz",
"integrity": "sha512-HOf0jzRnq2/aFUcdCJ9w9JGzN3gdEg0zFE4FyYlp4jtidqU03D5X7ZegGKfT1EWteR0gPBGp9ye5T5FvSWi9Yg==",
"requires": {}
"requires": {
}
},
"react-native-keyboard-aware-scroll-view": {
"version": "0.9.5",
@@ -35349,7 +35387,8 @@
"version": "5.7.0",
"resolved": "https://registry.npmjs.org/react-native-keyboard-tracking-view/-/react-native-keyboard-tracking-view-5.7.0.tgz",
"integrity": "sha512-MDeEwAbn9LJDOfHq0QLCGaZirVLk2X/tHqkAqz3y6uxryTRdSl9PwleOVar5Jx2oAPEg4J9BXbUD1wwOOi+5Kg==",
"requires": {}
"requires": {
}
},
"react-native-keychain": {
"version": "8.1.1",
@@ -35360,13 +35399,15 @@
"version": "2.7.2",
"resolved": "https://registry.npmjs.org/react-native-linear-gradient/-/react-native-linear-gradient-2.7.2.tgz",
"integrity": "sha512-c1mNtmQrD+nzlIePQ5XZR/6IuEaNcYvE+N7MnOHDSOkXmxfLVbyicT15KEYnXQqbTLwTrFNJPZot241lWRVC3g==",
"requires": {}
"requires": {
}
},
"react-native-localize": {
"version": "3.0.0",
"resolved": "https://registry.npmjs.org/react-native-localize/-/react-native-localize-3.0.0.tgz",
"integrity": "sha512-B8taYRLuLIYDzBTKIglA3K6ntjaEwbk6mwQ72ogZYl5ovM00NnpbiZ3sRq8KRVe/V1NGczxT33uVqG6BUWGWhg==",
"requires": {}
"requires": {
}
},
"react-native-math-view": {
"version": "3.9.5",
@@ -35402,7 +35443,8 @@
"version": "4.3.5",
"resolved": "https://registry.npmjs.org/react-native-notifications/-/react-native-notifications-4.3.5.tgz",
"integrity": "sha512-tCKkPaauN8/RIwPTeWdyezHXt5i4iDJViZGZ7/EBBuHB9kl9Oq3UjKFZeDfnM4DmJt+m7K2FQ7NaAuh3Kg1FCA==",
"requires": {}
"requires": {
}
},
"react-native-permissions": {
"version": "3.8.0",
@@ -35443,7 +35485,8 @@
"version": "4.5.3",
"resolved": "https://registry.npmjs.org/react-native-safe-area-context/-/react-native-safe-area-context-4.5.3.tgz",
"integrity": "sha512-ihYeGDEBSkYH+1aWnadNhVtclhppVgd/c0tm4mj0+HV11FoiWJ8N6ocnnZnRLvM5Fxc+hUqxR9bm5AXU3rXiyA==",
"requires": {}
"requires": {
}
},
"react-native-screens": {
"version": "3.21.0",
@@ -35476,7 +35519,8 @@
"version": "0.3.1",
"resolved": "https://registry.npmjs.org/react-native-size-matters/-/react-native-size-matters-0.3.1.tgz",
"integrity": "sha512-mKOfBLIBFBcs9br1rlZDvxD5+mAl8Gfr5CounwJtxI6Z82rGrMO+Kgl9EIg3RMVf3G855a85YVqHJL2f5EDRlw==",
"requires": {}
"requires": {
}
},
"react-native-svg": {
"version": "13.9.0",
@@ -37424,13 +37468,15 @@
"version": "0.1.6",
"resolved": "https://registry.npmjs.org/use-latest-callback/-/use-latest-callback-0.1.6.tgz",
"integrity": "sha512-VO/P91A/PmKH9bcN9a7O3duSuxe6M14ZoYXgA6a8dab8doWNdhiIHzEkX/jFeTTRBsX0Ubk6nG4q2NIjNsj+bg==",
"requires": {}
"requires": {
}
},
"use-sync-external-store": {
"version": "1.2.0",
"resolved": "https://registry.npmjs.org/use-sync-external-store/-/use-sync-external-store-1.2.0.tgz",
"integrity": "sha512-eEgnFxGQ1Ife9bzYs6VLi8/4X6CObHMw9Qr9tPY43iKwsPw8xE8+EFsf/2cFZ5S3esXgpWgtSCtLNS41F+sKPA==",
"requires": {}
"requires": {
}
},
"utf8": {
"version": "3.0.0",
@@ -37751,7 +37797,8 @@
"version": "7.5.5",
"resolved": "https://registry.npmjs.org/ws/-/ws-7.5.5.tgz",
"integrity": "sha512-BAkMFcAzl8as1G/hArkxOxq3G7pjUqQ3gzYbLL0/5zNkph70e+lCoxBGnm6AW1+/aiNeV4fnKqZ8m4GZewmH2w==",
"requires": {}
"requires": {
}
},
"xdate": {
"version": "0.8.2",

View File

@@ -1,6 +1,6 @@
{
"name": "mattermost-mobile",
"version": "2.5.1",
"version": "2.6.0",
"description": "Mattermost Mobile with React Native",
"repository": "git@github.com:mattermost/mattermost-mobile.git",
"author": "Mattermost, Inc.",