@sendbird/uikit-react-native 3.8.5 → 3.9.0

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.
Files changed (27) hide show
  1. package/README.md +1 -1
  2. package/lib/commonjs/components/ChatFlatList/FlatListInternal.js +6 -10
  3. package/lib/commonjs/components/ChatFlatList/FlatListInternal.js.map +1 -1
  4. package/lib/commonjs/platform/createFileService.native.js +14 -25
  5. package/lib/commonjs/platform/createFileService.native.js.map +1 -1
  6. package/lib/commonjs/platform/openDocument.native.js +66 -0
  7. package/lib/commonjs/platform/openDocument.native.js.map +1 -0
  8. package/lib/commonjs/version.js +1 -1
  9. package/lib/commonjs/version.js.map +1 -1
  10. package/lib/module/components/ChatFlatList/FlatListInternal.js +6 -10
  11. package/lib/module/components/ChatFlatList/FlatListInternal.js.map +1 -1
  12. package/lib/module/platform/createFileService.native.js +14 -25
  13. package/lib/module/platform/createFileService.native.js.map +1 -1
  14. package/lib/module/platform/openDocument.native.js +59 -0
  15. package/lib/module/platform/openDocument.native.js.map +1 -0
  16. package/lib/module/version.js +1 -1
  17. package/lib/module/version.js.map +1 -1
  18. package/lib/typescript/src/components/ChatFlatList/FlatListInternal.d.ts +1 -17
  19. package/lib/typescript/src/containers/SendbirdUIKitContainer.d.ts +1 -1
  20. package/lib/typescript/src/platform/createFileService.native.d.ts +2 -2
  21. package/lib/typescript/src/platform/openDocument.native.d.ts +5 -0
  22. package/lib/typescript/src/version.d.ts +1 -1
  23. package/package.json +10 -5
  24. package/src/components/ChatFlatList/FlatListInternal.tsx +7 -24
  25. package/src/platform/createFileService.native.ts +22 -16
  26. package/src/platform/openDocument.native.ts +59 -0
  27. package/src/version.ts +1 -1
package/README.md CHANGED
@@ -165,7 +165,7 @@ import Clipboard from '@react-native-clipboard/clipboard';
165
165
  import { CameraRoll } from '@react-native-camera-roll/camera-roll';
166
166
  import RNFBMessaging from '@react-native-firebase/messaging';
167
167
  import Video from 'react-native-video';
168
- import * as DocumentPicker from 'react-native-document-picker';
168
+ import * as DocumentPicker from '@react-native-documents/picker';
169
169
  import * as FileAccess from 'react-native-file-access';
170
170
  import * as ImagePicker from 'react-native-image-picker';
171
171
  import * as Permissions from 'react-native-permissions';
@@ -15,17 +15,13 @@ function shouldUseScrollViewEnhancer() {
15
15
  }
16
16
  return false;
17
17
  }
18
- function getFlatList() {
19
- if (shouldUseScrollViewEnhancer()) {
20
- try {
21
- return require('@sendbird/react-native-scrollview-enhancer').FlatList;
22
- } catch {
23
- return require('react-native').FlatList;
24
- }
25
- } else {
26
- return require('react-native').FlatList;
18
+ let FlatListInternal = require('react-native').FlatList;
19
+ if (shouldUseScrollViewEnhancer()) {
20
+ try {
21
+ FlatListInternal = require('@sendbird/react-native-scrollview-enhancer').FlatList;
22
+ } catch {
23
+ FlatListInternal = require('react-native').FlatList;
27
24
  }
28
25
  }
29
- const FlatListInternal = getFlatList();
30
26
  var _default = exports.default = FlatListInternal;
31
27
  //# sourceMappingURL=FlatListInternal.js.map
@@ -1 +1 @@
1
- {"version":3,"names":["_reactNative","require","shouldUseScrollViewEnhancer","_Platform$constants$r","Platform","constants","reactNativeVersion","major","_Platform$constants$r2","minor","getFlatList","FlatList","FlatListInternal","_default","exports","default"],"sources":["FlatListInternal.tsx"],"sourcesContent":["import type { ForwardedRef, ReactElement } from 'react';\nimport type { FlatListProps, FlatList as RNFlatList, ScrollViewProps } from 'react-native';\nimport { Platform } from 'react-native';\n\nimport type { SendbirdMessage } from '@sendbird/uikit-utils';\n\ntype FlatListBidirectional<T = SendbirdMessage> = (props: FlatListProps<T> & BidirectionalProps<T>) => ReactElement;\ntype BidirectionalProps<T> = {\n onStartReached?: ((info: { distanceFromStart: number }) => void) | null | undefined;\n onStartReachedThreshold?: number | null | undefined;\n onEndReached?: ((info: { distanceFromEnd: number }) => void) | null | undefined;\n onEndReachedThreshold?: number | null | undefined;\n maintainVisibleContentPosition?: ScrollViewProps['maintainVisibleContentPosition'];\n ref: ForwardedRef<RNFlatList<T>>;\n};\n\nfunction shouldUseScrollViewEnhancer() {\n if (Platform.constants.reactNativeVersion?.major < 1) {\n if (Platform.constants.reactNativeVersion?.minor < 72) {\n return true;\n }\n }\n return false;\n}\nfunction getFlatList(): FlatListBidirectional {\n if (shouldUseScrollViewEnhancer()) {\n try {\n return require('@sendbird/react-native-scrollview-enhancer').FlatList;\n } catch {\n return require('react-native').FlatList;\n }\n } else {\n return require('react-native').FlatList;\n }\n}\n\nconst FlatListInternal = getFlatList();\nexport default FlatListInternal;\n"],"mappings":";;;;;;AAEA,IAAAA,YAAA,GAAAC,OAAA;AAcA,SAASC,2BAA2BA,CAAA,EAAG;EAAA,IAAAC,qBAAA;EACrC,IAAI,EAAAA,qBAAA,GAAAC,qBAAQ,CAACC,SAAS,CAACC,kBAAkB,cAAAH,qBAAA,uBAArCA,qBAAA,CAAuCI,KAAK,IAAG,CAAC,EAAE;IAAA,IAAAC,sBAAA;IACpD,IAAI,EAAAA,sBAAA,GAAAJ,qBAAQ,CAACC,SAAS,CAACC,kBAAkB,cAAAE,sBAAA,uBAArCA,sBAAA,CAAuCC,KAAK,IAAG,EAAE,EAAE;MACrD,OAAO,IAAI;IACb;EACF;EACA,OAAO,KAAK;AACd;AACA,SAASC,WAAWA,CAAA,EAA0B;EAC5C,IAAIR,2BAA2B,CAAC,CAAC,EAAE;IACjC,IAAI;MACF,OAAOD,OAAO,CAAC,4CAA4C,CAAC,CAACU,QAAQ;IACvE,CAAC,CAAC,MAAM;MACN,OAAOV,OAAO,CAAC,cAAc,CAAC,CAACU,QAAQ;IACzC;EACF,CAAC,MAAM;IACL,OAAOV,OAAO,CAAC,cAAc,CAAC,CAACU,QAAQ;EACzC;AACF;AAEA,MAAMC,gBAAgB,GAAGF,WAAW,CAAC,CAAC;AAAC,IAAAG,QAAA,GAAAC,OAAA,CAAAC,OAAA,GACxBH,gBAAgB","ignoreList":[]}
1
+ {"version":3,"names":["_reactNative","require","shouldUseScrollViewEnhancer","_Platform$constants$r","Platform","constants","reactNativeVersion","major","_Platform$constants$r2","minor","FlatListInternal","FlatList","_default","exports","default"],"sources":["FlatListInternal.tsx"],"sourcesContent":["import { Platform } from 'react-native';\n\nfunction shouldUseScrollViewEnhancer() {\n if (Platform.constants.reactNativeVersion?.major < 1) {\n if (Platform.constants.reactNativeVersion?.minor < 72) {\n return true;\n }\n }\n return false;\n}\n\nlet FlatListInternal = require('react-native').FlatList;\nif (shouldUseScrollViewEnhancer()) {\n try {\n FlatListInternal = require('@sendbird/react-native-scrollview-enhancer').FlatList;\n } catch {\n FlatListInternal = require('react-native').FlatList;\n }\n}\n\nexport default FlatListInternal;\n"],"mappings":";;;;;;AAAA,IAAAA,YAAA,GAAAC,OAAA;AAEA,SAASC,2BAA2BA,CAAA,EAAG;EAAA,IAAAC,qBAAA;EACrC,IAAI,EAAAA,qBAAA,GAAAC,qBAAQ,CAACC,SAAS,CAACC,kBAAkB,cAAAH,qBAAA,uBAArCA,qBAAA,CAAuCI,KAAK,IAAG,CAAC,EAAE;IAAA,IAAAC,sBAAA;IACpD,IAAI,EAAAA,sBAAA,GAAAJ,qBAAQ,CAACC,SAAS,CAACC,kBAAkB,cAAAE,sBAAA,uBAArCA,sBAAA,CAAuCC,KAAK,IAAG,EAAE,EAAE;MACrD,OAAO,IAAI;IACb;EACF;EACA,OAAO,KAAK;AACd;AAEA,IAAIC,gBAAgB,GAAGT,OAAO,CAAC,cAAc,CAAC,CAACU,QAAQ;AACvD,IAAIT,2BAA2B,CAAC,CAAC,EAAE;EACjC,IAAI;IACFQ,gBAAgB,GAAGT,OAAO,CAAC,4CAA4C,CAAC,CAACU,QAAQ;EACnF,CAAC,CAAC,MAAM;IACND,gBAAgB,GAAGT,OAAO,CAAC,cAAc,CAAC,CAACU,QAAQ;EACrD;AACF;AAAC,IAAAC,QAAA,GAAAC,OAAA,CAAAC,OAAA,GAEcJ,gBAAgB","ignoreList":[]}
@@ -9,6 +9,7 @@ var _uikitUtils = require("@sendbird/uikit-utils");
9
9
  var _SBUError = _interopRequireDefault(require("../libs/SBUError"));
10
10
  var _nativePermissionGranted = _interopRequireDefault(require("../utils/nativePermissionGranted"));
11
11
  var _normalizeFile = _interopRequireDefault(require("../utils/normalizeFile"));
12
+ var _openDocument = require("./openDocument.native");
12
13
  function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; }
13
14
  function _defineProperty(e, r, t) { return (r = _toPropertyKey(r)) in e ? Object.defineProperty(e, r, { value: t, enumerable: !0, configurable: !0, writable: !0 }) : e[r] = t, e; }
14
15
  function _toPropertyKey(t) { var i = _toPrimitive(t, "string"); return "symbol" == typeof i ? i : i + ""; }
@@ -30,11 +31,16 @@ const createNativeFileService = ({
30
31
  mediaLibraryModule,
31
32
  fsModule
32
33
  }) => {
33
- const cameraPermissions = _reactNative.Platform.select({
34
- ios: [permissionModule.PERMISSIONS.IOS.CAMERA, permissionModule.PERMISSIONS.IOS.MICROPHONE],
34
+ const requiredPermissions = _reactNative.Platform.select({
35
+ ios: [permissionModule.PERMISSIONS.IOS.CAMERA],
35
36
  android: [permissionModule.PERMISSIONS.ANDROID.CAMERA],
36
37
  default: []
37
38
  });
39
+ const optionalPermissions = _reactNative.Platform.select({
40
+ ios: [permissionModule.PERMISSIONS.IOS.MICROPHONE],
41
+ android: [],
42
+ default: []
43
+ });
38
44
  const mediaLibraryPermissions = _reactNative.Platform.select({
39
45
  ios: [permissionModule.PERMISSIONS.IOS.PHOTO_LIBRARY, permissionModule.PERMISSIONS.IOS.PHOTO_LIBRARY_ADD_ONLY],
40
46
  android: getAndroidStoragePermissionsByAPILevel(permissionModule),
@@ -76,12 +82,14 @@ const createNativeFileService = ({
76
82
  });
77
83
  }
78
84
  async hasCameraPermission() {
79
- const status = await permissionModule.checkMultiple(cameraPermissions);
85
+ const status = await permissionModule.checkMultiple(requiredPermissions);
80
86
  return (0, _nativePermissionGranted.default)(status);
81
87
  }
82
88
  async requestCameraPermission() {
83
- const status = await permissionModule.requestMultiple(cameraPermissions);
84
- return (0, _nativePermissionGranted.default)(status);
89
+ const requiredPermissionsStatus = await permissionModule.requestMultiple(requiredPermissions);
90
+ if (!(0, _nativePermissionGranted.default)(requiredPermissionsStatus)) return false;
91
+ await permissionModule.requestMultiple(optionalPermissions);
92
+ return true;
85
93
  }
86
94
  async hasMediaLibraryPermission() {
87
95
  const status = await permissionModule.checkMultiple(mediaLibraryPermissions);
@@ -187,26 +195,7 @@ const createNativeFileService = ({
187
195
  })));
188
196
  }
189
197
  async openDocument(options) {
190
- try {
191
- const {
192
- uri,
193
- size,
194
- name,
195
- type
196
- } = await documentPickerModule.pickSingle();
197
- return (0, _normalizeFile.default)({
198
- uri,
199
- size,
200
- name,
201
- type
202
- });
203
- } catch (e) {
204
- if (!documentPickerModule.isCancel(e) && documentPickerModule.isInProgress(e)) {
205
- var _options$onOpenFailur5;
206
- options === null || options === void 0 || (_options$onOpenFailur5 = options.onOpenFailure) === null || _options$onOpenFailur5 === void 0 || _options$onOpenFailur5.call(options, _SBUError.default.UNKNOWN, e);
207
- }
208
- return null;
209
- }
198
+ return await (0, _openDocument.openDocument)(documentPickerModule, options);
210
199
  }
211
200
  async save(options) {
212
201
  const hasPermission = await this.hasMediaLibraryPermission();
@@ -1 +1 @@
1
- {"version":3,"names":["_reactNative","require","_uikitUtils","_SBUError","_interopRequireDefault","_nativePermissionGranted","_normalizeFile","e","__esModule","default","_defineProperty","r","t","_toPropertyKey","Object","defineProperty","value","enumerable","configurable","writable","i","_toPrimitive","Symbol","toPrimitive","call","TypeError","String","Number","getAndroidStoragePermissionsByAPILevel","permissionModule","Platform","OS","Version","PERMISSIONS","ANDROID","READ_EXTERNAL_STORAGE","WRITE_EXTERNAL_STORAGE","createNativeFileService","imagePickerModule","documentPickerModule","mediaLibraryModule","fsModule","cameraPermissions","select","ios","IOS","CAMERA","MICROPHONE","android","mediaLibraryPermissions","PHOTO_LIBRARY","PHOTO_LIBRARY_ADD_ONLY","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","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","openDocument","pickSingle","isCancel","isInProgress","_options$onOpenFailur5","UNKNOWN","save","downloadFile","mediaTypeMap","externalDirMap","externalDir","cpExternal","catch","Logger","error","createRecordFilePath","customExtension","Date","now","recordFilePath","startsWith","_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 }\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.PHOTO_LIBRARY, permissionModule.PERMISSIONS.IOS.PHOTO_LIBRARY_ADD_ONLY],\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 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 createRecordFilePath(customExtension = 'm4a'): { recordFilePath: string; uri: string } {\n const filename = `record-${Date.now()}.${customExtension}`;\n const path = `${fsModule.Dirs.CacheDir}/${filename}`;\n return Platform.select({\n ios: {\n uri: path,\n recordFilePath: filename,\n },\n android: {\n uri: path.startsWith('file://') ? path : 'file://' + path,\n recordFilePath: path,\n },\n default: {\n uri: path,\n recordFilePath: path,\n },\n });\n }\n }\n\n return new NativeFileService();\n};\n\nexport default createNativeFileService;\n"],"mappings":"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","ignoreList":[]}
1
+ {"version":3,"names":["_reactNative","require","_uikitUtils","_SBUError","_interopRequireDefault","_nativePermissionGranted","_normalizeFile","_openDocument","e","__esModule","default","_defineProperty","r","t","_toPropertyKey","Object","defineProperty","value","enumerable","configurable","writable","i","_toPrimitive","Symbol","toPrimitive","call","TypeError","String","Number","getAndroidStoragePermissionsByAPILevel","permissionModule","Platform","OS","Version","PERMISSIONS","ANDROID","READ_EXTERNAL_STORAGE","WRITE_EXTERNAL_STORAGE","createNativeFileService","imagePickerModule","documentPickerModule","mediaLibraryModule","fsModule","requiredPermissions","select","ios","IOS","CAMERA","android","optionalPermissions","MICROPHONE","mediaLibraryPermissions","PHOTO_LIBRARY","PHOTO_LIBRARY_ADD_ONLY","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","requiredPermissionsStatus","requestMultiple","hasMediaLibraryPermission","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","openDocument","save","downloadFile","mediaTypeMap","externalDirMap","externalDir","cpExternal","catch","Logger","error","createRecordFilePath","customExtension","Date","now","recordFilePath","startsWith","_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 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 { DocumentPicker, openDocument } from './openDocument.native';\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 }\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: DocumentPicker;\n permissionModule: typeof Permissions;\n mediaLibraryModule: typeof CameraRoll;\n fsModule: typeof FileAccess;\n}): FileServiceInterface => {\n const requiredPermissions: Permission[] = Platform.select({\n ios: [permissionModule.PERMISSIONS.IOS.CAMERA],\n android: [permissionModule.PERMISSIONS.ANDROID.CAMERA],\n default: [],\n });\n const optionalPermissions: Permission[] = Platform.select({\n ios: [permissionModule.PERMISSIONS.IOS.MICROPHONE],\n android: [],\n default: [],\n });\n const mediaLibraryPermissions: Permission[] = Platform.select({\n ios: [permissionModule.PERMISSIONS.IOS.PHOTO_LIBRARY, permissionModule.PERMISSIONS.IOS.PHOTO_LIBRARY_ADD_ONLY],\n android: getAndroidStoragePermissionsByAPILevel(permissionModule),\n default: [],\n });\n\n class NativeFileService implements FileServiceInterface {\n async hasCameraPermission(): Promise<boolean> {\n const status = await permissionModule.checkMultiple(requiredPermissions);\n return nativePermissionGranted(status);\n }\n\n async requestCameraPermission(): Promise<boolean> {\n const requiredPermissionsStatus = await permissionModule.requestMultiple(requiredPermissions);\n if (!nativePermissionGranted(requiredPermissionsStatus)) return false;\n\n await permissionModule.requestMultiple(optionalPermissions);\n return true;\n }\n\n async hasMediaLibraryPermission(): Promise<boolean> {\n const status = await permissionModule.checkMultiple(mediaLibraryPermissions);\n return nativePermissionGranted(status);\n }\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\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\n async openDocument(options?: OpenDocumentOptions): Promise<FilePickerResponse> {\n return await openDocument(documentPickerModule, options);\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 createRecordFilePath(customExtension = 'm4a'): { recordFilePath: string; uri: string } {\n const filename = `record-${Date.now()}.${customExtension}`;\n const path = `${fsModule.Dirs.CacheDir}/${filename}`;\n return Platform.select({\n ios: {\n uri: path,\n recordFilePath: filename,\n },\n android: {\n uri: path.startsWith('file://') ? path : 'file://' + path,\n recordFilePath: path,\n },\n default: {\n uri: path,\n recordFilePath: path,\n },\n });\n }\n }\n\n return new NativeFileService();\n};\n\nexport default createNativeFileService;\n"],"mappings":"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","ignoreList":[]}
@@ -0,0 +1,66 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.openDocument = openDocument;
7
+ var _uikitUtils = require("@sendbird/uikit-utils");
8
+ var _SBUError = _interopRequireDefault(require("../libs/SBUError"));
9
+ var _normalizeFile = _interopRequireDefault(require("../utils/normalizeFile"));
10
+ function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; }
11
+ async function openDocumentByOldDocumentPicker(documentPickerModule, options) {
12
+ _uikitUtils.Logger.warn('please update to @react-native-documents/picker');
13
+ try {
14
+ const {
15
+ uri,
16
+ size,
17
+ name,
18
+ type
19
+ } = await documentPickerModule.pickSingle();
20
+ return (0, _normalizeFile.default)({
21
+ uri,
22
+ size,
23
+ name,
24
+ type
25
+ });
26
+ } catch (e) {
27
+ if (!documentPickerModule.isCancel(e) && documentPickerModule.isInProgress(e)) {
28
+ var _options$onOpenFailur;
29
+ options === null || options === void 0 || (_options$onOpenFailur = options.onOpenFailure) === null || _options$onOpenFailur === void 0 || _options$onOpenFailur.call(options, _SBUError.default.UNKNOWN, e);
30
+ }
31
+ return null;
32
+ }
33
+ }
34
+ async function openDocumentByNewDocumentsPicker(documentPickerModule, options) {
35
+ try {
36
+ const results = await documentPickerModule.pick();
37
+ const {
38
+ uri,
39
+ size,
40
+ name,
41
+ type
42
+ } = results[0];
43
+ return (0, _normalizeFile.default)({
44
+ uri,
45
+ size,
46
+ name,
47
+ type
48
+ });
49
+ } catch (e) {
50
+ if (!documentPickerModule.isErrorWithCode(documentPickerModule.errorCodes.OPERATION_CANCELED) && documentPickerModule.isErrorWithCode(documentPickerModule.errorCodes.IN_PROGRESS)) {
51
+ var _options$onOpenFailur2;
52
+ options === null || options === void 0 || (_options$onOpenFailur2 = options.onOpenFailure) === null || _options$onOpenFailur2 === void 0 || _options$onOpenFailur2.call(options, _SBUError.default.UNKNOWN, e);
53
+ }
54
+ return null;
55
+ }
56
+ }
57
+ function isOldModule(documentPicker) {
58
+ return 'pickSingle' in documentPicker && typeof documentPicker.pickSingle === 'function';
59
+ }
60
+ async function openDocument(documentPickerModule, options) {
61
+ if (isOldModule(documentPickerModule)) {
62
+ return await openDocumentByOldDocumentPicker(documentPickerModule, options);
63
+ }
64
+ return await openDocumentByNewDocumentsPicker(documentPickerModule, options);
65
+ }
66
+ //# sourceMappingURL=openDocument.native.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"names":["_uikitUtils","require","_SBUError","_interopRequireDefault","_normalizeFile","e","__esModule","default","openDocumentByOldDocumentPicker","documentPickerModule","options","Logger","warn","uri","size","name","type","pickSingle","normalizeFile","isCancel","isInProgress","_options$onOpenFailur","onOpenFailure","call","SBUError","UNKNOWN","openDocumentByNewDocumentsPicker","results","pick","isErrorWithCode","errorCodes","OPERATION_CANCELED","IN_PROGRESS","_options$onOpenFailur2","isOldModule","documentPicker","openDocument"],"sources":["openDocument.native.ts"],"sourcesContent":["import type * as NewDocumentsPicker from '@react-native-documents/picker';\nimport type * as OldDocumentPicker from 'react-native-document-picker';\n\nimport { Logger } from '@sendbird/uikit-utils';\n\nimport SBUError from '../libs/SBUError';\nimport normalizeFile from '../utils/normalizeFile';\nimport type { FilePickerResponse, OpenDocumentOptions } from './types';\n\nexport type DocumentPicker = typeof OldDocumentPicker | typeof NewDocumentsPicker;\n\nasync function openDocumentByOldDocumentPicker(\n documentPickerModule: typeof OldDocumentPicker,\n options?: OpenDocumentOptions,\n): Promise<FilePickerResponse> {\n Logger.warn('please update to @react-native-documents/picker');\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\nasync function openDocumentByNewDocumentsPicker(\n documentPickerModule: typeof NewDocumentsPicker,\n options?: OpenDocumentOptions,\n): Promise<FilePickerResponse> {\n try {\n const results = await documentPickerModule.pick();\n const { uri, size, name, type } = results[0];\n return normalizeFile({ uri, size, name, type });\n } catch (e) {\n if (\n !documentPickerModule.isErrorWithCode(documentPickerModule.errorCodes.OPERATION_CANCELED) &&\n documentPickerModule.isErrorWithCode(documentPickerModule.errorCodes.IN_PROGRESS)\n ) {\n options?.onOpenFailure?.(SBUError.UNKNOWN, e);\n }\n return null;\n }\n}\n\nfunction isOldModule(documentPicker: DocumentPicker): documentPicker is typeof OldDocumentPicker {\n return 'pickSingle' in documentPicker && typeof documentPicker.pickSingle === 'function';\n}\n\nexport async function openDocument(\n documentPickerModule: DocumentPicker,\n options?: OpenDocumentOptions,\n): Promise<FilePickerResponse> {\n if (isOldModule(documentPickerModule)) {\n return await openDocumentByOldDocumentPicker(documentPickerModule, options);\n }\n return await openDocumentByNewDocumentsPicker(documentPickerModule, options);\n}\n"],"mappings":";;;;;;AAGA,IAAAA,WAAA,GAAAC,OAAA;AAEA,IAAAC,SAAA,GAAAC,sBAAA,CAAAF,OAAA;AACA,IAAAG,cAAA,GAAAD,sBAAA,CAAAF,OAAA;AAAmD,SAAAE,uBAAAE,CAAA,WAAAA,CAAA,IAAAA,CAAA,CAAAC,UAAA,GAAAD,CAAA,KAAAE,OAAA,EAAAF,CAAA;AAKnD,eAAeG,+BAA+BA,CAC5CC,oBAA8C,EAC9CC,OAA6B,EACA;EAC7BC,kBAAM,CAACC,IAAI,CAAC,iDAAiD,CAAC;EAC9D,IAAI;IACF,MAAM;MAAEC,GAAG;MAAEC,IAAI;MAAEC,IAAI;MAAEC;IAAK,CAAC,GAAG,MAAMP,oBAAoB,CAACQ,UAAU,CAAC,CAAC;IACzE,OAAO,IAAAC,sBAAa,EAAC;MAAEL,GAAG;MAAEC,IAAI;MAAEC,IAAI;MAAEC;IAAK,CAAC,CAAC;EACjD,CAAC,CAAC,OAAOX,CAAC,EAAE;IACV,IAAI,CAACI,oBAAoB,CAACU,QAAQ,CAACd,CAAC,CAAC,IAAII,oBAAoB,CAACW,YAAY,CAACf,CAAC,CAAC,EAAE;MAAA,IAAAgB,qBAAA;MAC7EX,OAAO,aAAPA,OAAO,gBAAAW,qBAAA,GAAPX,OAAO,CAAEY,aAAa,cAAAD,qBAAA,eAAtBA,qBAAA,CAAAE,IAAA,CAAAb,OAAO,EAAkBc,iBAAQ,CAACC,OAAO,EAAEpB,CAAC,CAAC;IAC/C;IACA,OAAO,IAAI;EACb;AACF;AAEA,eAAeqB,gCAAgCA,CAC7CjB,oBAA+C,EAC/CC,OAA6B,EACA;EAC7B,IAAI;IACF,MAAMiB,OAAO,GAAG,MAAMlB,oBAAoB,CAACmB,IAAI,CAAC,CAAC;IACjD,MAAM;MAAEf,GAAG;MAAEC,IAAI;MAAEC,IAAI;MAAEC;IAAK,CAAC,GAAGW,OAAO,CAAC,CAAC,CAAC;IAC5C,OAAO,IAAAT,sBAAa,EAAC;MAAEL,GAAG;MAAEC,IAAI;MAAEC,IAAI;MAAEC;IAAK,CAAC,CAAC;EACjD,CAAC,CAAC,OAAOX,CAAC,EAAE;IACV,IACE,CAACI,oBAAoB,CAACoB,eAAe,CAACpB,oBAAoB,CAACqB,UAAU,CAACC,kBAAkB,CAAC,IACzFtB,oBAAoB,CAACoB,eAAe,CAACpB,oBAAoB,CAACqB,UAAU,CAACE,WAAW,CAAC,EACjF;MAAA,IAAAC,sBAAA;MACAvB,OAAO,aAAPA,OAAO,gBAAAuB,sBAAA,GAAPvB,OAAO,CAAEY,aAAa,cAAAW,sBAAA,eAAtBA,sBAAA,CAAAV,IAAA,CAAAb,OAAO,EAAkBc,iBAAQ,CAACC,OAAO,EAAEpB,CAAC,CAAC;IAC/C;IACA,OAAO,IAAI;EACb;AACF;AAEA,SAAS6B,WAAWA,CAACC,cAA8B,EAA8C;EAC/F,OAAO,YAAY,IAAIA,cAAc,IAAI,OAAOA,cAAc,CAAClB,UAAU,KAAK,UAAU;AAC1F;AAEO,eAAemB,YAAYA,CAChC3B,oBAAoC,EACpCC,OAA6B,EACA;EAC7B,IAAIwB,WAAW,CAACzB,oBAAoB,CAAC,EAAE;IACrC,OAAO,MAAMD,+BAA+B,CAACC,oBAAoB,EAAEC,OAAO,CAAC;EAC7E;EACA,OAAO,MAAMgB,gCAAgC,CAACjB,oBAAoB,EAAEC,OAAO,CAAC;AAC9E","ignoreList":[]}
@@ -4,6 +4,6 @@ Object.defineProperty(exports, "__esModule", {
4
4
  value: true
5
5
  });
6
6
  exports.default = void 0;
7
- const VERSION = '3.8.5';
7
+ const VERSION = '3.9.0';
8
8
  var _default = exports.default = VERSION;
9
9
  //# sourceMappingURL=version.js.map
@@ -1 +1 @@
1
- {"version":3,"names":["VERSION","_default","exports","default"],"sources":["version.ts"],"sourcesContent":["const VERSION = '3.8.5';\nexport default VERSION;\n"],"mappings":";;;;;;AAAA,MAAMA,OAAO,GAAG,OAAO;AAAC,IAAAC,QAAA,GAAAC,OAAA,CAAAC,OAAA,GACTH,OAAO","ignoreList":[]}
1
+ {"version":3,"names":["VERSION","_default","exports","default"],"sources":["version.ts"],"sourcesContent":["const VERSION = '3.9.0';\nexport default VERSION;\n"],"mappings":";;;;;;AAAA,MAAMA,OAAO,GAAG,OAAO;AAAC,IAAAC,QAAA,GAAAC,OAAA,CAAAC,OAAA,GACTH,OAAO","ignoreList":[]}
@@ -9,17 +9,13 @@ function shouldUseScrollViewEnhancer() {
9
9
  }
10
10
  return false;
11
11
  }
12
- function getFlatList() {
13
- if (shouldUseScrollViewEnhancer()) {
14
- try {
15
- return require('@sendbird/react-native-scrollview-enhancer').FlatList;
16
- } catch {
17
- return require('react-native').FlatList;
18
- }
19
- } else {
20
- return require('react-native').FlatList;
12
+ let FlatListInternal = require('react-native').FlatList;
13
+ if (shouldUseScrollViewEnhancer()) {
14
+ try {
15
+ FlatListInternal = require('@sendbird/react-native-scrollview-enhancer').FlatList;
16
+ } catch {
17
+ FlatListInternal = require('react-native').FlatList;
21
18
  }
22
19
  }
23
- const FlatListInternal = getFlatList();
24
20
  export default FlatListInternal;
25
21
  //# sourceMappingURL=FlatListInternal.js.map
@@ -1 +1 @@
1
- {"version":3,"names":["Platform","shouldUseScrollViewEnhancer","_Platform$constants$r","constants","reactNativeVersion","major","_Platform$constants$r2","minor","getFlatList","require","FlatList","FlatListInternal"],"sources":["FlatListInternal.tsx"],"sourcesContent":["import type { ForwardedRef, ReactElement } from 'react';\nimport type { FlatListProps, FlatList as RNFlatList, ScrollViewProps } from 'react-native';\nimport { Platform } from 'react-native';\n\nimport type { SendbirdMessage } from '@sendbird/uikit-utils';\n\ntype FlatListBidirectional<T = SendbirdMessage> = (props: FlatListProps<T> & BidirectionalProps<T>) => ReactElement;\ntype BidirectionalProps<T> = {\n onStartReached?: ((info: { distanceFromStart: number }) => void) | null | undefined;\n onStartReachedThreshold?: number | null | undefined;\n onEndReached?: ((info: { distanceFromEnd: number }) => void) | null | undefined;\n onEndReachedThreshold?: number | null | undefined;\n maintainVisibleContentPosition?: ScrollViewProps['maintainVisibleContentPosition'];\n ref: ForwardedRef<RNFlatList<T>>;\n};\n\nfunction shouldUseScrollViewEnhancer() {\n if (Platform.constants.reactNativeVersion?.major < 1) {\n if (Platform.constants.reactNativeVersion?.minor < 72) {\n return true;\n }\n }\n return false;\n}\nfunction getFlatList(): FlatListBidirectional {\n if (shouldUseScrollViewEnhancer()) {\n try {\n return require('@sendbird/react-native-scrollview-enhancer').FlatList;\n } catch {\n return require('react-native').FlatList;\n }\n } else {\n return require('react-native').FlatList;\n }\n}\n\nconst FlatListInternal = getFlatList();\nexport default FlatListInternal;\n"],"mappings":"AAEA,SAASA,QAAQ,QAAQ,cAAc;AAcvC,SAASC,2BAA2BA,CAAA,EAAG;EAAA,IAAAC,qBAAA;EACrC,IAAI,EAAAA,qBAAA,GAAAF,QAAQ,CAACG,SAAS,CAACC,kBAAkB,cAAAF,qBAAA,uBAArCA,qBAAA,CAAuCG,KAAK,IAAG,CAAC,EAAE;IAAA,IAAAC,sBAAA;IACpD,IAAI,EAAAA,sBAAA,GAAAN,QAAQ,CAACG,SAAS,CAACC,kBAAkB,cAAAE,sBAAA,uBAArCA,sBAAA,CAAuCC,KAAK,IAAG,EAAE,EAAE;MACrD,OAAO,IAAI;IACb;EACF;EACA,OAAO,KAAK;AACd;AACA,SAASC,WAAWA,CAAA,EAA0B;EAC5C,IAAIP,2BAA2B,CAAC,CAAC,EAAE;IACjC,IAAI;MACF,OAAOQ,OAAO,CAAC,4CAA4C,CAAC,CAACC,QAAQ;IACvE,CAAC,CAAC,MAAM;MACN,OAAOD,OAAO,CAAC,cAAc,CAAC,CAACC,QAAQ;IACzC;EACF,CAAC,MAAM;IACL,OAAOD,OAAO,CAAC,cAAc,CAAC,CAACC,QAAQ;EACzC;AACF;AAEA,MAAMC,gBAAgB,GAAGH,WAAW,CAAC,CAAC;AACtC,eAAeG,gBAAgB","ignoreList":[]}
1
+ {"version":3,"names":["Platform","shouldUseScrollViewEnhancer","_Platform$constants$r","constants","reactNativeVersion","major","_Platform$constants$r2","minor","FlatListInternal","require","FlatList"],"sources":["FlatListInternal.tsx"],"sourcesContent":["import { Platform } from 'react-native';\n\nfunction shouldUseScrollViewEnhancer() {\n if (Platform.constants.reactNativeVersion?.major < 1) {\n if (Platform.constants.reactNativeVersion?.minor < 72) {\n return true;\n }\n }\n return false;\n}\n\nlet FlatListInternal = require('react-native').FlatList;\nif (shouldUseScrollViewEnhancer()) {\n try {\n FlatListInternal = require('@sendbird/react-native-scrollview-enhancer').FlatList;\n } catch {\n FlatListInternal = require('react-native').FlatList;\n }\n}\n\nexport default FlatListInternal;\n"],"mappings":"AAAA,SAASA,QAAQ,QAAQ,cAAc;AAEvC,SAASC,2BAA2BA,CAAA,EAAG;EAAA,IAAAC,qBAAA;EACrC,IAAI,EAAAA,qBAAA,GAAAF,QAAQ,CAACG,SAAS,CAACC,kBAAkB,cAAAF,qBAAA,uBAArCA,qBAAA,CAAuCG,KAAK,IAAG,CAAC,EAAE;IAAA,IAAAC,sBAAA;IACpD,IAAI,EAAAA,sBAAA,GAAAN,QAAQ,CAACG,SAAS,CAACC,kBAAkB,cAAAE,sBAAA,uBAArCA,sBAAA,CAAuCC,KAAK,IAAG,EAAE,EAAE;MACrD,OAAO,IAAI;IACb;EACF;EACA,OAAO,KAAK;AACd;AAEA,IAAIC,gBAAgB,GAAGC,OAAO,CAAC,cAAc,CAAC,CAACC,QAAQ;AACvD,IAAIT,2BAA2B,CAAC,CAAC,EAAE;EACjC,IAAI;IACFO,gBAAgB,GAAGC,OAAO,CAAC,4CAA4C,CAAC,CAACC,QAAQ;EACnF,CAAC,CAAC,MAAM;IACNF,gBAAgB,GAAGC,OAAO,CAAC,cAAc,CAAC,CAACC,QAAQ;EACrD;AACF;AAEA,eAAeF,gBAAgB","ignoreList":[]}
@@ -6,6 +6,7 @@ import { Logger, getFileExtension, getFileExtensionFromMime, getFileExtensionFro
6
6
  import SBUError from '../libs/SBUError';
7
7
  import nativePermissionGranted from '../utils/nativePermissionGranted';
8
8
  import normalizeFile from '../utils/normalizeFile';
9
+ import { openDocument } from './openDocument.native';
9
10
  function getAndroidStoragePermissionsByAPILevel(permissionModule) {
10
11
  if (Platform.OS !== 'android') return [];
11
12
  if (Platform.Version > 32) {
@@ -23,11 +24,16 @@ const createNativeFileService = ({
23
24
  mediaLibraryModule,
24
25
  fsModule
25
26
  }) => {
26
- const cameraPermissions = Platform.select({
27
- ios: [permissionModule.PERMISSIONS.IOS.CAMERA, permissionModule.PERMISSIONS.IOS.MICROPHONE],
27
+ const requiredPermissions = Platform.select({
28
+ ios: [permissionModule.PERMISSIONS.IOS.CAMERA],
28
29
  android: [permissionModule.PERMISSIONS.ANDROID.CAMERA],
29
30
  default: []
30
31
  });
32
+ const optionalPermissions = Platform.select({
33
+ ios: [permissionModule.PERMISSIONS.IOS.MICROPHONE],
34
+ android: [],
35
+ default: []
36
+ });
31
37
  const mediaLibraryPermissions = Platform.select({
32
38
  ios: [permissionModule.PERMISSIONS.IOS.PHOTO_LIBRARY, permissionModule.PERMISSIONS.IOS.PHOTO_LIBRARY_ADD_ONLY],
33
39
  android: getAndroidStoragePermissionsByAPILevel(permissionModule),
@@ -69,12 +75,14 @@ const createNativeFileService = ({
69
75
  });
70
76
  }
71
77
  async hasCameraPermission() {
72
- const status = await permissionModule.checkMultiple(cameraPermissions);
78
+ const status = await permissionModule.checkMultiple(requiredPermissions);
73
79
  return nativePermissionGranted(status);
74
80
  }
75
81
  async requestCameraPermission() {
76
- const status = await permissionModule.requestMultiple(cameraPermissions);
77
- return nativePermissionGranted(status);
82
+ const requiredPermissionsStatus = await permissionModule.requestMultiple(requiredPermissions);
83
+ if (!nativePermissionGranted(requiredPermissionsStatus)) return false;
84
+ await permissionModule.requestMultiple(optionalPermissions);
85
+ return true;
78
86
  }
79
87
  async hasMediaLibraryPermission() {
80
88
  const status = await permissionModule.checkMultiple(mediaLibraryPermissions);
@@ -180,26 +188,7 @@ const createNativeFileService = ({
180
188
  })));
181
189
  }
182
190
  async openDocument(options) {
183
- try {
184
- const {
185
- uri,
186
- size,
187
- name,
188
- type
189
- } = await documentPickerModule.pickSingle();
190
- return normalizeFile({
191
- uri,
192
- size,
193
- name,
194
- type
195
- });
196
- } catch (e) {
197
- if (!documentPickerModule.isCancel(e) && documentPickerModule.isInProgress(e)) {
198
- var _options$onOpenFailur5;
199
- options === null || options === void 0 || (_options$onOpenFailur5 = options.onOpenFailure) === null || _options$onOpenFailur5 === void 0 || _options$onOpenFailur5.call(options, SBUError.UNKNOWN, e);
200
- }
201
- return null;
202
- }
191
+ return await openDocument(documentPickerModule, options);
203
192
  }
204
193
  async save(options) {
205
194
  const hasPermission = await this.hasMediaLibraryPermission();
@@ -1 +1 @@
1
- {"version":3,"names":["Platform","Logger","getFileExtension","getFileExtensionFromMime","getFileExtensionFromUri","getFileType","normalizeFileName","SBUError","nativePermissionGranted","normalizeFile","getAndroidStoragePermissionsByAPILevel","permissionModule","OS","Version","PERMISSIONS","ANDROID","READ_EXTERNAL_STORAGE","WRITE_EXTERNAL_STORAGE","createNativeFileService","imagePickerModule","documentPickerModule","mediaLibraryModule","fsModule","cameraPermissions","select","ios","IOS","CAMERA","MICROPHONE","android","default","mediaLibraryPermissions","PHOTO_LIBRARY","PHOTO_LIBRARY_ADD_ONLY","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","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","openDocument","pickSingle","e","isCancel","isInProgress","_options$onOpenFailur5","UNKNOWN","save","downloadFile","mediaTypeMap","externalDirMap","externalDir","cpExternal","catch","error","createRecordFilePath","customExtension","Date","now","recordFilePath","startsWith"],"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 }\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.PHOTO_LIBRARY, permissionModule.PERMISSIONS.IOS.PHOTO_LIBRARY_ADD_ONLY],\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 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 createRecordFilePath(customExtension = 'm4a'): { recordFilePath: string; uri: string } {\n const filename = `record-${Date.now()}.${customExtension}`;\n const path = `${fsModule.Dirs.CacheDir}/${filename}`;\n return Platform.select({\n ios: {\n uri: path,\n recordFilePath: filename,\n },\n android: {\n uri: path.startsWith('file://') ? path : 'file://' + path,\n recordFilePath: path,\n },\n default: {\n uri: path,\n recordFilePath: path,\n },\n });\n }\n }\n\n return new NativeFileService();\n};\n\nexport default createNativeFileService;\n"],"mappings":"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","ignoreList":[]}
1
+ {"version":3,"names":["Platform","Logger","getFileExtension","getFileExtensionFromMime","getFileExtensionFromUri","getFileType","normalizeFileName","SBUError","nativePermissionGranted","normalizeFile","openDocument","getAndroidStoragePermissionsByAPILevel","permissionModule","OS","Version","PERMISSIONS","ANDROID","READ_EXTERNAL_STORAGE","WRITE_EXTERNAL_STORAGE","createNativeFileService","imagePickerModule","documentPickerModule","mediaLibraryModule","fsModule","requiredPermissions","select","ios","IOS","CAMERA","android","default","optionalPermissions","MICROPHONE","mediaLibraryPermissions","PHOTO_LIBRARY","PHOTO_LIBRARY_ADD_ONLY","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","requiredPermissionsStatus","requestMultiple","hasMediaLibraryPermission","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","save","downloadFile","mediaTypeMap","externalDirMap","externalDir","cpExternal","catch","error","createRecordFilePath","customExtension","Date","now","recordFilePath","startsWith"],"sources":["createFileService.native.ts"],"sourcesContent":["import type { CameraRoll } from '@react-native-camera-roll/camera-roll';\nimport { Platform } from 'react-native';\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 { DocumentPicker, openDocument } from './openDocument.native';\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 }\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: DocumentPicker;\n permissionModule: typeof Permissions;\n mediaLibraryModule: typeof CameraRoll;\n fsModule: typeof FileAccess;\n}): FileServiceInterface => {\n const requiredPermissions: Permission[] = Platform.select({\n ios: [permissionModule.PERMISSIONS.IOS.CAMERA],\n android: [permissionModule.PERMISSIONS.ANDROID.CAMERA],\n default: [],\n });\n const optionalPermissions: Permission[] = Platform.select({\n ios: [permissionModule.PERMISSIONS.IOS.MICROPHONE],\n android: [],\n default: [],\n });\n const mediaLibraryPermissions: Permission[] = Platform.select({\n ios: [permissionModule.PERMISSIONS.IOS.PHOTO_LIBRARY, permissionModule.PERMISSIONS.IOS.PHOTO_LIBRARY_ADD_ONLY],\n android: getAndroidStoragePermissionsByAPILevel(permissionModule),\n default: [],\n });\n\n class NativeFileService implements FileServiceInterface {\n async hasCameraPermission(): Promise<boolean> {\n const status = await permissionModule.checkMultiple(requiredPermissions);\n return nativePermissionGranted(status);\n }\n\n async requestCameraPermission(): Promise<boolean> {\n const requiredPermissionsStatus = await permissionModule.requestMultiple(requiredPermissions);\n if (!nativePermissionGranted(requiredPermissionsStatus)) return false;\n\n await permissionModule.requestMultiple(optionalPermissions);\n return true;\n }\n\n async hasMediaLibraryPermission(): Promise<boolean> {\n const status = await permissionModule.checkMultiple(mediaLibraryPermissions);\n return nativePermissionGranted(status);\n }\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\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\n async openDocument(options?: OpenDocumentOptions): Promise<FilePickerResponse> {\n return await openDocument(documentPickerModule, options);\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 createRecordFilePath(customExtension = 'm4a'): { recordFilePath: string; uri: string } {\n const filename = `record-${Date.now()}.${customExtension}`;\n const path = `${fsModule.Dirs.CacheDir}/${filename}`;\n return Platform.select({\n ios: {\n uri: path,\n recordFilePath: filename,\n },\n android: {\n uri: path.startsWith('file://') ? path : 'file://' + path,\n recordFilePath: path,\n },\n default: {\n uri: path,\n recordFilePath: path,\n },\n });\n }\n }\n\n return new NativeFileService();\n};\n\nexport default createNativeFileService;\n"],"mappings":"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","ignoreList":[]}
@@ -0,0 +1,59 @@
1
+ import { Logger } from '@sendbird/uikit-utils';
2
+ import SBUError from '../libs/SBUError';
3
+ import normalizeFile from '../utils/normalizeFile';
4
+ async function openDocumentByOldDocumentPicker(documentPickerModule, options) {
5
+ Logger.warn('please update to @react-native-documents/picker');
6
+ try {
7
+ const {
8
+ uri,
9
+ size,
10
+ name,
11
+ type
12
+ } = await documentPickerModule.pickSingle();
13
+ return normalizeFile({
14
+ uri,
15
+ size,
16
+ name,
17
+ type
18
+ });
19
+ } catch (e) {
20
+ if (!documentPickerModule.isCancel(e) && documentPickerModule.isInProgress(e)) {
21
+ var _options$onOpenFailur;
22
+ options === null || options === void 0 || (_options$onOpenFailur = options.onOpenFailure) === null || _options$onOpenFailur === void 0 || _options$onOpenFailur.call(options, SBUError.UNKNOWN, e);
23
+ }
24
+ return null;
25
+ }
26
+ }
27
+ async function openDocumentByNewDocumentsPicker(documentPickerModule, options) {
28
+ try {
29
+ const results = await documentPickerModule.pick();
30
+ const {
31
+ uri,
32
+ size,
33
+ name,
34
+ type
35
+ } = results[0];
36
+ return normalizeFile({
37
+ uri,
38
+ size,
39
+ name,
40
+ type
41
+ });
42
+ } catch (e) {
43
+ if (!documentPickerModule.isErrorWithCode(documentPickerModule.errorCodes.OPERATION_CANCELED) && documentPickerModule.isErrorWithCode(documentPickerModule.errorCodes.IN_PROGRESS)) {
44
+ var _options$onOpenFailur2;
45
+ options === null || options === void 0 || (_options$onOpenFailur2 = options.onOpenFailure) === null || _options$onOpenFailur2 === void 0 || _options$onOpenFailur2.call(options, SBUError.UNKNOWN, e);
46
+ }
47
+ return null;
48
+ }
49
+ }
50
+ function isOldModule(documentPicker) {
51
+ return 'pickSingle' in documentPicker && typeof documentPicker.pickSingle === 'function';
52
+ }
53
+ export async function openDocument(documentPickerModule, options) {
54
+ if (isOldModule(documentPickerModule)) {
55
+ return await openDocumentByOldDocumentPicker(documentPickerModule, options);
56
+ }
57
+ return await openDocumentByNewDocumentsPicker(documentPickerModule, options);
58
+ }
59
+ //# sourceMappingURL=openDocument.native.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"names":["Logger","SBUError","normalizeFile","openDocumentByOldDocumentPicker","documentPickerModule","options","warn","uri","size","name","type","pickSingle","e","isCancel","isInProgress","_options$onOpenFailur","onOpenFailure","call","UNKNOWN","openDocumentByNewDocumentsPicker","results","pick","isErrorWithCode","errorCodes","OPERATION_CANCELED","IN_PROGRESS","_options$onOpenFailur2","isOldModule","documentPicker","openDocument"],"sources":["openDocument.native.ts"],"sourcesContent":["import type * as NewDocumentsPicker from '@react-native-documents/picker';\nimport type * as OldDocumentPicker from 'react-native-document-picker';\n\nimport { Logger } from '@sendbird/uikit-utils';\n\nimport SBUError from '../libs/SBUError';\nimport normalizeFile from '../utils/normalizeFile';\nimport type { FilePickerResponse, OpenDocumentOptions } from './types';\n\nexport type DocumentPicker = typeof OldDocumentPicker | typeof NewDocumentsPicker;\n\nasync function openDocumentByOldDocumentPicker(\n documentPickerModule: typeof OldDocumentPicker,\n options?: OpenDocumentOptions,\n): Promise<FilePickerResponse> {\n Logger.warn('please update to @react-native-documents/picker');\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\nasync function openDocumentByNewDocumentsPicker(\n documentPickerModule: typeof NewDocumentsPicker,\n options?: OpenDocumentOptions,\n): Promise<FilePickerResponse> {\n try {\n const results = await documentPickerModule.pick();\n const { uri, size, name, type } = results[0];\n return normalizeFile({ uri, size, name, type });\n } catch (e) {\n if (\n !documentPickerModule.isErrorWithCode(documentPickerModule.errorCodes.OPERATION_CANCELED) &&\n documentPickerModule.isErrorWithCode(documentPickerModule.errorCodes.IN_PROGRESS)\n ) {\n options?.onOpenFailure?.(SBUError.UNKNOWN, e);\n }\n return null;\n }\n}\n\nfunction isOldModule(documentPicker: DocumentPicker): documentPicker is typeof OldDocumentPicker {\n return 'pickSingle' in documentPicker && typeof documentPicker.pickSingle === 'function';\n}\n\nexport async function openDocument(\n documentPickerModule: DocumentPicker,\n options?: OpenDocumentOptions,\n): Promise<FilePickerResponse> {\n if (isOldModule(documentPickerModule)) {\n return await openDocumentByOldDocumentPicker(documentPickerModule, options);\n }\n return await openDocumentByNewDocumentsPicker(documentPickerModule, options);\n}\n"],"mappings":"AAGA,SAASA,MAAM,QAAQ,uBAAuB;AAE9C,OAAOC,QAAQ,MAAM,kBAAkB;AACvC,OAAOC,aAAa,MAAM,wBAAwB;AAKlD,eAAeC,+BAA+BA,CAC5CC,oBAA8C,EAC9CC,OAA6B,EACA;EAC7BL,MAAM,CAACM,IAAI,CAAC,iDAAiD,CAAC;EAC9D,IAAI;IACF,MAAM;MAAEC,GAAG;MAAEC,IAAI;MAAEC,IAAI;MAAEC;IAAK,CAAC,GAAG,MAAMN,oBAAoB,CAACO,UAAU,CAAC,CAAC;IACzE,OAAOT,aAAa,CAAC;MAAEK,GAAG;MAAEC,IAAI;MAAEC,IAAI;MAAEC;IAAK,CAAC,CAAC;EACjD,CAAC,CAAC,OAAOE,CAAC,EAAE;IACV,IAAI,CAACR,oBAAoB,CAACS,QAAQ,CAACD,CAAC,CAAC,IAAIR,oBAAoB,CAACU,YAAY,CAACF,CAAC,CAAC,EAAE;MAAA,IAAAG,qBAAA;MAC7EV,OAAO,aAAPA,OAAO,gBAAAU,qBAAA,GAAPV,OAAO,CAAEW,aAAa,cAAAD,qBAAA,eAAtBA,qBAAA,CAAAE,IAAA,CAAAZ,OAAO,EAAkBJ,QAAQ,CAACiB,OAAO,EAAEN,CAAC,CAAC;IAC/C;IACA,OAAO,IAAI;EACb;AACF;AAEA,eAAeO,gCAAgCA,CAC7Cf,oBAA+C,EAC/CC,OAA6B,EACA;EAC7B,IAAI;IACF,MAAMe,OAAO,GAAG,MAAMhB,oBAAoB,CAACiB,IAAI,CAAC,CAAC;IACjD,MAAM;MAAEd,GAAG;MAAEC,IAAI;MAAEC,IAAI;MAAEC;IAAK,CAAC,GAAGU,OAAO,CAAC,CAAC,CAAC;IAC5C,OAAOlB,aAAa,CAAC;MAAEK,GAAG;MAAEC,IAAI;MAAEC,IAAI;MAAEC;IAAK,CAAC,CAAC;EACjD,CAAC,CAAC,OAAOE,CAAC,EAAE;IACV,IACE,CAACR,oBAAoB,CAACkB,eAAe,CAAClB,oBAAoB,CAACmB,UAAU,CAACC,kBAAkB,CAAC,IACzFpB,oBAAoB,CAACkB,eAAe,CAAClB,oBAAoB,CAACmB,UAAU,CAACE,WAAW,CAAC,EACjF;MAAA,IAAAC,sBAAA;MACArB,OAAO,aAAPA,OAAO,gBAAAqB,sBAAA,GAAPrB,OAAO,CAAEW,aAAa,cAAAU,sBAAA,eAAtBA,sBAAA,CAAAT,IAAA,CAAAZ,OAAO,EAAkBJ,QAAQ,CAACiB,OAAO,EAAEN,CAAC,CAAC;IAC/C;IACA,OAAO,IAAI;EACb;AACF;AAEA,SAASe,WAAWA,CAACC,cAA8B,EAA8C;EAC/F,OAAO,YAAY,IAAIA,cAAc,IAAI,OAAOA,cAAc,CAACjB,UAAU,KAAK,UAAU;AAC1F;AAEA,OAAO,eAAekB,YAAYA,CAChCzB,oBAAoC,EACpCC,OAA6B,EACA;EAC7B,IAAIsB,WAAW,CAACvB,oBAAoB,CAAC,EAAE;IACrC,OAAO,MAAMD,+BAA+B,CAACC,oBAAoB,EAAEC,OAAO,CAAC;EAC7E;EACA,OAAO,MAAMc,gCAAgC,CAACf,oBAAoB,EAAEC,OAAO,CAAC;AAC9E","ignoreList":[]}
@@ -1,3 +1,3 @@
1
- const VERSION = '3.8.5';
1
+ const VERSION = '3.9.0';
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.8.5';\nexport default VERSION;\n"],"mappings":"AAAA,MAAMA,OAAO,GAAG,OAAO;AACvB,eAAeA,OAAO","ignoreList":[]}
1
+ {"version":3,"names":["VERSION"],"sources":["version.ts"],"sourcesContent":["const VERSION = '3.9.0';\nexport default VERSION;\n"],"mappings":"AAAA,MAAMA,OAAO,GAAG,OAAO;AACvB,eAAeA,OAAO","ignoreList":[]}
@@ -1,18 +1,2 @@
1
- import type { ForwardedRef, ReactElement } from 'react';
2
- import type { FlatListProps, FlatList as RNFlatList, ScrollViewProps } from 'react-native';
3
- import type { SendbirdMessage } from '@sendbird/uikit-utils';
4
- type FlatListBidirectional<T = SendbirdMessage> = (props: FlatListProps<T> & BidirectionalProps<T>) => ReactElement;
5
- type BidirectionalProps<T> = {
6
- onStartReached?: ((info: {
7
- distanceFromStart: number;
8
- }) => void) | null | undefined;
9
- onStartReachedThreshold?: number | null | undefined;
10
- onEndReached?: ((info: {
11
- distanceFromEnd: number;
12
- }) => void) | null | undefined;
13
- onEndReachedThreshold?: number | null | undefined;
14
- maintainVisibleContentPosition?: ScrollViewProps['maintainVisibleContentPosition'];
15
- ref: ForwardedRef<RNFlatList<T>>;
16
- };
17
- declare const FlatListInternal: FlatListBidirectional<SendbirdMessage>;
1
+ declare let FlatListInternal: any;
18
2
  export default FlatListInternal;
@@ -14,7 +14,7 @@ import type { StringSet } from '../localization/StringSet.type';
14
14
  import type { ClipboardServiceInterface, FileServiceInterface, MediaServiceInterface, NotificationServiceInterface, PlayerServiceInterface, RecorderServiceInterface } from '../platform/types';
15
15
  import { ErrorBoundaryProps, LocalCacheStorage } from '../types';
16
16
  export declare const SendbirdUIKit: Readonly<{
17
- VERSION: "3.8.5";
17
+ VERSION: "3.9.0";
18
18
  PLATFORM: string;
19
19
  DEFAULT: {
20
20
  AUTO_PUSH_TOKEN_REGISTRATION: boolean;
@@ -1,12 +1,12 @@
1
1
  import type { CameraRoll } from '@react-native-camera-roll/camera-roll';
2
- import type * as DocumentPicker from 'react-native-document-picker';
3
2
  import type * as FileAccess from 'react-native-file-access';
4
3
  import type * as ImagePicker from 'react-native-image-picker';
5
4
  import type * as Permissions from 'react-native-permissions';
5
+ import { DocumentPicker } from './openDocument.native';
6
6
  import type { FileServiceInterface } from './types';
7
7
  declare const createNativeFileService: ({ imagePickerModule, documentPickerModule, permissionModule, mediaLibraryModule, fsModule, }: {
8
8
  imagePickerModule: typeof ImagePicker;
9
- documentPickerModule: typeof DocumentPicker;
9
+ documentPickerModule: DocumentPicker;
10
10
  permissionModule: typeof Permissions;
11
11
  mediaLibraryModule: typeof CameraRoll;
12
12
  fsModule: typeof FileAccess;
@@ -0,0 +1,5 @@
1
+ import type * as NewDocumentsPicker from '@react-native-documents/picker';
2
+ import type * as OldDocumentPicker from 'react-native-document-picker';
3
+ import type { FilePickerResponse, OpenDocumentOptions } from './types';
4
+ export type DocumentPicker = typeof OldDocumentPicker | typeof NewDocumentsPicker;
5
+ export declare function openDocument(documentPickerModule: DocumentPicker, options?: OpenDocumentOptions): Promise<FilePickerResponse>;
@@ -1,2 +1,2 @@
1
- declare const VERSION = "3.8.5";
1
+ declare const VERSION = "3.9.0";
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.8.5",
3
+ "version": "3.9.0",
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",
@@ -60,10 +60,10 @@
60
60
  },
61
61
  "dependencies": {
62
62
  "@openspacelabs/react-native-zoomable-view": "^2.1.5",
63
- "@sendbird/uikit-chat-hooks": "3.8.5",
64
- "@sendbird/uikit-react-native-foundation": "3.8.5",
63
+ "@sendbird/uikit-chat-hooks": "3.9.0",
64
+ "@sendbird/uikit-react-native-foundation": "3.9.0",
65
65
  "@sendbird/uikit-tools": "0.0.1-alpha.77",
66
- "@sendbird/uikit-utils": "3.8.5"
66
+ "@sendbird/uikit-utils": "3.9.0"
67
67
  },
68
68
  "devDependencies": {
69
69
  "@bam.tech/react-native-image-resizer": "^3.0.4",
@@ -71,6 +71,7 @@
71
71
  "@react-native-camera-roll/camera-roll": "^7.8.1",
72
72
  "@react-native-clipboard/clipboard": "^1.14.1",
73
73
  "@react-native-community/netinfo": "^11.3.2",
74
+ "@react-native-documents/picker": "^10.0.0",
74
75
  "@react-native-firebase/app": "^14.4.0",
75
76
  "@react-native-firebase/messaging": "^14.4.0",
76
77
  "@types/react": "*",
@@ -108,6 +109,7 @@
108
109
  "@react-native-camera-roll/camera-roll": ">=5.0.0",
109
110
  "@react-native-clipboard/clipboard": ">=1.8.5",
110
111
  "@react-native-community/netinfo": ">=9.3.0",
112
+ "@react-native-documents/picker": ">=10.0.0",
111
113
  "@react-native-firebase/messaging": ">=14.4.0",
112
114
  "@sendbird/chat": "^4.16.0",
113
115
  "@sendbird/react-native-scrollview-enhancer": "*",
@@ -145,6 +147,9 @@
145
147
  "@react-native-clipboard/clipboard": {
146
148
  "optional": true
147
149
  },
150
+ "@react-native-documents/picker": {
151
+ "optional": true
152
+ },
148
153
  "@react-native-firebase/messaging": {
149
154
  "optional": true
150
155
  },
@@ -208,5 +213,5 @@
208
213
  ]
209
214
  ]
210
215
  },
211
- "gitHead": "cb3e21b16f1feae03c23b69b702bbf132045c205"
216
+ "gitHead": "c54f9d39846d6f56f492308259afd08fcb5b398e"
212
217
  }
@@ -1,19 +1,5 @@
1
- import type { ForwardedRef, ReactElement } from 'react';
2
- import type { FlatListProps, FlatList as RNFlatList, ScrollViewProps } from 'react-native';
3
1
  import { Platform } from 'react-native';
4
2
 
5
- import type { SendbirdMessage } from '@sendbird/uikit-utils';
6
-
7
- type FlatListBidirectional<T = SendbirdMessage> = (props: FlatListProps<T> & BidirectionalProps<T>) => ReactElement;
8
- type BidirectionalProps<T> = {
9
- onStartReached?: ((info: { distanceFromStart: number }) => void) | null | undefined;
10
- onStartReachedThreshold?: number | null | undefined;
11
- onEndReached?: ((info: { distanceFromEnd: number }) => void) | null | undefined;
12
- onEndReachedThreshold?: number | null | undefined;
13
- maintainVisibleContentPosition?: ScrollViewProps['maintainVisibleContentPosition'];
14
- ref: ForwardedRef<RNFlatList<T>>;
15
- };
16
-
17
3
  function shouldUseScrollViewEnhancer() {
18
4
  if (Platform.constants.reactNativeVersion?.major < 1) {
19
5
  if (Platform.constants.reactNativeVersion?.minor < 72) {
@@ -22,17 +8,14 @@ function shouldUseScrollViewEnhancer() {
22
8
  }
23
9
  return false;
24
10
  }
25
- function getFlatList(): FlatListBidirectional {
26
- if (shouldUseScrollViewEnhancer()) {
27
- try {
28
- return require('@sendbird/react-native-scrollview-enhancer').FlatList;
29
- } catch {
30
- return require('react-native').FlatList;
31
- }
32
- } else {
33
- return require('react-native').FlatList;
11
+
12
+ let FlatListInternal = require('react-native').FlatList;
13
+ if (shouldUseScrollViewEnhancer()) {
14
+ try {
15
+ FlatListInternal = require('@sendbird/react-native-scrollview-enhancer').FlatList;
16
+ } catch {
17
+ FlatListInternal = require('react-native').FlatList;
34
18
  }
35
19
  }
36
20
 
37
- const FlatListInternal = getFlatList();
38
21
  export default FlatListInternal;
@@ -1,6 +1,5 @@
1
1
  import type { CameraRoll } from '@react-native-camera-roll/camera-roll';
2
2
  import { Platform } from 'react-native';
3
- import type * as DocumentPicker from 'react-native-document-picker';
4
3
  import type * as FileAccess from 'react-native-file-access';
5
4
  import type * as ImagePicker from 'react-native-image-picker';
6
5
  import type * as Permissions from 'react-native-permissions';
@@ -18,6 +17,7 @@ import {
18
17
  import SBUError from '../libs/SBUError';
19
18
  import nativePermissionGranted from '../utils/nativePermissionGranted';
20
19
  import normalizeFile from '../utils/normalizeFile';
20
+ import { DocumentPicker, openDocument } from './openDocument.native';
21
21
  import type {
22
22
  FilePickerResponse,
23
23
  FileServiceInterface,
@@ -52,16 +52,21 @@ const createNativeFileService = ({
52
52
  fsModule,
53
53
  }: {
54
54
  imagePickerModule: typeof ImagePicker;
55
- documentPickerModule: typeof DocumentPicker;
55
+ documentPickerModule: DocumentPicker;
56
56
  permissionModule: typeof Permissions;
57
57
  mediaLibraryModule: typeof CameraRoll;
58
58
  fsModule: typeof FileAccess;
59
59
  }): FileServiceInterface => {
60
- const cameraPermissions: Permission[] = Platform.select({
61
- ios: [permissionModule.PERMISSIONS.IOS.CAMERA, permissionModule.PERMISSIONS.IOS.MICROPHONE],
60
+ const requiredPermissions: Permission[] = Platform.select({
61
+ ios: [permissionModule.PERMISSIONS.IOS.CAMERA],
62
62
  android: [permissionModule.PERMISSIONS.ANDROID.CAMERA],
63
63
  default: [],
64
64
  });
65
+ const optionalPermissions: Permission[] = Platform.select({
66
+ ios: [permissionModule.PERMISSIONS.IOS.MICROPHONE],
67
+ android: [],
68
+ default: [],
69
+ });
65
70
  const mediaLibraryPermissions: Permission[] = Platform.select({
66
71
  ios: [permissionModule.PERMISSIONS.IOS.PHOTO_LIBRARY, permissionModule.PERMISSIONS.IOS.PHOTO_LIBRARY_ADD_ONLY],
67
72
  android: getAndroidStoragePermissionsByAPILevel(permissionModule),
@@ -70,17 +75,23 @@ const createNativeFileService = ({
70
75
 
71
76
  class NativeFileService implements FileServiceInterface {
72
77
  async hasCameraPermission(): Promise<boolean> {
73
- const status = await permissionModule.checkMultiple(cameraPermissions);
78
+ const status = await permissionModule.checkMultiple(requiredPermissions);
74
79
  return nativePermissionGranted(status);
75
80
  }
81
+
76
82
  async requestCameraPermission(): Promise<boolean> {
77
- const status = await permissionModule.requestMultiple(cameraPermissions);
78
- return nativePermissionGranted(status);
83
+ const requiredPermissionsStatus = await permissionModule.requestMultiple(requiredPermissions);
84
+ if (!nativePermissionGranted(requiredPermissionsStatus)) return false;
85
+
86
+ await permissionModule.requestMultiple(optionalPermissions);
87
+ return true;
79
88
  }
89
+
80
90
  async hasMediaLibraryPermission(): Promise<boolean> {
81
91
  const status = await permissionModule.checkMultiple(mediaLibraryPermissions);
82
92
  return nativePermissionGranted(status);
83
93
  }
94
+
84
95
  async requestMediaLibraryPermission(): Promise<boolean> {
85
96
  const status = await permissionModule.requestMultiple(mediaLibraryPermissions);
86
97
  return nativePermissionGranted(status);
@@ -121,6 +132,7 @@ const createNativeFileService = ({
121
132
  const { fileName: name, fileSize: size, type, uri } = response.assets?.[0] ?? {};
122
133
  return normalizeFile({ uri, size, name, type });
123
134
  }
135
+
124
136
  async openMediaLibrary(options?: OpenMediaLibraryOptions): Promise<FilePickerResponse[] | null> {
125
137
  /**
126
138
  * NOTE: options.selectionLimit {@link https://github.com/react-native-image-picker/react-native-image-picker#options}
@@ -164,17 +176,11 @@ const createNativeFileService = ({
164
176
  .map(({ fileName: name, fileSize: size, type, uri }) => normalizeFile({ uri, size, name, type })),
165
177
  );
166
178
  }
179
+
167
180
  async openDocument(options?: OpenDocumentOptions): Promise<FilePickerResponse> {
168
- try {
169
- const { uri, size, name, type } = await documentPickerModule.pickSingle();
170
- return normalizeFile({ uri, size, name, type });
171
- } catch (e) {
172
- if (!documentPickerModule.isCancel(e) && documentPickerModule.isInProgress(e)) {
173
- options?.onOpenFailure?.(SBUError.UNKNOWN, e);
174
- }
175
- return null;
176
- }
181
+ return await openDocument(documentPickerModule, options);
177
182
  }
183
+
178
184
  async save(options: SaveOptions): Promise<string> {
179
185
  const hasPermission = await this.hasMediaLibraryPermission();
180
186
  if (!hasPermission) {
@@ -0,0 +1,59 @@
1
+ import type * as NewDocumentsPicker from '@react-native-documents/picker';
2
+ import type * as OldDocumentPicker from 'react-native-document-picker';
3
+
4
+ import { Logger } from '@sendbird/uikit-utils';
5
+
6
+ import SBUError from '../libs/SBUError';
7
+ import normalizeFile from '../utils/normalizeFile';
8
+ import type { FilePickerResponse, OpenDocumentOptions } from './types';
9
+
10
+ export type DocumentPicker = typeof OldDocumentPicker | typeof NewDocumentsPicker;
11
+
12
+ async function openDocumentByOldDocumentPicker(
13
+ documentPickerModule: typeof OldDocumentPicker,
14
+ options?: OpenDocumentOptions,
15
+ ): Promise<FilePickerResponse> {
16
+ Logger.warn('please update to @react-native-documents/picker');
17
+ try {
18
+ const { uri, size, name, type } = await documentPickerModule.pickSingle();
19
+ return normalizeFile({ uri, size, name, type });
20
+ } catch (e) {
21
+ if (!documentPickerModule.isCancel(e) && documentPickerModule.isInProgress(e)) {
22
+ options?.onOpenFailure?.(SBUError.UNKNOWN, e);
23
+ }
24
+ return null;
25
+ }
26
+ }
27
+
28
+ async function openDocumentByNewDocumentsPicker(
29
+ documentPickerModule: typeof NewDocumentsPicker,
30
+ options?: OpenDocumentOptions,
31
+ ): Promise<FilePickerResponse> {
32
+ try {
33
+ const results = await documentPickerModule.pick();
34
+ const { uri, size, name, type } = results[0];
35
+ return normalizeFile({ uri, size, name, type });
36
+ } catch (e) {
37
+ if (
38
+ !documentPickerModule.isErrorWithCode(documentPickerModule.errorCodes.OPERATION_CANCELED) &&
39
+ documentPickerModule.isErrorWithCode(documentPickerModule.errorCodes.IN_PROGRESS)
40
+ ) {
41
+ options?.onOpenFailure?.(SBUError.UNKNOWN, e);
42
+ }
43
+ return null;
44
+ }
45
+ }
46
+
47
+ function isOldModule(documentPicker: DocumentPicker): documentPicker is typeof OldDocumentPicker {
48
+ return 'pickSingle' in documentPicker && typeof documentPicker.pickSingle === 'function';
49
+ }
50
+
51
+ export async function openDocument(
52
+ documentPickerModule: DocumentPicker,
53
+ options?: OpenDocumentOptions,
54
+ ): Promise<FilePickerResponse> {
55
+ if (isOldModule(documentPickerModule)) {
56
+ return await openDocumentByOldDocumentPicker(documentPickerModule, options);
57
+ }
58
+ return await openDocumentByNewDocumentsPicker(documentPickerModule, options);
59
+ }
package/src/version.ts CHANGED
@@ -1,2 +1,2 @@
1
- const VERSION = '3.8.5';
1
+ const VERSION = '3.9.0';
2
2
  export default VERSION;