@sendbird/uikit-react-native 3.0.4-rc.1 → 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.
- package/lib/commonjs/platform/createFileService.native.js +4 -1
- package/lib/commonjs/platform/createFileService.native.js.map +1 -1
- package/lib/commonjs/version.js +1 -1
- package/lib/commonjs/version.js.map +1 -1
- package/lib/module/platform/createFileService.native.js +5 -2
- package/lib/module/platform/createFileService.native.js.map +1 -1
- package/lib/module/version.js +1 -1
- package/lib/module/version.js.map +1 -1
- package/lib/typescript/src/containers/SendbirdUIKitContainer.d.ts +1 -1
- package/lib/typescript/src/version.d.ts +1 -1
- package/package.json +6 -5
- package/src/platform/createFileService.native.ts +5 -1
- package/src/version.ts +1 -1
|
@@ -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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"}
|
package/lib/commonjs/version.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["VERSION","_default","exports","default"],"sources":["version.ts"],"sourcesContent":["const VERSION = '3.0.4
|
|
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,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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"}
|
package/lib/module/version.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["VERSION"],"sources":["version.ts"],"sourcesContent":["const VERSION = '3.0.4
|
|
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
|
|
13
|
+
VERSION: "3.0.4";
|
|
14
14
|
PLATFORM: string;
|
|
15
15
|
DEFAULT: {
|
|
16
16
|
AUTO_PUSH_TOKEN_REGISTRATION: boolean;
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
declare const VERSION = "3.0.4
|
|
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
|
|
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
|
|
62
|
-
"@sendbird/uikit-react-native-foundation": "3.0.4
|
|
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
|
|
64
|
+
"@sendbird/uikit-utils": "3.0.4"
|
|
65
65
|
},
|
|
66
66
|
"devDependencies": {
|
|
67
67
|
"@bam.tech/react-native-image-resizer": "^3.0.4",
|
|
@@ -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
|
}
|
|
@@ -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;
|
package/src/version.ts
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
const VERSION = '3.0.4
|
|
1
|
+
const VERSION = '3.0.4';
|
|
2
2
|
export default VERSION;
|