diff --git a/__mocks__/react-native-fs.ts b/__mocks__/@dr.pogodin/react-native-fs.ts
similarity index 96%
rename from __mocks__/react-native-fs.ts
rename to __mocks__/@dr.pogodin/react-native-fs.ts
index 5a3963564..259b79660 100644
--- a/__mocks__/react-native-fs.ts
+++ b/__mocks__/@dr.pogodin/react-native-fs.ts
@@ -1,4 +1,4 @@
-jest.mock('react-native-fs', () => {
+jest.mock('@dr.pogodin/react-native-fs', () => {
return {
mkdir: jest.fn(),
moveFile: jest.fn(),
diff --git a/android/app/build.gradle b/android/app/build.gradle
index f89304bbe..671d0d7e5 100644
--- a/android/app/build.gradle
+++ b/android/app/build.gradle
@@ -89,7 +89,7 @@ android {
minSdkVersion rootProject.ext.minSdkVersion
targetSdkVersion rootProject.ext.targetSdkVersion
versionCode 95
- versionName "1.5.38"
+ versionName "1.6.0"
buildConfigField("boolean", "REACT_NATIVE_UNSTABLE_USE_RUNTIME_SCHEDULER_ALWAYS", (findProperty("reactNative.unstable_useRuntimeSchedulerAlways") ?: true).toString())
}
diff --git a/android/app/src/main/res/values/strings.xml b/android/app/src/main/res/values/strings.xml
index ff9c51baf..55cf690b4 100644
--- a/android/app/src/main/res/values/strings.xml
+++ b/android/app/src/main/res/values/strings.xml
@@ -2,5 +2,5 @@
Internxt
cover
false
- 1.5.38
+ 1.6.0
\ No newline at end of file
diff --git a/ios/Internxt.xcodeproj/project.pbxproj b/ios/Internxt.xcodeproj/project.pbxproj
index 40b9f8fcc..a5b382c70 100644
--- a/ios/Internxt.xcodeproj/project.pbxproj
+++ b/ios/Internxt.xcodeproj/project.pbxproj
@@ -280,6 +280,7 @@
"${PODS_CONFIGURATION_BUILD_DIR}/ReachabilitySwift/ReachabilitySwift.bundle",
"${PODS_CONFIGURATION_BUILD_DIR}/React-Core/RCTI18nStrings.bundle",
"${PODS_CONFIGURATION_BUILD_DIR}/Rudder/Rudder.bundle",
+ "${PODS_CONFIGURATION_BUILD_DIR}/dr-pogodin-react-native-fs/RNFS_PrivacyInfo.bundle",
);
name = "[CP] Copy Pods Resources";
outputPaths = (
@@ -293,6 +294,7 @@
"${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/ReachabilitySwift.bundle",
"${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/RCTI18nStrings.bundle",
"${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/Rudder.bundle",
+ "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/RNFS_PrivacyInfo.bundle",
);
runOnlyForDeploymentPostprocessing = 0;
shellPath = /bin/sh;
diff --git a/ios/Internxt/Info.plist b/ios/Internxt/Info.plist
index ce8ab22ab..fe9b133e1 100644
--- a/ios/Internxt/Info.plist
+++ b/ios/Internxt/Info.plist
@@ -19,7 +19,7 @@
CFBundlePackageType
$(PRODUCT_BUNDLE_PACKAGE_TYPE)
CFBundleShortVersionString
- 1.5.38
+ 1.6.0
CFBundleSignature
????
CFBundleURLTypes
diff --git a/ios/Internxt/Supporting/Expo.plist b/ios/Internxt/Supporting/Expo.plist
index 94c4a058b..1ed739e0e 100644
--- a/ios/Internxt/Supporting/Expo.plist
+++ b/ios/Internxt/Supporting/Expo.plist
@@ -9,7 +9,7 @@
EXUpdatesLaunchWaitMs
0
EXUpdatesRuntimeVersion
- 1.5.38
+ 1.6.0
EXUpdatesURL
https://u.expo.dev/680f4feb-6315-4a50-93ec-36dcd0b831d2
diff --git a/ios/Podfile.lock b/ios/Podfile.lock
index c72ea57fe..155b4c776 100644
--- a/ios/Podfile.lock
+++ b/ios/Podfile.lock
@@ -1,6 +1,10 @@
PODS:
- boost (1.83.0)
- DoubleConversion (1.1.6)
+ - dr-pogodin-react-native-fs (2.24.6):
+ - glog
+ - RCT-Folly (= 2022.05.16.00)
+ - React-Core
- EASClient (0.11.2):
- ExpoModulesCore
- EXConstants (15.4.6):
@@ -938,9 +942,13 @@ PODS:
- React-Mapbuffer (0.73.6):
- glog
- React-debug
+ - react-native-create-thumbnail (2.0.0):
+ - React-Core
- react-native-document-picker (4.3.0):
- React-Core
- - react-native-image-picker (4.10.3):
+ - react-native-image-picker (7.1.2):
+ - glog
+ - RCT-Folly (= 2022.05.16.00)
- React-Core
- react-native-pdf (6.7.5):
- React-Core
@@ -1151,8 +1159,6 @@ PODS:
- React-Core
- RNFlashList (1.6.3):
- React-Core
- - RNFS (2.20.0):
- - React-Core
- RNGestureHandler (2.14.1):
- glog
- RCT-Folly (= 2022.05.16.00)
@@ -1195,6 +1201,7 @@ PODS:
DEPENDENCIES:
- boost (from `../node_modules/react-native/third-party-podspecs/boost.podspec`)
- DoubleConversion (from `../node_modules/react-native/third-party-podspecs/DoubleConversion.podspec`)
+ - "dr-pogodin-react-native-fs (from `../node_modules/@dr.pogodin/react-native-fs`)"
- EASClient (from `../node_modules/expo-eas-client/ios`)
- EXConstants (from `../node_modules/expo-constants/ios`)
- EXFont (from `../node_modules/expo-font/ios`)
@@ -1246,6 +1253,7 @@ DEPENDENCIES:
- React-jsinspector (from `../node_modules/react-native/ReactCommon/jsinspector-modern`)
- React-logger (from `../node_modules/react-native/ReactCommon/logger`)
- React-Mapbuffer (from `../node_modules/react-native/ReactCommon`)
+ - react-native-create-thumbnail (from `../node_modules/react-native-create-thumbnail`)
- react-native-document-picker (from `../node_modules/react-native-document-picker`)
- react-native-image-picker (from `../node_modules/react-native-image-picker`)
- react-native-pdf (from `../node_modules/react-native-pdf`)
@@ -1284,7 +1292,6 @@ DEPENDENCIES:
- RNFastImage (from `../node_modules/react-native-fast-image`)
- RNFileViewer (from `../node_modules/react-native-file-viewer`)
- "RNFlashList (from `../node_modules/@shopify/flash-list`)"
- - RNFS (from `../node_modules/react-native-fs`)
- RNGestureHandler (from `../node_modules/react-native-gesture-handler`)
- RNPermissions (from `../node_modules/react-native-permissions`)
- RNReanimated (from `../node_modules/react-native-reanimated`)
@@ -1314,6 +1321,8 @@ EXTERNAL SOURCES:
:podspec: "../node_modules/react-native/third-party-podspecs/boost.podspec"
DoubleConversion:
:podspec: "../node_modules/react-native/third-party-podspecs/DoubleConversion.podspec"
+ dr-pogodin-react-native-fs:
+ :path: "../node_modules/@dr.pogodin/react-native-fs"
EASClient:
:path: "../node_modules/expo-eas-client/ios"
EXConstants:
@@ -1412,6 +1421,8 @@ EXTERNAL SOURCES:
:path: "../node_modules/react-native/ReactCommon/logger"
React-Mapbuffer:
:path: "../node_modules/react-native/ReactCommon"
+ react-native-create-thumbnail:
+ :path: "../node_modules/react-native-create-thumbnail"
react-native-document-picker:
:path: "../node_modules/react-native-document-picker"
react-native-image-picker:
@@ -1488,8 +1499,6 @@ EXTERNAL SOURCES:
:path: "../node_modules/react-native-file-viewer"
RNFlashList:
:path: "../node_modules/@shopify/flash-list"
- RNFS:
- :path: "../node_modules/react-native-fs"
RNGestureHandler:
:path: "../node_modules/react-native-gesture-handler"
RNPermissions:
@@ -1510,6 +1519,7 @@ EXTERNAL SOURCES:
SPEC CHECKSUMS:
boost: d3f49c53809116a5d38da093a8aa78bf551aed09
DoubleConversion: fea03f2699887d960129cc54bba7e52542b6f953
+ dr-pogodin-react-native-fs: ef429362460ab16ade0132464d024d40baf2c2dc
EASClient: a42ee8bf36c93b3128352faf2ae49405ab4f80bd
EXConstants: a5f6276e565d98f9eb4280f81241fc342d641590
EXFont: f20669cb266ef48b004f1eb1f2b20db96cd1df9f
@@ -1564,8 +1574,9 @@ SPEC CHECKSUMS:
React-jsinspector: 85583ef014ce53d731a98c66a0e24496f7a83066
React-logger: 3eb80a977f0d9669468ef641a5e1fabbc50a09ec
React-Mapbuffer: 84ea43c6c6232049135b1550b8c60b2faac19fab
+ react-native-create-thumbnail: ab55d24aea01723cf386f18b0b542aabb1982f27
react-native-document-picker: 20f652c2402d3ddc81f396d8167c3bd978add4a2
- react-native-image-picker: 60f4246eb5bb7187fc15638a8c1f13abd3820695
+ react-native-image-picker: d3db110a3ded6e48c93aef7e8e51afdde8b16ed0
react-native-pdf: 103940c90d62adfd259f63cca99c7c0c306b514c
react-native-pdf-thumbnail: 390b1bc4b115b613ca61d6b14cbc712b3621b1df
react-native-randombytes: 421f1c7d48c0af8dbcd471b0324393ebf8fe7846
@@ -1602,7 +1613,6 @@ SPEC CHECKSUMS:
RNFastImage: 5c9c9fed9c076e521b3f509fe79e790418a544e8
RNFileViewer: ce7ca3ac370e18554d35d6355cffd7c30437c592
RNFlashList: 4b4b6b093afc0df60ae08f9cbf6ccd4c836c667a
- RNFS: 4ac0f0ea233904cb798630b3c077808c06931688
RNGestureHandler: 15c6ef51acba34c49ff03003806cf5dd6098f383
RNPermissions: 4e3714e18afe7141d000beae3755e5b5fb2f5e05
RNReanimated: f6b02d8f5eaa2830296411d4ec3b8ef5442dd13d
diff --git a/package.json b/package.json
index 2eab6152e..94fbf5c4b 100644
--- a/package.json
+++ b/package.json
@@ -1,6 +1,6 @@
{
"name": "drive-mobile",
- "version": "v1.5.38",
+ "version": "v1.6.0",
"private": true,
"license": "GNU",
"scripts": {
@@ -30,6 +30,7 @@
},
"dependencies": {
"@burstware/react-native-portal": "^1.0.2",
+ "@dr.pogodin/react-native-fs": "2.24.6",
"@expo/config-plugins": "7.8.4",
"@expo/config-types": "^47.0.0",
"@hookform/resolvers": "^2.9.1",
@@ -92,14 +93,14 @@
"react-native": "0.73.6",
"react-native-bip39": "^2.3.0",
"react-native-collapsible": "^1.6.0",
+ "react-native-create-thumbnail": "^2.0.0",
"react-native-crypto": "^2.2.0",
"react-native-device-info": "^8.4.8",
"react-native-document-picker": "^4.1.0",
"react-native-fast-image": "^8.5.11",
"react-native-file-viewer": "^2.1.4",
- "react-native-fs": "^2.16.6",
"react-native-gesture-handler": "~2.14.0",
- "react-native-image-picker": "^4.0.6",
+ "react-native-image-picker": "^7.1.2",
"react-native-image-zoom-viewer": "^3.0.1",
"react-native-localization": "^2.3.1",
"react-native-logs": "^5.0.1",
diff --git a/patches/react-native-image-picker+7.1.2.patch b/patches/react-native-image-picker+7.1.2.patch
new file mode 100644
index 000000000..650b8f677
--- /dev/null
+++ b/patches/react-native-image-picker+7.1.2.patch
@@ -0,0 +1,24 @@
+diff --git a/node_modules/react-native-image-picker/ios/ImagePickerUtils.mm b/node_modules/react-native-image-picker/ios/ImagePickerUtils.mm
+index 443500d..6f8d0ba 100644
+--- a/node_modules/react-native-image-picker/ios/ImagePickerUtils.mm
++++ b/node_modules/react-native-image-picker/ios/ImagePickerUtils.mm
+@@ -97,6 +97,8 @@
+ const uint8_t firstByteJpg = 0xFF;
+ const uint8_t firstBytePng = 0x89;
+ const uint8_t firstByteGif = 0x47;
++ const uint8_t firstByteWebp = 0x52;
++ const uint8_t firstByteHeic = 0x00;
+
+ uint8_t firstByte;
+ [imageData getBytes:&firstByte length:1];
+@@ -107,6 +109,10 @@
+ return @"png";
+ case firstByteGif:
+ return @"gif";
++ case firstByteWebp:
++ return @"webp";
++ case firstByteHeic:
++ return @"heic";
+ default:
+ return @"jpg";
+ }
diff --git a/src/components/AppTextInput/index.tsx b/src/components/AppTextInput/index.tsx
index 90c218266..a199fc356 100644
--- a/src/components/AppTextInput/index.tsx
+++ b/src/components/AppTextInput/index.tsx
@@ -1,7 +1,16 @@
import { isString } from 'lodash';
-import { useState } from 'react';
-import { StyleProp, TextInput, TextInputProps, View, ViewStyle } from 'react-native';
-import { useAnimatedStyle, useSharedValue } from 'react-native-reanimated';
+import { useRef, useState } from 'react';
+import {
+ NativeSyntheticEvent,
+ Platform,
+ StyleProp,
+ TextInput,
+ TextInputFocusEventData,
+ TextInputProps,
+ TextInputSelectionChangeEventData,
+ View,
+ ViewStyle,
+} from 'react-native';
import { useTailwind } from 'tailwind-rn';
import useGetColor from '../../hooks/useColor';
import AppText from '../AppText';
@@ -19,8 +28,56 @@ const AppTextInput = (props: AppTextInputProps): JSX.Element => {
const tailwind = useTailwind();
const getColor = useGetColor();
const [isFocused, setIsFocused] = useState(false);
+ const [selection, setSelection] = useState<{ start: number; end: number } | undefined>();
+ const localInputRef = useRef(null);
const editable = props.editable !== false;
const [status, statusMessage] = props.status || ['idle', ''];
+ const isAndroid = Platform.OS === 'android';
+
+ const handleSelectionChange = (event: NativeSyntheticEvent) => {
+ if (isAndroid) {
+ const newSelection = event.nativeEvent.selection;
+ setSelection(newSelection);
+ }
+ };
+
+ const handleOnFocusInput = (e: NativeSyntheticEvent) => {
+ setIsFocused(true);
+ if (isAndroid && props.value && (!selection || (selection.start === 0 && selection.end === 0))) {
+ const position = props.value.length;
+ setSelection({ start: position, end: position });
+ }
+ props.onFocus?.(e);
+ };
+
+ // Added selection prop handler to resolve Android input cursor position bug
+ const handleChangeText = (newText: string) => {
+ if (isAndroid && selection) {
+ const oldText = props.value || '';
+ let newPosition: number;
+
+ const hasNothingSelected = selection.start === selection.end;
+ if (hasNothingSelected) {
+ newPosition = selection.start + (newText.length - oldText.length);
+ setSelection({ start: newPosition, end: newPosition });
+ } else {
+ const selectionStart = Math.min(selection.start, selection.end);
+ newPosition = selectionStart + newText.length - oldText.slice(selection.start, selection.end).length;
+ setSelection({ start: newPosition, end: newPosition });
+ }
+
+ setTimeout(() => {
+ if (localInputRef.current) {
+ localInputRef.current.setNativeProps({
+ selection: { start: newPosition, end: newPosition },
+ });
+ }
+ }, 0);
+ }
+
+ props.onChangeText?.(newText);
+ };
+
const renderStatusMessage = () => {
let template: JSX.Element | undefined = undefined;
@@ -47,6 +104,14 @@ const AppTextInput = (props: AppTextInputProps): JSX.Element => {
return template;
};
+ const inputProps = {
+ ...props,
+ ref: props.inputRef || localInputRef,
+ onChangeText: isAndroid ? handleChangeText : props.onChangeText,
+ onSelectionChange: isAndroid ? handleSelectionChange : props.onSelectionChange,
+ selection: isAndroid ? selection : props.selection,
+ };
+
return (
{props.label && {props.label}}
@@ -63,11 +128,13 @@ const AppTextInput = (props: AppTextInputProps): JSX.Element => {
>
setIsFocused(true)}
- onBlur={() => setIsFocused(false)}
- ref={props.inputRef}
+ onFocus={handleOnFocusInput}
+ onBlur={(e) => {
+ setIsFocused(false);
+ props.onBlur?.(e);
+ }}
/>
{props.renderAppend && {props.renderAppend({ isFocused })}}
diff --git a/src/components/SwipeBackHandler/index.tsx b/src/components/SwipeBackHandler/index.tsx
new file mode 100644
index 000000000..f8fc18d5a
--- /dev/null
+++ b/src/components/SwipeBackHandler/index.tsx
@@ -0,0 +1,23 @@
+import { useEffect } from 'react';
+import { BackHandler } from 'react-native';
+
+interface SwipeBackProps {
+ swipeBack: () => void;
+}
+
+const SwipeBackHandler = ({ swipeBack }: SwipeBackProps) => {
+ useEffect(() => {
+ const backHandler = BackHandler.addEventListener('hardwareBackPress', handleBackPress);
+
+ return () => backHandler.remove();
+ }, []);
+
+ const handleBackPress = () => {
+ swipeBack();
+ return true;
+ };
+
+ return null;
+};
+
+export default SwipeBackHandler;
diff --git a/src/components/modals/AddModal/index.tsx b/src/components/modals/AddModal/index.tsx
index 7b9e7a191..92da3e5e2 100644
--- a/src/components/modals/AddModal/index.tsx
+++ b/src/components/modals/AddModal/index.tsx
@@ -1,13 +1,14 @@
+import * as RNFS from '@dr.pogodin/react-native-fs';
import * as FileSystem from 'expo-file-system';
import {
launchCameraAsync,
requestCameraPermissionsAsync,
requestMediaLibraryPermissionsAsync,
} from 'expo-image-picker';
-import React, { useState } from 'react';
+import { useState } from 'react';
import { Alert, PermissionsAndroid, Platform, TouchableHighlight, View } from 'react-native';
import DocumentPicker, { DocumentPickerResponse } from 'react-native-document-picker';
-import RNFS from 'react-native-fs';
+
import { launchImageLibrary } from 'react-native-image-picker';
import { useDrive } from '@internxt-mobile/hooks/drive';
@@ -41,6 +42,7 @@ import BottomModal from '../BottomModal';
import CreateFolderModal from '../CreateFolderModal';
const MAX_FILES_BULK_UPLOAD = 25;
+
function AddModal(): JSX.Element {
const tailwind = useTailwind();
const getColor = useGetColor();
@@ -53,6 +55,7 @@ function AddModal(): JSX.Element {
const { limit } = useAppSelector((state) => state.storage);
const usage = useAppSelector(storageSelectors.usage);
+
async function uploadIOS(file: UploadingFile, fileType: 'document' | 'image', progressCallback: ProgressCallback) {
const name = decodeURI(file.uri).split('/').pop() || '';
const regex = /^(.*:\/{0,2})\/?(.*)$/gm;
@@ -81,6 +84,7 @@ function AddModal(): JSX.Element {
await SLEEP_BECAUSE_MAYBE_BACKEND_IS_NOT_RETURNING_FRESHLY_MODIFIED_OR_CREATED_ITEMS_YET(500);
await driveCtx.loadFolderContent(focusedFolder.id, { pullFrom: ['network'], resetPagination: true });
};
+
async function uploadAndroid(
fileToUpload: UploadingFile,
fileType: 'document' | 'image',
@@ -217,6 +221,7 @@ function AddModal(): JSX.Element {
thumbnails: uploadedThumbnail ? [uploadedThumbnail] : null,
} as DriveFileData;
}
+
const uploadFile = async (uploadingFile: UploadingFile, fileType: 'document' | 'image') => {
logger.info('Starting file upload process: ', JSON.stringify(uploadingFile));
function progressCallback(progress: number) {
@@ -445,6 +450,7 @@ function AddModal(): JSX.Element {
}
errorService.reportError(error);
+ logger.error('Error on handleUploadFiles function:', JSON.stringify(err));
notificationsService.show({
type: NotificationType.Error,
@@ -464,51 +470,56 @@ function AddModal(): JSX.Element {
const { status } = await requestMediaLibraryPermissionsAsync(false);
if (status === 'granted') {
- launchImageLibrary({ mediaType: 'mixed', selectionLimit: MAX_FILES_BULK_UPLOAD }, async (response) => {
- if (response.errorMessage) {
- return Alert.alert(response.errorMessage);
- }
- if (response.assets) {
- const documents: DocumentPickerResponse[] = [];
-
- for (const asset of response.assets) {
- const decodedURI = decodeURIComponent(asset.uri as string);
- const stat = await RNFS.stat(decodedURI);
-
- documents.push({
- fileCopyUri: asset.uri || '',
- name: decodeURIComponent(
- asset.fileName || asset.uri?.substring((asset.uri || '').lastIndexOf('/') + 1) || '',
- ),
- size: asset.fileSize || stat.size,
- type: asset.type || '',
- uri: asset.uri || '',
- });
+ launchImageLibrary(
+ { mediaType: 'mixed', selectionLimit: MAX_FILES_BULK_UPLOAD, assetRepresentationMode: 'current' },
+ async (response) => {
+ if (response.errorMessage) {
+ return Alert.alert(response.errorMessage);
}
-
- dispatch(uiActions.setShowUploadFileModal(false));
- uploadDocuments(documents)
- .then(() => {
- dispatch(driveThunks.loadUsageThunk());
-
- if (focusedFolder) {
- driveCtx.loadFolderContent(focusedFolder.id);
- }
- })
- .catch((err) => {
- if (err.message === 'User canceled document picker') {
- return;
- }
- notificationsService.show({
- type: NotificationType.Error,
- text1: strings.formatString(strings.errors.uploadFile, err.message) as string,
+ if (response.assets) {
+ const documents: DocumentPickerResponse[] = [];
+
+ for (const asset of response.assets) {
+ const decodedURI = decodeURIComponent(asset.uri as string);
+ const stat = await RNFS.stat(decodedURI);
+
+ documents.push({
+ fileCopyUri: asset.uri || '',
+ name: decodeURIComponent(
+ asset.fileName || asset.uri?.substring((asset.uri || '').lastIndexOf('/') + 1) || '',
+ ),
+ size: asset.fileSize || stat.size,
+ type: asset.type || '',
+ uri: asset.uri || '',
});
- })
- .finally(() => {
- dispatch(uiActions.setShowUploadFileModal(false));
- });
- }
- });
+ }
+
+ dispatch(uiActions.setShowUploadFileModal(false));
+ uploadDocuments(documents)
+ .then(() => {
+ dispatch(driveThunks.loadUsageThunk());
+
+ if (focusedFolder) {
+ driveCtx.loadFolderContent(focusedFolder.id);
+ }
+ })
+ .catch((err) => {
+ if (err.message === 'User canceled document picker') {
+ return;
+ }
+
+ logger.error('Error on handleUploadFromCameraRoll function:', JSON.stringify(err));
+ notificationsService.show({
+ type: NotificationType.Error,
+ text1: strings.formatString(strings.errors.uploadFile, err.message) as string,
+ });
+ })
+ .finally(() => {
+ dispatch(uiActions.setShowUploadFileModal(false));
+ });
+ }
+ },
+ );
}
} else {
DocumentPicker.pickMultiple({
@@ -527,6 +538,9 @@ function AddModal(): JSX.Element {
if (err.message === 'User canceled document picker') {
return;
}
+
+ logger.error('Error on hadleUploadFromCameraRoll function:', JSON.stringify(err));
+
notificationsService.show({
type: NotificationType.Error,
text1: strings.formatString(strings.errors.uploadFile, err.message) as string,
@@ -593,10 +607,12 @@ function AddModal(): JSX.Element {
}
}
}
- } catch (err) {
+ } catch (error) {
+ logger.error('Error on handleTakePhotoAndUpload function:', JSON.stringify(error));
+
notificationsService.show({
type: NotificationType.Error,
- text1: strings.formatString(strings.errors.uploadFile, (err as Error).message) as string,
+ text1: strings.formatString(strings.errors.uploadFile, (error as Error)?.message) as string,
});
}
}
@@ -671,8 +687,8 @@ function AddModal(): JSX.Element {
style={tailwind('flex-grow')}
underlayColor={getColor('text-gray-40')}
onPress={() => {
- setShowCreateFolderModal(true);
dispatch(uiActions.setShowUploadFileModal(false));
+ setShowCreateFolderModal(true);
}}
>
diff --git a/src/components/modals/BottomModal/index.tsx b/src/components/modals/BottomModal/index.tsx
index 46a66a32a..0f0388bab 100644
--- a/src/components/modals/BottomModal/index.tsx
+++ b/src/components/modals/BottomModal/index.tsx
@@ -4,10 +4,9 @@ import Modal from 'react-native-modalbox';
import { StatusBar } from 'expo-status-bar';
import { useSafeAreaInsets } from 'react-native-safe-area-context';
-import { X } from 'phosphor-react-native';
+import { INCREASED_TOUCH_AREA } from 'src/styles/global';
import { useTailwind } from 'tailwind-rn';
import useGetColor from '../../../hooks/useColor';
-import { INCREASED_TOUCH_AREA } from 'src/styles/global';
export interface BottomModalProps {
isOpen: boolean;
@@ -38,7 +37,7 @@ const BottomModal = (props: BottomModalProps): JSX.Element => {
((amount ?? 0) * 0.01).toFixed(2);
+
const PlansModal = (props: BaseModalProps) => {
const [selectedStorageBytes, setSelectedStorageBytes] = useState();
const [selectedInterval, setSelectedInterval] = useState();
@@ -184,12 +187,13 @@ const PlansModal = (props: BaseModalProps) => {
);
});
+
const renderButtons = (selectedBytes: number) => {
const displayPrices = getDisplayPriceWithIntervals(selectedBytes);
const monthlyPrice = displayPrices.find((display) => display.interval === 'month');
const yearlyPrice = displayPrices.find((display) => display.interval === 'year');
- const monthlyAmount = (monthlyPrice?.amount || 0) * 0.01;
- const yearlyAmount = (yearlyPrice?.amount || 0) * 0.01;
+ const monthlyAmount = formatAmount(monthlyPrice?.amount);
+ const yearlyAmount = formatAmount(yearlyPrice?.amount);
return (
<>
diff --git a/src/network/NetworkFacade.ts b/src/network/NetworkFacade.ts
index cc77779d6..ca4e4b2e8 100644
--- a/src/network/NetworkFacade.ts
+++ b/src/network/NetworkFacade.ts
@@ -1,3 +1,4 @@
+import * as RNFS from '@dr.pogodin/react-native-fs';
import { decryptFile, encryptFile } from '@internxt/rn-crypto';
import { ALGORITHMS, Network } from '@internxt/sdk/dist/network';
import { downloadFile } from '@internxt/sdk/dist/network/download';
@@ -6,7 +7,6 @@ import { uploadFile } from '@internxt/sdk/dist/network/upload';
import { Platform } from 'react-native';
import { validateMnemonic } from 'react-native-bip39';
import { randomBytes } from 'react-native-crypto';
-import * as RNFS from 'react-native-fs';
import uuid from 'react-native-uuid';
import RNFetchBlob from 'rn-fetch-blob';
@@ -114,7 +114,6 @@ export class NetworkFacade {
interval !== null && clearInterval(interval);
updateProgress(maxEncryptProgress);
}
-
fileHash = ripemd160(Buffer.from(await RNFS.hash(encryptedFilePath, 'sha256'), 'hex')).toString('hex');
},
async (url: string) => {
@@ -172,7 +171,7 @@ export class NetworkFacade {
throw new Error('Download error code 3');
}
- let downloadJob: { jobId: number; promise: Promise };
+ let downloadJob: { jobId: number; promise: Promise };
let expectedFileHash: string;
const decryptFileFromFs: DecryptFileFromFsFunction =
diff --git a/src/network/crypto.ts b/src/network/crypto.ts
index 7eef775c4..29b3c899b 100644
--- a/src/network/crypto.ts
+++ b/src/network/crypto.ts
@@ -1,6 +1,6 @@
-import RNFetchBlob from 'rn-fetch-blob';
-import { stat, read } from 'react-native-fs';
+import { read, stat } from '@dr.pogodin/react-native-fs';
import { createDecipheriv, Decipher } from 'react-native-crypto';
+import RNFetchBlob from 'rn-fetch-blob';
function getAes256CtrDecipher(key: Buffer, iv: Buffer): Decipher {
return createDecipheriv('aes-256-ctr', key, iv);
diff --git a/src/network/download.ts b/src/network/download.ts
index 575cef1d7..3f567d163 100644
--- a/src/network/download.ts
+++ b/src/network/download.ts
@@ -1,13 +1,13 @@
-import RNFS from 'react-native-fs';
+import * as RNFS from '@dr.pogodin/react-native-fs';
-import { getNetwork } from './NetworkFacade';
+import { FileVersionOneError } from '@internxt/sdk/dist/network/download';
+import FileManager from '../@inxt-js/api/FileManager';
+import { constants } from '../services/AppService';
import { downloadFile as downloadFileV1, LegacyDownloadRequiredError } from '../services/NetworkService/download';
import { downloadFile as downloadFileV1Legacy } from '../services/NetworkService/downloadLegacy';
-import { constants } from '../services/AppService';
-import { NetworkCredentials } from './requests';
-import { FileVersionOneError } from '@internxt/sdk/dist/network/download';
import { Abortable } from '../types';
-import FileManager from '../@inxt-js/api/FileManager';
+import { getNetwork } from './NetworkFacade';
+import { NetworkCredentials } from './requests';
export type EncryptedFileDownloadedParams = {
path: string;
diff --git a/src/screens/SignInScreen/index.tsx b/src/screens/SignInScreen/index.tsx
index 6dc357766..4232abf3d 100644
--- a/src/screens/SignInScreen/index.tsx
+++ b/src/screens/SignInScreen/index.tsx
@@ -118,7 +118,7 @@ function SignInScreen({ navigation }: RootStackScreenProps<'SignIn'>): JSX.Eleme
setIsLoading(false);
- setErrors({ loginFailed: strings.errors.missingAuthCredentials });
+ setErrors({ loginFailed: castedError.message });
}
};
const onGoToSignUpButtonPressed = () => {
diff --git a/src/screens/drive/DriveFolderScreen/DriveFolderScreen.tsx b/src/screens/drive/DriveFolderScreen/DriveFolderScreen.tsx
index b7246036a..bd5731c68 100644
--- a/src/screens/drive/DriveFolderScreen/DriveFolderScreen.tsx
+++ b/src/screens/drive/DriveFolderScreen/DriveFolderScreen.tsx
@@ -138,6 +138,7 @@ export function DriveFolderScreen({ navigation }: DriveScreenProps<'DriveFolder'
navigation.navigate('DrivePreview');
};
+
const handleDriveItemPress = (driveItem: DriveListItem) => {
const isFolder = driveItem.data.type ? false : true;
if (!isFolder) {
diff --git a/src/screens/drive/DrivePreviewScreen/DrivePreviewScreen.tsx b/src/screens/drive/DrivePreviewScreen/DrivePreviewScreen.tsx
index 1a5e42db1..2d7032fc3 100644
--- a/src/screens/drive/DrivePreviewScreen/DrivePreviewScreen.tsx
+++ b/src/screens/drive/DrivePreviewScreen/DrivePreviewScreen.tsx
@@ -1,4 +1,4 @@
-import { GeneratedThumbnail } from '@internxt-mobile/services/common';
+import { GeneratedThumbnail, imageService } from '@internxt-mobile/services/common';
import { time } from '@internxt-mobile/services/common/time';
import errorService from '@internxt-mobile/services/ErrorService';
import { fs } from '@internxt-mobile/services/FileSystemService';
@@ -51,12 +51,12 @@ export const DrivePreviewScreen: React.FC>
VIDEO_PREVIEW_TYPES.includes(downloadingFile.data.type as FileExtension) &&
!generatedThumbnail
) {
- // imageService
- // .generateVideoThumbnail(downloadingFile.downloadedFilePath)
- // .then((generatedThumbnail) => {
- // setGeneratedThumbnail(generatedThumbnail);
- // })
- // .catch((err) => errorService.reportError(err));
+ imageService
+ .generateVideoThumbnail(downloadingFile.downloadedFilePath)
+ .then((generatedThumbnail) => {
+ setGeneratedThumbnail(generatedThumbnail);
+ })
+ .catch((err) => errorService.reportError(err));
}
}, [downloadingFile?.downloadedFilePath]);
diff --git a/src/screens/drive/DrivePreviewScreen/DrivePreviewScreenHeader.tsx b/src/screens/drive/DrivePreviewScreen/DrivePreviewScreenHeader.tsx
index f3005f243..fb074038f 100644
--- a/src/screens/drive/DrivePreviewScreen/DrivePreviewScreenHeader.tsx
+++ b/src/screens/drive/DrivePreviewScreen/DrivePreviewScreenHeader.tsx
@@ -4,6 +4,7 @@ import { TouchableOpacity, View } from 'react-native';
import AppText from 'src/components/AppText';
import { INCREASED_TOUCH_AREA } from 'src/styles/global';
import { useTailwind } from 'tailwind-rn';
+import SwipeBackHandler from '../../../components/SwipeBackHandler';
export interface DrivePreviewScreenHeaderProps {
onCloseButtonPress: () => void;
@@ -21,6 +22,7 @@ export const DrivePreviewScreenHeader: React.FC =
{ height: DRIVE_PREVIEW_HEADER_HEIGHT },
]}
>
+
diff --git a/src/services/FileSystemService.ts b/src/services/FileSystemService.ts
index 926295930..29ad4d91e 100644
--- a/src/services/FileSystemService.ts
+++ b/src/services/FileSystemService.ts
@@ -1,13 +1,14 @@
+import * as RNFS from '@dr.pogodin/react-native-fs';
import { Platform } from 'react-native';
-import RNFS from 'react-native-fs';
-import RNFetchBlob, { RNFetchBlobStat } from 'rn-fetch-blob';
-import FileViewer from 'react-native-file-viewer';
+
+import { internxtFS } from '@internxt/mobile-sdk';
import * as FileSystem from 'expo-file-system';
+import { shareAsync } from 'expo-sharing';
import prettysize from 'prettysize';
+import FileViewer from 'react-native-file-viewer';
import Share from 'react-native-share';
import uuid from 'react-native-uuid';
-import { shareAsync } from 'expo-sharing';
-import { internxtFS } from '@internxt/mobile-sdk';
+import RNFetchBlob, { RNFetchBlobStat } from 'rn-fetch-blob';
enum AcceptedEncodings {
Utf8 = 'utf8',
Ascii = 'ascii',
@@ -21,7 +22,7 @@ export interface FileWriter {
const ANDROID_URI_PREFIX = 'file://';
-export type UsageStatsResult = Record;
+export type UsageStatsResult = Record;
class FileSystemService {
private timestamp = Date.now();
@@ -50,7 +51,7 @@ class FileSystemService {
return `internxt_mobile_runtime_logs_${this.timestamp}.txt`;
}
- public getDownloadsDir(): string {
+ public getDownloadsDir(): string | undefined {
// MainBundlePath is only available on iOS
return Platform.OS === 'ios' ? RNFS.MainBundlePath : RNFS.DownloadDirectoryPath;
}
diff --git a/src/services/NetworkService/download.ts b/src/services/NetworkService/download.ts
index fa40671b6..6134f2129 100644
--- a/src/services/NetworkService/download.ts
+++ b/src/services/NetworkService/download.ts
@@ -1,18 +1,19 @@
+import * as RNFS from '@dr.pogodin/react-native-fs';
import { request } from '@internxt/lib';
-import RNFS from 'react-native-fs';
+
import axios, { AxiosRequestConfig } from 'axios';
-import RNFetchBlob from 'rn-fetch-blob';
import { createDecipheriv } from 'react-native-crypto';
+import RNFetchBlob from 'rn-fetch-blob';
import { GenerateFileKey, ripemd160, sha256 } from '../../@inxt-js/lib/crypto';
import { eachLimit } from 'async';
-import fileSystemService from '../FileSystemService';
-import { NetworkCredentials } from '../../types';
-import { Platform } from 'react-native';
import { decryptFile as nativeDecryptFile } from '@internxt/rn-crypto';
import { FileId } from '@internxt/sdk/dist/photos';
+import { Platform } from 'react-native';
+import { NetworkCredentials } from '../../types';
+import fileSystemService from '../FileSystemService';
type FileDecryptedURI = string;
diff --git a/src/services/common/filesystem/fileCacheManager.spec.ts b/src/services/common/filesystem/fileCacheManager.spec.ts
index ea5f26883..d59e16455 100644
--- a/src/services/common/filesystem/fileCacheManager.spec.ts
+++ b/src/services/common/filesystem/fileCacheManager.spec.ts
@@ -1,5 +1,5 @@
+import { ReadDirResItemT } from '@dr.pogodin/react-native-fs';
import fileSystemService from '@internxt-mobile/services/FileSystemService';
-import { ReadDirItem } from 'react-native-fs';
import { FileCacheManagerConfigError, FileDoesntExistsError } from './errors';
import { FileCacheManager, FileCacheManagerConfig } from './fileCacheManager';
@@ -132,7 +132,7 @@ describe('File Cache Manager', () => {
it('Should remove files in the directory by the oldest mtime if not enough space', async () => {
// Total 90MB
- const itemsInDir: ReadDirItem[] = [
+ const itemsInDir: ReadDirResItemT[] = [
{
name: 'file_1.png',
ctime: new Date('2022/12/01'),
diff --git a/src/services/common/logger/logger.service.ts b/src/services/common/logger/logger.service.ts
index f6ec489ac..d30102898 100644
--- a/src/services/common/logger/logger.service.ts
+++ b/src/services/common/logger/logger.service.ts
@@ -1,5 +1,6 @@
+import * as RNFS from '@dr.pogodin/react-native-fs';
import { logger as RNLogger, consoleTransport, fileAsyncTransport } from 'react-native-logs';
-import RNFS from 'react-native-fs';
+
import { fs } from '@internxt-mobile/services/FileSystemService';
import { InteractionManager } from 'react-native';
diff --git a/src/services/common/media/image.service.ts b/src/services/common/media/image.service.ts
index 9b90a7d4c..140245961 100644
--- a/src/services/common/media/image.service.ts
+++ b/src/services/common/media/image.service.ts
@@ -3,7 +3,9 @@ import { manipulateAsync, SaveFormat } from 'expo-image-manipulator';
import fileSystemService, { fs } from '@internxt-mobile/services/FileSystemService';
import { FileExtension } from '@internxt-mobile/types/drive';
-import RNFS from 'react-native-fs';
+import * as RNFS from '@dr.pogodin/react-native-fs';
+
+import { createThumbnail } from 'react-native-create-thumbnail';
import PdfThumbnail from 'react-native-pdf-thumbnail';
import uuid from 'react-native-uuid';
import RNFetchBlob from 'rn-fetch-blob';
@@ -24,20 +26,15 @@ export type ThumbnailGenerateConfig = {
height?: number;
};
-// added this to omit video extension types, the package that produces the video thumbnail is
-// causing compilation errors, leave it to solve in other task
-type OmittedExtensions = 'avi' | 'mp4' | 'mov';
-type IncludedFileExtension = Exclude;
-
class ImageService {
private get thumbnailGenerators(): Record<
- IncludedFileExtension,
+ FileExtension,
(filePath: string, config: ThumbnailGenerateConfig) => Promise
> {
return {
- // [FileExtension.AVI]: this.generateVideoThumbnail,
- // [FileExtension.MP4]: this.generateVideoThumbnail,
- // [FileExtension.MOV]: this.generateVideoThumbnail,
+ [FileExtension.AVI]: this.generateVideoThumbnail,
+ [FileExtension.MP4]: this.generateVideoThumbnail,
+ [FileExtension.MOV]: this.generateVideoThumbnail,
[FileExtension.JPEG]: this.generateImageThumbnail,
[FileExtension.JPG]: this.generateImageThumbnail,
[FileExtension.PNG]: this.generateImageThumbnail,
@@ -154,7 +151,7 @@ class ImageService {
filePath: string,
config: { outputPath: string; quality?: number; extension: string; thumbnailFormat: SaveFormat },
): Promise {
- const generator = this.thumbnailGenerators[config.extension.toLowerCase() as IncludedFileExtension];
+ const generator = this.thumbnailGenerators[config.extension.toLowerCase() as FileExtension];
if (!generator) {
// eslint-disable-next-line no-console
@@ -165,24 +162,23 @@ class ImageService {
return this.resizeThumbnail(await generator(filePath, config));
}
- // TODO: FIND A WAY TO GENERATE VIDEO THUMBNAILS
/**
* Generates a thumbnail for a video file
*/
- // public generateVideoThumbnail = async (filePath: string): Promise => {
- // const result = await createThumbnail({
- // url: fileSystemService.pathToUri(filePath),
- // dirSize: 100,
- // });
-
- // return {
- // size: result.size,
- // type: 'JPEG',
- // width: result.width,
- // height: result.height,
- // path: result.path,
- // };
- // };
+ public generateVideoThumbnail = async (filePath: string): Promise => {
+ const result = await createThumbnail({
+ url: fileSystemService.pathToUri(filePath),
+ dirSize: 100,
+ });
+
+ return {
+ size: result.size,
+ type: 'JPEG',
+ width: result.width,
+ height: result.height,
+ path: result.path,
+ };
+ };
/**
* Generates a thumbnail for an image
diff --git a/src/services/drive/constants.ts b/src/services/drive/constants.ts
index a8a2f3283..c5c7c71ae 100644
--- a/src/services/drive/constants.ts
+++ b/src/services/drive/constants.ts
@@ -1,4 +1,5 @@
-import RNFS from 'react-native-fs';
+import * as RNFS from '@dr.pogodin/react-native-fs';
+
export const DRIVE_ROOT_DIRECTORY = `${RNFS.DocumentDirectoryPath}/drive`;
export const DRIVE_THUMBNAILS_DIRECTORY = `${DRIVE_ROOT_DIRECTORY}/thumbnails`;
export const DRIVE_CACHE_DIRECTORY = `${DRIVE_ROOT_DIRECTORY}/cache`;
diff --git a/src/services/drive/events/driveEvents.ts b/src/services/drive/events/driveEvents.ts
index 714a5d8ad..2d74d5709 100644
--- a/src/services/drive/events/driveEvents.ts
+++ b/src/services/drive/events/driveEvents.ts
@@ -1,6 +1,6 @@
/* eslint-disable @typescript-eslint/no-explicit-any */
+import * as RNFS from '@dr.pogodin/react-native-fs';
import EventEmitter from 'events';
-import RNFS from 'react-native-fs';
import { Abortable } from '../../../types';
import { DriveEventKey } from '../../../types/drive';
diff --git a/src/store/slices/drive/index.ts b/src/store/slices/drive/index.ts
index c3ba1f6e9..22ead9609 100644
--- a/src/store/slices/drive/index.ts
+++ b/src/store/slices/drive/index.ts
@@ -1,31 +1,31 @@
-import { createSlice, createAsyncThunk, PayloadAction } from '@reduxjs/toolkit';
import { DriveFileData, DriveFolderData } from '@internxt/sdk/dist/drive/storage/types';
+import { createAsyncThunk, createSlice, PayloadAction } from '@reduxjs/toolkit';
import analytics, { DriveAnalyticsEvent } from '../../../services/AnalyticsService';
-import { NotificationType } from '../../../types';
+import { logger } from '@internxt-mobile/services/common';
+import drive from '@internxt-mobile/services/drive';
+import { items } from '@internxt/lib';
+import { isValidFilename } from 'src/helpers';
+import authService from 'src/services/AuthService';
+import errorService from 'src/services/ErrorService';
+import { ErrorCodes } from 'src/types/errors';
import { RootState } from '../..';
import strings from '../../../../assets/lang/strings';
+import fileSystemService from '../../../services/FileSystemService';
import notificationsService from '../../../services/NotificationsService';
+import { NotificationType } from '../../../types';
import {
+ DownloadingFile,
+ DriveEventKey,
DriveItemData,
+ DriveItemFocused,
DriveItemStatus,
DriveListItem,
- UploadingFile,
- DownloadingFile,
- DriveEventKey,
DriveNavigationStack,
DriveNavigationStackItem,
- DriveItemFocused,
+ UploadingFile,
} from '../../../types/drive';
-import fileSystemService from '../../../services/FileSystemService';
-import { items } from '@internxt/lib';
-import drive from '@internxt-mobile/services/drive';
-import authService from 'src/services/AuthService';
-import errorService from 'src/services/ErrorService';
-import { ErrorCodes } from 'src/types/errors';
-import { isValidFilename } from 'src/helpers';
-import { logger } from '@internxt-mobile/services/common';
export enum ThunkOperationStatus {
SUCCESS = 'SUCCESS',
@@ -231,6 +231,7 @@ const downloadFileThunk = createAsyncThunk<
if (!fileAlreadyExists) {
trackDownloadStart();
downloadProgressCallback(0);
+
await download({ fileId, to: destinationPath });
}
@@ -242,6 +243,7 @@ const downloadFileThunk = createAsyncThunk<
trackDownloadSuccess();
} catch (err) {
+ logger.error('Error in downloadFileThunk ', JSON.stringify(err));
dispatch(driveActions.updateDownloadingFile({ error: (err as Error).message }));
/**
* In case something fails, we remove the file in case it exists, that way
diff --git a/tsconfig.json b/tsconfig.json
index 31823ac13..c54b8f53e 100644
--- a/tsconfig.json
+++ b/tsconfig.json
@@ -3,6 +3,7 @@
"compilerOptions": {
"strict": true,
"baseUrl": ".",
+ "jsx": "react-jsx",
"paths": {
"@internxt-mobile/ui-kit": ["src/components/ui-kit/index.ts"],
"@internxt-mobile/hooks/*": ["src/hooks/*"],
diff --git a/yarn.lock b/yarn.lock
index 2c8364e90..4a2bbf3f1 100644
--- a/yarn.lock
+++ b/yarn.lock
@@ -1279,6 +1279,13 @@
dependencies:
"@jridgewell/trace-mapping" "0.3.9"
+"@dr.pogodin/react-native-fs@2.24.6":
+ version "2.24.6"
+ resolved "https://registry.yarnpkg.com/@dr.pogodin/react-native-fs/-/react-native-fs-2.24.6.tgz#a673628d0b4b26f28cab211af98a9e83c12ae90b"
+ integrity sha512-DMEL/FLf+LrRnegBDbLHDRCAv/flhrZwbSOzHmwGPjAd8gF6Bn48z8gFmrwlxcAtR0rxo1K1L8gWzddyR/LV8A==
+ dependencies:
+ buffer "^6.0.3"
+
"@egjs/hammerjs@^2.0.17":
version "2.0.17"
resolved "https://registry.yarnpkg.com/@egjs/hammerjs/-/hammerjs-2.0.17.tgz#5dc02af75a6a06e4c2db0202cae38c9263895124"
@@ -10705,6 +10712,11 @@ react-native-collapsible@^1.6.0:
resolved "https://registry.yarnpkg.com/react-native-collapsible/-/react-native-collapsible-1.6.2.tgz#3b67fa402a6ba3c291022f5db8f345083862c3d8"
integrity sha512-MCOBVJWqHNjnDaGkvxX997VONmJeebh6wyJxnHEgg0L1PrlcXU1e/bo6eK+CDVFuMrCafw8Qh4DOv/C4V/+Iew==
+react-native-create-thumbnail@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/react-native-create-thumbnail/-/react-native-create-thumbnail-2.0.0.tgz#4eae9b4198cd484a1420608b53ce5872209b9a25"
+ integrity sha512-1GA0PHGlhSirKUqbtlLLk++3Wkd/fo8H8YUi71Lp5Y2z+AxZMKmY1/IcB9ooDiMzI1Pxr006Kq99JWuXowoykg==
+
react-native-crypto@^2.0.1, react-native-crypto@^2.2.0:
version "2.2.0"
resolved "https://registry.yarnpkg.com/react-native-crypto/-/react-native-crypto-2.2.0.tgz#c999ed7c96064f830e1f958687f53d0c44025770"
@@ -10741,14 +10753,6 @@ react-native-file-viewer@^2.1.4:
resolved "https://registry.yarnpkg.com/react-native-file-viewer/-/react-native-file-viewer-2.1.5.tgz#cd4544f573108e79002b5c7e1ebfce4371885250"
integrity sha512-MGC6sx9jsqHdefhVQ6o0akdsPGpkXgiIbpygb2Sg4g4bh7v6K1cardLV1NwGB9A6u1yICOSDT/MOC//9Ez6EUg==
-react-native-fs@^2.16.6:
- version "2.20.0"
- resolved "https://registry.yarnpkg.com/react-native-fs/-/react-native-fs-2.20.0.tgz#05a9362b473bfc0910772c0acbb73a78dbc810f6"
- integrity sha512-VkTBzs7fIDUiy/XajOSNk0XazFE9l+QlMAce7lGuebZcag5CnjszB+u4BdqzwaQOdcYb5wsJIsqq4kxInIRpJQ==
- dependencies:
- base-64 "^0.1.0"
- utf8 "^3.0.0"
-
react-native-gesture-handler@~2.14.0:
version "2.14.1"
resolved "https://registry.yarnpkg.com/react-native-gesture-handler/-/react-native-gesture-handler-2.14.1.tgz#930640231024b7921435ab476aa501dd4a6b2e01"
@@ -10765,10 +10769,10 @@ react-native-image-pan-zoom@^2.1.12:
resolved "https://registry.yarnpkg.com/react-native-image-pan-zoom/-/react-native-image-pan-zoom-2.1.12.tgz#eb98bf56fb5610379bdbfdb63219cc1baca98fd2"
integrity sha512-BF66XeP6dzuANsPmmFsJshM2Jyh/Mo1t8FsGc1L9Q9/sVP8MJULDabB1hms+eAoqgtyhMr5BuXV3E1hJ5U5H6Q==
-react-native-image-picker@^4.0.6:
- version "4.10.3"
- resolved "https://registry.yarnpkg.com/react-native-image-picker/-/react-native-image-picker-4.10.3.tgz#cdc11d9836b4cfa57e658c0700201babf8fdca10"
- integrity sha512-gLX8J6jCBkUt6jogpSdA7YyaGVLGYywRzMEwBciXshihpFZjc/cRlKymAVlu6Q7HMw0j3vrho6pI8ZGC5O/FGg==
+react-native-image-picker@^7.1.2:
+ version "7.1.2"
+ resolved "https://registry.yarnpkg.com/react-native-image-picker/-/react-native-image-picker-7.1.2.tgz#383849d1953caf4578874a1f5e5dd11c737bd5cd"
+ integrity sha512-b5y5nP60RIPxlAXlptn2QwlIuZWCUDWa/YPUVjgHc0Ih60mRiOg1PSzf0IjHSLeOZShCpirpvSPGnDExIpTRUg==
react-native-image-zoom-viewer@^3.0.1:
version "3.0.1"
@@ -13130,11 +13134,6 @@ utf8-byte-length@^1.0.1:
resolved "https://registry.yarnpkg.com/utf8-byte-length/-/utf8-byte-length-1.0.5.tgz#f9f63910d15536ee2b2d5dd4665389715eac5c1e"
integrity sha512-Xn0w3MtiQ6zoz2vFyUVruaCL53O/DwUvkEeOvj+uulMm0BkUGYWmBYVyElqZaSLhY6ZD0ulfU3aBra2aVT4xfA==
-utf8@^3.0.0:
- version "3.0.0"
- resolved "https://registry.yarnpkg.com/utf8/-/utf8-3.0.0.tgz#f052eed1364d696e769ef058b183df88c87f69d1"
- integrity sha512-E8VjFIQ/TyQgp+TZfS6l8yp/xWppSAHzidGiRrqe4bK4XP9pTRyKFgGJpO3SN7zdX4DeomTrwaseCHovfpFcqQ==
-
util-deprecate@^1.0.1, util-deprecate@^1.0.2, util-deprecate@~1.0.1:
version "1.0.2"
resolved "https://registry.yarnpkg.com/util-deprecate/-/util-deprecate-1.0.2.tgz#450d4dc9fa70de732762fbd2d4a28981419a0ccf"