@sendbird/uikit-react-native 3.0.4-rc.0 → 3.0.4

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -8,7 +8,6 @@ var _uikitUtils = require("@sendbird/uikit-utils");
8
8
  var _SBUError = _interopRequireDefault(require("../libs/SBUError"));
9
9
  var _expoBackwardUtils = _interopRequireDefault(require("../utils/expoBackwardUtils"));
10
10
  var _expoPermissionGranted = _interopRequireDefault(require("../utils/expoPermissionGranted"));
11
- var _normalizeFile = _interopRequireDefault(require("../utils/normalizeFile"));
12
11
  function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
13
12
  const createExpoFileService = _ref => {
14
13
  let {
@@ -58,9 +57,9 @@ const createExpoFileService = _ref => {
58
57
  }
59
58
  })()
60
59
  });
61
- if (_expoBackwardUtils.default.toCanceled(response)) return null;
62
- const filePickerRes = await _expoBackwardUtils.default.toFilePickerResponses(response, fsModule);
63
- return filePickerRes[0];
60
+ if (_expoBackwardUtils.default.imagePicker.isCanceled(response)) return null;
61
+ const [file] = await _expoBackwardUtils.default.imagePicker.toFilePickerResponses(response, fsModule);
62
+ return file;
64
63
  }
65
64
  async openMediaLibrary(options) {
66
65
  const hasPermission = await this.hasMediaLibraryPermission('read');
@@ -88,27 +87,17 @@ const createExpoFileService = _ref => {
88
87
  }
89
88
  })()
90
89
  });
91
- if (_expoBackwardUtils.default.toCanceled(response)) return null;
92
- return _expoBackwardUtils.default.toFilePickerResponses(response, fsModule);
90
+ if (_expoBackwardUtils.default.imagePicker.isCanceled(response)) return null;
91
+ return _expoBackwardUtils.default.imagePicker.toFilePickerResponses(response, fsModule);
93
92
  }
94
93
  async openDocument(options) {
95
94
  try {
96
95
  const response = await documentPickerModule.getDocumentAsync({
97
96
  type: '*/*'
98
97
  });
99
- if (response.type === 'cancel') return null;
100
- const {
101
- mimeType,
102
- uri,
103
- size,
104
- name
105
- } = response;
106
- return (0, _normalizeFile.default)({
107
- uri,
108
- size,
109
- name,
110
- type: mimeType
111
- });
98
+ if (_expoBackwardUtils.default.documentPicker.isCanceled(response)) return null;
99
+ const [file] = await _expoBackwardUtils.default.documentPicker.toFilePickerResponses(response);
100
+ return file;
112
101
  } catch (e) {
113
102
  var _options$onOpenFailur3;
114
103
  options === null || options === void 0 ? void 0 : (_options$onOpenFailur3 = options.onOpenFailure) === null || _options$onOpenFailur3 === void 0 ? void 0 : _options$onOpenFailur3.call(options, _SBUError.default.UNKNOWN, e);
@@ -1 +1 @@
1
- {"version":3,"names":["_uikitUtils","require","_SBUError","_interopRequireDefault","_expoBackwardUtils","_expoPermissionGranted","_normalizeFile","obj","__esModule","default","createExpoFileService","_ref","imagePickerModule","documentPickerModule","mediaLibraryModule","fsModule","ExpoFileServiceInterface","hasCameraPermission","res","getCameraPermissionsAsync","expoPermissionGranted","requestCameraPermission","requestCameraPermissionsAsync","hasMediaLibraryPermission","type","perms","getPermissionsAsync","requestMediaLibraryPermission","requestPermissionsAsync","openCamera","options","hasPermission","granted","_options$onOpenFailur","onOpenFailure","call","SBUError","PERMISSIONS_DENIED","response","launchCameraAsync","mediaTypes","mediaType","MediaTypeOptions","Images","Videos","All","expoBackwardUtils","toCanceled","filePickerRes","toFilePickerResponses","openMediaLibrary","_options$onOpenFailur2","selectionLimit","launchImageLibraryAsync","openDocument","getDocumentAsync","mimeType","uri","size","name","normalizeFile","e","_options$onOpenFailur3","UNKNOWN","save","Error","basePath","documentDirectory","cacheDirectory","downloadPath","fileName","downloadAsync","fileUrl","getFileType","fileType","match","saveToLibraryAsync","_default","exports"],"sources":["createFileService.expo.ts"],"sourcesContent":["import type * as ExpoDocumentPicker from 'expo-document-picker';\nimport type * as ExpoFs from 'expo-file-system';\nimport type * as ExpoImagePicker from 'expo-image-picker';\nimport type * as ExpoMediaLibrary from 'expo-media-library';\n\nimport { getFileType } from '@sendbird/uikit-utils';\n\nimport SBUError from '../libs/SBUError';\nimport expoBackwardUtils from '../utils/expoBackwardUtils';\nimport type { ExpoMediaLibraryPermissionResponse, ExpoPermissionResponse } from '../utils/expoPermissionGranted';\nimport expoPermissionGranted from '../utils/expoPermissionGranted';\nimport normalizeFile from '../utils/normalizeFile';\nimport type {\n FilePickerResponse,\n FileServiceInterface,\n OpenCameraOptions,\n OpenDocumentOptions,\n OpenMediaLibraryOptions,\n SaveOptions,\n} from './types';\n\nconst createExpoFileService = ({\n imagePickerModule,\n documentPickerModule,\n mediaLibraryModule,\n fsModule,\n}: {\n imagePickerModule: typeof ExpoImagePicker;\n documentPickerModule: typeof ExpoDocumentPicker;\n mediaLibraryModule: typeof ExpoMediaLibrary;\n fsModule: typeof ExpoFs;\n}): FileServiceInterface => {\n class ExpoFileServiceInterface implements FileServiceInterface {\n async hasCameraPermission(): Promise<boolean> {\n const res = (await imagePickerModule.getCameraPermissionsAsync()) as ExpoPermissionResponse;\n return expoPermissionGranted([res]);\n }\n async requestCameraPermission(): Promise<boolean> {\n const res = (await imagePickerModule.requestCameraPermissionsAsync()) as ExpoPermissionResponse;\n return expoPermissionGranted([res]);\n }\n async hasMediaLibraryPermission(type: 'write' | 'read'): Promise<boolean> {\n const perms = (await mediaLibraryModule.getPermissionsAsync(\n type === 'write',\n )) as ExpoMediaLibraryPermissionResponse;\n return expoPermissionGranted([perms]);\n }\n async requestMediaLibraryPermission(type: 'write' | 'read'): Promise<boolean> {\n const perms = (await mediaLibraryModule.requestPermissionsAsync(\n type === 'write',\n )) as ExpoMediaLibraryPermissionResponse;\n return expoPermissionGranted([perms]);\n }\n\n async openCamera(options?: OpenCameraOptions): Promise<FilePickerResponse> {\n const hasPermission = await this.hasCameraPermission();\n if (!hasPermission) {\n const granted = await this.requestCameraPermission();\n if (!granted) {\n options?.onOpenFailure?.(SBUError.PERMISSIONS_DENIED);\n return null;\n }\n }\n\n const response = await imagePickerModule.launchCameraAsync({\n mediaTypes: (() => {\n switch (options?.mediaType) {\n case 'photo':\n return imagePickerModule.MediaTypeOptions.Images;\n case 'video':\n return imagePickerModule.MediaTypeOptions.Videos;\n case 'all':\n return imagePickerModule.MediaTypeOptions.All;\n default:\n return imagePickerModule.MediaTypeOptions.Images;\n }\n })(),\n });\n\n if (expoBackwardUtils.toCanceled(response)) return null;\n\n const filePickerRes = await expoBackwardUtils.toFilePickerResponses(response, fsModule);\n return filePickerRes[0];\n }\n async openMediaLibrary(options: OpenMediaLibraryOptions) {\n const hasPermission = await this.hasMediaLibraryPermission('read');\n if (!hasPermission) {\n const granted = await this.requestMediaLibraryPermission('read');\n if (!granted) {\n options?.onOpenFailure?.(SBUError.PERMISSIONS_DENIED);\n return null;\n }\n }\n\n const selectionLimit = options?.selectionLimit || 1;\n const response = await imagePickerModule.launchImageLibraryAsync({\n selectionLimit,\n mediaTypes: (() => {\n switch (options?.mediaType) {\n case 'photo':\n return imagePickerModule.MediaTypeOptions.Images;\n case 'video':\n return imagePickerModule.MediaTypeOptions.Videos;\n case 'all':\n return imagePickerModule.MediaTypeOptions.All;\n default:\n return imagePickerModule.MediaTypeOptions.Images;\n }\n })(),\n });\n if (expoBackwardUtils.toCanceled(response)) return null;\n return expoBackwardUtils.toFilePickerResponses(response, fsModule);\n }\n\n async openDocument(options?: OpenDocumentOptions): Promise<FilePickerResponse> {\n try {\n const response = await documentPickerModule.getDocumentAsync({ type: '*/*' });\n if (response.type === 'cancel') return null;\n const { mimeType, uri, size, name } = response;\n return normalizeFile({ uri, size, name, type: mimeType });\n } catch (e) {\n options?.onOpenFailure?.(SBUError.UNKNOWN, e);\n return null;\n }\n }\n\n async save(options: SaveOptions): Promise<string> {\n const hasPermission = await this.hasMediaLibraryPermission('write');\n if (!hasPermission) {\n const granted = await this.requestMediaLibraryPermission('write');\n if (!granted) throw new Error('Permission not granted');\n }\n\n const basePath = fsModule.documentDirectory || fsModule.cacheDirectory;\n if (!basePath) throw new Error('Cannot determine directory');\n\n const downloadPath = `${basePath}/${options.fileName}`;\n\n const response = await fsModule.downloadAsync(options.fileUrl, downloadPath);\n if (getFileType(options.fileType || '').match(/video|image/)) {\n await mediaLibraryModule.saveToLibraryAsync(response.uri);\n }\n return response.uri;\n }\n }\n\n return new ExpoFileServiceInterface();\n};\n\nexport default createExpoFileService;\n"],"mappings":"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"}
1
+ {"version":3,"names":["_uikitUtils","require","_SBUError","_interopRequireDefault","_expoBackwardUtils","_expoPermissionGranted","obj","__esModule","default","createExpoFileService","_ref","imagePickerModule","documentPickerModule","mediaLibraryModule","fsModule","ExpoFileServiceInterface","hasCameraPermission","res","getCameraPermissionsAsync","expoPermissionGranted","requestCameraPermission","requestCameraPermissionsAsync","hasMediaLibraryPermission","type","perms","getPermissionsAsync","requestMediaLibraryPermission","requestPermissionsAsync","openCamera","options","hasPermission","granted","_options$onOpenFailur","onOpenFailure","call","SBUError","PERMISSIONS_DENIED","response","launchCameraAsync","mediaTypes","mediaType","MediaTypeOptions","Images","Videos","All","expoBackwardUtils","imagePicker","isCanceled","file","toFilePickerResponses","openMediaLibrary","_options$onOpenFailur2","selectionLimit","launchImageLibraryAsync","openDocument","getDocumentAsync","documentPicker","e","_options$onOpenFailur3","UNKNOWN","save","Error","basePath","documentDirectory","cacheDirectory","downloadPath","fileName","downloadAsync","fileUrl","getFileType","fileType","match","saveToLibraryAsync","uri","_default","exports"],"sources":["createFileService.expo.ts"],"sourcesContent":["import type * as ExpoDocumentPicker from 'expo-document-picker';\nimport type * as ExpoFs from 'expo-file-system';\nimport type * as ExpoImagePicker from 'expo-image-picker';\nimport type * as ExpoMediaLibrary from 'expo-media-library';\n\nimport { getFileType } from '@sendbird/uikit-utils';\n\nimport SBUError from '../libs/SBUError';\nimport expoBackwardUtils from '../utils/expoBackwardUtils';\nimport type { ExpoMediaLibraryPermissionResponse, ExpoPermissionResponse } from '../utils/expoPermissionGranted';\nimport expoPermissionGranted from '../utils/expoPermissionGranted';\nimport type {\n FilePickerResponse,\n FileServiceInterface,\n OpenCameraOptions,\n OpenDocumentOptions,\n OpenMediaLibraryOptions,\n SaveOptions,\n} from './types';\n\nconst createExpoFileService = ({\n imagePickerModule,\n documentPickerModule,\n mediaLibraryModule,\n fsModule,\n}: {\n imagePickerModule: typeof ExpoImagePicker;\n documentPickerModule: typeof ExpoDocumentPicker;\n mediaLibraryModule: typeof ExpoMediaLibrary;\n fsModule: typeof ExpoFs;\n}): FileServiceInterface => {\n class ExpoFileServiceInterface implements FileServiceInterface {\n async hasCameraPermission(): Promise<boolean> {\n const res = (await imagePickerModule.getCameraPermissionsAsync()) as ExpoPermissionResponse;\n return expoPermissionGranted([res]);\n }\n async requestCameraPermission(): Promise<boolean> {\n const res = (await imagePickerModule.requestCameraPermissionsAsync()) as ExpoPermissionResponse;\n return expoPermissionGranted([res]);\n }\n async hasMediaLibraryPermission(type: 'write' | 'read'): Promise<boolean> {\n const perms = (await mediaLibraryModule.getPermissionsAsync(\n type === 'write',\n )) as ExpoMediaLibraryPermissionResponse;\n return expoPermissionGranted([perms]);\n }\n async requestMediaLibraryPermission(type: 'write' | 'read'): Promise<boolean> {\n const perms = (await mediaLibraryModule.requestPermissionsAsync(\n type === 'write',\n )) as ExpoMediaLibraryPermissionResponse;\n return expoPermissionGranted([perms]);\n }\n\n async openCamera(options?: OpenCameraOptions): Promise<FilePickerResponse> {\n const hasPermission = await this.hasCameraPermission();\n if (!hasPermission) {\n const granted = await this.requestCameraPermission();\n if (!granted) {\n options?.onOpenFailure?.(SBUError.PERMISSIONS_DENIED);\n return null;\n }\n }\n\n const response = await imagePickerModule.launchCameraAsync({\n mediaTypes: (() => {\n switch (options?.mediaType) {\n case 'photo':\n return imagePickerModule.MediaTypeOptions.Images;\n case 'video':\n return imagePickerModule.MediaTypeOptions.Videos;\n case 'all':\n return imagePickerModule.MediaTypeOptions.All;\n default:\n return imagePickerModule.MediaTypeOptions.Images;\n }\n })(),\n });\n\n if (expoBackwardUtils.imagePicker.isCanceled(response)) return null;\n\n const [file] = await expoBackwardUtils.imagePicker.toFilePickerResponses(response, fsModule);\n return file;\n }\n async openMediaLibrary(options: OpenMediaLibraryOptions) {\n const hasPermission = await this.hasMediaLibraryPermission('read');\n if (!hasPermission) {\n const granted = await this.requestMediaLibraryPermission('read');\n if (!granted) {\n options?.onOpenFailure?.(SBUError.PERMISSIONS_DENIED);\n return null;\n }\n }\n\n const selectionLimit = options?.selectionLimit || 1;\n const response = await imagePickerModule.launchImageLibraryAsync({\n selectionLimit,\n mediaTypes: (() => {\n switch (options?.mediaType) {\n case 'photo':\n return imagePickerModule.MediaTypeOptions.Images;\n case 'video':\n return imagePickerModule.MediaTypeOptions.Videos;\n case 'all':\n return imagePickerModule.MediaTypeOptions.All;\n default:\n return imagePickerModule.MediaTypeOptions.Images;\n }\n })(),\n });\n if (expoBackwardUtils.imagePicker.isCanceled(response)) return null;\n return expoBackwardUtils.imagePicker.toFilePickerResponses(response, fsModule);\n }\n\n async openDocument(options?: OpenDocumentOptions): Promise<FilePickerResponse> {\n try {\n const response = await documentPickerModule.getDocumentAsync({ type: '*/*' });\n if (expoBackwardUtils.documentPicker.isCanceled(response)) return null;\n\n const [file] = await expoBackwardUtils.documentPicker.toFilePickerResponses(response);\n return file;\n } catch (e) {\n options?.onOpenFailure?.(SBUError.UNKNOWN, e);\n return null;\n }\n }\n\n async save(options: SaveOptions): Promise<string> {\n const hasPermission = await this.hasMediaLibraryPermission('write');\n if (!hasPermission) {\n const granted = await this.requestMediaLibraryPermission('write');\n if (!granted) throw new Error('Permission not granted');\n }\n\n const basePath = fsModule.documentDirectory || fsModule.cacheDirectory;\n if (!basePath) throw new Error('Cannot determine directory');\n\n const downloadPath = `${basePath}/${options.fileName}`;\n\n const response = await fsModule.downloadAsync(options.fileUrl, downloadPath);\n if (getFileType(options.fileType || '').match(/video|image/)) {\n await mediaLibraryModule.saveToLibraryAsync(response.uri);\n }\n return response.uri;\n }\n }\n\n return new ExpoFileServiceInterface();\n};\n\nexport default createExpoFileService;\n"],"mappings":"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"}
@@ -245,7 +245,10 @@ const createNativeFileService = _ref => {
245
245
  'video': 'video'
246
246
  };
247
247
  const externalDir = externalDirMap[file.type];
248
- await fsModule.FileSystem.cpExternal(downloadedPath, file.name, externalDir);
248
+ await fsModule.FileSystem.cpExternal(downloadedPath, file.name, externalDir).catch(() => {
249
+ _uikitUtils.Logger.error('Failed to save file to external storage. Retry saving to downloads directory instead.');
250
+ return fsModule.FileSystem.cpExternal(downloadedPath, file.name, 'downloads');
251
+ });
249
252
  }
250
253
  return downloadedPath;
251
254
  }
@@ -1 +1 @@
1
- {"version":3,"names":["_reactNative","require","_uikitUtils","_SBUError","_interopRequireDefault","_nativePermissionGranted","_normalizeFile","obj","__esModule","default","_defineProperty","key","value","_toPropertyKey","Object","defineProperty","enumerable","configurable","writable","arg","_toPrimitive","String","input","hint","prim","Symbol","toPrimitive","undefined","res","call","TypeError","Number","getAndroidStoragePermissionsByAPILevel","permissionModule","Platform","OS","Version","PERMISSIONS","ANDROID","READ_MEDIA_AUDIO","READ_MEDIA_IMAGES","READ_MEDIA_VIDEO","READ_EXTERNAL_STORAGE","WRITE_EXTERNAL_STORAGE","createNativeFileService","_ref","imagePickerModule","documentPickerModule","mediaLibraryModule","fsModule","cameraPermissions","select","ios","IOS","CAMERA","MICROPHONE","android","mediaLibraryPermissions","MEDIA_LIBRARY","PHOTO_LIBRARY","NativeFileService","constructor","options","dirname","Dirs","CacheDir","DocumentDir","context","filename","fileName","extension","getFileExtension","getFileExtensionFromMime","fileType","fileUrl","getFileExtensionFromUri","normalizeFileName","path","buildDownloadPath","FileSystem","fetch","downloadedPath","file","name","type","getFileType","hasCameraPermission","status","checkMultiple","nativePermissionGranted","requestCameraPermission","requestMultiple","hasMediaLibraryPermission","__DEV__","requestMediaLibraryPermission","openCamera","_response$assets","hasPermission","granted","_options$onOpenFailur","onOpenFailure","SBUError","PERMISSIONS_DENIED","response","launchCamera","presentationStyle","cameraType","mediaType","didCancel","errorCode","_options$onOpenFailur2","DEVICE_UNAVAILABLE","Error","errorMessage","fileSize","size","uri","assets","normalizeFile","openMediaLibrary","selectionLimit","_options$onOpenFailur3","launchImageLibrary","_options$onOpenFailur4","Promise","all","slice","map","_ref2","openDocument","pickSingle","e","isCancel","isInProgress","_options$onOpenFailur5","UNKNOWN","save","downloadFile","mediaTypeMap","externalDirMap","externalDir","cpExternal","_default","exports"],"sources":["createFileService.native.ts"],"sourcesContent":["import type { CameraRoll } from '@react-native-camera-roll/camera-roll';\nimport { Platform } from 'react-native';\nimport type * as DocumentPicker from 'react-native-document-picker';\nimport type * as FileAccess from 'react-native-file-access';\nimport type * as ImagePicker from 'react-native-image-picker';\nimport type * as Permissions from 'react-native-permissions';\nimport type { Permission } from 'react-native-permissions';\n\nimport {\n getFileExtension,\n getFileExtensionFromMime,\n getFileExtensionFromUri,\n getFileType,\n normalizeFileName,\n} from '@sendbird/uikit-utils';\n\nimport SBUError from '../libs/SBUError';\nimport nativePermissionGranted from '../utils/nativePermissionGranted';\nimport normalizeFile from '../utils/normalizeFile';\nimport type {\n FilePickerResponse,\n FileServiceInterface,\n OpenCameraOptions,\n OpenDocumentOptions,\n OpenMediaLibraryOptions,\n SaveOptions,\n} from './types';\n\nfunction getAndroidStoragePermissionsByAPILevel(permissionModule: typeof Permissions): Permission[] {\n if (Platform.OS !== 'android') return [];\n\n if (Platform.Version > 32) {\n return [\n permissionModule.PERMISSIONS.ANDROID.READ_MEDIA_AUDIO,\n permissionModule.PERMISSIONS.ANDROID.READ_MEDIA_IMAGES,\n permissionModule.PERMISSIONS.ANDROID.READ_MEDIA_VIDEO,\n ];\n }\n\n if (Platform.Version > 28) {\n return [permissionModule.PERMISSIONS.ANDROID.READ_EXTERNAL_STORAGE];\n }\n\n return [\n permissionModule.PERMISSIONS.ANDROID.WRITE_EXTERNAL_STORAGE,\n permissionModule.PERMISSIONS.ANDROID.READ_EXTERNAL_STORAGE,\n ];\n}\n\nconst createNativeFileService = ({\n imagePickerModule,\n documentPickerModule,\n permissionModule,\n mediaLibraryModule,\n fsModule,\n}: {\n imagePickerModule: typeof ImagePicker;\n documentPickerModule: typeof DocumentPicker;\n permissionModule: typeof Permissions;\n mediaLibraryModule: typeof CameraRoll;\n fsModule: typeof FileAccess;\n}): FileServiceInterface => {\n const cameraPermissions: Permission[] = Platform.select({\n ios: [permissionModule.PERMISSIONS.IOS.CAMERA, permissionModule.PERMISSIONS.IOS.MICROPHONE],\n android: [permissionModule.PERMISSIONS.ANDROID.CAMERA],\n default: [],\n });\n const mediaLibraryPermissions: Permission[] = Platform.select({\n ios: [permissionModule.PERMISSIONS.IOS.MEDIA_LIBRARY, permissionModule.PERMISSIONS.IOS.PHOTO_LIBRARY],\n android: getAndroidStoragePermissionsByAPILevel(permissionModule),\n default: [],\n });\n\n class NativeFileService implements FileServiceInterface {\n async hasCameraPermission(): Promise<boolean> {\n const status = await permissionModule.checkMultiple(cameraPermissions);\n return nativePermissionGranted(status);\n }\n async requestCameraPermission(): Promise<boolean> {\n const status = await permissionModule.requestMultiple(cameraPermissions);\n return nativePermissionGranted(status);\n }\n async hasMediaLibraryPermission(): Promise<boolean> {\n const status = await permissionModule.checkMultiple(mediaLibraryPermissions);\n if (\n __DEV__ &&\n Platform.OS === 'ios' &&\n status['ios.permission.MEDIA_LIBRARY'] === 'unavailable' &&\n status['ios.permission.PHOTO_LIBRARY'] === 'granted'\n ) {\n return true;\n }\n return nativePermissionGranted(status);\n }\n async requestMediaLibraryPermission(): Promise<boolean> {\n const status = await permissionModule.requestMultiple(mediaLibraryPermissions);\n return nativePermissionGranted(status);\n }\n\n async openCamera(options?: OpenCameraOptions): Promise<FilePickerResponse> {\n const hasPermission = await this.hasCameraPermission();\n if (!hasPermission) {\n const granted = await this.requestCameraPermission();\n if (!granted) {\n options?.onOpenFailure?.(SBUError.PERMISSIONS_DENIED);\n return null;\n }\n }\n\n const response = await imagePickerModule.launchCamera({\n presentationStyle: 'fullScreen',\n cameraType: options?.cameraType ?? 'back',\n mediaType: (() => {\n switch (options?.mediaType) {\n case 'photo':\n return 'photo';\n case 'video':\n return 'video';\n case 'all':\n return 'mixed';\n default:\n return 'photo';\n }\n })(),\n });\n if (response.didCancel) return null;\n if (response.errorCode === 'camera_unavailable') {\n options?.onOpenFailure?.(SBUError.DEVICE_UNAVAILABLE, new Error(response.errorMessage));\n return null;\n }\n\n const { fileName: name, fileSize: size, type, uri } = response.assets?.[0] ?? {};\n return normalizeFile({ uri, size, name, type });\n }\n async openMediaLibrary(options?: OpenMediaLibraryOptions): Promise<FilePickerResponse[] | null> {\n /**\n * NOTE: options.selectionLimit {@link https://github.com/react-native-image-picker/react-native-image-picker#options}\n * We do not support 0 (any number of files)\n **/\n const selectionLimit = options?.selectionLimit || 1;\n const hasPermission = await this.hasMediaLibraryPermission();\n if (!hasPermission) {\n const granted = await this.requestMediaLibraryPermission();\n if (!granted) {\n options?.onOpenFailure?.(SBUError.PERMISSIONS_DENIED);\n return null;\n }\n }\n\n const response = await imagePickerModule.launchImageLibrary({\n presentationStyle: 'fullScreen',\n selectionLimit,\n mediaType: (() => {\n switch (options?.mediaType) {\n case 'photo':\n return 'photo';\n case 'video':\n return 'video';\n case 'all':\n return 'mixed';\n default:\n return 'photo';\n }\n })(),\n });\n if (response.didCancel) return null;\n if (response.errorCode === 'camera_unavailable') {\n options?.onOpenFailure?.(SBUError.DEVICE_UNAVAILABLE, new Error(response.errorMessage));\n return null;\n }\n\n return Promise.all(\n (response.assets || [])\n .slice(0, selectionLimit)\n .map(({ fileName: name, fileSize: size, type, uri }) => normalizeFile({ uri, size, name, type })),\n );\n }\n async openDocument(options?: OpenDocumentOptions): Promise<FilePickerResponse> {\n try {\n const { uri, size, name, type } = await documentPickerModule.pickSingle();\n return normalizeFile({ uri, size, name, type });\n } catch (e) {\n if (!documentPickerModule.isCancel(e) && documentPickerModule.isInProgress(e)) {\n options?.onOpenFailure?.(SBUError.UNKNOWN, e);\n }\n return null;\n }\n }\n async save(options: SaveOptions): Promise<string> {\n const hasPermission = await this.hasMediaLibraryPermission();\n if (!hasPermission) {\n const granted = await this.requestMediaLibraryPermission();\n if (!granted) throw new Error('Permission not granted');\n }\n\n const { downloadedPath, file } = await this.downloadFile(options);\n\n if (Platform.OS === 'ios') {\n if (file.type === 'image' || file.type === 'video') {\n const mediaTypeMap = { 'image': 'photo', 'video': 'video' } as const;\n const mediaType = mediaTypeMap[file.type];\n await mediaLibraryModule.save(downloadedPath, { type: mediaType });\n }\n }\n\n if (Platform.OS === 'android') {\n const externalDirMap = { 'file': 'downloads', 'audio': 'audio', 'image': 'images', 'video': 'video' } as const;\n const externalDir = externalDirMap[file.type];\n await fsModule.FileSystem.cpExternal(downloadedPath, file.name, externalDir);\n }\n\n return downloadedPath;\n }\n\n private buildDownloadPath = async (options: SaveOptions) => {\n const dirname = Platform.select({ android: fsModule.Dirs.CacheDir, default: fsModule.Dirs.DocumentDir });\n const context = { dirname, filename: options.fileName };\n const extension =\n getFileExtension(options.fileName) ||\n getFileExtensionFromMime(options.fileType) ||\n getFileExtension(options.fileUrl) ||\n (await getFileExtensionFromUri(options.fileUrl));\n\n if (extension) context.filename = normalizeFileName(context.filename, extension);\n\n return { path: `${context.dirname}/${context.filename}`, ...context };\n };\n\n private downloadFile = async (options: SaveOptions) => {\n const { path, filename } = await this.buildDownloadPath(options);\n await fsModule.FileSystem.fetch(options.fileUrl, { path });\n return {\n downloadedPath: path,\n file: {\n name: filename,\n type: getFileType(getFileExtension(path)),\n } as const,\n };\n };\n }\n\n return new NativeFileService();\n};\n\nexport default createNativeFileService;\n"],"mappings":"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"}
1
+ {"version":3,"names":["_reactNative","require","_uikitUtils","_SBUError","_interopRequireDefault","_nativePermissionGranted","_normalizeFile","obj","__esModule","default","_defineProperty","key","value","_toPropertyKey","Object","defineProperty","enumerable","configurable","writable","arg","_toPrimitive","String","input","hint","prim","Symbol","toPrimitive","undefined","res","call","TypeError","Number","getAndroidStoragePermissionsByAPILevel","permissionModule","Platform","OS","Version","PERMISSIONS","ANDROID","READ_MEDIA_AUDIO","READ_MEDIA_IMAGES","READ_MEDIA_VIDEO","READ_EXTERNAL_STORAGE","WRITE_EXTERNAL_STORAGE","createNativeFileService","_ref","imagePickerModule","documentPickerModule","mediaLibraryModule","fsModule","cameraPermissions","select","ios","IOS","CAMERA","MICROPHONE","android","mediaLibraryPermissions","MEDIA_LIBRARY","PHOTO_LIBRARY","NativeFileService","constructor","options","dirname","Dirs","CacheDir","DocumentDir","context","filename","fileName","extension","getFileExtension","getFileExtensionFromMime","fileType","fileUrl","getFileExtensionFromUri","normalizeFileName","path","buildDownloadPath","FileSystem","fetch","downloadedPath","file","name","type","getFileType","hasCameraPermission","status","checkMultiple","nativePermissionGranted","requestCameraPermission","requestMultiple","hasMediaLibraryPermission","__DEV__","requestMediaLibraryPermission","openCamera","_response$assets","hasPermission","granted","_options$onOpenFailur","onOpenFailure","SBUError","PERMISSIONS_DENIED","response","launchCamera","presentationStyle","cameraType","mediaType","didCancel","errorCode","_options$onOpenFailur2","DEVICE_UNAVAILABLE","Error","errorMessage","fileSize","size","uri","assets","normalizeFile","openMediaLibrary","selectionLimit","_options$onOpenFailur3","launchImageLibrary","_options$onOpenFailur4","Promise","all","slice","map","_ref2","openDocument","pickSingle","e","isCancel","isInProgress","_options$onOpenFailur5","UNKNOWN","save","downloadFile","mediaTypeMap","externalDirMap","externalDir","cpExternal","catch","Logger","error","_default","exports"],"sources":["createFileService.native.ts"],"sourcesContent":["import type { CameraRoll } from '@react-native-camera-roll/camera-roll';\nimport { Platform } from 'react-native';\nimport type * as DocumentPicker from 'react-native-document-picker';\nimport type * as FileAccess from 'react-native-file-access';\nimport type * as ImagePicker from 'react-native-image-picker';\nimport type * as Permissions from 'react-native-permissions';\nimport type { Permission } from 'react-native-permissions';\n\nimport {\n Logger,\n getFileExtension,\n getFileExtensionFromMime,\n getFileExtensionFromUri,\n getFileType,\n normalizeFileName,\n} from '@sendbird/uikit-utils';\n\nimport SBUError from '../libs/SBUError';\nimport nativePermissionGranted from '../utils/nativePermissionGranted';\nimport normalizeFile from '../utils/normalizeFile';\nimport type {\n FilePickerResponse,\n FileServiceInterface,\n OpenCameraOptions,\n OpenDocumentOptions,\n OpenMediaLibraryOptions,\n SaveOptions,\n} from './types';\n\nfunction getAndroidStoragePermissionsByAPILevel(permissionModule: typeof Permissions): Permission[] {\n if (Platform.OS !== 'android') return [];\n\n if (Platform.Version > 32) {\n return [\n permissionModule.PERMISSIONS.ANDROID.READ_MEDIA_AUDIO,\n permissionModule.PERMISSIONS.ANDROID.READ_MEDIA_IMAGES,\n permissionModule.PERMISSIONS.ANDROID.READ_MEDIA_VIDEO,\n ];\n }\n\n if (Platform.Version > 28) {\n return [permissionModule.PERMISSIONS.ANDROID.READ_EXTERNAL_STORAGE];\n }\n\n return [\n permissionModule.PERMISSIONS.ANDROID.WRITE_EXTERNAL_STORAGE,\n permissionModule.PERMISSIONS.ANDROID.READ_EXTERNAL_STORAGE,\n ];\n}\n\nconst createNativeFileService = ({\n imagePickerModule,\n documentPickerModule,\n permissionModule,\n mediaLibraryModule,\n fsModule,\n}: {\n imagePickerModule: typeof ImagePicker;\n documentPickerModule: typeof DocumentPicker;\n permissionModule: typeof Permissions;\n mediaLibraryModule: typeof CameraRoll;\n fsModule: typeof FileAccess;\n}): FileServiceInterface => {\n const cameraPermissions: Permission[] = Platform.select({\n ios: [permissionModule.PERMISSIONS.IOS.CAMERA, permissionModule.PERMISSIONS.IOS.MICROPHONE],\n android: [permissionModule.PERMISSIONS.ANDROID.CAMERA],\n default: [],\n });\n const mediaLibraryPermissions: Permission[] = Platform.select({\n ios: [permissionModule.PERMISSIONS.IOS.MEDIA_LIBRARY, permissionModule.PERMISSIONS.IOS.PHOTO_LIBRARY],\n android: getAndroidStoragePermissionsByAPILevel(permissionModule),\n default: [],\n });\n\n class NativeFileService implements FileServiceInterface {\n async hasCameraPermission(): Promise<boolean> {\n const status = await permissionModule.checkMultiple(cameraPermissions);\n return nativePermissionGranted(status);\n }\n async requestCameraPermission(): Promise<boolean> {\n const status = await permissionModule.requestMultiple(cameraPermissions);\n return nativePermissionGranted(status);\n }\n async hasMediaLibraryPermission(): Promise<boolean> {\n const status = await permissionModule.checkMultiple(mediaLibraryPermissions);\n if (\n __DEV__ &&\n Platform.OS === 'ios' &&\n status['ios.permission.MEDIA_LIBRARY'] === 'unavailable' &&\n status['ios.permission.PHOTO_LIBRARY'] === 'granted'\n ) {\n return true;\n }\n return nativePermissionGranted(status);\n }\n async requestMediaLibraryPermission(): Promise<boolean> {\n const status = await permissionModule.requestMultiple(mediaLibraryPermissions);\n return nativePermissionGranted(status);\n }\n\n async openCamera(options?: OpenCameraOptions): Promise<FilePickerResponse> {\n const hasPermission = await this.hasCameraPermission();\n if (!hasPermission) {\n const granted = await this.requestCameraPermission();\n if (!granted) {\n options?.onOpenFailure?.(SBUError.PERMISSIONS_DENIED);\n return null;\n }\n }\n\n const response = await imagePickerModule.launchCamera({\n presentationStyle: 'fullScreen',\n cameraType: options?.cameraType ?? 'back',\n mediaType: (() => {\n switch (options?.mediaType) {\n case 'photo':\n return 'photo';\n case 'video':\n return 'video';\n case 'all':\n return 'mixed';\n default:\n return 'photo';\n }\n })(),\n });\n if (response.didCancel) return null;\n if (response.errorCode === 'camera_unavailable') {\n options?.onOpenFailure?.(SBUError.DEVICE_UNAVAILABLE, new Error(response.errorMessage));\n return null;\n }\n\n const { fileName: name, fileSize: size, type, uri } = response.assets?.[0] ?? {};\n return normalizeFile({ uri, size, name, type });\n }\n async openMediaLibrary(options?: OpenMediaLibraryOptions): Promise<FilePickerResponse[] | null> {\n /**\n * NOTE: options.selectionLimit {@link https://github.com/react-native-image-picker/react-native-image-picker#options}\n * We do not support 0 (any number of files)\n **/\n const selectionLimit = options?.selectionLimit || 1;\n const hasPermission = await this.hasMediaLibraryPermission();\n if (!hasPermission) {\n const granted = await this.requestMediaLibraryPermission();\n if (!granted) {\n options?.onOpenFailure?.(SBUError.PERMISSIONS_DENIED);\n return null;\n }\n }\n\n const response = await imagePickerModule.launchImageLibrary({\n presentationStyle: 'fullScreen',\n selectionLimit,\n mediaType: (() => {\n switch (options?.mediaType) {\n case 'photo':\n return 'photo';\n case 'video':\n return 'video';\n case 'all':\n return 'mixed';\n default:\n return 'photo';\n }\n })(),\n });\n if (response.didCancel) return null;\n if (response.errorCode === 'camera_unavailable') {\n options?.onOpenFailure?.(SBUError.DEVICE_UNAVAILABLE, new Error(response.errorMessage));\n return null;\n }\n\n return Promise.all(\n (response.assets || [])\n .slice(0, selectionLimit)\n .map(({ fileName: name, fileSize: size, type, uri }) => normalizeFile({ uri, size, name, type })),\n );\n }\n async openDocument(options?: OpenDocumentOptions): Promise<FilePickerResponse> {\n try {\n const { uri, size, name, type } = await documentPickerModule.pickSingle();\n return normalizeFile({ uri, size, name, type });\n } catch (e) {\n if (!documentPickerModule.isCancel(e) && documentPickerModule.isInProgress(e)) {\n options?.onOpenFailure?.(SBUError.UNKNOWN, e);\n }\n return null;\n }\n }\n async save(options: SaveOptions): Promise<string> {\n const hasPermission = await this.hasMediaLibraryPermission();\n if (!hasPermission) {\n const granted = await this.requestMediaLibraryPermission();\n if (!granted) throw new Error('Permission not granted');\n }\n\n const { downloadedPath, file } = await this.downloadFile(options);\n\n if (Platform.OS === 'ios') {\n if (file.type === 'image' || file.type === 'video') {\n const mediaTypeMap = { 'image': 'photo', 'video': 'video' } as const;\n const mediaType = mediaTypeMap[file.type];\n await mediaLibraryModule.save(downloadedPath, { type: mediaType });\n }\n }\n\n if (Platform.OS === 'android') {\n const externalDirMap = { 'file': 'downloads', 'audio': 'audio', 'image': 'images', 'video': 'video' } as const;\n const externalDir = externalDirMap[file.type];\n await fsModule.FileSystem.cpExternal(downloadedPath, file.name, externalDir).catch(() => {\n Logger.error('Failed to save file to external storage. Retry saving to downloads directory instead.');\n return fsModule.FileSystem.cpExternal(downloadedPath, file.name, 'downloads');\n });\n }\n\n return downloadedPath;\n }\n\n private buildDownloadPath = async (options: SaveOptions) => {\n const dirname = Platform.select({ android: fsModule.Dirs.CacheDir, default: fsModule.Dirs.DocumentDir });\n const context = { dirname, filename: options.fileName };\n const extension =\n getFileExtension(options.fileName) ||\n getFileExtensionFromMime(options.fileType) ||\n getFileExtension(options.fileUrl) ||\n (await getFileExtensionFromUri(options.fileUrl));\n\n if (extension) context.filename = normalizeFileName(context.filename, extension);\n\n return { path: `${context.dirname}/${context.filename}`, ...context };\n };\n\n private downloadFile = async (options: SaveOptions) => {\n const { path, filename } = await this.buildDownloadPath(options);\n await fsModule.FileSystem.fetch(options.fileUrl, { path });\n return {\n downloadedPath: path,\n file: {\n name: filename,\n type: getFileType(getFileExtension(path)),\n } as const,\n };\n };\n }\n\n return new NativeFileService();\n};\n\nexport default createNativeFileService;\n"],"mappings":"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"}
@@ -7,44 +7,89 @@ exports.default = void 0;
7
7
  var _normalizeFile = _interopRequireDefault(require("./normalizeFile"));
8
8
  function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
9
9
  const expoBackwardUtils = {
10
- toCanceled(result) {
11
- // @ts-expect-error backward compatibility
12
- return result.canceled ?? result.cancelled;
13
- },
14
- toFileSize(info) {
15
- if ('size' in info) {
16
- return info.size;
17
- } else {
18
- return 0;
10
+ imagePicker: {
11
+ isCanceled(result) {
12
+ // @ts-expect-error backward compatibility
13
+ return result.canceled ?? result.cancelled;
14
+ },
15
+ async toFilePickerResponses(result, fsModule) {
16
+ if (result.assets) {
17
+ const assets = result.assets || [];
18
+ const promises = assets.map(_ref => {
19
+ let {
20
+ fileName: name,
21
+ fileSize: size,
22
+ type,
23
+ uri
24
+ } = _ref;
25
+ return (0, _normalizeFile.default)({
26
+ uri,
27
+ size,
28
+ name,
29
+ type
30
+ });
31
+ });
32
+ return Promise.all(promises);
33
+ } else if ('uri' in result && typeof result.uri === 'string') {
34
+ const fileInfo = await fsModule.getInfoAsync(result.uri);
35
+ const response = await (0, _normalizeFile.default)({
36
+ uri: result.uri,
37
+ size: expoBackwardUtils.toFileSize(fileInfo)
38
+ });
39
+ return [response];
40
+ } else {
41
+ return [];
42
+ }
19
43
  }
20
44
  },
21
- async toFilePickerResponses(result, fsModule) {
22
- if (result.assets) {
23
- const assets = result.assets || [];
24
- const promises = assets.map(_ref => {
25
- let {
26
- fileName: name,
27
- fileSize: size,
28
- type,
29
- uri
30
- } = _ref;
31
- return (0, _normalizeFile.default)({
45
+ documentPicker: {
46
+ isCanceled(result) {
47
+ // @ts-expect-error backward compatibility
48
+ return result.canceled ?? result.type === 'cancel';
49
+ },
50
+ async toFilePickerResponses(result) {
51
+ if (result.assets) {
52
+ const assets = result.assets || [];
53
+ const promises = assets.map(_ref2 => {
54
+ let {
55
+ name,
56
+ size,
57
+ mimeType,
58
+ uri
59
+ } = _ref2;
60
+ return (0, _normalizeFile.default)({
61
+ uri,
62
+ size,
63
+ name,
64
+ type: mimeType
65
+ });
66
+ });
67
+ return Promise.all(promises);
68
+ } else if ('uri' in result && typeof result.uri === 'string') {
69
+ // @ts-expect-error backward compatibility
70
+ const {
71
+ mimeType,
72
+ uri,
73
+ size,
74
+ name
75
+ } = result;
76
+ const response = await (0, _normalizeFile.default)({
32
77
  uri,
33
78
  size,
34
79
  name,
35
- type
80
+ type: mimeType
36
81
  });
37
- });
38
- return Promise.all(promises);
39
- } else if ('uri' in result && typeof result.uri === 'string') {
40
- const fileInfo = await fsModule.getInfoAsync(result.uri);
41
- const response = await (0, _normalizeFile.default)({
42
- uri: result.uri,
43
- size: this.toFileSize(fileInfo)
44
- });
45
- return [response];
82
+ return [response];
83
+ } else {
84
+ return [];
85
+ }
86
+ }
87
+ },
88
+ toFileSize(info) {
89
+ if ('size' in info) {
90
+ return info.size;
46
91
  } else {
47
- return [];
92
+ return 0;
48
93
  }
49
94
  }
50
95
  };
@@ -1 +1 @@
1
- {"version":3,"names":["_normalizeFile","_interopRequireDefault","require","obj","__esModule","default","expoBackwardUtils","toCanceled","result","canceled","cancelled","toFileSize","info","size","toFilePickerResponses","fsModule","assets","promises","map","_ref","fileName","name","fileSize","type","uri","normalizeFile","Promise","all","fileInfo","getInfoAsync","response","_default","exports"],"sources":["expoBackwardUtils.ts"],"sourcesContent":["import type * as ExpoFs from 'expo-file-system';\nimport type * as ExpoImagePicker from 'expo-image-picker';\n\nimport type { FilePickerResponse } from '../platform/types';\nimport normalizeFile from './normalizeFile';\n\nconst expoBackwardUtils = {\n toCanceled(result: ExpoImagePicker.ImagePickerResult) {\n // @ts-expect-error backward compatibility\n return result.canceled ?? result.cancelled;\n },\n toFileSize(info: ExpoFs.FileInfo) {\n if ('size' in info) {\n return info.size;\n } else {\n return 0;\n }\n },\n async toFilePickerResponses(\n result: ExpoImagePicker.ImagePickerResult,\n fsModule: typeof ExpoFs,\n ): Promise<FilePickerResponse[]> {\n if (result.assets) {\n const assets = result.assets || [];\n const promises = assets.map(({ fileName: name, fileSize: size, type, uri }) =>\n normalizeFile({ uri, size, name, type }),\n );\n\n return Promise.all(promises);\n } else if ('uri' in result && typeof result.uri === 'string') {\n const fileInfo = await fsModule.getInfoAsync(result.uri);\n const response = await normalizeFile({ uri: result.uri, size: this.toFileSize(fileInfo) });\n return [response];\n } else {\n return [];\n }\n },\n};\n\nexport default expoBackwardUtils;\n"],"mappings":";;;;;;AAIA,IAAAA,cAAA,GAAAC,sBAAA,CAAAC,OAAA;AAA4C,SAAAD,uBAAAE,GAAA,WAAAA,GAAA,IAAAA,GAAA,CAAAC,UAAA,GAAAD,GAAA,KAAAE,OAAA,EAAAF,GAAA;AAE5C,MAAMG,iBAAiB,GAAG;EACxBC,UAAUA,CAACC,MAAyC,EAAE;IACpD;IACA,OAAOA,MAAM,CAACC,QAAQ,IAAID,MAAM,CAACE,SAAS;EAC5C,CAAC;EACDC,UAAUA,CAACC,IAAqB,EAAE;IAChC,IAAI,MAAM,IAAIA,IAAI,EAAE;MAClB,OAAOA,IAAI,CAACC,IAAI;IAClB,CAAC,MAAM;MACL,OAAO,CAAC;IACV;EACF,CAAC;EACD,MAAMC,qBAAqBA,CACzBN,MAAyC,EACzCO,QAAuB,EACQ;IAC/B,IAAIP,MAAM,CAACQ,MAAM,EAAE;MACjB,MAAMA,MAAM,GAAGR,MAAM,CAACQ,MAAM,IAAI,EAAE;MAClC,MAAMC,QAAQ,GAAGD,MAAM,CAACE,GAAG,CAACC,IAAA;QAAA,IAAC;UAAEC,QAAQ,EAAEC,IAAI;UAAEC,QAAQ,EAAET,IAAI;UAAEU,IAAI;UAAEC;QAAI,CAAC,GAAAL,IAAA;QAAA,OACxE,IAAAM,sBAAa,EAAC;UAAED,GAAG;UAAEX,IAAI;UAAEQ,IAAI;UAAEE;QAAK,CAAC,CAAC;MAAA,EACzC;MAED,OAAOG,OAAO,CAACC,GAAG,CAACV,QAAQ,CAAC;IAC9B,CAAC,MAAM,IAAI,KAAK,IAAIT,MAAM,IAAI,OAAOA,MAAM,CAACgB,GAAG,KAAK,QAAQ,EAAE;MAC5D,MAAMI,QAAQ,GAAG,MAAMb,QAAQ,CAACc,YAAY,CAACrB,MAAM,CAACgB,GAAG,CAAC;MACxD,MAAMM,QAAQ,GAAG,MAAM,IAAAL,sBAAa,EAAC;QAAED,GAAG,EAAEhB,MAAM,CAACgB,GAAG;QAAEX,IAAI,EAAE,IAAI,CAACF,UAAU,CAACiB,QAAQ;MAAE,CAAC,CAAC;MAC1F,OAAO,CAACE,QAAQ,CAAC;IACnB,CAAC,MAAM;MACL,OAAO,EAAE;IACX;EACF;AACF,CAAC;AAAC,IAAAC,QAAA,GAEazB,iBAAiB;AAAA0B,OAAA,CAAA3B,OAAA,GAAA0B,QAAA"}
1
+ {"version":3,"names":["_normalizeFile","_interopRequireDefault","require","obj","__esModule","default","expoBackwardUtils","imagePicker","isCanceled","result","canceled","cancelled","toFilePickerResponses","fsModule","assets","promises","map","_ref","fileName","name","fileSize","size","type","uri","normalizeFile","Promise","all","fileInfo","getInfoAsync","response","toFileSize","documentPicker","_ref2","mimeType","info","_default","exports"],"sources":["expoBackwardUtils.ts"],"sourcesContent":["import type * as ExpoDocumentPicker from 'expo-document-picker';\nimport type * as ExpoFs from 'expo-file-system';\nimport type * as ExpoImagePicker from 'expo-image-picker';\n\nimport type { FilePickerResponse } from '../platform/types';\nimport normalizeFile from './normalizeFile';\n\nconst expoBackwardUtils = {\n imagePicker: {\n isCanceled(result: ExpoImagePicker.ImagePickerResult) {\n // @ts-expect-error backward compatibility\n return result.canceled ?? result.cancelled;\n },\n async toFilePickerResponses(\n result: ExpoImagePicker.ImagePickerResult,\n fsModule: typeof ExpoFs,\n ): Promise<FilePickerResponse[]> {\n if (result.assets) {\n const assets = result.assets || [];\n const promises = assets.map(({ fileName: name, fileSize: size, type, uri }) =>\n normalizeFile({ uri, size, name, type }),\n );\n\n return Promise.all(promises);\n } else if ('uri' in result && typeof result.uri === 'string') {\n const fileInfo = await fsModule.getInfoAsync(result.uri);\n const response = await normalizeFile({ uri: result.uri, size: expoBackwardUtils.toFileSize(fileInfo) });\n return [response];\n } else {\n return [];\n }\n },\n },\n documentPicker: {\n isCanceled(result: ExpoDocumentPicker.DocumentPickerResult) {\n // @ts-expect-error backward compatibility\n return result.canceled ?? result.type === 'cancel';\n },\n async toFilePickerResponses(result: ExpoDocumentPicker.DocumentPickerResult): Promise<FilePickerResponse[]> {\n if (result.assets) {\n const assets = result.assets || [];\n const promises = assets.map(({ name, size, mimeType, uri }) =>\n normalizeFile({ uri, size, name, type: mimeType }),\n );\n\n return Promise.all(promises);\n } else if ('uri' in result && typeof result.uri === 'string') {\n // @ts-expect-error backward compatibility\n const { mimeType, uri, size, name } = result;\n const response = await normalizeFile({ uri, size, name, type: mimeType });\n\n return [response];\n } else {\n return [];\n }\n },\n },\n toFileSize(info: ExpoFs.FileInfo) {\n if ('size' in info) {\n return info.size;\n } else {\n return 0;\n }\n },\n};\n\nexport default expoBackwardUtils;\n"],"mappings":";;;;;;AAKA,IAAAA,cAAA,GAAAC,sBAAA,CAAAC,OAAA;AAA4C,SAAAD,uBAAAE,GAAA,WAAAA,GAAA,IAAAA,GAAA,CAAAC,UAAA,GAAAD,GAAA,KAAAE,OAAA,EAAAF,GAAA;AAE5C,MAAMG,iBAAiB,GAAG;EACxBC,WAAW,EAAE;IACXC,UAAUA,CAACC,MAAyC,EAAE;MACpD;MACA,OAAOA,MAAM,CAACC,QAAQ,IAAID,MAAM,CAACE,SAAS;IAC5C,CAAC;IACD,MAAMC,qBAAqBA,CACzBH,MAAyC,EACzCI,QAAuB,EACQ;MAC/B,IAAIJ,MAAM,CAACK,MAAM,EAAE;QACjB,MAAMA,MAAM,GAAGL,MAAM,CAACK,MAAM,IAAI,EAAE;QAClC,MAAMC,QAAQ,GAAGD,MAAM,CAACE,GAAG,CAACC,IAAA;UAAA,IAAC;YAAEC,QAAQ,EAAEC,IAAI;YAAEC,QAAQ,EAAEC,IAAI;YAAEC,IAAI;YAAEC;UAAI,CAAC,GAAAN,IAAA;UAAA,OACxE,IAAAO,sBAAa,EAAC;YAAED,GAAG;YAAEF,IAAI;YAAEF,IAAI;YAAEG;UAAK,CAAC,CAAC;QAAA,EACzC;QAED,OAAOG,OAAO,CAACC,GAAG,CAACX,QAAQ,CAAC;MAC9B,CAAC,MAAM,IAAI,KAAK,IAAIN,MAAM,IAAI,OAAOA,MAAM,CAACc,GAAG,KAAK,QAAQ,EAAE;QAC5D,MAAMI,QAAQ,GAAG,MAAMd,QAAQ,CAACe,YAAY,CAACnB,MAAM,CAACc,GAAG,CAAC;QACxD,MAAMM,QAAQ,GAAG,MAAM,IAAAL,sBAAa,EAAC;UAAED,GAAG,EAAEd,MAAM,CAACc,GAAG;UAAEF,IAAI,EAAEf,iBAAiB,CAACwB,UAAU,CAACH,QAAQ;QAAE,CAAC,CAAC;QACvG,OAAO,CAACE,QAAQ,CAAC;MACnB,CAAC,MAAM;QACL,OAAO,EAAE;MACX;IACF;EACF,CAAC;EACDE,cAAc,EAAE;IACdvB,UAAUA,CAACC,MAA+C,EAAE;MAC1D;MACA,OAAOA,MAAM,CAACC,QAAQ,IAAID,MAAM,CAACa,IAAI,KAAK,QAAQ;IACpD,CAAC;IACD,MAAMV,qBAAqBA,CAACH,MAA+C,EAAiC;MAC1G,IAAIA,MAAM,CAACK,MAAM,EAAE;QACjB,MAAMA,MAAM,GAAGL,MAAM,CAACK,MAAM,IAAI,EAAE;QAClC,MAAMC,QAAQ,GAAGD,MAAM,CAACE,GAAG,CAACgB,KAAA;UAAA,IAAC;YAAEb,IAAI;YAAEE,IAAI;YAAEY,QAAQ;YAAEV;UAAI,CAAC,GAAAS,KAAA;UAAA,OACxD,IAAAR,sBAAa,EAAC;YAAED,GAAG;YAAEF,IAAI;YAAEF,IAAI;YAAEG,IAAI,EAAEW;UAAS,CAAC,CAAC;QAAA,EACnD;QAED,OAAOR,OAAO,CAACC,GAAG,CAACX,QAAQ,CAAC;MAC9B,CAAC,MAAM,IAAI,KAAK,IAAIN,MAAM,IAAI,OAAOA,MAAM,CAACc,GAAG,KAAK,QAAQ,EAAE;QAC5D;QACA,MAAM;UAAEU,QAAQ;UAAEV,GAAG;UAAEF,IAAI;UAAEF;QAAK,CAAC,GAAGV,MAAM;QAC5C,MAAMoB,QAAQ,GAAG,MAAM,IAAAL,sBAAa,EAAC;UAAED,GAAG;UAAEF,IAAI;UAAEF,IAAI;UAAEG,IAAI,EAAEW;QAAS,CAAC,CAAC;QAEzE,OAAO,CAACJ,QAAQ,CAAC;MACnB,CAAC,MAAM;QACL,OAAO,EAAE;MACX;IACF;EACF,CAAC;EACDC,UAAUA,CAACI,IAAqB,EAAE;IAChC,IAAI,MAAM,IAAIA,IAAI,EAAE;MAClB,OAAOA,IAAI,CAACb,IAAI;IAClB,CAAC,MAAM;MACL,OAAO,CAAC;IACV;EACF;AACF,CAAC;AAAC,IAAAc,QAAA,GAEa7B,iBAAiB;AAAA8B,OAAA,CAAA/B,OAAA,GAAA8B,QAAA"}
@@ -4,7 +4,7 @@ Object.defineProperty(exports, "__esModule", {
4
4
  value: true
5
5
  });
6
6
  exports.default = void 0;
7
- const VERSION = '3.0.4-rc.0';
7
+ const VERSION = '3.0.4';
8
8
  var _default = VERSION;
9
9
  exports.default = _default;
10
10
  //# sourceMappingURL=version.js.map
@@ -1 +1 @@
1
- {"version":3,"names":["VERSION","_default","exports","default"],"sources":["version.ts"],"sourcesContent":["const VERSION = '3.0.4-rc.0';\nexport default VERSION;\n"],"mappings":";;;;;;AAAA,MAAMA,OAAO,GAAG,YAAY;AAAC,IAAAC,QAAA,GACdD,OAAO;AAAAE,OAAA,CAAAC,OAAA,GAAAF,QAAA"}
1
+ {"version":3,"names":["VERSION","_default","exports","default"],"sources":["version.ts"],"sourcesContent":["const VERSION = '3.0.4';\nexport default VERSION;\n"],"mappings":";;;;;;AAAA,MAAMA,OAAO,GAAG,OAAO;AAAC,IAAAC,QAAA,GACTD,OAAO;AAAAE,OAAA,CAAAC,OAAA,GAAAF,QAAA"}
@@ -2,7 +2,6 @@ import { getFileType } from '@sendbird/uikit-utils';
2
2
  import SBUError from '../libs/SBUError';
3
3
  import expoBackwardUtils from '../utils/expoBackwardUtils';
4
4
  import expoPermissionGranted from '../utils/expoPermissionGranted';
5
- import normalizeFile from '../utils/normalizeFile';
6
5
  const createExpoFileService = _ref => {
7
6
  let {
8
7
  imagePickerModule,
@@ -51,9 +50,9 @@ const createExpoFileService = _ref => {
51
50
  }
52
51
  })()
53
52
  });
54
- if (expoBackwardUtils.toCanceled(response)) return null;
55
- const filePickerRes = await expoBackwardUtils.toFilePickerResponses(response, fsModule);
56
- return filePickerRes[0];
53
+ if (expoBackwardUtils.imagePicker.isCanceled(response)) return null;
54
+ const [file] = await expoBackwardUtils.imagePicker.toFilePickerResponses(response, fsModule);
55
+ return file;
57
56
  }
58
57
  async openMediaLibrary(options) {
59
58
  const hasPermission = await this.hasMediaLibraryPermission('read');
@@ -81,27 +80,17 @@ const createExpoFileService = _ref => {
81
80
  }
82
81
  })()
83
82
  });
84
- if (expoBackwardUtils.toCanceled(response)) return null;
85
- return expoBackwardUtils.toFilePickerResponses(response, fsModule);
83
+ if (expoBackwardUtils.imagePicker.isCanceled(response)) return null;
84
+ return expoBackwardUtils.imagePicker.toFilePickerResponses(response, fsModule);
86
85
  }
87
86
  async openDocument(options) {
88
87
  try {
89
88
  const response = await documentPickerModule.getDocumentAsync({
90
89
  type: '*/*'
91
90
  });
92
- if (response.type === 'cancel') return null;
93
- const {
94
- mimeType,
95
- uri,
96
- size,
97
- name
98
- } = response;
99
- return normalizeFile({
100
- uri,
101
- size,
102
- name,
103
- type: mimeType
104
- });
91
+ if (expoBackwardUtils.documentPicker.isCanceled(response)) return null;
92
+ const [file] = await expoBackwardUtils.documentPicker.toFilePickerResponses(response);
93
+ return file;
105
94
  } catch (e) {
106
95
  var _options$onOpenFailur3;
107
96
  options === null || options === void 0 ? void 0 : (_options$onOpenFailur3 = options.onOpenFailure) === null || _options$onOpenFailur3 === void 0 ? void 0 : _options$onOpenFailur3.call(options, SBUError.UNKNOWN, e);
@@ -1 +1 @@
1
- {"version":3,"names":["getFileType","SBUError","expoBackwardUtils","expoPermissionGranted","normalizeFile","createExpoFileService","_ref","imagePickerModule","documentPickerModule","mediaLibraryModule","fsModule","ExpoFileServiceInterface","hasCameraPermission","res","getCameraPermissionsAsync","requestCameraPermission","requestCameraPermissionsAsync","hasMediaLibraryPermission","type","perms","getPermissionsAsync","requestMediaLibraryPermission","requestPermissionsAsync","openCamera","options","hasPermission","granted","_options$onOpenFailur","onOpenFailure","call","PERMISSIONS_DENIED","response","launchCameraAsync","mediaTypes","mediaType","MediaTypeOptions","Images","Videos","All","toCanceled","filePickerRes","toFilePickerResponses","openMediaLibrary","_options$onOpenFailur2","selectionLimit","launchImageLibraryAsync","openDocument","getDocumentAsync","mimeType","uri","size","name","e","_options$onOpenFailur3","UNKNOWN","save","Error","basePath","documentDirectory","cacheDirectory","downloadPath","fileName","downloadAsync","fileUrl","fileType","match","saveToLibraryAsync"],"sources":["createFileService.expo.ts"],"sourcesContent":["import type * as ExpoDocumentPicker from 'expo-document-picker';\nimport type * as ExpoFs from 'expo-file-system';\nimport type * as ExpoImagePicker from 'expo-image-picker';\nimport type * as ExpoMediaLibrary from 'expo-media-library';\n\nimport { getFileType } from '@sendbird/uikit-utils';\n\nimport SBUError from '../libs/SBUError';\nimport expoBackwardUtils from '../utils/expoBackwardUtils';\nimport type { ExpoMediaLibraryPermissionResponse, ExpoPermissionResponse } from '../utils/expoPermissionGranted';\nimport expoPermissionGranted from '../utils/expoPermissionGranted';\nimport normalizeFile from '../utils/normalizeFile';\nimport type {\n FilePickerResponse,\n FileServiceInterface,\n OpenCameraOptions,\n OpenDocumentOptions,\n OpenMediaLibraryOptions,\n SaveOptions,\n} from './types';\n\nconst createExpoFileService = ({\n imagePickerModule,\n documentPickerModule,\n mediaLibraryModule,\n fsModule,\n}: {\n imagePickerModule: typeof ExpoImagePicker;\n documentPickerModule: typeof ExpoDocumentPicker;\n mediaLibraryModule: typeof ExpoMediaLibrary;\n fsModule: typeof ExpoFs;\n}): FileServiceInterface => {\n class ExpoFileServiceInterface implements FileServiceInterface {\n async hasCameraPermission(): Promise<boolean> {\n const res = (await imagePickerModule.getCameraPermissionsAsync()) as ExpoPermissionResponse;\n return expoPermissionGranted([res]);\n }\n async requestCameraPermission(): Promise<boolean> {\n const res = (await imagePickerModule.requestCameraPermissionsAsync()) as ExpoPermissionResponse;\n return expoPermissionGranted([res]);\n }\n async hasMediaLibraryPermission(type: 'write' | 'read'): Promise<boolean> {\n const perms = (await mediaLibraryModule.getPermissionsAsync(\n type === 'write',\n )) as ExpoMediaLibraryPermissionResponse;\n return expoPermissionGranted([perms]);\n }\n async requestMediaLibraryPermission(type: 'write' | 'read'): Promise<boolean> {\n const perms = (await mediaLibraryModule.requestPermissionsAsync(\n type === 'write',\n )) as ExpoMediaLibraryPermissionResponse;\n return expoPermissionGranted([perms]);\n }\n\n async openCamera(options?: OpenCameraOptions): Promise<FilePickerResponse> {\n const hasPermission = await this.hasCameraPermission();\n if (!hasPermission) {\n const granted = await this.requestCameraPermission();\n if (!granted) {\n options?.onOpenFailure?.(SBUError.PERMISSIONS_DENIED);\n return null;\n }\n }\n\n const response = await imagePickerModule.launchCameraAsync({\n mediaTypes: (() => {\n switch (options?.mediaType) {\n case 'photo':\n return imagePickerModule.MediaTypeOptions.Images;\n case 'video':\n return imagePickerModule.MediaTypeOptions.Videos;\n case 'all':\n return imagePickerModule.MediaTypeOptions.All;\n default:\n return imagePickerModule.MediaTypeOptions.Images;\n }\n })(),\n });\n\n if (expoBackwardUtils.toCanceled(response)) return null;\n\n const filePickerRes = await expoBackwardUtils.toFilePickerResponses(response, fsModule);\n return filePickerRes[0];\n }\n async openMediaLibrary(options: OpenMediaLibraryOptions) {\n const hasPermission = await this.hasMediaLibraryPermission('read');\n if (!hasPermission) {\n const granted = await this.requestMediaLibraryPermission('read');\n if (!granted) {\n options?.onOpenFailure?.(SBUError.PERMISSIONS_DENIED);\n return null;\n }\n }\n\n const selectionLimit = options?.selectionLimit || 1;\n const response = await imagePickerModule.launchImageLibraryAsync({\n selectionLimit,\n mediaTypes: (() => {\n switch (options?.mediaType) {\n case 'photo':\n return imagePickerModule.MediaTypeOptions.Images;\n case 'video':\n return imagePickerModule.MediaTypeOptions.Videos;\n case 'all':\n return imagePickerModule.MediaTypeOptions.All;\n default:\n return imagePickerModule.MediaTypeOptions.Images;\n }\n })(),\n });\n if (expoBackwardUtils.toCanceled(response)) return null;\n return expoBackwardUtils.toFilePickerResponses(response, fsModule);\n }\n\n async openDocument(options?: OpenDocumentOptions): Promise<FilePickerResponse> {\n try {\n const response = await documentPickerModule.getDocumentAsync({ type: '*/*' });\n if (response.type === 'cancel') return null;\n const { mimeType, uri, size, name } = response;\n return normalizeFile({ uri, size, name, type: mimeType });\n } catch (e) {\n options?.onOpenFailure?.(SBUError.UNKNOWN, e);\n return null;\n }\n }\n\n async save(options: SaveOptions): Promise<string> {\n const hasPermission = await this.hasMediaLibraryPermission('write');\n if (!hasPermission) {\n const granted = await this.requestMediaLibraryPermission('write');\n if (!granted) throw new Error('Permission not granted');\n }\n\n const basePath = fsModule.documentDirectory || fsModule.cacheDirectory;\n if (!basePath) throw new Error('Cannot determine directory');\n\n const downloadPath = `${basePath}/${options.fileName}`;\n\n const response = await fsModule.downloadAsync(options.fileUrl, downloadPath);\n if (getFileType(options.fileType || '').match(/video|image/)) {\n await mediaLibraryModule.saveToLibraryAsync(response.uri);\n }\n return response.uri;\n }\n }\n\n return new ExpoFileServiceInterface();\n};\n\nexport default createExpoFileService;\n"],"mappings":"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"}
1
+ {"version":3,"names":["getFileType","SBUError","expoBackwardUtils","expoPermissionGranted","createExpoFileService","_ref","imagePickerModule","documentPickerModule","mediaLibraryModule","fsModule","ExpoFileServiceInterface","hasCameraPermission","res","getCameraPermissionsAsync","requestCameraPermission","requestCameraPermissionsAsync","hasMediaLibraryPermission","type","perms","getPermissionsAsync","requestMediaLibraryPermission","requestPermissionsAsync","openCamera","options","hasPermission","granted","_options$onOpenFailur","onOpenFailure","call","PERMISSIONS_DENIED","response","launchCameraAsync","mediaTypes","mediaType","MediaTypeOptions","Images","Videos","All","imagePicker","isCanceled","file","toFilePickerResponses","openMediaLibrary","_options$onOpenFailur2","selectionLimit","launchImageLibraryAsync","openDocument","getDocumentAsync","documentPicker","e","_options$onOpenFailur3","UNKNOWN","save","Error","basePath","documentDirectory","cacheDirectory","downloadPath","fileName","downloadAsync","fileUrl","fileType","match","saveToLibraryAsync","uri"],"sources":["createFileService.expo.ts"],"sourcesContent":["import type * as ExpoDocumentPicker from 'expo-document-picker';\nimport type * as ExpoFs from 'expo-file-system';\nimport type * as ExpoImagePicker from 'expo-image-picker';\nimport type * as ExpoMediaLibrary from 'expo-media-library';\n\nimport { getFileType } from '@sendbird/uikit-utils';\n\nimport SBUError from '../libs/SBUError';\nimport expoBackwardUtils from '../utils/expoBackwardUtils';\nimport type { ExpoMediaLibraryPermissionResponse, ExpoPermissionResponse } from '../utils/expoPermissionGranted';\nimport expoPermissionGranted from '../utils/expoPermissionGranted';\nimport type {\n FilePickerResponse,\n FileServiceInterface,\n OpenCameraOptions,\n OpenDocumentOptions,\n OpenMediaLibraryOptions,\n SaveOptions,\n} from './types';\n\nconst createExpoFileService = ({\n imagePickerModule,\n documentPickerModule,\n mediaLibraryModule,\n fsModule,\n}: {\n imagePickerModule: typeof ExpoImagePicker;\n documentPickerModule: typeof ExpoDocumentPicker;\n mediaLibraryModule: typeof ExpoMediaLibrary;\n fsModule: typeof ExpoFs;\n}): FileServiceInterface => {\n class ExpoFileServiceInterface implements FileServiceInterface {\n async hasCameraPermission(): Promise<boolean> {\n const res = (await imagePickerModule.getCameraPermissionsAsync()) as ExpoPermissionResponse;\n return expoPermissionGranted([res]);\n }\n async requestCameraPermission(): Promise<boolean> {\n const res = (await imagePickerModule.requestCameraPermissionsAsync()) as ExpoPermissionResponse;\n return expoPermissionGranted([res]);\n }\n async hasMediaLibraryPermission(type: 'write' | 'read'): Promise<boolean> {\n const perms = (await mediaLibraryModule.getPermissionsAsync(\n type === 'write',\n )) as ExpoMediaLibraryPermissionResponse;\n return expoPermissionGranted([perms]);\n }\n async requestMediaLibraryPermission(type: 'write' | 'read'): Promise<boolean> {\n const perms = (await mediaLibraryModule.requestPermissionsAsync(\n type === 'write',\n )) as ExpoMediaLibraryPermissionResponse;\n return expoPermissionGranted([perms]);\n }\n\n async openCamera(options?: OpenCameraOptions): Promise<FilePickerResponse> {\n const hasPermission = await this.hasCameraPermission();\n if (!hasPermission) {\n const granted = await this.requestCameraPermission();\n if (!granted) {\n options?.onOpenFailure?.(SBUError.PERMISSIONS_DENIED);\n return null;\n }\n }\n\n const response = await imagePickerModule.launchCameraAsync({\n mediaTypes: (() => {\n switch (options?.mediaType) {\n case 'photo':\n return imagePickerModule.MediaTypeOptions.Images;\n case 'video':\n return imagePickerModule.MediaTypeOptions.Videos;\n case 'all':\n return imagePickerModule.MediaTypeOptions.All;\n default:\n return imagePickerModule.MediaTypeOptions.Images;\n }\n })(),\n });\n\n if (expoBackwardUtils.imagePicker.isCanceled(response)) return null;\n\n const [file] = await expoBackwardUtils.imagePicker.toFilePickerResponses(response, fsModule);\n return file;\n }\n async openMediaLibrary(options: OpenMediaLibraryOptions) {\n const hasPermission = await this.hasMediaLibraryPermission('read');\n if (!hasPermission) {\n const granted = await this.requestMediaLibraryPermission('read');\n if (!granted) {\n options?.onOpenFailure?.(SBUError.PERMISSIONS_DENIED);\n return null;\n }\n }\n\n const selectionLimit = options?.selectionLimit || 1;\n const response = await imagePickerModule.launchImageLibraryAsync({\n selectionLimit,\n mediaTypes: (() => {\n switch (options?.mediaType) {\n case 'photo':\n return imagePickerModule.MediaTypeOptions.Images;\n case 'video':\n return imagePickerModule.MediaTypeOptions.Videos;\n case 'all':\n return imagePickerModule.MediaTypeOptions.All;\n default:\n return imagePickerModule.MediaTypeOptions.Images;\n }\n })(),\n });\n if (expoBackwardUtils.imagePicker.isCanceled(response)) return null;\n return expoBackwardUtils.imagePicker.toFilePickerResponses(response, fsModule);\n }\n\n async openDocument(options?: OpenDocumentOptions): Promise<FilePickerResponse> {\n try {\n const response = await documentPickerModule.getDocumentAsync({ type: '*/*' });\n if (expoBackwardUtils.documentPicker.isCanceled(response)) return null;\n\n const [file] = await expoBackwardUtils.documentPicker.toFilePickerResponses(response);\n return file;\n } catch (e) {\n options?.onOpenFailure?.(SBUError.UNKNOWN, e);\n return null;\n }\n }\n\n async save(options: SaveOptions): Promise<string> {\n const hasPermission = await this.hasMediaLibraryPermission('write');\n if (!hasPermission) {\n const granted = await this.requestMediaLibraryPermission('write');\n if (!granted) throw new Error('Permission not granted');\n }\n\n const basePath = fsModule.documentDirectory || fsModule.cacheDirectory;\n if (!basePath) throw new Error('Cannot determine directory');\n\n const downloadPath = `${basePath}/${options.fileName}`;\n\n const response = await fsModule.downloadAsync(options.fileUrl, downloadPath);\n if (getFileType(options.fileType || '').match(/video|image/)) {\n await mediaLibraryModule.saveToLibraryAsync(response.uri);\n }\n return response.uri;\n }\n }\n\n return new ExpoFileServiceInterface();\n};\n\nexport default createExpoFileService;\n"],"mappings":"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"}
@@ -2,7 +2,7 @@ function _defineProperty(obj, key, value) { key = _toPropertyKey(key); if (key i
2
2
  function _toPropertyKey(arg) { var key = _toPrimitive(arg, "string"); return typeof key === "symbol" ? key : String(key); }
3
3
  function _toPrimitive(input, hint) { if (typeof input !== "object" || input === null) return input; var prim = input[Symbol.toPrimitive]; if (prim !== undefined) { var res = prim.call(input, hint || "default"); if (typeof res !== "object") return res; throw new TypeError("@@toPrimitive must return a primitive value."); } return (hint === "string" ? String : Number)(input); }
4
4
  import { Platform } from 'react-native';
5
- import { getFileExtension, getFileExtensionFromMime, getFileExtensionFromUri, getFileType, normalizeFileName } from '@sendbird/uikit-utils';
5
+ import { Logger, getFileExtension, getFileExtensionFromMime, getFileExtensionFromUri, getFileType, normalizeFileName } from '@sendbird/uikit-utils';
6
6
  import SBUError from '../libs/SBUError';
7
7
  import nativePermissionGranted from '../utils/nativePermissionGranted';
8
8
  import normalizeFile from '../utils/normalizeFile';
@@ -238,7 +238,10 @@ const createNativeFileService = _ref => {
238
238
  'video': 'video'
239
239
  };
240
240
  const externalDir = externalDirMap[file.type];
241
- await fsModule.FileSystem.cpExternal(downloadedPath, file.name, externalDir);
241
+ await fsModule.FileSystem.cpExternal(downloadedPath, file.name, externalDir).catch(() => {
242
+ Logger.error('Failed to save file to external storage. Retry saving to downloads directory instead.');
243
+ return fsModule.FileSystem.cpExternal(downloadedPath, file.name, 'downloads');
244
+ });
242
245
  }
243
246
  return downloadedPath;
244
247
  }
@@ -1 +1 @@
1
- {"version":3,"names":["Platform","getFileExtension","getFileExtensionFromMime","getFileExtensionFromUri","getFileType","normalizeFileName","SBUError","nativePermissionGranted","normalizeFile","getAndroidStoragePermissionsByAPILevel","permissionModule","OS","Version","PERMISSIONS","ANDROID","READ_MEDIA_AUDIO","READ_MEDIA_IMAGES","READ_MEDIA_VIDEO","READ_EXTERNAL_STORAGE","WRITE_EXTERNAL_STORAGE","createNativeFileService","_ref","imagePickerModule","documentPickerModule","mediaLibraryModule","fsModule","cameraPermissions","select","ios","IOS","CAMERA","MICROPHONE","android","default","mediaLibraryPermissions","MEDIA_LIBRARY","PHOTO_LIBRARY","NativeFileService","constructor","_defineProperty","options","dirname","Dirs","CacheDir","DocumentDir","context","filename","fileName","extension","fileType","fileUrl","path","buildDownloadPath","FileSystem","fetch","downloadedPath","file","name","type","hasCameraPermission","status","checkMultiple","requestCameraPermission","requestMultiple","hasMediaLibraryPermission","__DEV__","requestMediaLibraryPermission","openCamera","_response$assets","hasPermission","granted","_options$onOpenFailur","onOpenFailure","call","PERMISSIONS_DENIED","response","launchCamera","presentationStyle","cameraType","mediaType","didCancel","errorCode","_options$onOpenFailur2","DEVICE_UNAVAILABLE","Error","errorMessage","fileSize","size","uri","assets","openMediaLibrary","selectionLimit","_options$onOpenFailur3","launchImageLibrary","_options$onOpenFailur4","Promise","all","slice","map","_ref2","openDocument","pickSingle","e","isCancel","isInProgress","_options$onOpenFailur5","UNKNOWN","save","downloadFile","mediaTypeMap","externalDirMap","externalDir","cpExternal"],"sources":["createFileService.native.ts"],"sourcesContent":["import type { CameraRoll } from '@react-native-camera-roll/camera-roll';\nimport { Platform } from 'react-native';\nimport type * as DocumentPicker from 'react-native-document-picker';\nimport type * as FileAccess from 'react-native-file-access';\nimport type * as ImagePicker from 'react-native-image-picker';\nimport type * as Permissions from 'react-native-permissions';\nimport type { Permission } from 'react-native-permissions';\n\nimport {\n getFileExtension,\n getFileExtensionFromMime,\n getFileExtensionFromUri,\n getFileType,\n normalizeFileName,\n} from '@sendbird/uikit-utils';\n\nimport SBUError from '../libs/SBUError';\nimport nativePermissionGranted from '../utils/nativePermissionGranted';\nimport normalizeFile from '../utils/normalizeFile';\nimport type {\n FilePickerResponse,\n FileServiceInterface,\n OpenCameraOptions,\n OpenDocumentOptions,\n OpenMediaLibraryOptions,\n SaveOptions,\n} from './types';\n\nfunction getAndroidStoragePermissionsByAPILevel(permissionModule: typeof Permissions): Permission[] {\n if (Platform.OS !== 'android') return [];\n\n if (Platform.Version > 32) {\n return [\n permissionModule.PERMISSIONS.ANDROID.READ_MEDIA_AUDIO,\n permissionModule.PERMISSIONS.ANDROID.READ_MEDIA_IMAGES,\n permissionModule.PERMISSIONS.ANDROID.READ_MEDIA_VIDEO,\n ];\n }\n\n if (Platform.Version > 28) {\n return [permissionModule.PERMISSIONS.ANDROID.READ_EXTERNAL_STORAGE];\n }\n\n return [\n permissionModule.PERMISSIONS.ANDROID.WRITE_EXTERNAL_STORAGE,\n permissionModule.PERMISSIONS.ANDROID.READ_EXTERNAL_STORAGE,\n ];\n}\n\nconst createNativeFileService = ({\n imagePickerModule,\n documentPickerModule,\n permissionModule,\n mediaLibraryModule,\n fsModule,\n}: {\n imagePickerModule: typeof ImagePicker;\n documentPickerModule: typeof DocumentPicker;\n permissionModule: typeof Permissions;\n mediaLibraryModule: typeof CameraRoll;\n fsModule: typeof FileAccess;\n}): FileServiceInterface => {\n const cameraPermissions: Permission[] = Platform.select({\n ios: [permissionModule.PERMISSIONS.IOS.CAMERA, permissionModule.PERMISSIONS.IOS.MICROPHONE],\n android: [permissionModule.PERMISSIONS.ANDROID.CAMERA],\n default: [],\n });\n const mediaLibraryPermissions: Permission[] = Platform.select({\n ios: [permissionModule.PERMISSIONS.IOS.MEDIA_LIBRARY, permissionModule.PERMISSIONS.IOS.PHOTO_LIBRARY],\n android: getAndroidStoragePermissionsByAPILevel(permissionModule),\n default: [],\n });\n\n class NativeFileService implements FileServiceInterface {\n async hasCameraPermission(): Promise<boolean> {\n const status = await permissionModule.checkMultiple(cameraPermissions);\n return nativePermissionGranted(status);\n }\n async requestCameraPermission(): Promise<boolean> {\n const status = await permissionModule.requestMultiple(cameraPermissions);\n return nativePermissionGranted(status);\n }\n async hasMediaLibraryPermission(): Promise<boolean> {\n const status = await permissionModule.checkMultiple(mediaLibraryPermissions);\n if (\n __DEV__ &&\n Platform.OS === 'ios' &&\n status['ios.permission.MEDIA_LIBRARY'] === 'unavailable' &&\n status['ios.permission.PHOTO_LIBRARY'] === 'granted'\n ) {\n return true;\n }\n return nativePermissionGranted(status);\n }\n async requestMediaLibraryPermission(): Promise<boolean> {\n const status = await permissionModule.requestMultiple(mediaLibraryPermissions);\n return nativePermissionGranted(status);\n }\n\n async openCamera(options?: OpenCameraOptions): Promise<FilePickerResponse> {\n const hasPermission = await this.hasCameraPermission();\n if (!hasPermission) {\n const granted = await this.requestCameraPermission();\n if (!granted) {\n options?.onOpenFailure?.(SBUError.PERMISSIONS_DENIED);\n return null;\n }\n }\n\n const response = await imagePickerModule.launchCamera({\n presentationStyle: 'fullScreen',\n cameraType: options?.cameraType ?? 'back',\n mediaType: (() => {\n switch (options?.mediaType) {\n case 'photo':\n return 'photo';\n case 'video':\n return 'video';\n case 'all':\n return 'mixed';\n default:\n return 'photo';\n }\n })(),\n });\n if (response.didCancel) return null;\n if (response.errorCode === 'camera_unavailable') {\n options?.onOpenFailure?.(SBUError.DEVICE_UNAVAILABLE, new Error(response.errorMessage));\n return null;\n }\n\n const { fileName: name, fileSize: size, type, uri } = response.assets?.[0] ?? {};\n return normalizeFile({ uri, size, name, type });\n }\n async openMediaLibrary(options?: OpenMediaLibraryOptions): Promise<FilePickerResponse[] | null> {\n /**\n * NOTE: options.selectionLimit {@link https://github.com/react-native-image-picker/react-native-image-picker#options}\n * We do not support 0 (any number of files)\n **/\n const selectionLimit = options?.selectionLimit || 1;\n const hasPermission = await this.hasMediaLibraryPermission();\n if (!hasPermission) {\n const granted = await this.requestMediaLibraryPermission();\n if (!granted) {\n options?.onOpenFailure?.(SBUError.PERMISSIONS_DENIED);\n return null;\n }\n }\n\n const response = await imagePickerModule.launchImageLibrary({\n presentationStyle: 'fullScreen',\n selectionLimit,\n mediaType: (() => {\n switch (options?.mediaType) {\n case 'photo':\n return 'photo';\n case 'video':\n return 'video';\n case 'all':\n return 'mixed';\n default:\n return 'photo';\n }\n })(),\n });\n if (response.didCancel) return null;\n if (response.errorCode === 'camera_unavailable') {\n options?.onOpenFailure?.(SBUError.DEVICE_UNAVAILABLE, new Error(response.errorMessage));\n return null;\n }\n\n return Promise.all(\n (response.assets || [])\n .slice(0, selectionLimit)\n .map(({ fileName: name, fileSize: size, type, uri }) => normalizeFile({ uri, size, name, type })),\n );\n }\n async openDocument(options?: OpenDocumentOptions): Promise<FilePickerResponse> {\n try {\n const { uri, size, name, type } = await documentPickerModule.pickSingle();\n return normalizeFile({ uri, size, name, type });\n } catch (e) {\n if (!documentPickerModule.isCancel(e) && documentPickerModule.isInProgress(e)) {\n options?.onOpenFailure?.(SBUError.UNKNOWN, e);\n }\n return null;\n }\n }\n async save(options: SaveOptions): Promise<string> {\n const hasPermission = await this.hasMediaLibraryPermission();\n if (!hasPermission) {\n const granted = await this.requestMediaLibraryPermission();\n if (!granted) throw new Error('Permission not granted');\n }\n\n const { downloadedPath, file } = await this.downloadFile(options);\n\n if (Platform.OS === 'ios') {\n if (file.type === 'image' || file.type === 'video') {\n const mediaTypeMap = { 'image': 'photo', 'video': 'video' } as const;\n const mediaType = mediaTypeMap[file.type];\n await mediaLibraryModule.save(downloadedPath, { type: mediaType });\n }\n }\n\n if (Platform.OS === 'android') {\n const externalDirMap = { 'file': 'downloads', 'audio': 'audio', 'image': 'images', 'video': 'video' } as const;\n const externalDir = externalDirMap[file.type];\n await fsModule.FileSystem.cpExternal(downloadedPath, file.name, externalDir);\n }\n\n return downloadedPath;\n }\n\n private buildDownloadPath = async (options: SaveOptions) => {\n const dirname = Platform.select({ android: fsModule.Dirs.CacheDir, default: fsModule.Dirs.DocumentDir });\n const context = { dirname, filename: options.fileName };\n const extension =\n getFileExtension(options.fileName) ||\n getFileExtensionFromMime(options.fileType) ||\n getFileExtension(options.fileUrl) ||\n (await getFileExtensionFromUri(options.fileUrl));\n\n if (extension) context.filename = normalizeFileName(context.filename, extension);\n\n return { path: `${context.dirname}/${context.filename}`, ...context };\n };\n\n private downloadFile = async (options: SaveOptions) => {\n const { path, filename } = await this.buildDownloadPath(options);\n await fsModule.FileSystem.fetch(options.fileUrl, { path });\n return {\n downloadedPath: path,\n file: {\n name: filename,\n type: getFileType(getFileExtension(path)),\n } as const,\n };\n };\n }\n\n return new NativeFileService();\n};\n\nexport default createNativeFileService;\n"],"mappings":"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"}
1
+ {"version":3,"names":["Platform","Logger","getFileExtension","getFileExtensionFromMime","getFileExtensionFromUri","getFileType","normalizeFileName","SBUError","nativePermissionGranted","normalizeFile","getAndroidStoragePermissionsByAPILevel","permissionModule","OS","Version","PERMISSIONS","ANDROID","READ_MEDIA_AUDIO","READ_MEDIA_IMAGES","READ_MEDIA_VIDEO","READ_EXTERNAL_STORAGE","WRITE_EXTERNAL_STORAGE","createNativeFileService","_ref","imagePickerModule","documentPickerModule","mediaLibraryModule","fsModule","cameraPermissions","select","ios","IOS","CAMERA","MICROPHONE","android","default","mediaLibraryPermissions","MEDIA_LIBRARY","PHOTO_LIBRARY","NativeFileService","constructor","_defineProperty","options","dirname","Dirs","CacheDir","DocumentDir","context","filename","fileName","extension","fileType","fileUrl","path","buildDownloadPath","FileSystem","fetch","downloadedPath","file","name","type","hasCameraPermission","status","checkMultiple","requestCameraPermission","requestMultiple","hasMediaLibraryPermission","__DEV__","requestMediaLibraryPermission","openCamera","_response$assets","hasPermission","granted","_options$onOpenFailur","onOpenFailure","call","PERMISSIONS_DENIED","response","launchCamera","presentationStyle","cameraType","mediaType","didCancel","errorCode","_options$onOpenFailur2","DEVICE_UNAVAILABLE","Error","errorMessage","fileSize","size","uri","assets","openMediaLibrary","selectionLimit","_options$onOpenFailur3","launchImageLibrary","_options$onOpenFailur4","Promise","all","slice","map","_ref2","openDocument","pickSingle","e","isCancel","isInProgress","_options$onOpenFailur5","UNKNOWN","save","downloadFile","mediaTypeMap","externalDirMap","externalDir","cpExternal","catch","error"],"sources":["createFileService.native.ts"],"sourcesContent":["import type { CameraRoll } from '@react-native-camera-roll/camera-roll';\nimport { Platform } from 'react-native';\nimport type * as DocumentPicker from 'react-native-document-picker';\nimport type * as FileAccess from 'react-native-file-access';\nimport type * as ImagePicker from 'react-native-image-picker';\nimport type * as Permissions from 'react-native-permissions';\nimport type { Permission } from 'react-native-permissions';\n\nimport {\n Logger,\n getFileExtension,\n getFileExtensionFromMime,\n getFileExtensionFromUri,\n getFileType,\n normalizeFileName,\n} from '@sendbird/uikit-utils';\n\nimport SBUError from '../libs/SBUError';\nimport nativePermissionGranted from '../utils/nativePermissionGranted';\nimport normalizeFile from '../utils/normalizeFile';\nimport type {\n FilePickerResponse,\n FileServiceInterface,\n OpenCameraOptions,\n OpenDocumentOptions,\n OpenMediaLibraryOptions,\n SaveOptions,\n} from './types';\n\nfunction getAndroidStoragePermissionsByAPILevel(permissionModule: typeof Permissions): Permission[] {\n if (Platform.OS !== 'android') return [];\n\n if (Platform.Version > 32) {\n return [\n permissionModule.PERMISSIONS.ANDROID.READ_MEDIA_AUDIO,\n permissionModule.PERMISSIONS.ANDROID.READ_MEDIA_IMAGES,\n permissionModule.PERMISSIONS.ANDROID.READ_MEDIA_VIDEO,\n ];\n }\n\n if (Platform.Version > 28) {\n return [permissionModule.PERMISSIONS.ANDROID.READ_EXTERNAL_STORAGE];\n }\n\n return [\n permissionModule.PERMISSIONS.ANDROID.WRITE_EXTERNAL_STORAGE,\n permissionModule.PERMISSIONS.ANDROID.READ_EXTERNAL_STORAGE,\n ];\n}\n\nconst createNativeFileService = ({\n imagePickerModule,\n documentPickerModule,\n permissionModule,\n mediaLibraryModule,\n fsModule,\n}: {\n imagePickerModule: typeof ImagePicker;\n documentPickerModule: typeof DocumentPicker;\n permissionModule: typeof Permissions;\n mediaLibraryModule: typeof CameraRoll;\n fsModule: typeof FileAccess;\n}): FileServiceInterface => {\n const cameraPermissions: Permission[] = Platform.select({\n ios: [permissionModule.PERMISSIONS.IOS.CAMERA, permissionModule.PERMISSIONS.IOS.MICROPHONE],\n android: [permissionModule.PERMISSIONS.ANDROID.CAMERA],\n default: [],\n });\n const mediaLibraryPermissions: Permission[] = Platform.select({\n ios: [permissionModule.PERMISSIONS.IOS.MEDIA_LIBRARY, permissionModule.PERMISSIONS.IOS.PHOTO_LIBRARY],\n android: getAndroidStoragePermissionsByAPILevel(permissionModule),\n default: [],\n });\n\n class NativeFileService implements FileServiceInterface {\n async hasCameraPermission(): Promise<boolean> {\n const status = await permissionModule.checkMultiple(cameraPermissions);\n return nativePermissionGranted(status);\n }\n async requestCameraPermission(): Promise<boolean> {\n const status = await permissionModule.requestMultiple(cameraPermissions);\n return nativePermissionGranted(status);\n }\n async hasMediaLibraryPermission(): Promise<boolean> {\n const status = await permissionModule.checkMultiple(mediaLibraryPermissions);\n if (\n __DEV__ &&\n Platform.OS === 'ios' &&\n status['ios.permission.MEDIA_LIBRARY'] === 'unavailable' &&\n status['ios.permission.PHOTO_LIBRARY'] === 'granted'\n ) {\n return true;\n }\n return nativePermissionGranted(status);\n }\n async requestMediaLibraryPermission(): Promise<boolean> {\n const status = await permissionModule.requestMultiple(mediaLibraryPermissions);\n return nativePermissionGranted(status);\n }\n\n async openCamera(options?: OpenCameraOptions): Promise<FilePickerResponse> {\n const hasPermission = await this.hasCameraPermission();\n if (!hasPermission) {\n const granted = await this.requestCameraPermission();\n if (!granted) {\n options?.onOpenFailure?.(SBUError.PERMISSIONS_DENIED);\n return null;\n }\n }\n\n const response = await imagePickerModule.launchCamera({\n presentationStyle: 'fullScreen',\n cameraType: options?.cameraType ?? 'back',\n mediaType: (() => {\n switch (options?.mediaType) {\n case 'photo':\n return 'photo';\n case 'video':\n return 'video';\n case 'all':\n return 'mixed';\n default:\n return 'photo';\n }\n })(),\n });\n if (response.didCancel) return null;\n if (response.errorCode === 'camera_unavailable') {\n options?.onOpenFailure?.(SBUError.DEVICE_UNAVAILABLE, new Error(response.errorMessage));\n return null;\n }\n\n const { fileName: name, fileSize: size, type, uri } = response.assets?.[0] ?? {};\n return normalizeFile({ uri, size, name, type });\n }\n async openMediaLibrary(options?: OpenMediaLibraryOptions): Promise<FilePickerResponse[] | null> {\n /**\n * NOTE: options.selectionLimit {@link https://github.com/react-native-image-picker/react-native-image-picker#options}\n * We do not support 0 (any number of files)\n **/\n const selectionLimit = options?.selectionLimit || 1;\n const hasPermission = await this.hasMediaLibraryPermission();\n if (!hasPermission) {\n const granted = await this.requestMediaLibraryPermission();\n if (!granted) {\n options?.onOpenFailure?.(SBUError.PERMISSIONS_DENIED);\n return null;\n }\n }\n\n const response = await imagePickerModule.launchImageLibrary({\n presentationStyle: 'fullScreen',\n selectionLimit,\n mediaType: (() => {\n switch (options?.mediaType) {\n case 'photo':\n return 'photo';\n case 'video':\n return 'video';\n case 'all':\n return 'mixed';\n default:\n return 'photo';\n }\n })(),\n });\n if (response.didCancel) return null;\n if (response.errorCode === 'camera_unavailable') {\n options?.onOpenFailure?.(SBUError.DEVICE_UNAVAILABLE, new Error(response.errorMessage));\n return null;\n }\n\n return Promise.all(\n (response.assets || [])\n .slice(0, selectionLimit)\n .map(({ fileName: name, fileSize: size, type, uri }) => normalizeFile({ uri, size, name, type })),\n );\n }\n async openDocument(options?: OpenDocumentOptions): Promise<FilePickerResponse> {\n try {\n const { uri, size, name, type } = await documentPickerModule.pickSingle();\n return normalizeFile({ uri, size, name, type });\n } catch (e) {\n if (!documentPickerModule.isCancel(e) && documentPickerModule.isInProgress(e)) {\n options?.onOpenFailure?.(SBUError.UNKNOWN, e);\n }\n return null;\n }\n }\n async save(options: SaveOptions): Promise<string> {\n const hasPermission = await this.hasMediaLibraryPermission();\n if (!hasPermission) {\n const granted = await this.requestMediaLibraryPermission();\n if (!granted) throw new Error('Permission not granted');\n }\n\n const { downloadedPath, file } = await this.downloadFile(options);\n\n if (Platform.OS === 'ios') {\n if (file.type === 'image' || file.type === 'video') {\n const mediaTypeMap = { 'image': 'photo', 'video': 'video' } as const;\n const mediaType = mediaTypeMap[file.type];\n await mediaLibraryModule.save(downloadedPath, { type: mediaType });\n }\n }\n\n if (Platform.OS === 'android') {\n const externalDirMap = { 'file': 'downloads', 'audio': 'audio', 'image': 'images', 'video': 'video' } as const;\n const externalDir = externalDirMap[file.type];\n await fsModule.FileSystem.cpExternal(downloadedPath, file.name, externalDir).catch(() => {\n Logger.error('Failed to save file to external storage. Retry saving to downloads directory instead.');\n return fsModule.FileSystem.cpExternal(downloadedPath, file.name, 'downloads');\n });\n }\n\n return downloadedPath;\n }\n\n private buildDownloadPath = async (options: SaveOptions) => {\n const dirname = Platform.select({ android: fsModule.Dirs.CacheDir, default: fsModule.Dirs.DocumentDir });\n const context = { dirname, filename: options.fileName };\n const extension =\n getFileExtension(options.fileName) ||\n getFileExtensionFromMime(options.fileType) ||\n getFileExtension(options.fileUrl) ||\n (await getFileExtensionFromUri(options.fileUrl));\n\n if (extension) context.filename = normalizeFileName(context.filename, extension);\n\n return { path: `${context.dirname}/${context.filename}`, ...context };\n };\n\n private downloadFile = async (options: SaveOptions) => {\n const { path, filename } = await this.buildDownloadPath(options);\n await fsModule.FileSystem.fetch(options.fileUrl, { path });\n return {\n downloadedPath: path,\n file: {\n name: filename,\n type: getFileType(getFileExtension(path)),\n } as const,\n };\n };\n }\n\n return new NativeFileService();\n};\n\nexport default createNativeFileService;\n"],"mappings":"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"}
@@ -1,43 +1,88 @@
1
1
  import normalizeFile from './normalizeFile';
2
2
  const expoBackwardUtils = {
3
- toCanceled(result) {
4
- // @ts-expect-error backward compatibility
5
- return result.canceled ?? result.cancelled;
6
- },
7
- toFileSize(info) {
8
- if ('size' in info) {
9
- return info.size;
10
- } else {
11
- return 0;
3
+ imagePicker: {
4
+ isCanceled(result) {
5
+ // @ts-expect-error backward compatibility
6
+ return result.canceled ?? result.cancelled;
7
+ },
8
+ async toFilePickerResponses(result, fsModule) {
9
+ if (result.assets) {
10
+ const assets = result.assets || [];
11
+ const promises = assets.map(_ref => {
12
+ let {
13
+ fileName: name,
14
+ fileSize: size,
15
+ type,
16
+ uri
17
+ } = _ref;
18
+ return normalizeFile({
19
+ uri,
20
+ size,
21
+ name,
22
+ type
23
+ });
24
+ });
25
+ return Promise.all(promises);
26
+ } else if ('uri' in result && typeof result.uri === 'string') {
27
+ const fileInfo = await fsModule.getInfoAsync(result.uri);
28
+ const response = await normalizeFile({
29
+ uri: result.uri,
30
+ size: expoBackwardUtils.toFileSize(fileInfo)
31
+ });
32
+ return [response];
33
+ } else {
34
+ return [];
35
+ }
12
36
  }
13
37
  },
14
- async toFilePickerResponses(result, fsModule) {
15
- if (result.assets) {
16
- const assets = result.assets || [];
17
- const promises = assets.map(_ref => {
18
- let {
19
- fileName: name,
20
- fileSize: size,
21
- type,
22
- uri
23
- } = _ref;
24
- return normalizeFile({
38
+ documentPicker: {
39
+ isCanceled(result) {
40
+ // @ts-expect-error backward compatibility
41
+ return result.canceled ?? result.type === 'cancel';
42
+ },
43
+ async toFilePickerResponses(result) {
44
+ if (result.assets) {
45
+ const assets = result.assets || [];
46
+ const promises = assets.map(_ref2 => {
47
+ let {
48
+ name,
49
+ size,
50
+ mimeType,
51
+ uri
52
+ } = _ref2;
53
+ return normalizeFile({
54
+ uri,
55
+ size,
56
+ name,
57
+ type: mimeType
58
+ });
59
+ });
60
+ return Promise.all(promises);
61
+ } else if ('uri' in result && typeof result.uri === 'string') {
62
+ // @ts-expect-error backward compatibility
63
+ const {
64
+ mimeType,
65
+ uri,
66
+ size,
67
+ name
68
+ } = result;
69
+ const response = await normalizeFile({
25
70
  uri,
26
71
  size,
27
72
  name,
28
- type
73
+ type: mimeType
29
74
  });
30
- });
31
- return Promise.all(promises);
32
- } else if ('uri' in result && typeof result.uri === 'string') {
33
- const fileInfo = await fsModule.getInfoAsync(result.uri);
34
- const response = await normalizeFile({
35
- uri: result.uri,
36
- size: this.toFileSize(fileInfo)
37
- });
38
- return [response];
75
+ return [response];
76
+ } else {
77
+ return [];
78
+ }
79
+ }
80
+ },
81
+ toFileSize(info) {
82
+ if ('size' in info) {
83
+ return info.size;
39
84
  } else {
40
- return [];
85
+ return 0;
41
86
  }
42
87
  }
43
88
  };
@@ -1 +1 @@
1
- {"version":3,"names":["normalizeFile","expoBackwardUtils","toCanceled","result","canceled","cancelled","toFileSize","info","size","toFilePickerResponses","fsModule","assets","promises","map","_ref","fileName","name","fileSize","type","uri","Promise","all","fileInfo","getInfoAsync","response"],"sources":["expoBackwardUtils.ts"],"sourcesContent":["import type * as ExpoFs from 'expo-file-system';\nimport type * as ExpoImagePicker from 'expo-image-picker';\n\nimport type { FilePickerResponse } from '../platform/types';\nimport normalizeFile from './normalizeFile';\n\nconst expoBackwardUtils = {\n toCanceled(result: ExpoImagePicker.ImagePickerResult) {\n // @ts-expect-error backward compatibility\n return result.canceled ?? result.cancelled;\n },\n toFileSize(info: ExpoFs.FileInfo) {\n if ('size' in info) {\n return info.size;\n } else {\n return 0;\n }\n },\n async toFilePickerResponses(\n result: ExpoImagePicker.ImagePickerResult,\n fsModule: typeof ExpoFs,\n ): Promise<FilePickerResponse[]> {\n if (result.assets) {\n const assets = result.assets || [];\n const promises = assets.map(({ fileName: name, fileSize: size, type, uri }) =>\n normalizeFile({ uri, size, name, type }),\n );\n\n return Promise.all(promises);\n } else if ('uri' in result && typeof result.uri === 'string') {\n const fileInfo = await fsModule.getInfoAsync(result.uri);\n const response = await normalizeFile({ uri: result.uri, size: this.toFileSize(fileInfo) });\n return [response];\n } else {\n return [];\n }\n },\n};\n\nexport default expoBackwardUtils;\n"],"mappings":"AAIA,OAAOA,aAAa,MAAM,iBAAiB;AAE3C,MAAMC,iBAAiB,GAAG;EACxBC,UAAUA,CAACC,MAAyC,EAAE;IACpD;IACA,OAAOA,MAAM,CAACC,QAAQ,IAAID,MAAM,CAACE,SAAS;EAC5C,CAAC;EACDC,UAAUA,CAACC,IAAqB,EAAE;IAChC,IAAI,MAAM,IAAIA,IAAI,EAAE;MAClB,OAAOA,IAAI,CAACC,IAAI;IAClB,CAAC,MAAM;MACL,OAAO,CAAC;IACV;EACF,CAAC;EACD,MAAMC,qBAAqBA,CACzBN,MAAyC,EACzCO,QAAuB,EACQ;IAC/B,IAAIP,MAAM,CAACQ,MAAM,EAAE;MACjB,MAAMA,MAAM,GAAGR,MAAM,CAACQ,MAAM,IAAI,EAAE;MAClC,MAAMC,QAAQ,GAAGD,MAAM,CAACE,GAAG,CAACC,IAAA;QAAA,IAAC;UAAEC,QAAQ,EAAEC,IAAI;UAAEC,QAAQ,EAAET,IAAI;UAAEU,IAAI;UAAEC;QAAI,CAAC,GAAAL,IAAA;QAAA,OACxEd,aAAa,CAAC;UAAEmB,GAAG;UAAEX,IAAI;UAAEQ,IAAI;UAAEE;QAAK,CAAC,CAAC;MAAA,EACzC;MAED,OAAOE,OAAO,CAACC,GAAG,CAACT,QAAQ,CAAC;IAC9B,CAAC,MAAM,IAAI,KAAK,IAAIT,MAAM,IAAI,OAAOA,MAAM,CAACgB,GAAG,KAAK,QAAQ,EAAE;MAC5D,MAAMG,QAAQ,GAAG,MAAMZ,QAAQ,CAACa,YAAY,CAACpB,MAAM,CAACgB,GAAG,CAAC;MACxD,MAAMK,QAAQ,GAAG,MAAMxB,aAAa,CAAC;QAAEmB,GAAG,EAAEhB,MAAM,CAACgB,GAAG;QAAEX,IAAI,EAAE,IAAI,CAACF,UAAU,CAACgB,QAAQ;MAAE,CAAC,CAAC;MAC1F,OAAO,CAACE,QAAQ,CAAC;IACnB,CAAC,MAAM;MACL,OAAO,EAAE;IACX;EACF;AACF,CAAC;AAED,eAAevB,iBAAiB"}
1
+ {"version":3,"names":["normalizeFile","expoBackwardUtils","imagePicker","isCanceled","result","canceled","cancelled","toFilePickerResponses","fsModule","assets","promises","map","_ref","fileName","name","fileSize","size","type","uri","Promise","all","fileInfo","getInfoAsync","response","toFileSize","documentPicker","_ref2","mimeType","info"],"sources":["expoBackwardUtils.ts"],"sourcesContent":["import type * as ExpoDocumentPicker from 'expo-document-picker';\nimport type * as ExpoFs from 'expo-file-system';\nimport type * as ExpoImagePicker from 'expo-image-picker';\n\nimport type { FilePickerResponse } from '../platform/types';\nimport normalizeFile from './normalizeFile';\n\nconst expoBackwardUtils = {\n imagePicker: {\n isCanceled(result: ExpoImagePicker.ImagePickerResult) {\n // @ts-expect-error backward compatibility\n return result.canceled ?? result.cancelled;\n },\n async toFilePickerResponses(\n result: ExpoImagePicker.ImagePickerResult,\n fsModule: typeof ExpoFs,\n ): Promise<FilePickerResponse[]> {\n if (result.assets) {\n const assets = result.assets || [];\n const promises = assets.map(({ fileName: name, fileSize: size, type, uri }) =>\n normalizeFile({ uri, size, name, type }),\n );\n\n return Promise.all(promises);\n } else if ('uri' in result && typeof result.uri === 'string') {\n const fileInfo = await fsModule.getInfoAsync(result.uri);\n const response = await normalizeFile({ uri: result.uri, size: expoBackwardUtils.toFileSize(fileInfo) });\n return [response];\n } else {\n return [];\n }\n },\n },\n documentPicker: {\n isCanceled(result: ExpoDocumentPicker.DocumentPickerResult) {\n // @ts-expect-error backward compatibility\n return result.canceled ?? result.type === 'cancel';\n },\n async toFilePickerResponses(result: ExpoDocumentPicker.DocumentPickerResult): Promise<FilePickerResponse[]> {\n if (result.assets) {\n const assets = result.assets || [];\n const promises = assets.map(({ name, size, mimeType, uri }) =>\n normalizeFile({ uri, size, name, type: mimeType }),\n );\n\n return Promise.all(promises);\n } else if ('uri' in result && typeof result.uri === 'string') {\n // @ts-expect-error backward compatibility\n const { mimeType, uri, size, name } = result;\n const response = await normalizeFile({ uri, size, name, type: mimeType });\n\n return [response];\n } else {\n return [];\n }\n },\n },\n toFileSize(info: ExpoFs.FileInfo) {\n if ('size' in info) {\n return info.size;\n } else {\n return 0;\n }\n },\n};\n\nexport default expoBackwardUtils;\n"],"mappings":"AAKA,OAAOA,aAAa,MAAM,iBAAiB;AAE3C,MAAMC,iBAAiB,GAAG;EACxBC,WAAW,EAAE;IACXC,UAAUA,CAACC,MAAyC,EAAE;MACpD;MACA,OAAOA,MAAM,CAACC,QAAQ,IAAID,MAAM,CAACE,SAAS;IAC5C,CAAC;IACD,MAAMC,qBAAqBA,CACzBH,MAAyC,EACzCI,QAAuB,EACQ;MAC/B,IAAIJ,MAAM,CAACK,MAAM,EAAE;QACjB,MAAMA,MAAM,GAAGL,MAAM,CAACK,MAAM,IAAI,EAAE;QAClC,MAAMC,QAAQ,GAAGD,MAAM,CAACE,GAAG,CAACC,IAAA;UAAA,IAAC;YAAEC,QAAQ,EAAEC,IAAI;YAAEC,QAAQ,EAAEC,IAAI;YAAEC,IAAI;YAAEC;UAAI,CAAC,GAAAN,IAAA;UAAA,OACxEZ,aAAa,CAAC;YAAEkB,GAAG;YAAEF,IAAI;YAAEF,IAAI;YAAEG;UAAK,CAAC,CAAC;QAAA,EACzC;QAED,OAAOE,OAAO,CAACC,GAAG,CAACV,QAAQ,CAAC;MAC9B,CAAC,MAAM,IAAI,KAAK,IAAIN,MAAM,IAAI,OAAOA,MAAM,CAACc,GAAG,KAAK,QAAQ,EAAE;QAC5D,MAAMG,QAAQ,GAAG,MAAMb,QAAQ,CAACc,YAAY,CAAClB,MAAM,CAACc,GAAG,CAAC;QACxD,MAAMK,QAAQ,GAAG,MAAMvB,aAAa,CAAC;UAAEkB,GAAG,EAAEd,MAAM,CAACc,GAAG;UAAEF,IAAI,EAAEf,iBAAiB,CAACuB,UAAU,CAACH,QAAQ;QAAE,CAAC,CAAC;QACvG,OAAO,CAACE,QAAQ,CAAC;MACnB,CAAC,MAAM;QACL,OAAO,EAAE;MACX;IACF;EACF,CAAC;EACDE,cAAc,EAAE;IACdtB,UAAUA,CAACC,MAA+C,EAAE;MAC1D;MACA,OAAOA,MAAM,CAACC,QAAQ,IAAID,MAAM,CAACa,IAAI,KAAK,QAAQ;IACpD,CAAC;IACD,MAAMV,qBAAqBA,CAACH,MAA+C,EAAiC;MAC1G,IAAIA,MAAM,CAACK,MAAM,EAAE;QACjB,MAAMA,MAAM,GAAGL,MAAM,CAACK,MAAM,IAAI,EAAE;QAClC,MAAMC,QAAQ,GAAGD,MAAM,CAACE,GAAG,CAACe,KAAA;UAAA,IAAC;YAAEZ,IAAI;YAAEE,IAAI;YAAEW,QAAQ;YAAET;UAAI,CAAC,GAAAQ,KAAA;UAAA,OACxD1B,aAAa,CAAC;YAAEkB,GAAG;YAAEF,IAAI;YAAEF,IAAI;YAAEG,IAAI,EAAEU;UAAS,CAAC,CAAC;QAAA,EACnD;QAED,OAAOR,OAAO,CAACC,GAAG,CAACV,QAAQ,CAAC;MAC9B,CAAC,MAAM,IAAI,KAAK,IAAIN,MAAM,IAAI,OAAOA,MAAM,CAACc,GAAG,KAAK,QAAQ,EAAE;QAC5D;QACA,MAAM;UAAES,QAAQ;UAAET,GAAG;UAAEF,IAAI;UAAEF;QAAK,CAAC,GAAGV,MAAM;QAC5C,MAAMmB,QAAQ,GAAG,MAAMvB,aAAa,CAAC;UAAEkB,GAAG;UAAEF,IAAI;UAAEF,IAAI;UAAEG,IAAI,EAAEU;QAAS,CAAC,CAAC;QAEzE,OAAO,CAACJ,QAAQ,CAAC;MACnB,CAAC,MAAM;QACL,OAAO,EAAE;MACX;IACF;EACF,CAAC;EACDC,UAAUA,CAACI,IAAqB,EAAE;IAChC,IAAI,MAAM,IAAIA,IAAI,EAAE;MAClB,OAAOA,IAAI,CAACZ,IAAI;IAClB,CAAC,MAAM;MACL,OAAO,CAAC;IACV;EACF;AACF,CAAC;AAED,eAAef,iBAAiB"}
@@ -1,3 +1,3 @@
1
- const VERSION = '3.0.4-rc.0';
1
+ const VERSION = '3.0.4';
2
2
  export default VERSION;
3
3
  //# sourceMappingURL=version.js.map
@@ -1 +1 @@
1
- {"version":3,"names":["VERSION"],"sources":["version.ts"],"sourcesContent":["const VERSION = '3.0.4-rc.0';\nexport default VERSION;\n"],"mappings":"AAAA,MAAMA,OAAO,GAAG,YAAY;AAC5B,eAAeA,OAAO"}
1
+ {"version":3,"names":["VERSION"],"sources":["version.ts"],"sourcesContent":["const VERSION = '3.0.4';\nexport default VERSION;\n"],"mappings":"AAAA,MAAMA,OAAO,GAAG,OAAO;AACvB,eAAeA,OAAO"}
@@ -10,7 +10,7 @@ import type { ClipboardServiceInterface, FileServiceInterface, MediaServiceInter
10
10
  import type { ErrorBoundaryProps, LocalCacheStorage } from '../types';
11
11
  type UnimplementedFeatures = 'enableVoiceMessage' | 'threadReplySelectType' | 'replyType';
12
12
  export declare const SendbirdUIKit: Readonly<{
13
- VERSION: "3.0.4-rc.0";
13
+ VERSION: "3.0.4";
14
14
  PLATFORM: string;
15
15
  DEFAULT: {
16
16
  AUTO_PUSH_TOKEN_REGISTRATION: boolean;
@@ -1,9 +1,16 @@
1
+ import type * as ExpoDocumentPicker from 'expo-document-picker';
1
2
  import type * as ExpoFs from 'expo-file-system';
2
3
  import type * as ExpoImagePicker from 'expo-image-picker';
3
4
  import type { FilePickerResponse } from '../platform/types';
4
5
  declare const expoBackwardUtils: {
5
- toCanceled(result: ExpoImagePicker.ImagePickerResult): boolean;
6
+ imagePicker: {
7
+ isCanceled(result: ExpoImagePicker.ImagePickerResult): boolean;
8
+ toFilePickerResponses(result: ExpoImagePicker.ImagePickerResult, fsModule: typeof ExpoFs): Promise<FilePickerResponse[]>;
9
+ };
10
+ documentPicker: {
11
+ isCanceled(result: ExpoDocumentPicker.DocumentPickerResult): boolean;
12
+ toFilePickerResponses(result: ExpoDocumentPicker.DocumentPickerResult): Promise<FilePickerResponse[]>;
13
+ };
6
14
  toFileSize(info: ExpoFs.FileInfo): number;
7
- toFilePickerResponses(result: ExpoImagePicker.ImagePickerResult, fsModule: typeof ExpoFs): Promise<FilePickerResponse[]>;
8
15
  };
9
16
  export default expoBackwardUtils;
@@ -1,2 +1,2 @@
1
- declare const VERSION = "3.0.4-rc.0";
1
+ declare const VERSION = "3.0.4";
2
2
  export default VERSION;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@sendbird/uikit-react-native",
3
- "version": "3.0.4-rc.0",
3
+ "version": "3.0.4",
4
4
  "description": "Sendbird UIKit for React Native: A feature-rich and customizable chat UI kit with messaging, channel management, and user authentication.",
5
5
  "keywords": [
6
6
  "sendbird",
@@ -58,10 +58,10 @@
58
58
  "access": "public"
59
59
  },
60
60
  "dependencies": {
61
- "@sendbird/uikit-chat-hooks": "3.0.4-rc.0",
62
- "@sendbird/uikit-react-native-foundation": "3.0.4-rc.0",
61
+ "@sendbird/uikit-chat-hooks": "3.0.4",
62
+ "@sendbird/uikit-react-native-foundation": "3.0.4",
63
63
  "@sendbird/uikit-tools": "^0.0.1-alpha.38",
64
- "@sendbird/uikit-utils": "3.0.4-rc.0"
64
+ "@sendbird/uikit-utils": "3.0.4"
65
65
  },
66
66
  "devDependencies": {
67
67
  "@bam.tech/react-native-image-resizer": "^3.0.4",
@@ -77,7 +77,7 @@
77
77
  "date-fns": "^2.28.0",
78
78
  "expo-av": "^13.2.1",
79
79
  "expo-clipboard": "^4.1.2",
80
- "expo-document-picker": "^11.2.2",
80
+ "expo-document-picker": "^11.5.3",
81
81
  "expo-file-system": "^15.2.2",
82
82
  "expo-image-manipulator": "^11.1.1",
83
83
  "expo-image-picker": "^14.1.1",
@@ -203,5 +203,6 @@
203
203
  "entryPoint": "./src/index.ts",
204
204
  "readmeFile": "./README.md",
205
205
  "displayName": "@sendbird/uikit-react-native"
206
- }
206
+ },
207
+ "gitHead": "bf8ff3723f82f75ccf994938d6e5468e6fb669be"
207
208
  }
@@ -9,7 +9,6 @@ import SBUError from '../libs/SBUError';
9
9
  import expoBackwardUtils from '../utils/expoBackwardUtils';
10
10
  import type { ExpoMediaLibraryPermissionResponse, ExpoPermissionResponse } from '../utils/expoPermissionGranted';
11
11
  import expoPermissionGranted from '../utils/expoPermissionGranted';
12
- import normalizeFile from '../utils/normalizeFile';
13
12
  import type {
14
13
  FilePickerResponse,
15
14
  FileServiceInterface,
@@ -77,10 +76,10 @@ const createExpoFileService = ({
77
76
  })(),
78
77
  });
79
78
 
80
- if (expoBackwardUtils.toCanceled(response)) return null;
79
+ if (expoBackwardUtils.imagePicker.isCanceled(response)) return null;
81
80
 
82
- const filePickerRes = await expoBackwardUtils.toFilePickerResponses(response, fsModule);
83
- return filePickerRes[0];
81
+ const [file] = await expoBackwardUtils.imagePicker.toFilePickerResponses(response, fsModule);
82
+ return file;
84
83
  }
85
84
  async openMediaLibrary(options: OpenMediaLibraryOptions) {
86
85
  const hasPermission = await this.hasMediaLibraryPermission('read');
@@ -108,16 +107,17 @@ const createExpoFileService = ({
108
107
  }
109
108
  })(),
110
109
  });
111
- if (expoBackwardUtils.toCanceled(response)) return null;
112
- return expoBackwardUtils.toFilePickerResponses(response, fsModule);
110
+ if (expoBackwardUtils.imagePicker.isCanceled(response)) return null;
111
+ return expoBackwardUtils.imagePicker.toFilePickerResponses(response, fsModule);
113
112
  }
114
113
 
115
114
  async openDocument(options?: OpenDocumentOptions): Promise<FilePickerResponse> {
116
115
  try {
117
116
  const response = await documentPickerModule.getDocumentAsync({ type: '*/*' });
118
- if (response.type === 'cancel') return null;
119
- const { mimeType, uri, size, name } = response;
120
- return normalizeFile({ uri, size, name, type: mimeType });
117
+ if (expoBackwardUtils.documentPicker.isCanceled(response)) return null;
118
+
119
+ const [file] = await expoBackwardUtils.documentPicker.toFilePickerResponses(response);
120
+ return file;
121
121
  } catch (e) {
122
122
  options?.onOpenFailure?.(SBUError.UNKNOWN, e);
123
123
  return null;
@@ -7,6 +7,7 @@ import type * as Permissions from 'react-native-permissions';
7
7
  import type { Permission } from 'react-native-permissions';
8
8
 
9
9
  import {
10
+ Logger,
10
11
  getFileExtension,
11
12
  getFileExtensionFromMime,
12
13
  getFileExtensionFromUri,
@@ -206,7 +207,10 @@ const createNativeFileService = ({
206
207
  if (Platform.OS === 'android') {
207
208
  const externalDirMap = { 'file': 'downloads', 'audio': 'audio', 'image': 'images', 'video': 'video' } as const;
208
209
  const externalDir = externalDirMap[file.type];
209
- await fsModule.FileSystem.cpExternal(downloadedPath, file.name, externalDir);
210
+ await fsModule.FileSystem.cpExternal(downloadedPath, file.name, externalDir).catch(() => {
211
+ Logger.error('Failed to save file to external storage. Retry saving to downloads directory instead.');
212
+ return fsModule.FileSystem.cpExternal(downloadedPath, file.name, 'downloads');
213
+ });
210
214
  }
211
215
 
212
216
  return downloadedPath;
@@ -1,3 +1,4 @@
1
+ import type * as ExpoDocumentPicker from 'expo-document-picker';
1
2
  import type * as ExpoFs from 'expo-file-system';
2
3
  import type * as ExpoImagePicker from 'expo-image-picker';
3
4
 
@@ -5,9 +6,54 @@ import type { FilePickerResponse } from '../platform/types';
5
6
  import normalizeFile from './normalizeFile';
6
7
 
7
8
  const expoBackwardUtils = {
8
- toCanceled(result: ExpoImagePicker.ImagePickerResult) {
9
- // @ts-expect-error backward compatibility
10
- return result.canceled ?? result.cancelled;
9
+ imagePicker: {
10
+ isCanceled(result: ExpoImagePicker.ImagePickerResult) {
11
+ // @ts-expect-error backward compatibility
12
+ return result.canceled ?? result.cancelled;
13
+ },
14
+ async toFilePickerResponses(
15
+ result: ExpoImagePicker.ImagePickerResult,
16
+ fsModule: typeof ExpoFs,
17
+ ): Promise<FilePickerResponse[]> {
18
+ if (result.assets) {
19
+ const assets = result.assets || [];
20
+ const promises = assets.map(({ fileName: name, fileSize: size, type, uri }) =>
21
+ normalizeFile({ uri, size, name, type }),
22
+ );
23
+
24
+ return Promise.all(promises);
25
+ } else if ('uri' in result && typeof result.uri === 'string') {
26
+ const fileInfo = await fsModule.getInfoAsync(result.uri);
27
+ const response = await normalizeFile({ uri: result.uri, size: expoBackwardUtils.toFileSize(fileInfo) });
28
+ return [response];
29
+ } else {
30
+ return [];
31
+ }
32
+ },
33
+ },
34
+ documentPicker: {
35
+ isCanceled(result: ExpoDocumentPicker.DocumentPickerResult) {
36
+ // @ts-expect-error backward compatibility
37
+ return result.canceled ?? result.type === 'cancel';
38
+ },
39
+ async toFilePickerResponses(result: ExpoDocumentPicker.DocumentPickerResult): Promise<FilePickerResponse[]> {
40
+ if (result.assets) {
41
+ const assets = result.assets || [];
42
+ const promises = assets.map(({ name, size, mimeType, uri }) =>
43
+ normalizeFile({ uri, size, name, type: mimeType }),
44
+ );
45
+
46
+ return Promise.all(promises);
47
+ } else if ('uri' in result && typeof result.uri === 'string') {
48
+ // @ts-expect-error backward compatibility
49
+ const { mimeType, uri, size, name } = result;
50
+ const response = await normalizeFile({ uri, size, name, type: mimeType });
51
+
52
+ return [response];
53
+ } else {
54
+ return [];
55
+ }
56
+ },
11
57
  },
12
58
  toFileSize(info: ExpoFs.FileInfo) {
13
59
  if ('size' in info) {
@@ -16,25 +62,6 @@ const expoBackwardUtils = {
16
62
  return 0;
17
63
  }
18
64
  },
19
- async toFilePickerResponses(
20
- result: ExpoImagePicker.ImagePickerResult,
21
- fsModule: typeof ExpoFs,
22
- ): Promise<FilePickerResponse[]> {
23
- if (result.assets) {
24
- const assets = result.assets || [];
25
- const promises = assets.map(({ fileName: name, fileSize: size, type, uri }) =>
26
- normalizeFile({ uri, size, name, type }),
27
- );
28
-
29
- return Promise.all(promises);
30
- } else if ('uri' in result && typeof result.uri === 'string') {
31
- const fileInfo = await fsModule.getInfoAsync(result.uri);
32
- const response = await normalizeFile({ uri: result.uri, size: this.toFileSize(fileInfo) });
33
- return [response];
34
- } else {
35
- return [];
36
- }
37
- },
38
65
  };
39
66
 
40
67
  export default expoBackwardUtils;
package/src/version.ts CHANGED
@@ -1,2 +1,2 @@
1
- const VERSION = '3.0.4-rc.0';
1
+ const VERSION = '3.0.4';
2
2
  export default VERSION;