Thread crash fix and other UI fixes (#7342)

* center align channel name in intro

* align custom status in channel header

* wrap long custom status on profile bottom sheet

* Fix LaTex render clipped on Android

* Add margin for users displayed in a list

* show user profile when tapping on self on channel members

* Fix Thread screen when rootId prop is undefined

* update snapshots

* fix server / login screen on small devices
This commit is contained in:
Elias Nahum 2023-05-11 09:35:11 -04:00 committed by GitHub
parent c99861d728
commit 5e9de9f4a2
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
16 changed files with 125 additions and 130 deletions

View file

@ -3,7 +3,7 @@
import React from 'react';
import {useIntl} from 'react-intl';
import {Platform, Text, View} from 'react-native';
import {Text, View} from 'react-native';
import MathView from 'react-native-math-view';
import ErrorBoundary from '@components/markdown/error_boundary';
@ -23,7 +23,7 @@ type MathViewErrorProps = {
const getStyleSheet = makeStyleSheetFromTheme((theme: Theme) => {
return {
mathStyle: {
marginBottom: Platform.select({default: -10, ios: 2.5}),
marginVertical: 3,
color: theme.centerChannelColor,
},
viewStyle: {

View file

@ -123,6 +123,7 @@ export default function ServerUserList({
term={term}
testID={testID}
tutorialWatched={tutorialWatched}
includeUserMargin={true}
/>
);
}

View file

@ -22,6 +22,7 @@ type AtMentionItemProps = {
user: UserProfile | UserModel;
containerStyle?: StyleProp<ViewStyle>;
currentUserId: string;
includeMargin?: boolean;
size?: number;
testID?: string;
isCustomStatusEnabled: boolean;
@ -61,11 +62,12 @@ const getThemedStyles = makeStyleSheetFromTheme((theme: Theme) => {
const nonThemedStyles = StyleSheet.create({
row: {
height: 40,
paddingVertical: 8,
paddingBottom: 8,
paddingTop: 4,
flexDirection: 'row',
alignItems: 'center',
},
margin: {marginVertical: 8},
rowInfoBaseContainer: {
flex: 1,
},
@ -104,6 +106,7 @@ const UserItem = ({
disabled = false,
viewRef,
padding,
includeMargin,
}: AtMentionItemProps) => {
const theme = useTheme();
const style = getThemedStyles(theme);
@ -134,8 +137,9 @@ const UserItem = ({
opacity: disabled ? 0.32 : 1,
paddingHorizontal: padding || undefined,
},
includeMargin && nonThemedStyles.margin,
];
}, [disabled, padding]);
}, [disabled, padding, includeMargin]);
const onPress = useCallback(() => {
onUserPress?.(user);

View file

@ -158,13 +158,14 @@ exports[`components/channel_list_row should show no results 1`] = `
"alignItems": "center",
"flexDirection": "row",
"height": 40,
"paddingBottom": 8,
"paddingTop": 4,
"paddingVertical": 8,
},
{
"opacity": 1,
"paddingHorizontal": 20,
},
undefined,
],
undefined,
]
@ -443,13 +444,14 @@ exports[`components/channel_list_row should show results and tutorial 1`] = `
"alignItems": "center",
"flexDirection": "row",
"height": 40,
"paddingBottom": 8,
"paddingTop": 4,
"paddingVertical": 8,
},
{
"opacity": 1,
"paddingHorizontal": 20,
},
undefined,
],
undefined,
]
@ -808,13 +810,14 @@ exports[`components/channel_list_row should show results no tutorial 1`] = `
"alignItems": "center",
"flexDirection": "row",
"height": 40,
"paddingBottom": 8,
"paddingTop": 4,
"paddingVertical": 8,
},
{
"opacity": 1,
"paddingHorizontal": 20,
},
undefined,
],
undefined,
]
@ -1125,13 +1128,14 @@ exports[`components/channel_list_row should show results no tutorial 2 users 1`]
"alignItems": "center",
"flexDirection": "row",
"height": 40,
"paddingBottom": 8,
"paddingTop": 4,
"paddingVertical": 8,
},
{
"opacity": 1,
"paddingHorizontal": 20,
},
undefined,
],
undefined,
]
@ -1315,13 +1319,14 @@ exports[`components/channel_list_row should show results no tutorial 2 users 1`]
"alignItems": "center",
"flexDirection": "row",
"height": 40,
"paddingBottom": 8,
"paddingTop": 4,
"paddingVertical": 8,
},
{
"opacity": 1,
"paddingHorizontal": 20,
},
undefined,
],
undefined,
]

View file

@ -100,12 +100,14 @@ export function createProfilesSections(intl: IntlShape, profiles: UserProfile[],
const results = [];
let index = 0;
for (const [k, v] of sections) {
results.push({
first: index === 0,
id: k,
data: v,
});
index++;
if (v.length) {
results.push({
first: index === 0,
id: k,
data: v,
});
index++;
}
}
return results;
}
@ -159,6 +161,7 @@ type Props = {
testID?: string;
term?: string;
tutorialWatched: boolean;
includeUserMargin?: boolean;
}
export default function UserList({
@ -175,6 +178,7 @@ export default function UserList({
term,
testID,
tutorialWatched,
includeUserMargin,
}: Props) {
const intl = useIntl();
const theme = useTheme();
@ -247,9 +251,10 @@ export default function UserList({
testID='create_direct_message.user_list.user_item'
tutorialWatched={tutorialWatched}
user={item}
includeMargin={includeUserMargin}
/>
);
}, [selectedIds, handleSelectProfile, showManageMode, manageMode, tutorialWatched]);
}, [selectedIds, handleSelectProfile, showManageMode, manageMode, tutorialWatched, includeUserMargin]);
const renderLoading = useCallback(() => {
if (!loading) {

View file

@ -26,6 +26,7 @@ import type UserModel from '@typings/database/models/servers/user';
type Props = {
highlight?: boolean;
id: string;
includeMargin?: boolean;
isMyUser: boolean;
isChannelAdmin: boolean;
manageMode: boolean;
@ -70,6 +71,7 @@ const DEFAULT_ICON_OPACITY = 0.32;
function UserListRow({
id,
includeMargin,
isMyUser,
highlight,
isChannelAdmin,
@ -124,11 +126,8 @@ function UserListRow({
}, [highlight, tutorialWatched, isTablet]);
const handlePress = useCallback((u: UserModel | UserProfile) => {
if (isMyUser && manageMode) {
return;
}
onPress?.(u);
}, [onPress, isMyUser, manageMode]);
}, [onPress]);
const manageModeIcon = useMemo(() => {
if (!showManageMode || isMyUser) {
@ -190,6 +189,7 @@ function UserListRow({
disabled={!(selectable || selected || !disabled)}
viewRef={viewRef}
padding={20}
includeMargin={includeMargin}
/>
{showTutorial &&
<TutorialHighlight

View file

@ -50,6 +50,7 @@ const getStyleSheet = makeStyleSheetFromTheme((theme: Theme) => ({
color: theme.centerChannelColor,
marginTop: 8,
marginBottom: 8,
textAlign: 'center',
...typography('Heading', 700, 'SemiBold'),
},
}));

View file

@ -48,14 +48,17 @@ type ChannelProps = {
const getStyleSheet = makeStyleSheetFromTheme((theme: Theme) => ({
customStatusContainer: {
flexDirection: 'row',
height: 13,
height: 15,
left: Platform.select({ios: undefined, default: -2}),
marginTop: Platform.select({ios: undefined, default: 1}),
},
customStatusEmoji: {marginRight: 5},
customStatusEmoji: {
marginRight: 5,
marginTop: Platform.select({ios: undefined, default: -2}),
},
customStatusText: {
alignItems: 'center',
height: 13,
height: 15,
},
subtitle: {
color: changeOpacity(theme.sidebarHeaderTextColor, 0.72),

View file

@ -48,7 +48,7 @@ const getStyleSheet = makeStyleSheetFromTheme((theme: Theme) => ({
},
forgotPasswordBtn: {
borderColor: 'transparent',
width: '50%',
width: '60%',
},
forgotPasswordError: {
marginTop: 30,

View file

@ -1,8 +1,8 @@
// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.
// See LICENSE.txt for license information.
import React, {useEffect, useMemo, useRef} from 'react';
import {Platform, useWindowDimensions, View} from 'react-native';
import React, {useCallback, useEffect, useMemo, useRef, useState} from 'react';
import {Platform, useWindowDimensions, View, type LayoutChangeEvent} from 'react-native';
import {KeyboardAwareScrollView} from 'react-native-keyboard-aware-scroll-view';
import {Navigation} from 'react-native-navigation';
import Animated, {useAnimatedStyle, useSharedValue, withTiming} from 'react-native-reanimated';
@ -12,6 +12,7 @@ import FormattedText from '@components/formatted_text';
import {Screens} from '@constants';
import useAndroidHardwareBackHandler from '@hooks/android_back_handler';
import {useIsTablet} from '@hooks/device';
import {useDefaultHeaderHeight} from '@hooks/header';
import useNavButtonPressed from '@hooks/navigation_button_pressed';
import NetworkManager from '@managers/network_manager';
import Background from '@screens/background';
@ -82,8 +83,10 @@ const LoginOptions = ({
const styles = getStyles(theme);
const keyboardAwareRef = useRef<KeyboardAwareScrollView>(null);
const dimensions = useWindowDimensions();
const defaultHeaderHeight = useDefaultHeaderHeight();
const isTablet = useIsTablet();
const translateX = useSharedValue(dimensions.width);
const [contentFillScreen, setContentFillScreen] = useState(false);
const numberSSOs = useMemo(() => {
return Object.values(ssoOptions).filter((v) => v.enabled).length;
}, [ssoOptions]);
@ -143,6 +146,11 @@ const LoginOptions = ({
popTopScreen(componentId);
};
const onLayout = useCallback((e: LayoutChangeEvent) => {
const {height} = e.nativeEvent.layout;
setContentFillScreen(dimensions.height < height + defaultHeaderHeight);
}, [dimensions.height, defaultHeaderHeight]);
useEffect(() => {
const navigationEvents = Navigation.events().registerNavigationButtonPressedListener(({buttonId}) => {
if (closeButtonId && buttonId === closeButtonId) {
@ -176,7 +184,7 @@ const LoginOptions = ({
useAndroidHardwareBackHandler(componentId, pop);
let additionalContainerStyle;
if (numberSSOs < 3 || !hasLoginForm || (isTablet && dimensions.height > dimensions.width)) {
if (!contentFillScreen && (numberSSOs < 3 || !hasLoginForm || (isTablet && dimensions.height > dimensions.width))) {
additionalContainerStyle = styles.flex;
}
@ -221,7 +229,10 @@ const LoginOptions = ({
scrollToOverflowEnabled={true}
style={styles.flex}
>
<View style={styles.centered}>
<View
onLayout={onLayout}
style={styles.centered}
>
{title}
{description}
{hasLoginForm &&

View file

@ -111,7 +111,14 @@ export default function ManageChannelMembers({
}, 100), [channelId, loading, serverUrl, term]);
const handleSelectProfile = useCallback(async (profile: UserProfile) => {
await fetchUsersByIds(serverUrl, [profile.id]);
if (profile.id === currentUserId && isManageMode) {
return;
}
if (profile.id !== currentUserId) {
await fetchUsersByIds(serverUrl, [profile.id]);
}
const title = formatMessage({id: 'mobile.routes.user_profile', defaultMessage: 'Profile'});
const props = {
channelId,
@ -124,7 +131,7 @@ export default function ManageChannelMembers({
Keyboard.dismiss();
openAsBottomSheet({screen: USER_PROFILE, title, theme, closeButtonId: CLOSE_BUTTON_ID, props});
}, [canManageAndRemoveMembers, channelId, isManageMode]);
}, [canManageAndRemoveMembers, channelId, isManageMode, currentUserId]);
const searchUsers = useCallback(async (searchTerm: string) => {
const lowerCasedTerm = searchTerm.toLowerCase();
@ -256,9 +263,6 @@ export default function ManageChannelMembers({
value={term}
/>
</View>
{/* TODO: https://mattermost.atlassian.net/browse/MM-48830 */}
{/* fix flashing No Results page when results are present */}
<UserList
currentUserId={currentUserId}
handleSelectProfile={handleSelectProfile}
@ -272,6 +276,7 @@ export default function ManageChannelMembers({
term={term}
testID='manage_members.user_list'
tutorialWatched={tutorialWatched}
includeUserMargin={true}
/>
</SafeAreaView>
);

View file

@ -27,7 +27,7 @@ const getStyleSheet = makeStyleSheetFromTheme((theme: Theme) => ({
...typography('Heading', 400, 'SemiBold'),
},
connect: {
width: 320,
width: 300,
letterSpacing: -1,
color: theme.centerChannelColor,
marginVertical: 12,

View file

@ -9,6 +9,7 @@ import {observeChannelsWithCalls, observeCurrentCall} from '@calls/state';
import {withServerUrl} from '@context/server';
import {observePost} from '@queries/servers/post';
import {observeIsCRTEnabled} from '@queries/servers/thread';
import EphemeralStore from '@store/ephemeral_store';
import Thread from './thread';
@ -20,7 +21,8 @@ type EnhanceProps = WithDatabaseArgs & {
}
const enhanced = withObservables(['rootId'], ({database, serverUrl, rootId}: EnhanceProps) => {
const rootPost = observePost(database, rootId);
const rId = rootId || EphemeralStore.getCurrentThreadId();
const rootPost = observePost(database, rId);
const channelId = rootPost.pipe(
switchMap((r) => of$(r?.channelId || '')),
@ -49,6 +51,7 @@ const enhanced = withObservables(['rootId'], ({database, serverUrl, rootId}: Enh
isCallInCurrentChannel,
isInACall,
isInCurrentChannelCall,
rootId: of$(rId),
rootPost,
};
});

View file

@ -81,10 +81,12 @@ const Thread = ({
useEffect(() => {
return () => {
EphemeralStore.setCurrentThreadId('');
if (rootId === EphemeralStore.getCurrentThreadId()) {
EphemeralStore.setCurrentThreadId('');
}
setButtons(componentId, {rightButtons: []});
};
}, []);
}, [rootId]);
useDidUpdate(() => {
if (!rootPost) {

View file

@ -26,6 +26,7 @@ const getStyleSheet = makeStyleSheetFromTheme((theme: Theme) => ({
},
description: {
color: theme.centerChannelColor,
flex: 1,
...typography('Body', 200),
},
title: {

140
package-lock.json generated
View file

@ -6,7 +6,7 @@
"packages": {
"": {
"name": "mattermost-mobile",
"version": "2.3.0",
"version": "2.4.0",
"hasInstallScript": true,
"license": "Apache 2.0",
"dependencies": {
@ -24281,8 +24281,7 @@
"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.3",
@ -24328,8 +24327,7 @@
"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",
@ -24415,15 +24413,13 @@
"version": "5.3.1",
"resolved": "https://registry.npmjs.org/@react-native-camera-roll/camera-roll/-/camera-roll-5.3.1.tgz",
"integrity": "sha512-2XKMkb/pLBC6vYkNh+bJ4UEj49V2ZSyWFHmaxsUJU9beLo1QbM3XJnySV6F1uv7aC+I2RBlDuAusCqNiTQiCOw==",
"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.2",
@ -25580,8 +25576,7 @@
"version": "9.3.9",
"resolved": "https://registry.npmjs.org/@react-native-community/netinfo/-/netinfo-9.3.9.tgz",
"integrity": "sha512-L9f8OjX5Fwh5CdP4ygDPa6iQCJJ4tAtXiFuQp6EG4/sdSXDqOXaehAhJrZAN8P8Lztnf8YN8p836GmZuBCrY+A==",
"requires": {
}
"requires": {}
},
"@react-native-cookies/cookies": {
"version": "6.2.1",
@ -25657,8 +25652,7 @@
"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",
@ -25943,72 +25937,63 @@
"version": "0.10.2",
"resolved": "https://registry.npmjs.org/@stream-io/flat-list-mvcp/-/flat-list-mvcp-0.10.2.tgz",
"integrity": "sha512-jebEKP7pfRF8/tVSqNM6qdvisfOtMnMlzGYTWldoOnIq9/6DS1BU4ilzBuH6O7iBUu4bDokrMCNJgA2b2EKW/A==",
"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",
@ -26932,8 +26917,7 @@
"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",
@ -26949,8 +26933,7 @@
"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",
@ -27005,16 +26988,14 @@
"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",
@ -27076,8 +27057,7 @@
"integrity": "sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==",
"dev": true,
"peer": true,
"requires": {
}
"requires": {}
},
"anser": {
"version": "1.4.10",
@ -27304,8 +27284,7 @@
"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",
@ -29272,8 +29251,7 @@
"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",
@ -29361,8 +29339,7 @@
"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",
@ -29498,8 +29475,7 @@
"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",
@ -31917,8 +31893,7 @@
"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",
@ -35376,8 +35351,7 @@
"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.1",
@ -35555,8 +35529,7 @@
"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.0.1",
@ -35596,15 +35569,13 @@
"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": "8.2.0",
@ -35641,22 +35612,19 @@
"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",
@ -35695,22 +35663,19 @@
"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.3.1",
"resolved": "https://registry.npmjs.org/react-native-image-picker/-/react-native-image-picker-5.3.1.tgz",
"integrity": "sha512-zRCjtlE3KOeaWDM8gXzTwXfvo3ZeF2XMkHceU7CVCtKRleKxna/E4XWIPu/lXO2qlMdnSx1WvfPSbqzAX0qxpA==",
"requires": {
}
"requires": {}
},
"react-native-in-app-review": {
"version": "4.3.3",
@ -35720,15 +35685,13 @@
"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",
@ -35743,8 +35706,7 @@
"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",
@ -35755,15 +35717,13 @@
"version": "2.6.2",
"resolved": "https://registry.npmjs.org/react-native-linear-gradient/-/react-native-linear-gradient-2.6.2.tgz",
"integrity": "sha512-Z8Xxvupsex+9BBFoSYS87bilNPWcRfRsGC0cpJk72Nxb5p2nEkGSBv73xZbEHnW2mUFvP+huYxrVvjZkr/gRjQ==",
"requires": {
}
"requires": {}
},
"react-native-localize": {
"version": "2.2.6",
"resolved": "https://registry.npmjs.org/react-native-localize/-/react-native-localize-2.2.6.tgz",
"integrity": "sha512-EZETlC1ZlW/4g6xfsNCwAkAw5BDL2A6zk/08JjFR/GRGxYuKRD7iP1hHn1+h6DEu+xROjPpoNeXfMER2vkTVIQ==",
"requires": {
}
"requires": {}
},
"react-native-math-view": {
"version": "3.9.5",
@ -35799,8 +35759,7 @@
"version": "4.3.3",
"resolved": "https://registry.npmjs.org/react-native-notifications/-/react-native-notifications-4.3.3.tgz",
"integrity": "sha512-t7uPgpC93A4L41Jea2zet3BUqgh45gpN/ATS9gxejNH3r6kWgMdGeeZJhuMpl1gSXw1gcvgzdjzIjN7YZSOP0A==",
"requires": {
}
"requires": {}
},
"react-native-permissions": {
"version": "3.8.0",
@ -35841,8 +35800,7 @@
"version": "4.5.1",
"resolved": "https://registry.npmjs.org/react-native-safe-area-context/-/react-native-safe-area-context-4.5.1.tgz",
"integrity": "sha512-bKcwk6zZvyz+VLoG6Uia1oiYU1jSbv1ysjEKSRLsLtPcDsbixsTc0UgfrPqjZxNTPzvYLMcr8ufA90UQauN4mw==",
"requires": {
}
"requires": {}
},
"react-native-screens": {
"version": "3.20.0",
@ -35875,8 +35833,7 @@
"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",
@ -37812,15 +37769,13 @@
"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",
@ -38161,8 +38116,7 @@
"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",