@sendbird/uikit-react-native 3.8.6 → 3.9.1
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/README.md +1 -1
- package/lib/commonjs/components/ChatFlatList/FlatListInternal.js +6 -10
- package/lib/commonjs/components/ChatFlatList/FlatListInternal.js.map +1 -1
- package/lib/commonjs/platform/createFileService.expo.js +16 -8
- package/lib/commonjs/platform/createFileService.expo.js.map +1 -1
- package/lib/commonjs/platform/createFileService.native.js +2 -20
- package/lib/commonjs/platform/createFileService.native.js.map +1 -1
- package/lib/commonjs/platform/openDocument.native.js +66 -0
- package/lib/commonjs/platform/openDocument.native.js.map +1 -0
- package/lib/commonjs/version.js +1 -1
- package/lib/commonjs/version.js.map +1 -1
- package/lib/module/components/ChatFlatList/FlatListInternal.js +6 -10
- package/lib/module/components/ChatFlatList/FlatListInternal.js.map +1 -1
- package/lib/module/platform/createFileService.expo.js +16 -8
- package/lib/module/platform/createFileService.expo.js.map +1 -1
- package/lib/module/platform/createFileService.native.js +2 -20
- package/lib/module/platform/createFileService.native.js.map +1 -1
- package/lib/module/platform/openDocument.native.js +59 -0
- package/lib/module/platform/openDocument.native.js.map +1 -0
- package/lib/module/version.js +1 -1
- package/lib/module/version.js.map +1 -1
- package/lib/typescript/src/components/ChatFlatList/FlatListInternal.d.ts +1 -17
- package/lib/typescript/src/containers/SendbirdUIKitContainer.d.ts +1 -1
- package/lib/typescript/src/platform/createFileService.native.d.ts +2 -2
- package/lib/typescript/src/platform/openDocument.native.d.ts +5 -0
- package/lib/typescript/src/version.d.ts +1 -1
- package/package.json +15 -6
- package/src/components/ChatFlatList/FlatListInternal.tsx +7 -24
- package/src/platform/createFileService.expo.ts +23 -8
- package/src/platform/createFileService.native.ts +9 -11
- package/src/platform/openDocument.native.ts +59 -0
- 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-
|
|
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
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
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","
|
|
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":[]}
|
|
@@ -24,12 +24,20 @@ const createExpoFileService = ({
|
|
|
24
24
|
const res = await imagePickerModule.requestCameraPermissionsAsync();
|
|
25
25
|
return (0, _expoPermissionGranted.default)([res]);
|
|
26
26
|
}
|
|
27
|
-
async
|
|
28
|
-
const perms = await imagePickerModule.getMediaLibraryPermissionsAsync(
|
|
27
|
+
async hasMediaLibraryReadPermission() {
|
|
28
|
+
const perms = await imagePickerModule.getMediaLibraryPermissionsAsync(false);
|
|
29
29
|
return (0, _expoPermissionGranted.default)([perms]);
|
|
30
30
|
}
|
|
31
|
-
async
|
|
32
|
-
const perms = await imagePickerModule.requestMediaLibraryPermissionsAsync(
|
|
31
|
+
async requestMediaLibraryReadPermission() {
|
|
32
|
+
const perms = await imagePickerModule.requestMediaLibraryPermissionsAsync(false);
|
|
33
|
+
return (0, _expoPermissionGranted.default)([perms]);
|
|
34
|
+
}
|
|
35
|
+
async hasMediaLibraryWritePermission() {
|
|
36
|
+
const perms = await mediaLibraryModule.getPermissionsAsync(true, []);
|
|
37
|
+
return (0, _expoPermissionGranted.default)([perms]);
|
|
38
|
+
}
|
|
39
|
+
async requestMediaLibraryWritePermission() {
|
|
40
|
+
const perms = await mediaLibraryModule.requestPermissionsAsync(true, []);
|
|
33
41
|
return (0, _expoPermissionGranted.default)([perms]);
|
|
34
42
|
}
|
|
35
43
|
async openCamera(options) {
|
|
@@ -61,9 +69,9 @@ const createExpoFileService = ({
|
|
|
61
69
|
return file;
|
|
62
70
|
}
|
|
63
71
|
async openMediaLibrary(options) {
|
|
64
|
-
const hasPermission = await this.
|
|
72
|
+
const hasPermission = await this.hasMediaLibraryReadPermission();
|
|
65
73
|
if (!hasPermission) {
|
|
66
|
-
const granted = await this.
|
|
74
|
+
const granted = await this.requestMediaLibraryReadPermission();
|
|
67
75
|
if (!granted) {
|
|
68
76
|
var _options$onOpenFailur2;
|
|
69
77
|
options === null || options === void 0 || (_options$onOpenFailur2 = options.onOpenFailure) === null || _options$onOpenFailur2 === void 0 || _options$onOpenFailur2.call(options, _SBUError.default.PERMISSIONS_DENIED);
|
|
@@ -104,9 +112,9 @@ const createExpoFileService = ({
|
|
|
104
112
|
}
|
|
105
113
|
}
|
|
106
114
|
async save(options) {
|
|
107
|
-
const hasPermission = await this.
|
|
115
|
+
const hasPermission = await this.hasMediaLibraryWritePermission();
|
|
108
116
|
if (!hasPermission) {
|
|
109
|
-
const granted = await this.
|
|
117
|
+
const granted = await this.requestMediaLibraryWritePermission();
|
|
110
118
|
if (!granted) throw new Error('Permission not granted');
|
|
111
119
|
}
|
|
112
120
|
const basePath = fsModule.documentDirectory || fsModule.cacheDirectory;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["_uikitUtils","require","_SBUError","_interopRequireDefault","_expoBackwardUtils","_expoPermissionGranted","e","__esModule","default","createExpoFileService","imagePickerModule","documentPickerModule","mediaLibraryModule","fsModule","ExpoFileServiceInterface","hasCameraPermission","res","getCameraPermissionsAsync","expoPermissionGranted","requestCameraPermission","requestCameraPermissionsAsync","hasMediaLibraryPermission","type","perms","getMediaLibraryPermissionsAsync","requestMediaLibraryPermission","requestMediaLibraryPermissionsAsync","openCamera","options","hasPermission","granted","_options$onOpenFailur","onOpenFailure","call","SBUError","PERMISSIONS_DENIED","response","launchCameraAsync","mediaTypes","mediaType","MediaTypeOptions","Images","Videos","All","expoBackwardUtils","imagePicker","isCanceled","file","toFilePickerResponses","openMediaLibrary","_options$onOpenFailur2","selectionLimit","launchImageLibraryAsync","openDocument","getDocumentAsync","documentPicker","_options$onOpenFailur3","UNKNOWN","save","Error","basePath","documentDirectory","cacheDirectory","downloadPath","fileName","downloadAsync","fileUrl","getFileType","fileType","match","saveToLibraryAsync","uri","createRecordFilePath","customExtension","filename","Date","now","recordFilePath","_default","exports"],"sources":["createFileService.expo.ts"],"sourcesContent":["import type * as ExpoDocumentPicker from 'expo-document-picker';\nimport type * as ExpoFs from 'expo-file-system';\nimport type * as ExpoImagePicker from 'expo-image-picker';\nimport type * as ExpoMediaLibrary from 'expo-media-library';\n\nimport { getFileType } from '@sendbird/uikit-utils';\n\nimport SBUError from '../libs/SBUError';\nimport expoBackwardUtils from '../utils/expoBackwardUtils';\nimport type { ExpoMediaLibraryPermissionResponse, ExpoPermissionResponse } from '../utils/expoPermissionGranted';\nimport expoPermissionGranted from '../utils/expoPermissionGranted';\nimport type {\n FilePickerResponse,\n FileServiceInterface,\n OpenCameraOptions,\n OpenDocumentOptions,\n OpenMediaLibraryOptions,\n SaveOptions,\n} from './types';\n\nconst createExpoFileService = ({\n imagePickerModule,\n documentPickerModule,\n mediaLibraryModule,\n fsModule,\n}: {\n imagePickerModule: typeof ExpoImagePicker;\n documentPickerModule: typeof ExpoDocumentPicker;\n mediaLibraryModule: typeof ExpoMediaLibrary;\n fsModule: typeof ExpoFs;\n}): FileServiceInterface => {\n class ExpoFileServiceInterface implements FileServiceInterface {\n async hasCameraPermission(): Promise<boolean> {\n const res = (await imagePickerModule.getCameraPermissionsAsync()) as ExpoPermissionResponse;\n return expoPermissionGranted([res]);\n }\n async requestCameraPermission(): Promise<boolean> {\n const res = (await imagePickerModule.requestCameraPermissionsAsync()) as ExpoPermissionResponse;\n return expoPermissionGranted([res]);\n }\n async hasMediaLibraryPermission(type: 'write' | 'read'): Promise<boolean> {\n const perms = (await imagePickerModule.getMediaLibraryPermissionsAsync(\n type === 'write',\n )) as ExpoMediaLibraryPermissionResponse;\n return expoPermissionGranted([perms]);\n }\n async requestMediaLibraryPermission(type: 'write' | 'read'): Promise<boolean> {\n const perms = (await imagePickerModule.requestMediaLibraryPermissionsAsync(\n type === 'write',\n )) as ExpoMediaLibraryPermissionResponse;\n return expoPermissionGranted([perms]);\n }\n\n async openCamera(options?: OpenCameraOptions): Promise<FilePickerResponse> {\n const hasPermission = await this.hasCameraPermission();\n if (!hasPermission) {\n const granted = await this.requestCameraPermission();\n if (!granted) {\n options?.onOpenFailure?.(SBUError.PERMISSIONS_DENIED);\n return null;\n }\n }\n\n const response = await imagePickerModule.launchCameraAsync({\n mediaTypes: (() => {\n switch (options?.mediaType) {\n case 'photo':\n return imagePickerModule.MediaTypeOptions.Images;\n case 'video':\n return imagePickerModule.MediaTypeOptions.Videos;\n case 'all':\n return imagePickerModule.MediaTypeOptions.All;\n default:\n return imagePickerModule.MediaTypeOptions.Images;\n }\n })(),\n });\n\n if (expoBackwardUtils.imagePicker.isCanceled(response)) return null;\n\n const [file] = await expoBackwardUtils.imagePicker.toFilePickerResponses(response, fsModule);\n return file;\n }\n async openMediaLibrary(options: OpenMediaLibraryOptions) {\n const hasPermission = await this.hasMediaLibraryPermission('read');\n if (!hasPermission) {\n const granted = await this.requestMediaLibraryPermission('read');\n if (!granted) {\n options?.onOpenFailure?.(SBUError.PERMISSIONS_DENIED);\n return null;\n }\n }\n\n const selectionLimit = options?.selectionLimit || 1;\n const response = await imagePickerModule.launchImageLibraryAsync({\n selectionLimit,\n mediaTypes: (() => {\n switch (options?.mediaType) {\n case 'photo':\n return imagePickerModule.MediaTypeOptions.Images;\n case 'video':\n return imagePickerModule.MediaTypeOptions.Videos;\n case 'all':\n return imagePickerModule.MediaTypeOptions.All;\n default:\n return imagePickerModule.MediaTypeOptions.Images;\n }\n })(),\n });\n if (expoBackwardUtils.imagePicker.isCanceled(response)) return null;\n return expoBackwardUtils.imagePicker.toFilePickerResponses(response, fsModule);\n }\n\n async openDocument(options?: OpenDocumentOptions): Promise<FilePickerResponse> {\n try {\n const response = await documentPickerModule.getDocumentAsync({ type: '*/*' });\n if (expoBackwardUtils.documentPicker.isCanceled(response)) return null;\n\n const [file] = await expoBackwardUtils.documentPicker.toFilePickerResponses(response);\n return file;\n } catch (e) {\n options?.onOpenFailure?.(SBUError.UNKNOWN, e);\n return null;\n }\n }\n\n async save(options: SaveOptions): Promise<string> {\n const hasPermission = await this.hasMediaLibraryPermission('write');\n if (!hasPermission) {\n const granted = await this.requestMediaLibraryPermission('write');\n if (!granted) throw new Error('Permission not granted');\n }\n\n const basePath = fsModule.documentDirectory || fsModule.cacheDirectory;\n if (!basePath) throw new Error('Cannot determine directory');\n\n const downloadPath = `${basePath}/${options.fileName}`;\n\n const response = await fsModule.downloadAsync(options.fileUrl, downloadPath);\n if (getFileType(options.fileType || '').match(/video|image/)) {\n await mediaLibraryModule.saveToLibraryAsync(response.uri);\n }\n return response.uri;\n }\n createRecordFilePath(customExtension = 'm4a'): { recordFilePath: string; uri: string } {\n const basePath = fsModule.cacheDirectory;\n if (!basePath) throw new Error('Cannot determine directory');\n\n const filename = `record-${Date.now()}.${customExtension}`;\n return {\n uri: `${basePath}/${filename}`,\n recordFilePath: `${basePath}/${filename}`,\n };\n }\n }\n\n return new ExpoFileServiceInterface();\n};\n\nexport default createExpoFileService;\n"],"mappings":"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","ignoreList":[]}
|
|
1
|
+
{"version":3,"names":["_uikitUtils","require","_SBUError","_interopRequireDefault","_expoBackwardUtils","_expoPermissionGranted","e","__esModule","default","createExpoFileService","imagePickerModule","documentPickerModule","mediaLibraryModule","fsModule","ExpoFileServiceInterface","hasCameraPermission","res","getCameraPermissionsAsync","expoPermissionGranted","requestCameraPermission","requestCameraPermissionsAsync","hasMediaLibraryReadPermission","perms","getMediaLibraryPermissionsAsync","requestMediaLibraryReadPermission","requestMediaLibraryPermissionsAsync","hasMediaLibraryWritePermission","getPermissionsAsync","requestMediaLibraryWritePermission","requestPermissionsAsync","openCamera","options","hasPermission","granted","_options$onOpenFailur","onOpenFailure","call","SBUError","PERMISSIONS_DENIED","response","launchCameraAsync","mediaTypes","mediaType","MediaTypeOptions","Images","Videos","All","expoBackwardUtils","imagePicker","isCanceled","file","toFilePickerResponses","openMediaLibrary","_options$onOpenFailur2","selectionLimit","launchImageLibraryAsync","openDocument","getDocumentAsync","type","documentPicker","_options$onOpenFailur3","UNKNOWN","save","Error","basePath","documentDirectory","cacheDirectory","downloadPath","fileName","downloadAsync","fileUrl","getFileType","fileType","match","saveToLibraryAsync","uri","createRecordFilePath","customExtension","filename","Date","now","recordFilePath","_default","exports"],"sources":["createFileService.expo.ts"],"sourcesContent":["import type * as ExpoDocumentPicker from 'expo-document-picker';\nimport type * as ExpoFs from 'expo-file-system';\nimport type * as ExpoImagePicker from 'expo-image-picker';\nimport type * as ExpoMediaLibrary from 'expo-media-library';\n\nimport { getFileType } from '@sendbird/uikit-utils';\n\nimport SBUError from '../libs/SBUError';\nimport expoBackwardUtils from '../utils/expoBackwardUtils';\nimport type { ExpoMediaLibraryPermissionResponse, ExpoPermissionResponse } from '../utils/expoPermissionGranted';\nimport expoPermissionGranted from '../utils/expoPermissionGranted';\nimport type {\n FilePickerResponse,\n FileServiceInterface,\n OpenCameraOptions,\n OpenDocumentOptions,\n OpenMediaLibraryOptions,\n SaveOptions,\n} from './types';\n\nconst createExpoFileService = ({\n imagePickerModule,\n documentPickerModule,\n mediaLibraryModule,\n fsModule,\n}: {\n imagePickerModule: typeof ExpoImagePicker;\n documentPickerModule: typeof ExpoDocumentPicker;\n mediaLibraryModule: typeof ExpoMediaLibrary;\n fsModule: typeof ExpoFs;\n}): FileServiceInterface => {\n class ExpoFileServiceInterface implements FileServiceInterface {\n async hasCameraPermission(): Promise<boolean> {\n const res = (await imagePickerModule.getCameraPermissionsAsync()) as ExpoPermissionResponse;\n return expoPermissionGranted([res]);\n }\n\n async requestCameraPermission(): Promise<boolean> {\n const res = (await imagePickerModule.requestCameraPermissionsAsync()) as ExpoPermissionResponse;\n return expoPermissionGranted([res]);\n }\n\n async hasMediaLibraryReadPermission(): Promise<boolean> {\n const perms = (await imagePickerModule.getMediaLibraryPermissionsAsync(\n false,\n )) as ExpoMediaLibraryPermissionResponse;\n return expoPermissionGranted([perms]);\n }\n\n async requestMediaLibraryReadPermission(): Promise<boolean> {\n const perms = (await imagePickerModule.requestMediaLibraryPermissionsAsync(\n false,\n )) as ExpoMediaLibraryPermissionResponse;\n return expoPermissionGranted([perms]);\n }\n\n async hasMediaLibraryWritePermission(): Promise<boolean> {\n const perms = (await mediaLibraryModule.getPermissionsAsync(true, [])) as ExpoMediaLibraryPermissionResponse;\n return expoPermissionGranted([perms]);\n }\n\n async requestMediaLibraryWritePermission(): Promise<boolean> {\n const perms = (await mediaLibraryModule.requestPermissionsAsync(true, [])) as ExpoMediaLibraryPermissionResponse;\n return expoPermissionGranted([perms]);\n }\n\n async openCamera(options?: OpenCameraOptions): Promise<FilePickerResponse> {\n const hasPermission = await this.hasCameraPermission();\n if (!hasPermission) {\n const granted = await this.requestCameraPermission();\n if (!granted) {\n options?.onOpenFailure?.(SBUError.PERMISSIONS_DENIED);\n return null;\n }\n }\n\n const response = await imagePickerModule.launchCameraAsync({\n mediaTypes: (() => {\n switch (options?.mediaType) {\n case 'photo':\n return imagePickerModule.MediaTypeOptions.Images;\n case 'video':\n return imagePickerModule.MediaTypeOptions.Videos;\n case 'all':\n return imagePickerModule.MediaTypeOptions.All;\n default:\n return imagePickerModule.MediaTypeOptions.Images;\n }\n })(),\n });\n\n if (expoBackwardUtils.imagePicker.isCanceled(response)) return null;\n\n const [file] = await expoBackwardUtils.imagePicker.toFilePickerResponses(response, fsModule);\n return file;\n }\n\n async openMediaLibrary(options: OpenMediaLibraryOptions) {\n const hasPermission = await this.hasMediaLibraryReadPermission();\n if (!hasPermission) {\n const granted = await this.requestMediaLibraryReadPermission();\n if (!granted) {\n options?.onOpenFailure?.(SBUError.PERMISSIONS_DENIED);\n return null;\n }\n }\n\n const selectionLimit = options?.selectionLimit || 1;\n const response = await imagePickerModule.launchImageLibraryAsync({\n selectionLimit,\n mediaTypes: (() => {\n switch (options?.mediaType) {\n case 'photo':\n return imagePickerModule.MediaTypeOptions.Images;\n case 'video':\n return imagePickerModule.MediaTypeOptions.Videos;\n case 'all':\n return imagePickerModule.MediaTypeOptions.All;\n default:\n return imagePickerModule.MediaTypeOptions.Images;\n }\n })(),\n });\n if (expoBackwardUtils.imagePicker.isCanceled(response)) return null;\n return expoBackwardUtils.imagePicker.toFilePickerResponses(response, fsModule);\n }\n\n async openDocument(options?: OpenDocumentOptions): Promise<FilePickerResponse> {\n try {\n const response = await documentPickerModule.getDocumentAsync({ type: '*/*' });\n if (expoBackwardUtils.documentPicker.isCanceled(response)) return null;\n\n const [file] = await expoBackwardUtils.documentPicker.toFilePickerResponses(response);\n return file;\n } catch (e) {\n options?.onOpenFailure?.(SBUError.UNKNOWN, e);\n return null;\n }\n }\n\n async save(options: SaveOptions): Promise<string> {\n const hasPermission = await this.hasMediaLibraryWritePermission();\n if (!hasPermission) {\n const granted = await this.requestMediaLibraryWritePermission();\n if (!granted) throw new Error('Permission not granted');\n }\n\n const basePath = fsModule.documentDirectory || fsModule.cacheDirectory;\n if (!basePath) throw new Error('Cannot determine directory');\n\n const downloadPath = `${basePath}/${options.fileName}`;\n\n const response = await fsModule.downloadAsync(options.fileUrl, downloadPath);\n if (getFileType(options.fileType || '').match(/video|image/)) {\n await mediaLibraryModule.saveToLibraryAsync(response.uri);\n }\n return response.uri;\n }\n\n createRecordFilePath(customExtension = 'm4a'): { recordFilePath: string; uri: string } {\n const basePath = fsModule.cacheDirectory;\n if (!basePath) throw new Error('Cannot determine directory');\n\n const filename = `record-${Date.now()}.${customExtension}`;\n return {\n uri: `${basePath}/${filename}`,\n recordFilePath: `${basePath}/${filename}`,\n };\n }\n }\n\n return new ExpoFileServiceInterface();\n};\n\nexport default createExpoFileService;\n"],"mappings":"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","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 + ""; }
|
|
@@ -194,26 +195,7 @@ const createNativeFileService = ({
|
|
|
194
195
|
})));
|
|
195
196
|
}
|
|
196
197
|
async openDocument(options) {
|
|
197
|
-
|
|
198
|
-
const {
|
|
199
|
-
uri,
|
|
200
|
-
size,
|
|
201
|
-
name,
|
|
202
|
-
type
|
|
203
|
-
} = await documentPickerModule.pickSingle();
|
|
204
|
-
return (0, _normalizeFile.default)({
|
|
205
|
-
uri,
|
|
206
|
-
size,
|
|
207
|
-
name,
|
|
208
|
-
type
|
|
209
|
-
});
|
|
210
|
-
} catch (e) {
|
|
211
|
-
if (!documentPickerModule.isCancel(e) && documentPickerModule.isInProgress(e)) {
|
|
212
|
-
var _options$onOpenFailur5;
|
|
213
|
-
options === null || options === void 0 || (_options$onOpenFailur5 = options.onOpenFailure) === null || _options$onOpenFailur5 === void 0 || _options$onOpenFailur5.call(options, _SBUError.default.UNKNOWN, e);
|
|
214
|
-
}
|
|
215
|
-
return null;
|
|
216
|
-
}
|
|
198
|
+
return await (0, _openDocument.openDocument)(documentPickerModule, options);
|
|
217
199
|
}
|
|
218
200
|
async save(options) {
|
|
219
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","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","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 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 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 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":[]}
|
package/lib/commonjs/version.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["VERSION","_default","exports","default"],"sources":["version.ts"],"sourcesContent":["const VERSION = '3.
|
|
1
|
+
{"version":3,"names":["VERSION","_default","exports","default"],"sources":["version.ts"],"sourcesContent":["const VERSION = '3.9.1';\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
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
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","
|
|
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":[]}
|
|
@@ -17,12 +17,20 @@ const createExpoFileService = ({
|
|
|
17
17
|
const res = await imagePickerModule.requestCameraPermissionsAsync();
|
|
18
18
|
return expoPermissionGranted([res]);
|
|
19
19
|
}
|
|
20
|
-
async
|
|
21
|
-
const perms = await imagePickerModule.getMediaLibraryPermissionsAsync(
|
|
20
|
+
async hasMediaLibraryReadPermission() {
|
|
21
|
+
const perms = await imagePickerModule.getMediaLibraryPermissionsAsync(false);
|
|
22
22
|
return expoPermissionGranted([perms]);
|
|
23
23
|
}
|
|
24
|
-
async
|
|
25
|
-
const perms = await imagePickerModule.requestMediaLibraryPermissionsAsync(
|
|
24
|
+
async requestMediaLibraryReadPermission() {
|
|
25
|
+
const perms = await imagePickerModule.requestMediaLibraryPermissionsAsync(false);
|
|
26
|
+
return expoPermissionGranted([perms]);
|
|
27
|
+
}
|
|
28
|
+
async hasMediaLibraryWritePermission() {
|
|
29
|
+
const perms = await mediaLibraryModule.getPermissionsAsync(true, []);
|
|
30
|
+
return expoPermissionGranted([perms]);
|
|
31
|
+
}
|
|
32
|
+
async requestMediaLibraryWritePermission() {
|
|
33
|
+
const perms = await mediaLibraryModule.requestPermissionsAsync(true, []);
|
|
26
34
|
return expoPermissionGranted([perms]);
|
|
27
35
|
}
|
|
28
36
|
async openCamera(options) {
|
|
@@ -54,9 +62,9 @@ const createExpoFileService = ({
|
|
|
54
62
|
return file;
|
|
55
63
|
}
|
|
56
64
|
async openMediaLibrary(options) {
|
|
57
|
-
const hasPermission = await this.
|
|
65
|
+
const hasPermission = await this.hasMediaLibraryReadPermission();
|
|
58
66
|
if (!hasPermission) {
|
|
59
|
-
const granted = await this.
|
|
67
|
+
const granted = await this.requestMediaLibraryReadPermission();
|
|
60
68
|
if (!granted) {
|
|
61
69
|
var _options$onOpenFailur2;
|
|
62
70
|
options === null || options === void 0 || (_options$onOpenFailur2 = options.onOpenFailure) === null || _options$onOpenFailur2 === void 0 || _options$onOpenFailur2.call(options, SBUError.PERMISSIONS_DENIED);
|
|
@@ -97,9 +105,9 @@ const createExpoFileService = ({
|
|
|
97
105
|
}
|
|
98
106
|
}
|
|
99
107
|
async save(options) {
|
|
100
|
-
const hasPermission = await this.
|
|
108
|
+
const hasPermission = await this.hasMediaLibraryWritePermission();
|
|
101
109
|
if (!hasPermission) {
|
|
102
|
-
const granted = await this.
|
|
110
|
+
const granted = await this.requestMediaLibraryWritePermission();
|
|
103
111
|
if (!granted) throw new Error('Permission not granted');
|
|
104
112
|
}
|
|
105
113
|
const basePath = fsModule.documentDirectory || fsModule.cacheDirectory;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["getFileType","SBUError","expoBackwardUtils","expoPermissionGranted","createExpoFileService","imagePickerModule","documentPickerModule","mediaLibraryModule","fsModule","ExpoFileServiceInterface","hasCameraPermission","res","getCameraPermissionsAsync","requestCameraPermission","requestCameraPermissionsAsync","hasMediaLibraryPermission","type","perms","getMediaLibraryPermissionsAsync","requestMediaLibraryPermission","requestMediaLibraryPermissionsAsync","openCamera","options","hasPermission","granted","_options$onOpenFailur","onOpenFailure","call","PERMISSIONS_DENIED","response","launchCameraAsync","mediaTypes","mediaType","MediaTypeOptions","Images","Videos","All","imagePicker","isCanceled","file","toFilePickerResponses","openMediaLibrary","_options$onOpenFailur2","selectionLimit","launchImageLibraryAsync","openDocument","getDocumentAsync","documentPicker","e","_options$onOpenFailur3","UNKNOWN","save","Error","basePath","documentDirectory","cacheDirectory","downloadPath","fileName","downloadAsync","fileUrl","fileType","match","saveToLibraryAsync","uri","createRecordFilePath","customExtension","filename","Date","now","recordFilePath"],"sources":["createFileService.expo.ts"],"sourcesContent":["import type * as ExpoDocumentPicker from 'expo-document-picker';\nimport type * as ExpoFs from 'expo-file-system';\nimport type * as ExpoImagePicker from 'expo-image-picker';\nimport type * as ExpoMediaLibrary from 'expo-media-library';\n\nimport { getFileType } from '@sendbird/uikit-utils';\n\nimport SBUError from '../libs/SBUError';\nimport expoBackwardUtils from '../utils/expoBackwardUtils';\nimport type { ExpoMediaLibraryPermissionResponse, ExpoPermissionResponse } from '../utils/expoPermissionGranted';\nimport expoPermissionGranted from '../utils/expoPermissionGranted';\nimport type {\n FilePickerResponse,\n FileServiceInterface,\n OpenCameraOptions,\n OpenDocumentOptions,\n OpenMediaLibraryOptions,\n SaveOptions,\n} from './types';\n\nconst createExpoFileService = ({\n imagePickerModule,\n documentPickerModule,\n mediaLibraryModule,\n fsModule,\n}: {\n imagePickerModule: typeof ExpoImagePicker;\n documentPickerModule: typeof ExpoDocumentPicker;\n mediaLibraryModule: typeof ExpoMediaLibrary;\n fsModule: typeof ExpoFs;\n}): FileServiceInterface => {\n class ExpoFileServiceInterface implements FileServiceInterface {\n async hasCameraPermission(): Promise<boolean> {\n const res = (await imagePickerModule.getCameraPermissionsAsync()) as ExpoPermissionResponse;\n return expoPermissionGranted([res]);\n }\n async requestCameraPermission(): Promise<boolean> {\n const res = (await imagePickerModule.requestCameraPermissionsAsync()) as ExpoPermissionResponse;\n return expoPermissionGranted([res]);\n }\n async hasMediaLibraryPermission(type: 'write' | 'read'): Promise<boolean> {\n const perms = (await imagePickerModule.getMediaLibraryPermissionsAsync(\n type === 'write',\n )) as ExpoMediaLibraryPermissionResponse;\n return expoPermissionGranted([perms]);\n }\n async requestMediaLibraryPermission(type: 'write' | 'read'): Promise<boolean> {\n const perms = (await imagePickerModule.requestMediaLibraryPermissionsAsync(\n type === 'write',\n )) as ExpoMediaLibraryPermissionResponse;\n return expoPermissionGranted([perms]);\n }\n\n async openCamera(options?: OpenCameraOptions): Promise<FilePickerResponse> {\n const hasPermission = await this.hasCameraPermission();\n if (!hasPermission) {\n const granted = await this.requestCameraPermission();\n if (!granted) {\n options?.onOpenFailure?.(SBUError.PERMISSIONS_DENIED);\n return null;\n }\n }\n\n const response = await imagePickerModule.launchCameraAsync({\n mediaTypes: (() => {\n switch (options?.mediaType) {\n case 'photo':\n return imagePickerModule.MediaTypeOptions.Images;\n case 'video':\n return imagePickerModule.MediaTypeOptions.Videos;\n case 'all':\n return imagePickerModule.MediaTypeOptions.All;\n default:\n return imagePickerModule.MediaTypeOptions.Images;\n }\n })(),\n });\n\n if (expoBackwardUtils.imagePicker.isCanceled(response)) return null;\n\n const [file] = await expoBackwardUtils.imagePicker.toFilePickerResponses(response, fsModule);\n return file;\n }\n async openMediaLibrary(options: OpenMediaLibraryOptions) {\n const hasPermission = await this.hasMediaLibraryPermission('read');\n if (!hasPermission) {\n const granted = await this.requestMediaLibraryPermission('read');\n if (!granted) {\n options?.onOpenFailure?.(SBUError.PERMISSIONS_DENIED);\n return null;\n }\n }\n\n const selectionLimit = options?.selectionLimit || 1;\n const response = await imagePickerModule.launchImageLibraryAsync({\n selectionLimit,\n mediaTypes: (() => {\n switch (options?.mediaType) {\n case 'photo':\n return imagePickerModule.MediaTypeOptions.Images;\n case 'video':\n return imagePickerModule.MediaTypeOptions.Videos;\n case 'all':\n return imagePickerModule.MediaTypeOptions.All;\n default:\n return imagePickerModule.MediaTypeOptions.Images;\n }\n })(),\n });\n if (expoBackwardUtils.imagePicker.isCanceled(response)) return null;\n return expoBackwardUtils.imagePicker.toFilePickerResponses(response, fsModule);\n }\n\n async openDocument(options?: OpenDocumentOptions): Promise<FilePickerResponse> {\n try {\n const response = await documentPickerModule.getDocumentAsync({ type: '*/*' });\n if (expoBackwardUtils.documentPicker.isCanceled(response)) return null;\n\n const [file] = await expoBackwardUtils.documentPicker.toFilePickerResponses(response);\n return file;\n } catch (e) {\n options?.onOpenFailure?.(SBUError.UNKNOWN, e);\n return null;\n }\n }\n\n async save(options: SaveOptions): Promise<string> {\n const hasPermission = await this.hasMediaLibraryPermission('write');\n if (!hasPermission) {\n const granted = await this.requestMediaLibraryPermission('write');\n if (!granted) throw new Error('Permission not granted');\n }\n\n const basePath = fsModule.documentDirectory || fsModule.cacheDirectory;\n if (!basePath) throw new Error('Cannot determine directory');\n\n const downloadPath = `${basePath}/${options.fileName}`;\n\n const response = await fsModule.downloadAsync(options.fileUrl, downloadPath);\n if (getFileType(options.fileType || '').match(/video|image/)) {\n await mediaLibraryModule.saveToLibraryAsync(response.uri);\n }\n return response.uri;\n }\n createRecordFilePath(customExtension = 'm4a'): { recordFilePath: string; uri: string } {\n const basePath = fsModule.cacheDirectory;\n if (!basePath) throw new Error('Cannot determine directory');\n\n const filename = `record-${Date.now()}.${customExtension}`;\n return {\n uri: `${basePath}/${filename}`,\n recordFilePath: `${basePath}/${filename}`,\n };\n }\n }\n\n return new ExpoFileServiceInterface();\n};\n\nexport default createExpoFileService;\n"],"mappings":"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","ignoreList":[]}
|
|
1
|
+
{"version":3,"names":["getFileType","SBUError","expoBackwardUtils","expoPermissionGranted","createExpoFileService","imagePickerModule","documentPickerModule","mediaLibraryModule","fsModule","ExpoFileServiceInterface","hasCameraPermission","res","getCameraPermissionsAsync","requestCameraPermission","requestCameraPermissionsAsync","hasMediaLibraryReadPermission","perms","getMediaLibraryPermissionsAsync","requestMediaLibraryReadPermission","requestMediaLibraryPermissionsAsync","hasMediaLibraryWritePermission","getPermissionsAsync","requestMediaLibraryWritePermission","requestPermissionsAsync","openCamera","options","hasPermission","granted","_options$onOpenFailur","onOpenFailure","call","PERMISSIONS_DENIED","response","launchCameraAsync","mediaTypes","mediaType","MediaTypeOptions","Images","Videos","All","imagePicker","isCanceled","file","toFilePickerResponses","openMediaLibrary","_options$onOpenFailur2","selectionLimit","launchImageLibraryAsync","openDocument","getDocumentAsync","type","documentPicker","e","_options$onOpenFailur3","UNKNOWN","save","Error","basePath","documentDirectory","cacheDirectory","downloadPath","fileName","downloadAsync","fileUrl","fileType","match","saveToLibraryAsync","uri","createRecordFilePath","customExtension","filename","Date","now","recordFilePath"],"sources":["createFileService.expo.ts"],"sourcesContent":["import type * as ExpoDocumentPicker from 'expo-document-picker';\nimport type * as ExpoFs from 'expo-file-system';\nimport type * as ExpoImagePicker from 'expo-image-picker';\nimport type * as ExpoMediaLibrary from 'expo-media-library';\n\nimport { getFileType } from '@sendbird/uikit-utils';\n\nimport SBUError from '../libs/SBUError';\nimport expoBackwardUtils from '../utils/expoBackwardUtils';\nimport type { ExpoMediaLibraryPermissionResponse, ExpoPermissionResponse } from '../utils/expoPermissionGranted';\nimport expoPermissionGranted from '../utils/expoPermissionGranted';\nimport type {\n FilePickerResponse,\n FileServiceInterface,\n OpenCameraOptions,\n OpenDocumentOptions,\n OpenMediaLibraryOptions,\n SaveOptions,\n} from './types';\n\nconst createExpoFileService = ({\n imagePickerModule,\n documentPickerModule,\n mediaLibraryModule,\n fsModule,\n}: {\n imagePickerModule: typeof ExpoImagePicker;\n documentPickerModule: typeof ExpoDocumentPicker;\n mediaLibraryModule: typeof ExpoMediaLibrary;\n fsModule: typeof ExpoFs;\n}): FileServiceInterface => {\n class ExpoFileServiceInterface implements FileServiceInterface {\n async hasCameraPermission(): Promise<boolean> {\n const res = (await imagePickerModule.getCameraPermissionsAsync()) as ExpoPermissionResponse;\n return expoPermissionGranted([res]);\n }\n\n async requestCameraPermission(): Promise<boolean> {\n const res = (await imagePickerModule.requestCameraPermissionsAsync()) as ExpoPermissionResponse;\n return expoPermissionGranted([res]);\n }\n\n async hasMediaLibraryReadPermission(): Promise<boolean> {\n const perms = (await imagePickerModule.getMediaLibraryPermissionsAsync(\n false,\n )) as ExpoMediaLibraryPermissionResponse;\n return expoPermissionGranted([perms]);\n }\n\n async requestMediaLibraryReadPermission(): Promise<boolean> {\n const perms = (await imagePickerModule.requestMediaLibraryPermissionsAsync(\n false,\n )) as ExpoMediaLibraryPermissionResponse;\n return expoPermissionGranted([perms]);\n }\n\n async hasMediaLibraryWritePermission(): Promise<boolean> {\n const perms = (await mediaLibraryModule.getPermissionsAsync(true, [])) as ExpoMediaLibraryPermissionResponse;\n return expoPermissionGranted([perms]);\n }\n\n async requestMediaLibraryWritePermission(): Promise<boolean> {\n const perms = (await mediaLibraryModule.requestPermissionsAsync(true, [])) as ExpoMediaLibraryPermissionResponse;\n return expoPermissionGranted([perms]);\n }\n\n async openCamera(options?: OpenCameraOptions): Promise<FilePickerResponse> {\n const hasPermission = await this.hasCameraPermission();\n if (!hasPermission) {\n const granted = await this.requestCameraPermission();\n if (!granted) {\n options?.onOpenFailure?.(SBUError.PERMISSIONS_DENIED);\n return null;\n }\n }\n\n const response = await imagePickerModule.launchCameraAsync({\n mediaTypes: (() => {\n switch (options?.mediaType) {\n case 'photo':\n return imagePickerModule.MediaTypeOptions.Images;\n case 'video':\n return imagePickerModule.MediaTypeOptions.Videos;\n case 'all':\n return imagePickerModule.MediaTypeOptions.All;\n default:\n return imagePickerModule.MediaTypeOptions.Images;\n }\n })(),\n });\n\n if (expoBackwardUtils.imagePicker.isCanceled(response)) return null;\n\n const [file] = await expoBackwardUtils.imagePicker.toFilePickerResponses(response, fsModule);\n return file;\n }\n\n async openMediaLibrary(options: OpenMediaLibraryOptions) {\n const hasPermission = await this.hasMediaLibraryReadPermission();\n if (!hasPermission) {\n const granted = await this.requestMediaLibraryReadPermission();\n if (!granted) {\n options?.onOpenFailure?.(SBUError.PERMISSIONS_DENIED);\n return null;\n }\n }\n\n const selectionLimit = options?.selectionLimit || 1;\n const response = await imagePickerModule.launchImageLibraryAsync({\n selectionLimit,\n mediaTypes: (() => {\n switch (options?.mediaType) {\n case 'photo':\n return imagePickerModule.MediaTypeOptions.Images;\n case 'video':\n return imagePickerModule.MediaTypeOptions.Videos;\n case 'all':\n return imagePickerModule.MediaTypeOptions.All;\n default:\n return imagePickerModule.MediaTypeOptions.Images;\n }\n })(),\n });\n if (expoBackwardUtils.imagePicker.isCanceled(response)) return null;\n return expoBackwardUtils.imagePicker.toFilePickerResponses(response, fsModule);\n }\n\n async openDocument(options?: OpenDocumentOptions): Promise<FilePickerResponse> {\n try {\n const response = await documentPickerModule.getDocumentAsync({ type: '*/*' });\n if (expoBackwardUtils.documentPicker.isCanceled(response)) return null;\n\n const [file] = await expoBackwardUtils.documentPicker.toFilePickerResponses(response);\n return file;\n } catch (e) {\n options?.onOpenFailure?.(SBUError.UNKNOWN, e);\n return null;\n }\n }\n\n async save(options: SaveOptions): Promise<string> {\n const hasPermission = await this.hasMediaLibraryWritePermission();\n if (!hasPermission) {\n const granted = await this.requestMediaLibraryWritePermission();\n if (!granted) throw new Error('Permission not granted');\n }\n\n const basePath = fsModule.documentDirectory || fsModule.cacheDirectory;\n if (!basePath) throw new Error('Cannot determine directory');\n\n const downloadPath = `${basePath}/${options.fileName}`;\n\n const response = await fsModule.downloadAsync(options.fileUrl, downloadPath);\n if (getFileType(options.fileType || '').match(/video|image/)) {\n await mediaLibraryModule.saveToLibraryAsync(response.uri);\n }\n return response.uri;\n }\n\n createRecordFilePath(customExtension = 'm4a'): { recordFilePath: string; uri: string } {\n const basePath = fsModule.cacheDirectory;\n if (!basePath) throw new Error('Cannot determine directory');\n\n const filename = `record-${Date.now()}.${customExtension}`;\n return {\n uri: `${basePath}/${filename}`,\n recordFilePath: `${basePath}/${filename}`,\n };\n }\n }\n\n return new ExpoFileServiceInterface();\n};\n\nexport default createExpoFileService;\n"],"mappings":"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","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) {
|
|
@@ -187,26 +188,7 @@ const createNativeFileService = ({
|
|
|
187
188
|
})));
|
|
188
189
|
}
|
|
189
190
|
async openDocument(options) {
|
|
190
|
-
|
|
191
|
-
const {
|
|
192
|
-
uri,
|
|
193
|
-
size,
|
|
194
|
-
name,
|
|
195
|
-
type
|
|
196
|
-
} = await documentPickerModule.pickSingle();
|
|
197
|
-
return normalizeFile({
|
|
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.UNKNOWN, e);
|
|
207
|
-
}
|
|
208
|
-
return null;
|
|
209
|
-
}
|
|
191
|
+
return await openDocument(documentPickerModule, options);
|
|
210
192
|
}
|
|
211
193
|
async save(options) {
|
|
212
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","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","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 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 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 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":[]}
|
package/lib/module/version.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["VERSION"],"sources":["version.ts"],"sourcesContent":["const VERSION = '3.
|
|
1
|
+
{"version":3,"names":["VERSION"],"sources":["version.ts"],"sourcesContent":["const VERSION = '3.9.1';\nexport default VERSION;\n"],"mappings":"AAAA,MAAMA,OAAO,GAAG,OAAO;AACvB,eAAeA,OAAO","ignoreList":[]}
|
|
@@ -1,18 +1,2 @@
|
|
|
1
|
-
|
|
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.
|
|
17
|
+
VERSION: "3.9.1";
|
|
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:
|
|
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.
|
|
1
|
+
declare const VERSION = "3.9.1";
|
|
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.
|
|
3
|
+
"version": "3.9.1",
|
|
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.
|
|
64
|
-
"@sendbird/uikit-react-native-foundation": "3.
|
|
63
|
+
"@sendbird/uikit-chat-hooks": "3.9.1",
|
|
64
|
+
"@sendbird/uikit-react-native-foundation": "3.9.1",
|
|
65
65
|
"@sendbird/uikit-tools": "0.0.1-alpha.77",
|
|
66
|
-
"@sendbird/uikit-utils": "3.
|
|
66
|
+
"@sendbird/uikit-utils": "3.9.1"
|
|
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": "*",
|
|
@@ -82,7 +83,7 @@
|
|
|
82
83
|
"expo-file-system": "^15.2.2",
|
|
83
84
|
"expo-image-manipulator": "^11.1.1",
|
|
84
85
|
"expo-image-picker": "^14.1.1",
|
|
85
|
-
"expo-media-library": "^
|
|
86
|
+
"expo-media-library": "^16.0.0",
|
|
86
87
|
"expo-notifications": "^0.18.1",
|
|
87
88
|
"expo-video-thumbnails": "^7.2.1",
|
|
88
89
|
"glob": "^7.2.0",
|
|
@@ -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": "*",
|
|
@@ -118,6 +120,7 @@
|
|
|
118
120
|
"expo-file-system": ">=13.1.4",
|
|
119
121
|
"expo-image-manipulator": ">=11.0.0",
|
|
120
122
|
"expo-image-picker": ">=12.0.2",
|
|
123
|
+
"expo-media-library": ">=16.0.0",
|
|
121
124
|
"expo-notifications": ">=0.14.1",
|
|
122
125
|
"expo-video-thumbnails": ">=6.4.0",
|
|
123
126
|
"react": ">=17.0.2",
|
|
@@ -145,6 +148,9 @@
|
|
|
145
148
|
"@react-native-clipboard/clipboard": {
|
|
146
149
|
"optional": true
|
|
147
150
|
},
|
|
151
|
+
"@react-native-documents/picker": {
|
|
152
|
+
"optional": true
|
|
153
|
+
},
|
|
148
154
|
"@react-native-firebase/messaging": {
|
|
149
155
|
"optional": true
|
|
150
156
|
},
|
|
@@ -172,6 +178,9 @@
|
|
|
172
178
|
"expo-notifications": {
|
|
173
179
|
"optional": true
|
|
174
180
|
},
|
|
181
|
+
"expo-media-library": {
|
|
182
|
+
"optional": true
|
|
183
|
+
},
|
|
175
184
|
"expo-video-thumbnails": {
|
|
176
185
|
"optional": true
|
|
177
186
|
},
|
|
@@ -208,5 +217,5 @@
|
|
|
208
217
|
]
|
|
209
218
|
]
|
|
210
219
|
},
|
|
211
|
-
"gitHead": "
|
|
220
|
+
"gitHead": "83e3acf677236ee37a3608fdd32e283b62d87bbf"
|
|
212
221
|
}
|
|
@@ -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
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
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;
|
|
@@ -34,23 +34,36 @@ const createExpoFileService = ({
|
|
|
34
34
|
const res = (await imagePickerModule.getCameraPermissionsAsync()) as ExpoPermissionResponse;
|
|
35
35
|
return expoPermissionGranted([res]);
|
|
36
36
|
}
|
|
37
|
+
|
|
37
38
|
async requestCameraPermission(): Promise<boolean> {
|
|
38
39
|
const res = (await imagePickerModule.requestCameraPermissionsAsync()) as ExpoPermissionResponse;
|
|
39
40
|
return expoPermissionGranted([res]);
|
|
40
41
|
}
|
|
41
|
-
|
|
42
|
+
|
|
43
|
+
async hasMediaLibraryReadPermission(): Promise<boolean> {
|
|
42
44
|
const perms = (await imagePickerModule.getMediaLibraryPermissionsAsync(
|
|
43
|
-
|
|
45
|
+
false,
|
|
44
46
|
)) as ExpoMediaLibraryPermissionResponse;
|
|
45
47
|
return expoPermissionGranted([perms]);
|
|
46
48
|
}
|
|
47
|
-
|
|
49
|
+
|
|
50
|
+
async requestMediaLibraryReadPermission(): Promise<boolean> {
|
|
48
51
|
const perms = (await imagePickerModule.requestMediaLibraryPermissionsAsync(
|
|
49
|
-
|
|
52
|
+
false,
|
|
50
53
|
)) as ExpoMediaLibraryPermissionResponse;
|
|
51
54
|
return expoPermissionGranted([perms]);
|
|
52
55
|
}
|
|
53
56
|
|
|
57
|
+
async hasMediaLibraryWritePermission(): Promise<boolean> {
|
|
58
|
+
const perms = (await mediaLibraryModule.getPermissionsAsync(true, [])) as ExpoMediaLibraryPermissionResponse;
|
|
59
|
+
return expoPermissionGranted([perms]);
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
async requestMediaLibraryWritePermission(): Promise<boolean> {
|
|
63
|
+
const perms = (await mediaLibraryModule.requestPermissionsAsync(true, [])) as ExpoMediaLibraryPermissionResponse;
|
|
64
|
+
return expoPermissionGranted([perms]);
|
|
65
|
+
}
|
|
66
|
+
|
|
54
67
|
async openCamera(options?: OpenCameraOptions): Promise<FilePickerResponse> {
|
|
55
68
|
const hasPermission = await this.hasCameraPermission();
|
|
56
69
|
if (!hasPermission) {
|
|
@@ -81,10 +94,11 @@ const createExpoFileService = ({
|
|
|
81
94
|
const [file] = await expoBackwardUtils.imagePicker.toFilePickerResponses(response, fsModule);
|
|
82
95
|
return file;
|
|
83
96
|
}
|
|
97
|
+
|
|
84
98
|
async openMediaLibrary(options: OpenMediaLibraryOptions) {
|
|
85
|
-
const hasPermission = await this.
|
|
99
|
+
const hasPermission = await this.hasMediaLibraryReadPermission();
|
|
86
100
|
if (!hasPermission) {
|
|
87
|
-
const granted = await this.
|
|
101
|
+
const granted = await this.requestMediaLibraryReadPermission();
|
|
88
102
|
if (!granted) {
|
|
89
103
|
options?.onOpenFailure?.(SBUError.PERMISSIONS_DENIED);
|
|
90
104
|
return null;
|
|
@@ -125,9 +139,9 @@ const createExpoFileService = ({
|
|
|
125
139
|
}
|
|
126
140
|
|
|
127
141
|
async save(options: SaveOptions): Promise<string> {
|
|
128
|
-
const hasPermission = await this.
|
|
142
|
+
const hasPermission = await this.hasMediaLibraryWritePermission();
|
|
129
143
|
if (!hasPermission) {
|
|
130
|
-
const granted = await this.
|
|
144
|
+
const granted = await this.requestMediaLibraryWritePermission();
|
|
131
145
|
if (!granted) throw new Error('Permission not granted');
|
|
132
146
|
}
|
|
133
147
|
|
|
@@ -142,6 +156,7 @@ const createExpoFileService = ({
|
|
|
142
156
|
}
|
|
143
157
|
return response.uri;
|
|
144
158
|
}
|
|
159
|
+
|
|
145
160
|
createRecordFilePath(customExtension = 'm4a'): { recordFilePath: string; uri: string } {
|
|
146
161
|
const basePath = fsModule.cacheDirectory;
|
|
147
162
|
if (!basePath) throw new Error('Cannot determine directory');
|
|
@@ -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,7 +52,7 @@ const createNativeFileService = ({
|
|
|
52
52
|
fsModule,
|
|
53
53
|
}: {
|
|
54
54
|
imagePickerModule: typeof ImagePicker;
|
|
55
|
-
documentPickerModule:
|
|
55
|
+
documentPickerModule: DocumentPicker;
|
|
56
56
|
permissionModule: typeof Permissions;
|
|
57
57
|
mediaLibraryModule: typeof CameraRoll;
|
|
58
58
|
fsModule: typeof FileAccess;
|
|
@@ -78,6 +78,7 @@ const createNativeFileService = ({
|
|
|
78
78
|
const status = await permissionModule.checkMultiple(requiredPermissions);
|
|
79
79
|
return nativePermissionGranted(status);
|
|
80
80
|
}
|
|
81
|
+
|
|
81
82
|
async requestCameraPermission(): Promise<boolean> {
|
|
82
83
|
const requiredPermissionsStatus = await permissionModule.requestMultiple(requiredPermissions);
|
|
83
84
|
if (!nativePermissionGranted(requiredPermissionsStatus)) return false;
|
|
@@ -85,10 +86,12 @@ const createNativeFileService = ({
|
|
|
85
86
|
await permissionModule.requestMultiple(optionalPermissions);
|
|
86
87
|
return true;
|
|
87
88
|
}
|
|
89
|
+
|
|
88
90
|
async hasMediaLibraryPermission(): Promise<boolean> {
|
|
89
91
|
const status = await permissionModule.checkMultiple(mediaLibraryPermissions);
|
|
90
92
|
return nativePermissionGranted(status);
|
|
91
93
|
}
|
|
94
|
+
|
|
92
95
|
async requestMediaLibraryPermission(): Promise<boolean> {
|
|
93
96
|
const status = await permissionModule.requestMultiple(mediaLibraryPermissions);
|
|
94
97
|
return nativePermissionGranted(status);
|
|
@@ -129,6 +132,7 @@ const createNativeFileService = ({
|
|
|
129
132
|
const { fileName: name, fileSize: size, type, uri } = response.assets?.[0] ?? {};
|
|
130
133
|
return normalizeFile({ uri, size, name, type });
|
|
131
134
|
}
|
|
135
|
+
|
|
132
136
|
async openMediaLibrary(options?: OpenMediaLibraryOptions): Promise<FilePickerResponse[] | null> {
|
|
133
137
|
/**
|
|
134
138
|
* NOTE: options.selectionLimit {@link https://github.com/react-native-image-picker/react-native-image-picker#options}
|
|
@@ -172,17 +176,11 @@ const createNativeFileService = ({
|
|
|
172
176
|
.map(({ fileName: name, fileSize: size, type, uri }) => normalizeFile({ uri, size, name, type })),
|
|
173
177
|
);
|
|
174
178
|
}
|
|
179
|
+
|
|
175
180
|
async openDocument(options?: OpenDocumentOptions): Promise<FilePickerResponse> {
|
|
176
|
-
|
|
177
|
-
const { uri, size, name, type } = await documentPickerModule.pickSingle();
|
|
178
|
-
return normalizeFile({ uri, size, name, type });
|
|
179
|
-
} catch (e) {
|
|
180
|
-
if (!documentPickerModule.isCancel(e) && documentPickerModule.isInProgress(e)) {
|
|
181
|
-
options?.onOpenFailure?.(SBUError.UNKNOWN, e);
|
|
182
|
-
}
|
|
183
|
-
return null;
|
|
184
|
-
}
|
|
181
|
+
return await openDocument(documentPickerModule, options);
|
|
185
182
|
}
|
|
183
|
+
|
|
186
184
|
async save(options: SaveOptions): Promise<string> {
|
|
187
185
|
const hasPermission = await this.hasMediaLibraryPermission();
|
|
188
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.
|
|
1
|
+
const VERSION = '3.9.1';
|
|
2
2
|
export default VERSION;
|