diff --git a/app/components/markdown/markdown_latex_inline/index.tsx b/app/components/markdown/markdown_latex_inline/index.tsx index be7e6a697..801f8cc92 100644 --- a/app/components/markdown/markdown_latex_inline/index.tsx +++ b/app/components/markdown/markdown_latex_inline/index.tsx @@ -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: { diff --git a/app/components/server_user_list/index.tsx b/app/components/server_user_list/index.tsx index 85a2749a8..c47277ec5 100644 --- a/app/components/server_user_list/index.tsx +++ b/app/components/server_user_list/index.tsx @@ -123,6 +123,7 @@ export default function ServerUserList({ term={term} testID={testID} tutorialWatched={tutorialWatched} + includeUserMargin={true} /> ); } diff --git a/app/components/user_item/user_item.tsx b/app/components/user_item/user_item.tsx index add7246d0..6af46a5ca 100644 --- a/app/components/user_item/user_item.tsx +++ b/app/components/user_item/user_item.tsx @@ -22,6 +22,7 @@ type AtMentionItemProps = { user: UserProfile | UserModel; containerStyle?: StyleProp; 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); diff --git a/app/components/user_list/__snapshots__/index.test.tsx.snap b/app/components/user_list/__snapshots__/index.test.tsx.snap index e628c5f35..e63f69a87 100644 --- a/app/components/user_list/__snapshots__/index.test.tsx.snap +++ b/app/components/user_list/__snapshots__/index.test.tsx.snap @@ -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, ] diff --git a/app/components/user_list/index.tsx b/app/components/user_list/index.tsx index 2daa07822..246b09452 100644 --- a/app/components/user_list/index.tsx +++ b/app/components/user_list/index.tsx @@ -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) { diff --git a/app/components/user_list_row/index.tsx b/app/components/user_list_row/index.tsx index bf9faa9c7..cec7eb6ea 100644 --- a/app/components/user_list_row/index.tsx +++ b/app/components/user_list_row/index.tsx @@ -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 && ({ color: theme.centerChannelColor, marginTop: 8, marginBottom: 8, + textAlign: 'center', ...typography('Heading', 700, 'SemiBold'), }, })); diff --git a/app/screens/channel/header/header.tsx b/app/screens/channel/header/header.tsx index 237ef9b9b..0a7a779e5 100644 --- a/app/screens/channel/header/header.tsx +++ b/app/screens/channel/header/header.tsx @@ -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), diff --git a/app/screens/login/form.tsx b/app/screens/login/form.tsx index fca72a13b..9c49e9201 100644 --- a/app/screens/login/form.tsx +++ b/app/screens/login/form.tsx @@ -48,7 +48,7 @@ const getStyleSheet = makeStyleSheetFromTheme((theme: Theme) => ({ }, forgotPasswordBtn: { borderColor: 'transparent', - width: '50%', + width: '60%', }, forgotPasswordError: { marginTop: 30, diff --git a/app/screens/login/index.tsx b/app/screens/login/index.tsx index 013d57420..6e1e70777 100644 --- a/app/screens/login/index.tsx +++ b/app/screens/login/index.tsx @@ -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(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} > - + {title} {description} {hasLoginForm && diff --git a/app/screens/manage_channel_members/manage_channel_members.tsx b/app/screens/manage_channel_members/manage_channel_members.tsx index 4cf7c8d22..10de1e84e 100644 --- a/app/screens/manage_channel_members/manage_channel_members.tsx +++ b/app/screens/manage_channel_members/manage_channel_members.tsx @@ -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} /> - - {/* TODO: https://mattermost.atlassian.net/browse/MM-48830 */} - {/* fix flashing No Results page when results are present */} ); diff --git a/app/screens/server/header.tsx b/app/screens/server/header.tsx index 27452632e..d2300f7de 100644 --- a/app/screens/server/header.tsx +++ b/app/screens/server/header.tsx @@ -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, diff --git a/app/screens/thread/index.tsx b/app/screens/thread/index.tsx index 08dada76a..17a588ce0 100644 --- a/app/screens/thread/index.tsx +++ b/app/screens/thread/index.tsx @@ -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, }; }); diff --git a/app/screens/thread/thread.tsx b/app/screens/thread/thread.tsx index d35bdf19c..4bf847f96 100644 --- a/app/screens/thread/thread.tsx +++ b/app/screens/thread/thread.tsx @@ -81,10 +81,12 @@ const Thread = ({ useEffect(() => { return () => { - EphemeralStore.setCurrentThreadId(''); + if (rootId === EphemeralStore.getCurrentThreadId()) { + EphemeralStore.setCurrentThreadId(''); + } setButtons(componentId, {rightButtons: []}); }; - }, []); + }, [rootId]); useDidUpdate(() => { if (!rootPost) { diff --git a/app/screens/user_profile/custom_status.tsx b/app/screens/user_profile/custom_status.tsx index 51e420e03..eedc7adf1 100644 --- a/app/screens/user_profile/custom_status.tsx +++ b/app/screens/user_profile/custom_status.tsx @@ -26,6 +26,7 @@ const getStyleSheet = makeStyleSheetFromTheme((theme: Theme) => ({ }, description: { color: theme.centerChannelColor, + flex: 1, ...typography('Body', 200), }, title: { diff --git a/package-lock.json b/package-lock.json index 3dcbc722f..fbb1c4238 100644 --- a/package-lock.json +++ b/package-lock.json @@ -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",