@sendbird/uikit-react-native 3.0.0 → 3.0.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/lib/commonjs/components/ChatFlatList/FlatListInternal.js +5 -5
- package/lib/commonjs/components/ChatFlatList/FlatListInternal.js.map +1 -1
- package/lib/commonjs/components/ChatFlatList/index.js +1 -1
- package/lib/commonjs/components/ChatFlatList/index.js.map +1 -1
- package/lib/commonjs/platform/createFileService.expo.js +8 -22
- package/lib/commonjs/platform/createFileService.expo.js.map +1 -1
- package/lib/commonjs/platform/createMediaService.expo.js +3 -4
- package/lib/commonjs/platform/createMediaService.expo.js.map +1 -1
- package/lib/commonjs/utils/expoBackwardUtils.js +53 -0
- package/lib/commonjs/utils/expoBackwardUtils.js.map +1 -0
- package/lib/commonjs/utils/normalizeFile.js +4 -1
- package/lib/commonjs/utils/normalizeFile.js.map +1 -1
- package/lib/commonjs/version.js +1 -1
- package/lib/commonjs/version.js.map +1 -1
- package/lib/module/components/ChatFlatList/FlatListInternal.js +5 -5
- package/lib/module/components/ChatFlatList/FlatListInternal.js.map +1 -1
- package/lib/module/components/ChatFlatList/index.js +1 -1
- package/lib/module/components/ChatFlatList/index.js.map +1 -1
- package/lib/module/platform/createFileService.expo.js +8 -22
- package/lib/module/platform/createFileService.expo.js.map +1 -1
- package/lib/module/platform/createMediaService.expo.js +3 -4
- package/lib/module/platform/createMediaService.expo.js.map +1 -1
- package/lib/module/utils/expoBackwardUtils.js +45 -0
- package/lib/module/utils/expoBackwardUtils.js.map +1 -0
- package/lib/module/utils/normalizeFile.js +4 -1
- package/lib/module/utils/normalizeFile.js.map +1 -1
- package/lib/module/version.js +1 -1
- package/lib/module/version.js.map +1 -1
- package/lib/typescript/src/components/ChatFlatList/FlatListInternal.d.ts +0 -2
- package/lib/typescript/src/containers/SendbirdUIKitContainer.d.ts +1 -1
- package/lib/typescript/src/utils/expoBackwardUtils.d.ts +9 -0
- package/lib/typescript/src/version.d.ts +1 -1
- package/package.json +14 -14
- package/src/components/ChatFlatList/FlatListInternal.tsx +5 -4
- package/src/components/ChatFlatList/index.tsx +1 -1
- package/src/platform/createFileService.expo.ts +8 -9
- package/src/platform/createMediaService.expo.tsx +3 -2
- package/src/utils/expoBackwardUtils.ts +40 -0
- package/src/utils/normalizeFile.ts +5 -1
- package/src/version.ts +1 -1
|
@@ -5,12 +5,12 @@ Object.defineProperty(exports, "__esModule", {
|
|
|
5
5
|
});
|
|
6
6
|
exports.default = void 0;
|
|
7
7
|
var _reactNative = require("react-native");
|
|
8
|
-
/**
|
|
9
|
-
* */
|
|
10
|
-
|
|
11
8
|
function shouldUseScrollViewEnhancer() {
|
|
12
|
-
|
|
13
|
-
|
|
9
|
+
var _Platform$constants$r;
|
|
10
|
+
if (_reactNative.Platform.OS !== 'android') return false;
|
|
11
|
+
if (((_Platform$constants$r = _reactNative.Platform.constants.reactNativeVersion) === null || _Platform$constants$r === void 0 ? void 0 : _Platform$constants$r.major) < 1) {
|
|
12
|
+
var _Platform$constants$r2;
|
|
13
|
+
if (((_Platform$constants$r2 = _reactNative.Platform.constants.reactNativeVersion) === null || _Platform$constants$r2 === void 0 ? void 0 : _Platform$constants$r2.minor) < 72) {
|
|
14
14
|
return true;
|
|
15
15
|
}
|
|
16
16
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["_reactNative","require","shouldUseScrollViewEnhancer","Platform","constants","reactNativeVersion","major","minor","getFlatList","FlatList","FlatListInternal","_default","exports","default"],"sources":["FlatListInternal.tsx"],"sourcesContent":["
|
|
1
|
+
{"version":3,"names":["_reactNative","require","shouldUseScrollViewEnhancer","_Platform$constants$r","Platform","OS","constants","reactNativeVersion","major","_Platform$constants$r2","minor","getFlatList","FlatList","FlatListInternal","_default","exports","default"],"sources":["FlatListInternal.tsx"],"sourcesContent":["import type { ForwardedRef, ReactElement } from 'react';\nimport type { FlatListProps, FlatList as RNFlatList, ScrollViewProps } from 'react-native';\nimport { Platform } from 'react-native';\n\nimport type { SendbirdMessage } from '@sendbird/uikit-utils';\n\ntype FlatListBidirectional<T = SendbirdMessage> = (props: FlatListProps<T> & BidirectionalProps<T>) => ReactElement;\ntype BidirectionalProps<T> = {\n onStartReached?: ((info: { distanceFromStart: number }) => void) | null | undefined;\n onStartReachedThreshold?: number | null | undefined;\n onEndReached?: ((info: { distanceFromEnd: number }) => void) | null | undefined;\n onEndReachedThreshold?: number | null | undefined;\n maintainVisibleContentPosition?: ScrollViewProps['maintainVisibleContentPosition'];\n ref: ForwardedRef<RNFlatList<T>>;\n};\n\nfunction shouldUseScrollViewEnhancer() {\n if (Platform.OS !== 'android') return false;\n\n if (Platform.constants.reactNativeVersion?.major < 1) {\n if (Platform.constants.reactNativeVersion?.minor < 72) {\n return true;\n }\n }\n return false;\n}\n\nfunction getFlatList(): FlatListBidirectional {\n if (shouldUseScrollViewEnhancer()) {\n try {\n return require('@sendbird/react-native-scrollview-enhancer').FlatList;\n } catch {\n return require('react-native').FlatList;\n }\n } else {\n return require('react-native').FlatList;\n }\n}\n\nconst FlatListInternal = getFlatList();\nexport default FlatListInternal;\n"],"mappings":";;;;;;AAEA,IAAAA,YAAA,GAAAC,OAAA;AAcA,SAASC,2BAA2BA,CAAA,EAAG;EAAA,IAAAC,qBAAA;EACrC,IAAIC,qBAAQ,CAACC,EAAE,KAAK,SAAS,EAAE,OAAO,KAAK;EAE3C,IAAI,EAAAF,qBAAA,GAAAC,qBAAQ,CAACE,SAAS,CAACC,kBAAkB,cAAAJ,qBAAA,uBAArCA,qBAAA,CAAuCK,KAAK,IAAG,CAAC,EAAE;IAAA,IAAAC,sBAAA;IACpD,IAAI,EAAAA,sBAAA,GAAAL,qBAAQ,CAACE,SAAS,CAACC,kBAAkB,cAAAE,sBAAA,uBAArCA,sBAAA,CAAuCC,KAAK,IAAG,EAAE,EAAE;MACrD,OAAO,IAAI;IACb;EACF;EACA,OAAO,KAAK;AACd;AAEA,SAASC,WAAWA,CAAA,EAA0B;EAC5C,IAAIT,2BAA2B,EAAE,EAAE;IACjC,IAAI;MACF,OAAOD,OAAO,CAAC,4CAA4C,CAAC,CAACW,QAAQ;IACvE,CAAC,CAAC,MAAM;MACN,OAAOX,OAAO,CAAC,cAAc,CAAC,CAACW,QAAQ;IACzC;EACF,CAAC,MAAM;IACL,OAAOX,OAAO,CAAC,cAAc,CAAC,CAACW,QAAQ;EACzC;AACF;AAEA,MAAMC,gBAAgB,GAAGF,WAAW,EAAE;AAAC,IAAAG,QAAA,GACxBD,gBAAgB;AAAAE,OAAA,CAAAC,OAAA,GAAAF,QAAA"}
|
|
@@ -17,7 +17,7 @@ let ANDROID_BUG_ALERT_SHOWED = _reactNative.Platform.OS !== 'android';
|
|
|
17
17
|
const BOTTOM_DETECT_THRESHOLD = 25;
|
|
18
18
|
const UNREACHABLE_THRESHOLD = Number.MIN_SAFE_INTEGER;
|
|
19
19
|
// FIXME: Inverted FlatList performance issue on Android {@link https://github.com/facebook/react-native/issues/30034}
|
|
20
|
-
const ChatFlatList = /*#__PURE__*/(0, _react.forwardRef)(function
|
|
20
|
+
const ChatFlatList = /*#__PURE__*/(0, _react.forwardRef)(function ChatFlatList(_ref, ref) {
|
|
21
21
|
var _props$data;
|
|
22
22
|
let {
|
|
23
23
|
onTopReached,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["_react","_interopRequireWildcard","require","_reactNative","_uikitReactNativeFoundation","_uikitUtils","_FlatListInternal","_interopRequireDefault","obj","__esModule","default","_getRequireWildcardCache","nodeInterop","WeakMap","cacheBabelInterop","cacheNodeInterop","cache","has","get","newObj","hasPropertyDescriptor","Object","defineProperty","getOwnPropertyDescriptor","key","prototype","hasOwnProperty","call","desc","set","_extends","assign","bind","target","i","arguments","length","source","apply","ANDROID_BUG_ALERT_SHOWED","Platform","OS","BOTTOM_DETECT_THRESHOLD","UNREACHABLE_THRESHOLD","Number","MIN_SAFE_INTEGER","ChatFlatList","forwardRef","
|
|
1
|
+
{"version":3,"names":["_react","_interopRequireWildcard","require","_reactNative","_uikitReactNativeFoundation","_uikitUtils","_FlatListInternal","_interopRequireDefault","obj","__esModule","default","_getRequireWildcardCache","nodeInterop","WeakMap","cacheBabelInterop","cacheNodeInterop","cache","has","get","newObj","hasPropertyDescriptor","Object","defineProperty","getOwnPropertyDescriptor","key","prototype","hasOwnProperty","call","desc","set","_extends","assign","bind","target","i","arguments","length","source","apply","ANDROID_BUG_ALERT_SHOWED","Platform","OS","BOTTOM_DETECT_THRESHOLD","UNREACHABLE_THRESHOLD","Number","MIN_SAFE_INTEGER","ChatFlatList","forwardRef","_ref","ref","_props$data","onTopReached","onBottomReached","onScrolledAwayFromBottom","onScroll","props","select","useUIKitTheme","contentOffsetY","useRef","_onScroll","useFreshCallback","event","contentOffset","nativeEvent","prevOffsetY","current","currOffsetY","y","__DEV__","console","warn","createElement","bounces","removeClippedSubviews","keyboardDismissMode","keyboardShouldPersistTaps","indicatorStyle","light","dark","inverted","Boolean","data","onEndReached","onScrollToIndexFailed","NOOP","onStartReached","scrollEventThrottle","keyExtractor","getMessageUniqId","style","flex","StyleSheet","flatten","maintainVisibleContentPosition","minIndexForVisible","autoscrollToTopThreshold","_default","exports"],"sources":["index.tsx"],"sourcesContent":["import React, { forwardRef, useRef } from 'react';\nimport { FlatListProps, Platform, FlatList as RNFlatList, StyleSheet } from 'react-native';\n\nimport { useUIKitTheme } from '@sendbird/uikit-react-native-foundation';\nimport { NOOP, SendbirdMessage, getMessageUniqId, useFreshCallback } from '@sendbird/uikit-utils';\n\nimport FlatListInternal from './FlatListInternal';\n\nlet ANDROID_BUG_ALERT_SHOWED = Platform.OS !== 'android';\nconst BOTTOM_DETECT_THRESHOLD = 25;\nconst UNREACHABLE_THRESHOLD = Number.MIN_SAFE_INTEGER;\n\ntype Props = Omit<FlatListProps<SendbirdMessage>, 'onEndReached'> & {\n onBottomReached: () => void;\n onTopReached: () => void;\n onScrolledAwayFromBottom: (value: boolean) => void;\n};\n// FIXME: Inverted FlatList performance issue on Android {@link https://github.com/facebook/react-native/issues/30034}\nconst ChatFlatList = forwardRef<RNFlatList, Props>(function ChatFlatList(\n { onTopReached, onBottomReached, onScrolledAwayFromBottom, onScroll, ...props },\n ref,\n) {\n const { select } = useUIKitTheme();\n const contentOffsetY = useRef(0);\n\n const _onScroll = useFreshCallback<NonNullable<Props['onScroll']>>((event) => {\n onScroll?.(event);\n\n const { contentOffset } = event.nativeEvent;\n\n const prevOffsetY = contentOffsetY.current;\n const currOffsetY = contentOffset.y;\n\n if (BOTTOM_DETECT_THRESHOLD < prevOffsetY && currOffsetY <= BOTTOM_DETECT_THRESHOLD) {\n onScrolledAwayFromBottom(false);\n } else if (BOTTOM_DETECT_THRESHOLD < currOffsetY && prevOffsetY <= BOTTOM_DETECT_THRESHOLD) {\n onScrolledAwayFromBottom(true);\n }\n\n contentOffsetY.current = contentOffset.y;\n });\n\n if (__DEV__ && !ANDROID_BUG_ALERT_SHOWED) {\n ANDROID_BUG_ALERT_SHOWED = true;\n // eslint-disable-next-line no-console\n console.warn(\n 'UIKit Warning: The inverted FlatList has a performance issue on Android. Maybe this is a bug.\\n' +\n 'Please refer to the link: https://github.com/facebook/react-native/issues/30034',\n );\n }\n\n return (\n <FlatListInternal\n bounces={false}\n removeClippedSubviews\n keyboardDismissMode={'on-drag'}\n keyboardShouldPersistTaps={'handled'}\n indicatorStyle={select({ light: 'black', dark: 'white' })}\n {...props}\n // FIXME: inverted list of ListEmptyComponent is reversed {@link https://github.com/facebook/react-native/issues/21196#issuecomment-836937743}\n inverted={Boolean(props.data?.length)}\n ref={ref}\n onEndReached={onTopReached}\n onScrollToIndexFailed={NOOP}\n onStartReached={onBottomReached}\n scrollEventThrottle={16}\n onScroll={_onScroll}\n keyExtractor={getMessageUniqId}\n style={{ flex: 1, ...StyleSheet.flatten(props.style) }}\n maintainVisibleContentPosition={{ minIndexForVisible: 0, autoscrollToTopThreshold: UNREACHABLE_THRESHOLD }}\n />\n );\n});\n\nexport default ChatFlatList;\n"],"mappings":"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"}
|
|
@@ -6,6 +6,7 @@ Object.defineProperty(exports, "__esModule", {
|
|
|
6
6
|
exports.default = void 0;
|
|
7
7
|
var _uikitUtils = require("@sendbird/uikit-utils");
|
|
8
8
|
var _SBUError = _interopRequireDefault(require("../libs/SBUError"));
|
|
9
|
+
var _expoBackwardUtils = _interopRequireDefault(require("../utils/expoBackwardUtils"));
|
|
9
10
|
var _expoPermissionGranted = _interopRequireDefault(require("../utils/expoPermissionGranted"));
|
|
10
11
|
var _normalizeFile = _interopRequireDefault(require("../utils/normalizeFile"));
|
|
11
12
|
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
|
|
@@ -57,17 +58,9 @@ const createExpoFileService = _ref => {
|
|
|
57
58
|
}
|
|
58
59
|
})()
|
|
59
60
|
});
|
|
60
|
-
if (response
|
|
61
|
-
const
|
|
62
|
-
|
|
63
|
-
} = response;
|
|
64
|
-
const {
|
|
65
|
-
size
|
|
66
|
-
} = await fsModule.getInfoAsync(response.uri);
|
|
67
|
-
return (0, _normalizeFile.default)({
|
|
68
|
-
uri,
|
|
69
|
-
size
|
|
70
|
-
});
|
|
61
|
+
if (_expoBackwardUtils.default.toCanceled(response)) return null;
|
|
62
|
+
const filePickerRes = await _expoBackwardUtils.default.toFilePickerResponses(response, fsModule);
|
|
63
|
+
return filePickerRes[0];
|
|
71
64
|
}
|
|
72
65
|
async openMediaLibrary(options) {
|
|
73
66
|
const hasPermission = await this.hasMediaLibraryPermission('read');
|
|
@@ -79,7 +72,9 @@ const createExpoFileService = _ref => {
|
|
|
79
72
|
return null;
|
|
80
73
|
}
|
|
81
74
|
}
|
|
75
|
+
const selectionLimit = (options === null || options === void 0 ? void 0 : options.selectionLimit) || 1;
|
|
82
76
|
const response = await imagePickerModule.launchImageLibraryAsync({
|
|
77
|
+
selectionLimit,
|
|
83
78
|
mediaTypes: (() => {
|
|
84
79
|
switch (options === null || options === void 0 ? void 0 : options.mediaType) {
|
|
85
80
|
case 'photo':
|
|
@@ -93,17 +88,8 @@ const createExpoFileService = _ref => {
|
|
|
93
88
|
}
|
|
94
89
|
})()
|
|
95
90
|
});
|
|
96
|
-
if (response
|
|
97
|
-
|
|
98
|
-
uri
|
|
99
|
-
} = response;
|
|
100
|
-
const {
|
|
101
|
-
size
|
|
102
|
-
} = await fsModule.getInfoAsync(uri);
|
|
103
|
-
return [await (0, _normalizeFile.default)({
|
|
104
|
-
uri,
|
|
105
|
-
size
|
|
106
|
-
})];
|
|
91
|
+
if (_expoBackwardUtils.default.toCanceled(response)) return null;
|
|
92
|
+
return _expoBackwardUtils.default.toFilePickerResponses(response, fsModule);
|
|
107
93
|
}
|
|
108
94
|
async openDocument(options) {
|
|
109
95
|
try {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["_uikitUtils","require","_SBUError","_interopRequireDefault","_expoPermissionGranted","_normalizeFile","obj","__esModule","default","createExpoFileService","_ref","imagePickerModule","documentPickerModule","mediaLibraryModule","fsModule","ExpoFileServiceInterface","hasCameraPermission","res","getCameraPermissionsAsync","expoPermissionGranted","requestCameraPermission","requestCameraPermissionsAsync","hasMediaLibraryPermission","type","perms","getPermissionsAsync","requestMediaLibraryPermission","requestPermissionsAsync","openCamera","options","hasPermission","granted","_options$onOpenFailur","onOpenFailure","call","SBUError","PERMISSIONS_DENIED","response","launchCameraAsync","mediaTypes","mediaType","MediaTypeOptions","Images","Videos","All","cancelled","uri","size","getInfoAsync","normalizeFile","openMediaLibrary","_options$onOpenFailur2","launchImageLibraryAsync","openDocument","getDocumentAsync","mimeType","name","e","_options$onOpenFailur3","UNKNOWN","save","Error","basePath","documentDirectory","cacheDirectory","downloadPath","fileName","downloadAsync","fileUrl","getFileType","fileType","match","saveToLibraryAsync","_default","exports"],"sources":["createFileService.expo.ts"],"sourcesContent":["import type * as ExpoDocumentPicker from 'expo-document-picker';\nimport type * as ExpoFs from 'expo-file-system';\nimport type * as ExpoImagePicker from 'expo-image-picker';\nimport type * as ExpoMediaLibrary from 'expo-media-library';\n\nimport { getFileType } from '@sendbird/uikit-utils';\n\nimport SBUError from '../libs/SBUError';\nimport type { ExpoMediaLibraryPermissionResponse, ExpoPermissionResponse } from '../utils/expoPermissionGranted';\nimport expoPermissionGranted from '../utils/expoPermissionGranted';\nimport normalizeFile from '../utils/normalizeFile';\nimport type {\n FilePickerResponse,\n FileServiceInterface,\n OpenCameraOptions,\n OpenDocumentOptions,\n OpenMediaLibraryOptions,\n SaveOptions,\n} from './types';\n\nconst createExpoFileService = ({\n imagePickerModule,\n documentPickerModule,\n mediaLibraryModule,\n fsModule,\n}: {\n imagePickerModule: typeof ExpoImagePicker;\n documentPickerModule: typeof ExpoDocumentPicker;\n mediaLibraryModule: typeof ExpoMediaLibrary;\n fsModule: typeof ExpoFs;\n}): FileServiceInterface => {\n class ExpoFileServiceInterface implements FileServiceInterface {\n async hasCameraPermission(): Promise<boolean> {\n const res = (await imagePickerModule.getCameraPermissionsAsync()) as ExpoPermissionResponse;\n return expoPermissionGranted([res]);\n }\n async requestCameraPermission(): Promise<boolean> {\n const res = (await imagePickerModule.requestCameraPermissionsAsync()) as ExpoPermissionResponse;\n return expoPermissionGranted([res]);\n }\n async hasMediaLibraryPermission(type: 'write' | 'read'): Promise<boolean> {\n const perms = (await mediaLibraryModule.getPermissionsAsync(\n type === 'write',\n )) as ExpoMediaLibraryPermissionResponse;\n return expoPermissionGranted([perms]);\n }\n async requestMediaLibraryPermission(type: 'write' | 'read'): Promise<boolean> {\n const perms = (await mediaLibraryModule.requestPermissionsAsync(\n type === 'write',\n )) as ExpoMediaLibraryPermissionResponse;\n return expoPermissionGranted([perms]);\n }\n\n async openCamera(options?: OpenCameraOptions): Promise<FilePickerResponse> {\n const hasPermission = await this.hasCameraPermission();\n if (!hasPermission) {\n const granted = await this.requestCameraPermission();\n if (!granted) {\n options?.onOpenFailure?.(SBUError.PERMISSIONS_DENIED);\n return null;\n }\n }\n\n const response = await imagePickerModule.launchCameraAsync({\n mediaTypes: (() => {\n switch (options?.mediaType) {\n case 'photo':\n return imagePickerModule.MediaTypeOptions.Images;\n case 'video':\n return imagePickerModule.MediaTypeOptions.Videos;\n case 'all':\n return imagePickerModule.MediaTypeOptions.All;\n default:\n return imagePickerModule.MediaTypeOptions.Images;\n }\n })(),\n });\n\n if (response.cancelled) return null;\n\n const { uri } = response;\n const { size } = await fsModule.getInfoAsync(response.uri);\n\n return normalizeFile({ uri, size });\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 response = await imagePickerModule.launchImageLibraryAsync({\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 (response.cancelled) return null;\n const { uri } = response;\n const { size } = await fsModule.getInfoAsync(uri);\n return [await normalizeFile({ uri, size })];\n }\n\n async openDocument(options?: OpenDocumentOptions): Promise<FilePickerResponse> {\n try {\n const response = await documentPickerModule.getDocumentAsync({ type: '*/*' });\n if (response.type === 'cancel') return null;\n const { mimeType, uri, size, name } = response;\n return normalizeFile({ uri, size, name, type: mimeType });\n } catch (e) {\n options?.onOpenFailure?.(SBUError.UNKNOWN, e);\n return null;\n }\n }\n\n async save(options: SaveOptions): Promise<string> {\n const hasPermission = await this.hasMediaLibraryPermission('write');\n if (!hasPermission) {\n const granted = await this.requestMediaLibraryPermission('write');\n if (!granted) throw new Error('Permission not granted');\n }\n\n const basePath = fsModule.documentDirectory || fsModule.cacheDirectory;\n if (!basePath) throw new Error('Cannot determine directory');\n\n const downloadPath = `${basePath}/${options.fileName}`;\n\n const response = await fsModule.downloadAsync(options.fileUrl, downloadPath);\n if (getFileType(options.fileType || '').match(/video|image/)) {\n await mediaLibraryModule.saveToLibraryAsync(response.uri);\n }\n return response.uri;\n }\n }\n\n return new ExpoFileServiceInterface();\n};\n\nexport default createExpoFileService;\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"names":["_uikitUtils","require","_SBUError","_interopRequireDefault","_expoBackwardUtils","_expoPermissionGranted","_normalizeFile","obj","__esModule","default","createExpoFileService","_ref","imagePickerModule","documentPickerModule","mediaLibraryModule","fsModule","ExpoFileServiceInterface","hasCameraPermission","res","getCameraPermissionsAsync","expoPermissionGranted","requestCameraPermission","requestCameraPermissionsAsync","hasMediaLibraryPermission","type","perms","getPermissionsAsync","requestMediaLibraryPermission","requestPermissionsAsync","openCamera","options","hasPermission","granted","_options$onOpenFailur","onOpenFailure","call","SBUError","PERMISSIONS_DENIED","response","launchCameraAsync","mediaTypes","mediaType","MediaTypeOptions","Images","Videos","All","expoBackwardUtils","toCanceled","filePickerRes","toFilePickerResponses","openMediaLibrary","_options$onOpenFailur2","selectionLimit","launchImageLibraryAsync","openDocument","getDocumentAsync","mimeType","uri","size","name","normalizeFile","e","_options$onOpenFailur3","UNKNOWN","save","Error","basePath","documentDirectory","cacheDirectory","downloadPath","fileName","downloadAsync","fileUrl","getFileType","fileType","match","saveToLibraryAsync","_default","exports"],"sources":["createFileService.expo.ts"],"sourcesContent":["import type * as ExpoDocumentPicker from 'expo-document-picker';\nimport type * as ExpoFs from 'expo-file-system';\nimport type * as ExpoImagePicker from 'expo-image-picker';\nimport type * as ExpoMediaLibrary from 'expo-media-library';\n\nimport { getFileType } from '@sendbird/uikit-utils';\n\nimport SBUError from '../libs/SBUError';\nimport expoBackwardUtils from '../utils/expoBackwardUtils';\nimport type { ExpoMediaLibraryPermissionResponse, ExpoPermissionResponse } from '../utils/expoPermissionGranted';\nimport expoPermissionGranted from '../utils/expoPermissionGranted';\nimport normalizeFile from '../utils/normalizeFile';\nimport type {\n FilePickerResponse,\n FileServiceInterface,\n OpenCameraOptions,\n OpenDocumentOptions,\n OpenMediaLibraryOptions,\n SaveOptions,\n} from './types';\n\nconst createExpoFileService = ({\n imagePickerModule,\n documentPickerModule,\n mediaLibraryModule,\n fsModule,\n}: {\n imagePickerModule: typeof ExpoImagePicker;\n documentPickerModule: typeof ExpoDocumentPicker;\n mediaLibraryModule: typeof ExpoMediaLibrary;\n fsModule: typeof ExpoFs;\n}): FileServiceInterface => {\n class ExpoFileServiceInterface implements FileServiceInterface {\n async hasCameraPermission(): Promise<boolean> {\n const res = (await imagePickerModule.getCameraPermissionsAsync()) as ExpoPermissionResponse;\n return expoPermissionGranted([res]);\n }\n async requestCameraPermission(): Promise<boolean> {\n const res = (await imagePickerModule.requestCameraPermissionsAsync()) as ExpoPermissionResponse;\n return expoPermissionGranted([res]);\n }\n async hasMediaLibraryPermission(type: 'write' | 'read'): Promise<boolean> {\n const perms = (await mediaLibraryModule.getPermissionsAsync(\n type === 'write',\n )) as ExpoMediaLibraryPermissionResponse;\n return expoPermissionGranted([perms]);\n }\n async requestMediaLibraryPermission(type: 'write' | 'read'): Promise<boolean> {\n const perms = (await mediaLibraryModule.requestPermissionsAsync(\n type === 'write',\n )) as ExpoMediaLibraryPermissionResponse;\n return expoPermissionGranted([perms]);\n }\n\n async openCamera(options?: OpenCameraOptions): Promise<FilePickerResponse> {\n const hasPermission = await this.hasCameraPermission();\n if (!hasPermission) {\n const granted = await this.requestCameraPermission();\n if (!granted) {\n options?.onOpenFailure?.(SBUError.PERMISSIONS_DENIED);\n return null;\n }\n }\n\n const response = await imagePickerModule.launchCameraAsync({\n mediaTypes: (() => {\n switch (options?.mediaType) {\n case 'photo':\n return imagePickerModule.MediaTypeOptions.Images;\n case 'video':\n return imagePickerModule.MediaTypeOptions.Videos;\n case 'all':\n return imagePickerModule.MediaTypeOptions.All;\n default:\n return imagePickerModule.MediaTypeOptions.Images;\n }\n })(),\n });\n\n if (expoBackwardUtils.toCanceled(response)) return null;\n\n const filePickerRes = await expoBackwardUtils.toFilePickerResponses(response, fsModule);\n return filePickerRes[0];\n }\n async openMediaLibrary(options: OpenMediaLibraryOptions) {\n const hasPermission = await this.hasMediaLibraryPermission('read');\n if (!hasPermission) {\n const granted = await this.requestMediaLibraryPermission('read');\n if (!granted) {\n options?.onOpenFailure?.(SBUError.PERMISSIONS_DENIED);\n return null;\n }\n }\n\n const selectionLimit = options?.selectionLimit || 1;\n const response = await imagePickerModule.launchImageLibraryAsync({\n selectionLimit,\n mediaTypes: (() => {\n switch (options?.mediaType) {\n case 'photo':\n return imagePickerModule.MediaTypeOptions.Images;\n case 'video':\n return imagePickerModule.MediaTypeOptions.Videos;\n case 'all':\n return imagePickerModule.MediaTypeOptions.All;\n default:\n return imagePickerModule.MediaTypeOptions.Images;\n }\n })(),\n });\n if (expoBackwardUtils.toCanceled(response)) return null;\n return expoBackwardUtils.toFilePickerResponses(response, fsModule);\n }\n\n async openDocument(options?: OpenDocumentOptions): Promise<FilePickerResponse> {\n try {\n const response = await documentPickerModule.getDocumentAsync({ type: '*/*' });\n if (response.type === 'cancel') return null;\n const { mimeType, uri, size, name } = response;\n return normalizeFile({ uri, size, name, type: mimeType });\n } catch (e) {\n options?.onOpenFailure?.(SBUError.UNKNOWN, e);\n return null;\n }\n }\n\n async save(options: SaveOptions): Promise<string> {\n const hasPermission = await this.hasMediaLibraryPermission('write');\n if (!hasPermission) {\n const granted = await this.requestMediaLibraryPermission('write');\n if (!granted) throw new Error('Permission not granted');\n }\n\n const basePath = fsModule.documentDirectory || fsModule.cacheDirectory;\n if (!basePath) throw new Error('Cannot determine directory');\n\n const downloadPath = `${basePath}/${options.fileName}`;\n\n const response = await fsModule.downloadAsync(options.fileUrl, downloadPath);\n if (getFileType(options.fileType || '').match(/video|image/)) {\n await mediaLibraryModule.saveToLibraryAsync(response.uri);\n }\n return response.uri;\n }\n }\n\n return new ExpoFileServiceInterface();\n};\n\nexport default createExpoFileService;\n"],"mappings":"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"}
|
|
@@ -7,6 +7,7 @@ exports.default = void 0;
|
|
|
7
7
|
var _react = _interopRequireDefault(require("react"));
|
|
8
8
|
var _uikitUtils = require("@sendbird/uikit-utils");
|
|
9
9
|
var _SBUUtils = _interopRequireDefault(require("../libs/SBUUtils"));
|
|
10
|
+
var _expoBackwardUtils = _interopRequireDefault(require("../utils/expoBackwardUtils"));
|
|
10
11
|
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
|
|
11
12
|
function _extends() { _extends = Object.assign ? Object.assign.bind() : function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; }; return _extends.apply(this, arguments); }
|
|
12
13
|
const createExpoMediaService = _ref => {
|
|
@@ -72,12 +73,10 @@ const createExpoMediaService = _ref => {
|
|
|
72
73
|
}], {
|
|
73
74
|
compress: Math.min(Math.max(0, compressionRate), 1)
|
|
74
75
|
});
|
|
75
|
-
const
|
|
76
|
-
size = 0
|
|
77
|
-
} = await fsModule.getInfoAsync(uri);
|
|
76
|
+
const fileInfo = await fsModule.getInfoAsync(uri);
|
|
78
77
|
return {
|
|
79
78
|
uri: compressedURI,
|
|
80
|
-
size
|
|
79
|
+
size: _expoBackwardUtils.default.toFileSize(fileInfo)
|
|
81
80
|
};
|
|
82
81
|
}
|
|
83
82
|
};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["_react","_interopRequireDefault","require","_uikitUtils","_SBUUtils","obj","__esModule","default","_extends","Object","assign","bind","target","i","arguments","length","source","key","prototype","hasOwnProperty","call","apply","createExpoMediaService","_ref","avModule","thumbnailModule","imageManipulator","fsModule","VideoComponent","_ref2","resizeMode","onLoad","props","createElement","Video","useNativeControls","getVideoThumbnail","_ref3","url","quality","timeMills","uri","getThumbnailAsync","time","path","compressImage","_ref4","maxWidth","maxHeight","compressionRate","originSize","SBUUtils","getImageSize","resizingSize","getDownscaleSize","width","height","compressedURI","manipulateAsync","resize","compress","Math","min","max","
|
|
1
|
+
{"version":3,"names":["_react","_interopRequireDefault","require","_uikitUtils","_SBUUtils","_expoBackwardUtils","obj","__esModule","default","_extends","Object","assign","bind","target","i","arguments","length","source","key","prototype","hasOwnProperty","call","apply","createExpoMediaService","_ref","avModule","thumbnailModule","imageManipulator","fsModule","VideoComponent","_ref2","resizeMode","onLoad","props","createElement","Video","useNativeControls","getVideoThumbnail","_ref3","url","quality","timeMills","uri","getThumbnailAsync","time","path","compressImage","_ref4","maxWidth","maxHeight","compressionRate","originSize","SBUUtils","getImageSize","resizingSize","getDownscaleSize","width","height","compressedURI","manipulateAsync","resize","compress","Math","min","max","fileInfo","getInfoAsync","size","expoBackwardUtils","toFileSize","_default","exports"],"sources":["createMediaService.expo.tsx"],"sourcesContent":["import type * as ExpoAV from 'expo-av';\nimport type * as ExpoFS from 'expo-file-system';\nimport type * as ExpoImageManipulator from 'expo-image-manipulator';\nimport type * as ExpoVideoThumbnail from 'expo-video-thumbnails';\nimport React from 'react';\n\nimport { getDownscaleSize } from '@sendbird/uikit-utils';\n\nimport SBUUtils from '../libs/SBUUtils';\nimport expoBackwardUtils from '../utils/expoBackwardUtils';\nimport type { MediaServiceInterface } from './types';\n\ntype Modules = {\n avModule: typeof ExpoAV;\n thumbnailModule: typeof ExpoVideoThumbnail;\n imageManipulator: typeof ExpoImageManipulator;\n fsModule: typeof ExpoFS;\n};\n\nconst createExpoMediaService = ({\n avModule,\n thumbnailModule,\n imageManipulator,\n fsModule,\n}: Modules): MediaServiceInterface => {\n return {\n VideoComponent({ source, resizeMode, onLoad, ...props }) {\n // FIXME: type error https://github.com/expo/expo/issues/17101\n // @ts-ignore\n return <avModule.Video {...props} source={source} resizeMode={resizeMode} onLoad={onLoad} useNativeControls />;\n },\n async getVideoThumbnail({ url, quality, timeMills }) {\n try {\n const { uri } = await thumbnailModule.getThumbnailAsync(url, { quality, time: timeMills });\n return { path: uri };\n } catch {\n return null;\n }\n },\n async compressImage({ maxWidth, maxHeight, compressionRate = 1, uri }) {\n const originSize = await SBUUtils.getImageSize(uri);\n const resizingSize = getDownscaleSize(originSize, { width: maxWidth, height: maxHeight });\n\n const { uri: compressedURI } = await imageManipulator.manipulateAsync(uri, [{ resize: resizingSize }], {\n compress: Math.min(Math.max(0, compressionRate), 1),\n });\n const fileInfo = await fsModule.getInfoAsync(uri);\n\n return { uri: compressedURI, size: expoBackwardUtils.toFileSize(fileInfo) };\n },\n };\n};\n\nexport default createExpoMediaService;\n"],"mappings":"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"}
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
Object.defineProperty(exports, "__esModule", {
|
|
4
|
+
value: true
|
|
5
|
+
});
|
|
6
|
+
exports.default = void 0;
|
|
7
|
+
var _normalizeFile = _interopRequireDefault(require("./normalizeFile"));
|
|
8
|
+
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
|
|
9
|
+
const expoBackwardUtils = {
|
|
10
|
+
toCanceled(result) {
|
|
11
|
+
// @ts-expect-error backward compatibility
|
|
12
|
+
return result.canceled ?? result.cancelled;
|
|
13
|
+
},
|
|
14
|
+
toFileSize(info) {
|
|
15
|
+
if ('size' in info) {
|
|
16
|
+
return info.size;
|
|
17
|
+
} else {
|
|
18
|
+
return 0;
|
|
19
|
+
}
|
|
20
|
+
},
|
|
21
|
+
async toFilePickerResponses(result, fsModule) {
|
|
22
|
+
if (result.assets) {
|
|
23
|
+
const assets = result.assets || [];
|
|
24
|
+
const promises = assets.map(_ref => {
|
|
25
|
+
let {
|
|
26
|
+
fileName: name,
|
|
27
|
+
fileSize: size,
|
|
28
|
+
type,
|
|
29
|
+
uri
|
|
30
|
+
} = _ref;
|
|
31
|
+
return (0, _normalizeFile.default)({
|
|
32
|
+
uri,
|
|
33
|
+
size,
|
|
34
|
+
name,
|
|
35
|
+
type
|
|
36
|
+
});
|
|
37
|
+
});
|
|
38
|
+
return Promise.all(promises);
|
|
39
|
+
} else if ('uri' in result && typeof result.uri === 'string') {
|
|
40
|
+
const fileInfo = await fsModule.getInfoAsync(result.uri);
|
|
41
|
+
const response = await (0, _normalizeFile.default)({
|
|
42
|
+
uri: result.uri,
|
|
43
|
+
size: this.toFileSize(fileInfo)
|
|
44
|
+
});
|
|
45
|
+
return [response];
|
|
46
|
+
} else {
|
|
47
|
+
return [];
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
};
|
|
51
|
+
var _default = expoBackwardUtils;
|
|
52
|
+
exports.default = _default;
|
|
53
|
+
//# sourceMappingURL=expoBackwardUtils.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"names":["_normalizeFile","_interopRequireDefault","require","obj","__esModule","default","expoBackwardUtils","toCanceled","result","canceled","cancelled","toFileSize","info","size","toFilePickerResponses","fsModule","assets","promises","map","_ref","fileName","name","fileSize","type","uri","normalizeFile","Promise","all","fileInfo","getInfoAsync","response","_default","exports"],"sources":["expoBackwardUtils.ts"],"sourcesContent":["import type * as ExpoFs from 'expo-file-system';\nimport type * as ExpoImagePicker from 'expo-image-picker';\n\nimport type { FilePickerResponse } from '../platform/types';\nimport normalizeFile from './normalizeFile';\n\nconst expoBackwardUtils = {\n toCanceled(result: ExpoImagePicker.ImagePickerResult) {\n // @ts-expect-error backward compatibility\n return result.canceled ?? result.cancelled;\n },\n toFileSize(info: ExpoFs.FileInfo) {\n if ('size' in info) {\n return info.size;\n } else {\n return 0;\n }\n },\n async toFilePickerResponses(\n result: ExpoImagePicker.ImagePickerResult,\n fsModule: typeof ExpoFs,\n ): Promise<FilePickerResponse[]> {\n if (result.assets) {\n const assets = result.assets || [];\n const promises = assets.map(({ fileName: name, fileSize: size, type, uri }) =>\n normalizeFile({ uri, size, name, type }),\n );\n\n return Promise.all(promises);\n } else if ('uri' in result && typeof result.uri === 'string') {\n const fileInfo = await fsModule.getInfoAsync(result.uri);\n const response = await normalizeFile({ uri: result.uri, size: this.toFileSize(fileInfo) });\n return [response];\n } else {\n return [];\n }\n },\n};\n\nexport default expoBackwardUtils;\n"],"mappings":";;;;;;AAIA,IAAAA,cAAA,GAAAC,sBAAA,CAAAC,OAAA;AAA4C,SAAAD,uBAAAE,GAAA,WAAAA,GAAA,IAAAA,GAAA,CAAAC,UAAA,GAAAD,GAAA,KAAAE,OAAA,EAAAF,GAAA;AAE5C,MAAMG,iBAAiB,GAAG;EACxBC,UAAUA,CAACC,MAAyC,EAAE;IACpD;IACA,OAAOA,MAAM,CAACC,QAAQ,IAAID,MAAM,CAACE,SAAS;EAC5C,CAAC;EACDC,UAAUA,CAACC,IAAqB,EAAE;IAChC,IAAI,MAAM,IAAIA,IAAI,EAAE;MAClB,OAAOA,IAAI,CAACC,IAAI;IAClB,CAAC,MAAM;MACL,OAAO,CAAC;IACV;EACF,CAAC;EACD,MAAMC,qBAAqBA,CACzBN,MAAyC,EACzCO,QAAuB,EACQ;IAC/B,IAAIP,MAAM,CAACQ,MAAM,EAAE;MACjB,MAAMA,MAAM,GAAGR,MAAM,CAACQ,MAAM,IAAI,EAAE;MAClC,MAAMC,QAAQ,GAAGD,MAAM,CAACE,GAAG,CAACC,IAAA;QAAA,IAAC;UAAEC,QAAQ,EAAEC,IAAI;UAAEC,QAAQ,EAAET,IAAI;UAAEU,IAAI;UAAEC;QAAI,CAAC,GAAAL,IAAA;QAAA,OACxE,IAAAM,sBAAa,EAAC;UAAED,GAAG;UAAEX,IAAI;UAAEQ,IAAI;UAAEE;QAAK,CAAC,CAAC;MAAA,EACzC;MAED,OAAOG,OAAO,CAACC,GAAG,CAACV,QAAQ,CAAC;IAC9B,CAAC,MAAM,IAAI,KAAK,IAAIT,MAAM,IAAI,OAAOA,MAAM,CAACgB,GAAG,KAAK,QAAQ,EAAE;MAC5D,MAAMI,QAAQ,GAAG,MAAMb,QAAQ,CAACc,YAAY,CAACrB,MAAM,CAACgB,GAAG,CAAC;MACxD,MAAMM,QAAQ,GAAG,MAAM,IAAAL,sBAAa,EAAC;QAAED,GAAG,EAAEhB,MAAM,CAACgB,GAAG;QAAEX,IAAI,EAAE,IAAI,CAACF,UAAU,CAACiB,QAAQ;MAAE,CAAC,CAAC;MAC1F,OAAO,CAACE,QAAQ,CAAC;IACnB,CAAC,MAAM;MACL,OAAO,EAAE;IACX;EACF;AACF,CAAC;AAAC,IAAAC,QAAA,GAEazB,iBAAiB;AAAA0B,OAAA,CAAA3B,OAAA,GAAA0B,QAAA"}
|
|
@@ -19,7 +19,7 @@ const normalizeFile = async _ref => {
|
|
|
19
19
|
const extension = (0, _uikitUtils.getFileExtension)(filename) || (0, _uikitUtils.getFileExtensionFromMime)(filetype) || (await (0, _uikitUtils.getFileExtensionFromUri)(uri));
|
|
20
20
|
if (extension) {
|
|
21
21
|
filename = (0, _uikitUtils.normalizeFileName)(filename, extension);
|
|
22
|
-
if (!filetype) {
|
|
22
|
+
if (!filetype || !isNotMimeType(filetype)) {
|
|
23
23
|
filetype = (0, _uikitUtils.getMimeFromFileExtension)(extension);
|
|
24
24
|
}
|
|
25
25
|
}
|
|
@@ -30,6 +30,9 @@ const normalizeFile = async _ref => {
|
|
|
30
30
|
size: size ?? 0
|
|
31
31
|
};
|
|
32
32
|
};
|
|
33
|
+
function isNotMimeType(str) {
|
|
34
|
+
return str.indexOf('/') === -1;
|
|
35
|
+
}
|
|
33
36
|
var _default = normalizeFile;
|
|
34
37
|
exports.default = _default;
|
|
35
38
|
//# sourceMappingURL=normalizeFile.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["_uikitUtils","require","normalizeFile","_ref","uri","size","name","type","filename","String","Date","now","filetype","extension","getFileExtension","getFileExtensionFromMime","getFileExtensionFromUri","normalizeFileName","getMimeFromFileExtension","_default","exports","default"],"sources":["normalizeFile.ts"],"sourcesContent":["import type { PartialNullable } from '@sendbird/uikit-utils';\nimport {\n getFileExtension,\n getFileExtensionFromMime,\n getFileExtensionFromUri,\n getMimeFromFileExtension,\n normalizeFileName,\n} from '@sendbird/uikit-utils';\n\nimport type { FilePickerResponse, FileType } from '../platform/types';\n\nconst normalizeFile = async ({ uri, size, name, type }: PartialNullable<FileType>): Promise<FilePickerResponse> => {\n // URI is required property\n if (!uri) return null;\n\n let filename = name || String(Date.now());\n let filetype = type || '';\n\n const extension =\n getFileExtension(filename) || getFileExtensionFromMime(filetype) || (await getFileExtensionFromUri(uri));\n\n if (extension) {\n filename = normalizeFileName(filename, extension);\n if (!filetype) {\n filetype = getMimeFromFileExtension(extension);\n }\n }\n\n return { uri, name: filename, type: filetype, size: size ?? 0 };\n};\n\nexport default normalizeFile;\n"],"mappings":";;;;;;AACA,IAAAA,WAAA,GAAAC,OAAA;AAUA,MAAMC,aAAa,GAAG,MAAAC,IAAA,IAA6F;EAAA,IAAtF;IAAEC,GAAG;IAAEC,IAAI;IAAEC,IAAI;IAAEC;EAAgC,CAAC,GAAAJ,IAAA;EAC/E;EACA,IAAI,CAACC,GAAG,EAAE,OAAO,IAAI;EAErB,IAAII,QAAQ,GAAGF,IAAI,IAAIG,MAAM,CAACC,IAAI,CAACC,GAAG,EAAE,CAAC;EACzC,IAAIC,QAAQ,GAAGL,IAAI,IAAI,EAAE;EAEzB,MAAMM,SAAS,GACb,IAAAC,4BAAgB,EAACN,QAAQ,CAAC,IAAI,IAAAO,oCAAwB,EAACH,QAAQ,CAAC,KAAK,MAAM,IAAAI,mCAAuB,EAACZ,GAAG,CAAC,CAAC;EAE1G,IAAIS,SAAS,EAAE;IACbL,QAAQ,GAAG,IAAAS,6BAAiB,EAACT,QAAQ,EAAEK,SAAS,CAAC;IACjD,IAAI,CAACD,QAAQ,EAAE;
|
|
1
|
+
{"version":3,"names":["_uikitUtils","require","normalizeFile","_ref","uri","size","name","type","filename","String","Date","now","filetype","extension","getFileExtension","getFileExtensionFromMime","getFileExtensionFromUri","normalizeFileName","isNotMimeType","getMimeFromFileExtension","str","indexOf","_default","exports","default"],"sources":["normalizeFile.ts"],"sourcesContent":["import type { PartialNullable } from '@sendbird/uikit-utils';\nimport {\n getFileExtension,\n getFileExtensionFromMime,\n getFileExtensionFromUri,\n getMimeFromFileExtension,\n normalizeFileName,\n} from '@sendbird/uikit-utils';\n\nimport type { FilePickerResponse, FileType } from '../platform/types';\n\nconst normalizeFile = async ({ uri, size, name, type }: PartialNullable<FileType>): Promise<FilePickerResponse> => {\n // URI is required property\n if (!uri) return null;\n\n let filename = name || String(Date.now());\n let filetype = type || '';\n\n const extension =\n getFileExtension(filename) || getFileExtensionFromMime(filetype) || (await getFileExtensionFromUri(uri));\n\n if (extension) {\n filename = normalizeFileName(filename, extension);\n if (!filetype || !isNotMimeType(filetype)) {\n filetype = getMimeFromFileExtension(extension);\n }\n }\n\n return { uri, name: filename, type: filetype, size: size ?? 0 };\n};\n\nfunction isNotMimeType(str: string) {\n return str.indexOf('/') === -1;\n}\n\nexport default normalizeFile;\n"],"mappings":";;;;;;AACA,IAAAA,WAAA,GAAAC,OAAA;AAUA,MAAMC,aAAa,GAAG,MAAAC,IAAA,IAA6F;EAAA,IAAtF;IAAEC,GAAG;IAAEC,IAAI;IAAEC,IAAI;IAAEC;EAAgC,CAAC,GAAAJ,IAAA;EAC/E;EACA,IAAI,CAACC,GAAG,EAAE,OAAO,IAAI;EAErB,IAAII,QAAQ,GAAGF,IAAI,IAAIG,MAAM,CAACC,IAAI,CAACC,GAAG,EAAE,CAAC;EACzC,IAAIC,QAAQ,GAAGL,IAAI,IAAI,EAAE;EAEzB,MAAMM,SAAS,GACb,IAAAC,4BAAgB,EAACN,QAAQ,CAAC,IAAI,IAAAO,oCAAwB,EAACH,QAAQ,CAAC,KAAK,MAAM,IAAAI,mCAAuB,EAACZ,GAAG,CAAC,CAAC;EAE1G,IAAIS,SAAS,EAAE;IACbL,QAAQ,GAAG,IAAAS,6BAAiB,EAACT,QAAQ,EAAEK,SAAS,CAAC;IACjD,IAAI,CAACD,QAAQ,IAAI,CAACM,aAAa,CAACN,QAAQ,CAAC,EAAE;MACzCA,QAAQ,GAAG,IAAAO,oCAAwB,EAACN,SAAS,CAAC;IAChD;EACF;EAEA,OAAO;IAAET,GAAG;IAAEE,IAAI,EAAEE,QAAQ;IAAED,IAAI,EAAEK,QAAQ;IAAEP,IAAI,EAAEA,IAAI,IAAI;EAAE,CAAC;AACjE,CAAC;AAED,SAASa,aAAaA,CAACE,GAAW,EAAE;EAClC,OAAOA,GAAG,CAACC,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;AAChC;AAAC,IAAAC,QAAA,GAEcpB,aAAa;AAAAqB,OAAA,CAAAC,OAAA,GAAAF,QAAA"}
|
package/lib/commonjs/version.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["VERSION","_default","exports","default"],"sources":["version.ts"],"sourcesContent":["const VERSION = '3.0.
|
|
1
|
+
{"version":3,"names":["VERSION","_default","exports","default"],"sources":["version.ts"],"sourcesContent":["const VERSION = '3.0.1';\nexport default VERSION;\n"],"mappings":";;;;;;AAAA,MAAMA,OAAO,GAAG,OAAO;AAAC,IAAAC,QAAA,GACTD,OAAO;AAAAE,OAAA,CAAAC,OAAA,GAAAF,QAAA"}
|
|
@@ -1,10 +1,10 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* */
|
|
3
|
-
|
|
4
1
|
import { Platform } from 'react-native';
|
|
5
2
|
function shouldUseScrollViewEnhancer() {
|
|
6
|
-
|
|
7
|
-
|
|
3
|
+
var _Platform$constants$r;
|
|
4
|
+
if (Platform.OS !== 'android') return false;
|
|
5
|
+
if (((_Platform$constants$r = Platform.constants.reactNativeVersion) === null || _Platform$constants$r === void 0 ? void 0 : _Platform$constants$r.major) < 1) {
|
|
6
|
+
var _Platform$constants$r2;
|
|
7
|
+
if (((_Platform$constants$r2 = Platform.constants.reactNativeVersion) === null || _Platform$constants$r2 === void 0 ? void 0 : _Platform$constants$r2.minor) < 72) {
|
|
8
8
|
return true;
|
|
9
9
|
}
|
|
10
10
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["Platform","shouldUseScrollViewEnhancer","constants","reactNativeVersion","major","minor","getFlatList","require","FlatList","FlatListInternal"],"sources":["FlatListInternal.tsx"],"sourcesContent":["
|
|
1
|
+
{"version":3,"names":["Platform","shouldUseScrollViewEnhancer","_Platform$constants$r","OS","constants","reactNativeVersion","major","_Platform$constants$r2","minor","getFlatList","require","FlatList","FlatListInternal"],"sources":["FlatListInternal.tsx"],"sourcesContent":["import type { ForwardedRef, ReactElement } from 'react';\nimport type { FlatListProps, FlatList as RNFlatList, ScrollViewProps } from 'react-native';\nimport { Platform } from 'react-native';\n\nimport type { SendbirdMessage } from '@sendbird/uikit-utils';\n\ntype FlatListBidirectional<T = SendbirdMessage> = (props: FlatListProps<T> & BidirectionalProps<T>) => ReactElement;\ntype BidirectionalProps<T> = {\n onStartReached?: ((info: { distanceFromStart: number }) => void) | null | undefined;\n onStartReachedThreshold?: number | null | undefined;\n onEndReached?: ((info: { distanceFromEnd: number }) => void) | null | undefined;\n onEndReachedThreshold?: number | null | undefined;\n maintainVisibleContentPosition?: ScrollViewProps['maintainVisibleContentPosition'];\n ref: ForwardedRef<RNFlatList<T>>;\n};\n\nfunction shouldUseScrollViewEnhancer() {\n if (Platform.OS !== 'android') return false;\n\n if (Platform.constants.reactNativeVersion?.major < 1) {\n if (Platform.constants.reactNativeVersion?.minor < 72) {\n return true;\n }\n }\n return false;\n}\n\nfunction getFlatList(): FlatListBidirectional {\n if (shouldUseScrollViewEnhancer()) {\n try {\n return require('@sendbird/react-native-scrollview-enhancer').FlatList;\n } catch {\n return require('react-native').FlatList;\n }\n } else {\n return require('react-native').FlatList;\n }\n}\n\nconst FlatListInternal = getFlatList();\nexport default FlatListInternal;\n"],"mappings":"AAEA,SAASA,QAAQ,QAAQ,cAAc;AAcvC,SAASC,2BAA2BA,CAAA,EAAG;EAAA,IAAAC,qBAAA;EACrC,IAAIF,QAAQ,CAACG,EAAE,KAAK,SAAS,EAAE,OAAO,KAAK;EAE3C,IAAI,EAAAD,qBAAA,GAAAF,QAAQ,CAACI,SAAS,CAACC,kBAAkB,cAAAH,qBAAA,uBAArCA,qBAAA,CAAuCI,KAAK,IAAG,CAAC,EAAE;IAAA,IAAAC,sBAAA;IACpD,IAAI,EAAAA,sBAAA,GAAAP,QAAQ,CAACI,SAAS,CAACC,kBAAkB,cAAAE,sBAAA,uBAArCA,sBAAA,CAAuCC,KAAK,IAAG,EAAE,EAAE;MACrD,OAAO,IAAI;IACb;EACF;EACA,OAAO,KAAK;AACd;AAEA,SAASC,WAAWA,CAAA,EAA0B;EAC5C,IAAIR,2BAA2B,EAAE,EAAE;IACjC,IAAI;MACF,OAAOS,OAAO,CAAC,4CAA4C,CAAC,CAACC,QAAQ;IACvE,CAAC,CAAC,MAAM;MACN,OAAOD,OAAO,CAAC,cAAc,CAAC,CAACC,QAAQ;IACzC;EACF,CAAC,MAAM;IACL,OAAOD,OAAO,CAAC,cAAc,CAAC,CAACC,QAAQ;EACzC;AACF;AAEA,MAAMC,gBAAgB,GAAGH,WAAW,EAAE;AACtC,eAAeG,gBAAgB"}
|
|
@@ -8,7 +8,7 @@ let ANDROID_BUG_ALERT_SHOWED = Platform.OS !== 'android';
|
|
|
8
8
|
const BOTTOM_DETECT_THRESHOLD = 25;
|
|
9
9
|
const UNREACHABLE_THRESHOLD = Number.MIN_SAFE_INTEGER;
|
|
10
10
|
// FIXME: Inverted FlatList performance issue on Android {@link https://github.com/facebook/react-native/issues/30034}
|
|
11
|
-
const ChatFlatList = /*#__PURE__*/forwardRef(function
|
|
11
|
+
const ChatFlatList = /*#__PURE__*/forwardRef(function ChatFlatList(_ref, ref) {
|
|
12
12
|
var _props$data;
|
|
13
13
|
let {
|
|
14
14
|
onTopReached,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["React","forwardRef","useRef","Platform","StyleSheet","useUIKitTheme","NOOP","getMessageUniqId","useFreshCallback","FlatListInternal","ANDROID_BUG_ALERT_SHOWED","OS","BOTTOM_DETECT_THRESHOLD","UNREACHABLE_THRESHOLD","Number","MIN_SAFE_INTEGER","ChatFlatList","
|
|
1
|
+
{"version":3,"names":["React","forwardRef","useRef","Platform","StyleSheet","useUIKitTheme","NOOP","getMessageUniqId","useFreshCallback","FlatListInternal","ANDROID_BUG_ALERT_SHOWED","OS","BOTTOM_DETECT_THRESHOLD","UNREACHABLE_THRESHOLD","Number","MIN_SAFE_INTEGER","ChatFlatList","_ref","ref","_props$data","onTopReached","onBottomReached","onScrolledAwayFromBottom","onScroll","props","select","contentOffsetY","_onScroll","event","contentOffset","nativeEvent","prevOffsetY","current","currOffsetY","y","__DEV__","console","warn","createElement","_extends","bounces","removeClippedSubviews","keyboardDismissMode","keyboardShouldPersistTaps","indicatorStyle","light","dark","inverted","Boolean","data","length","onEndReached","onScrollToIndexFailed","onStartReached","scrollEventThrottle","keyExtractor","style","flex","flatten","maintainVisibleContentPosition","minIndexForVisible","autoscrollToTopThreshold"],"sources":["index.tsx"],"sourcesContent":["import React, { forwardRef, useRef } from 'react';\nimport { FlatListProps, Platform, FlatList as RNFlatList, StyleSheet } from 'react-native';\n\nimport { useUIKitTheme } from '@sendbird/uikit-react-native-foundation';\nimport { NOOP, SendbirdMessage, getMessageUniqId, useFreshCallback } from '@sendbird/uikit-utils';\n\nimport FlatListInternal from './FlatListInternal';\n\nlet ANDROID_BUG_ALERT_SHOWED = Platform.OS !== 'android';\nconst BOTTOM_DETECT_THRESHOLD = 25;\nconst UNREACHABLE_THRESHOLD = Number.MIN_SAFE_INTEGER;\n\ntype Props = Omit<FlatListProps<SendbirdMessage>, 'onEndReached'> & {\n onBottomReached: () => void;\n onTopReached: () => void;\n onScrolledAwayFromBottom: (value: boolean) => void;\n};\n// FIXME: Inverted FlatList performance issue on Android {@link https://github.com/facebook/react-native/issues/30034}\nconst ChatFlatList = forwardRef<RNFlatList, Props>(function ChatFlatList(\n { onTopReached, onBottomReached, onScrolledAwayFromBottom, onScroll, ...props },\n ref,\n) {\n const { select } = useUIKitTheme();\n const contentOffsetY = useRef(0);\n\n const _onScroll = useFreshCallback<NonNullable<Props['onScroll']>>((event) => {\n onScroll?.(event);\n\n const { contentOffset } = event.nativeEvent;\n\n const prevOffsetY = contentOffsetY.current;\n const currOffsetY = contentOffset.y;\n\n if (BOTTOM_DETECT_THRESHOLD < prevOffsetY && currOffsetY <= BOTTOM_DETECT_THRESHOLD) {\n onScrolledAwayFromBottom(false);\n } else if (BOTTOM_DETECT_THRESHOLD < currOffsetY && prevOffsetY <= BOTTOM_DETECT_THRESHOLD) {\n onScrolledAwayFromBottom(true);\n }\n\n contentOffsetY.current = contentOffset.y;\n });\n\n if (__DEV__ && !ANDROID_BUG_ALERT_SHOWED) {\n ANDROID_BUG_ALERT_SHOWED = true;\n // eslint-disable-next-line no-console\n console.warn(\n 'UIKit Warning: The inverted FlatList has a performance issue on Android. Maybe this is a bug.\\n' +\n 'Please refer to the link: https://github.com/facebook/react-native/issues/30034',\n );\n }\n\n return (\n <FlatListInternal\n bounces={false}\n removeClippedSubviews\n keyboardDismissMode={'on-drag'}\n keyboardShouldPersistTaps={'handled'}\n indicatorStyle={select({ light: 'black', dark: 'white' })}\n {...props}\n // FIXME: inverted list of ListEmptyComponent is reversed {@link https://github.com/facebook/react-native/issues/21196#issuecomment-836937743}\n inverted={Boolean(props.data?.length)}\n ref={ref}\n onEndReached={onTopReached}\n onScrollToIndexFailed={NOOP}\n onStartReached={onBottomReached}\n scrollEventThrottle={16}\n onScroll={_onScroll}\n keyExtractor={getMessageUniqId}\n style={{ flex: 1, ...StyleSheet.flatten(props.style) }}\n maintainVisibleContentPosition={{ minIndexForVisible: 0, autoscrollToTopThreshold: UNREACHABLE_THRESHOLD }}\n />\n );\n});\n\nexport default ChatFlatList;\n"],"mappings":";AAAA,OAAOA,KAAK,IAAIC,UAAU,EAAEC,MAAM,QAAQ,OAAO;AACjD,SAAwBC,QAAQ,EAA0BC,UAAU,QAAQ,cAAc;AAE1F,SAASC,aAAa,QAAQ,yCAAyC;AACvE,SAASC,IAAI,EAAmBC,gBAAgB,EAAEC,gBAAgB,QAAQ,uBAAuB;AAEjG,OAAOC,gBAAgB,MAAM,oBAAoB;AAEjD,IAAIC,wBAAwB,GAAGP,QAAQ,CAACQ,EAAE,KAAK,SAAS;AACxD,MAAMC,uBAAuB,GAAG,EAAE;AAClC,MAAMC,qBAAqB,GAAGC,MAAM,CAACC,gBAAgB;AAOrD;AACA,MAAMC,YAAY,gBAAGf,UAAU,CAAoB,SAASe,YAAYA,CAAAC,IAAA,EAEtEC,GAAG,EACH;EAAA,IAAAC,WAAA;EAAA,IAFA;IAAEC,YAAY;IAAEC,eAAe;IAAEC,wBAAwB;IAAEC,QAAQ;IAAE,GAAGC;EAAM,CAAC,GAAAP,IAAA;EAG/E,MAAM;IAAEQ;EAAO,CAAC,GAAGpB,aAAa,EAAE;EAClC,MAAMqB,cAAc,GAAGxB,MAAM,CAAC,CAAC,CAAC;EAEhC,MAAMyB,SAAS,GAAGnB,gBAAgB,CAAkCoB,KAAK,IAAK;IAC5EL,QAAQ,aAARA,QAAQ,uBAARA,QAAQ,CAAGK,KAAK,CAAC;IAEjB,MAAM;MAAEC;IAAc,CAAC,GAAGD,KAAK,CAACE,WAAW;IAE3C,MAAMC,WAAW,GAAGL,cAAc,CAACM,OAAO;IAC1C,MAAMC,WAAW,GAAGJ,aAAa,CAACK,CAAC;IAEnC,IAAItB,uBAAuB,GAAGmB,WAAW,IAAIE,WAAW,IAAIrB,uBAAuB,EAAE;MACnFU,wBAAwB,CAAC,KAAK,CAAC;IACjC,CAAC,MAAM,IAAIV,uBAAuB,GAAGqB,WAAW,IAAIF,WAAW,IAAInB,uBAAuB,EAAE;MAC1FU,wBAAwB,CAAC,IAAI,CAAC;IAChC;IAEAI,cAAc,CAACM,OAAO,GAAGH,aAAa,CAACK,CAAC;EAC1C,CAAC,CAAC;EAEF,IAAIC,OAAO,IAAI,CAACzB,wBAAwB,EAAE;IACxCA,wBAAwB,GAAG,IAAI;IAC/B;IACA0B,OAAO,CAACC,IAAI,CACV,iGAAiG,GAC/F,iFAAiF,CACpF;EACH;EAEA,oBACErC,KAAA,CAAAsC,aAAA,CAAC7B,gBAAgB,EAAA8B,QAAA;IACfC,OAAO,EAAE,KAAM;IACfC,qBAAqB;IACrBC,mBAAmB,EAAE,SAAU;IAC/BC,yBAAyB,EAAE,SAAU;IACrCC,cAAc,EAAEnB,MAAM,CAAC;MAAEoB,KAAK,EAAE,OAAO;MAAEC,IAAI,EAAE;IAAQ,CAAC;EAAE,GACtDtB,KAAK;IACT;IACAuB,QAAQ,EAAEC,OAAO,EAAA7B,WAAA,GAACK,KAAK,CAACyB,IAAI,cAAA9B,WAAA,uBAAVA,WAAA,CAAY+B,MAAM,CAAE;IACtChC,GAAG,EAAEA,GAAI;IACTiC,YAAY,EAAE/B,YAAa;IAC3BgC,qBAAqB,EAAE9C,IAAK;IAC5B+C,cAAc,EAAEhC,eAAgB;IAChCiC,mBAAmB,EAAE,EAAG;IACxB/B,QAAQ,EAAEI,SAAU;IACpB4B,YAAY,EAAEhD,gBAAiB;IAC/BiD,KAAK,EAAE;MAAEC,IAAI,EAAE,CAAC;MAAE,GAAGrD,UAAU,CAACsD,OAAO,CAAClC,KAAK,CAACgC,KAAK;IAAE,CAAE;IACvDG,8BAA8B,EAAE;MAAEC,kBAAkB,EAAE,CAAC;MAAEC,wBAAwB,EAAEhD;IAAsB;EAAE,GAC3G;AAEN,CAAC,CAAC;AAEF,eAAeG,YAAY"}
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import { getFileType } from '@sendbird/uikit-utils';
|
|
2
2
|
import SBUError from '../libs/SBUError';
|
|
3
|
+
import expoBackwardUtils from '../utils/expoBackwardUtils';
|
|
3
4
|
import expoPermissionGranted from '../utils/expoPermissionGranted';
|
|
4
5
|
import normalizeFile from '../utils/normalizeFile';
|
|
5
6
|
const createExpoFileService = _ref => {
|
|
@@ -50,17 +51,9 @@ const createExpoFileService = _ref => {
|
|
|
50
51
|
}
|
|
51
52
|
})()
|
|
52
53
|
});
|
|
53
|
-
if (response
|
|
54
|
-
const
|
|
55
|
-
|
|
56
|
-
} = response;
|
|
57
|
-
const {
|
|
58
|
-
size
|
|
59
|
-
} = await fsModule.getInfoAsync(response.uri);
|
|
60
|
-
return normalizeFile({
|
|
61
|
-
uri,
|
|
62
|
-
size
|
|
63
|
-
});
|
|
54
|
+
if (expoBackwardUtils.toCanceled(response)) return null;
|
|
55
|
+
const filePickerRes = await expoBackwardUtils.toFilePickerResponses(response, fsModule);
|
|
56
|
+
return filePickerRes[0];
|
|
64
57
|
}
|
|
65
58
|
async openMediaLibrary(options) {
|
|
66
59
|
const hasPermission = await this.hasMediaLibraryPermission('read');
|
|
@@ -72,7 +65,9 @@ const createExpoFileService = _ref => {
|
|
|
72
65
|
return null;
|
|
73
66
|
}
|
|
74
67
|
}
|
|
68
|
+
const selectionLimit = (options === null || options === void 0 ? void 0 : options.selectionLimit) || 1;
|
|
75
69
|
const response = await imagePickerModule.launchImageLibraryAsync({
|
|
70
|
+
selectionLimit,
|
|
76
71
|
mediaTypes: (() => {
|
|
77
72
|
switch (options === null || options === void 0 ? void 0 : options.mediaType) {
|
|
78
73
|
case 'photo':
|
|
@@ -86,17 +81,8 @@ const createExpoFileService = _ref => {
|
|
|
86
81
|
}
|
|
87
82
|
})()
|
|
88
83
|
});
|
|
89
|
-
if (response
|
|
90
|
-
|
|
91
|
-
uri
|
|
92
|
-
} = response;
|
|
93
|
-
const {
|
|
94
|
-
size
|
|
95
|
-
} = await fsModule.getInfoAsync(uri);
|
|
96
|
-
return [await normalizeFile({
|
|
97
|
-
uri,
|
|
98
|
-
size
|
|
99
|
-
})];
|
|
84
|
+
if (expoBackwardUtils.toCanceled(response)) return null;
|
|
85
|
+
return expoBackwardUtils.toFilePickerResponses(response, fsModule);
|
|
100
86
|
}
|
|
101
87
|
async openDocument(options) {
|
|
102
88
|
try {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["getFileType","SBUError","expoPermissionGranted","normalizeFile","createExpoFileService","_ref","imagePickerModule","documentPickerModule","mediaLibraryModule","fsModule","ExpoFileServiceInterface","hasCameraPermission","res","getCameraPermissionsAsync","requestCameraPermission","requestCameraPermissionsAsync","hasMediaLibraryPermission","type","perms","getPermissionsAsync","requestMediaLibraryPermission","requestPermissionsAsync","openCamera","options","hasPermission","granted","_options$onOpenFailur","onOpenFailure","call","PERMISSIONS_DENIED","response","launchCameraAsync","mediaTypes","mediaType","MediaTypeOptions","Images","Videos","All","cancelled","uri","size","getInfoAsync","openMediaLibrary","_options$onOpenFailur2","launchImageLibraryAsync","openDocument","getDocumentAsync","mimeType","name","e","_options$onOpenFailur3","UNKNOWN","save","Error","basePath","documentDirectory","cacheDirectory","downloadPath","fileName","downloadAsync","fileUrl","fileType","match","saveToLibraryAsync"],"sources":["createFileService.expo.ts"],"sourcesContent":["import type * as ExpoDocumentPicker from 'expo-document-picker';\nimport type * as ExpoFs from 'expo-file-system';\nimport type * as ExpoImagePicker from 'expo-image-picker';\nimport type * as ExpoMediaLibrary from 'expo-media-library';\n\nimport { getFileType } from '@sendbird/uikit-utils';\n\nimport SBUError from '../libs/SBUError';\nimport type { ExpoMediaLibraryPermissionResponse, ExpoPermissionResponse } from '../utils/expoPermissionGranted';\nimport expoPermissionGranted from '../utils/expoPermissionGranted';\nimport normalizeFile from '../utils/normalizeFile';\nimport type {\n FilePickerResponse,\n FileServiceInterface,\n OpenCameraOptions,\n OpenDocumentOptions,\n OpenMediaLibraryOptions,\n SaveOptions,\n} from './types';\n\nconst createExpoFileService = ({\n imagePickerModule,\n documentPickerModule,\n mediaLibraryModule,\n fsModule,\n}: {\n imagePickerModule: typeof ExpoImagePicker;\n documentPickerModule: typeof ExpoDocumentPicker;\n mediaLibraryModule: typeof ExpoMediaLibrary;\n fsModule: typeof ExpoFs;\n}): FileServiceInterface => {\n class ExpoFileServiceInterface implements FileServiceInterface {\n async hasCameraPermission(): Promise<boolean> {\n const res = (await imagePickerModule.getCameraPermissionsAsync()) as ExpoPermissionResponse;\n return expoPermissionGranted([res]);\n }\n async requestCameraPermission(): Promise<boolean> {\n const res = (await imagePickerModule.requestCameraPermissionsAsync()) as ExpoPermissionResponse;\n return expoPermissionGranted([res]);\n }\n async hasMediaLibraryPermission(type: 'write' | 'read'): Promise<boolean> {\n const perms = (await mediaLibraryModule.getPermissionsAsync(\n type === 'write',\n )) as ExpoMediaLibraryPermissionResponse;\n return expoPermissionGranted([perms]);\n }\n async requestMediaLibraryPermission(type: 'write' | 'read'): Promise<boolean> {\n const perms = (await mediaLibraryModule.requestPermissionsAsync(\n type === 'write',\n )) as ExpoMediaLibraryPermissionResponse;\n return expoPermissionGranted([perms]);\n }\n\n async openCamera(options?: OpenCameraOptions): Promise<FilePickerResponse> {\n const hasPermission = await this.hasCameraPermission();\n if (!hasPermission) {\n const granted = await this.requestCameraPermission();\n if (!granted) {\n options?.onOpenFailure?.(SBUError.PERMISSIONS_DENIED);\n return null;\n }\n }\n\n const response = await imagePickerModule.launchCameraAsync({\n mediaTypes: (() => {\n switch (options?.mediaType) {\n case 'photo':\n return imagePickerModule.MediaTypeOptions.Images;\n case 'video':\n return imagePickerModule.MediaTypeOptions.Videos;\n case 'all':\n return imagePickerModule.MediaTypeOptions.All;\n default:\n return imagePickerModule.MediaTypeOptions.Images;\n }\n })(),\n });\n\n if (response.cancelled) return null;\n\n const { uri } = response;\n const { size } = await fsModule.getInfoAsync(response.uri);\n\n return normalizeFile({ uri, size });\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 response = await imagePickerModule.launchImageLibraryAsync({\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 (response.cancelled) return null;\n const { uri } = response;\n const { size } = await fsModule.getInfoAsync(uri);\n return [await normalizeFile({ uri, size })];\n }\n\n async openDocument(options?: OpenDocumentOptions): Promise<FilePickerResponse> {\n try {\n const response = await documentPickerModule.getDocumentAsync({ type: '*/*' });\n if (response.type === 'cancel') return null;\n const { mimeType, uri, size, name } = response;\n return normalizeFile({ uri, size, name, type: mimeType });\n } catch (e) {\n options?.onOpenFailure?.(SBUError.UNKNOWN, e);\n return null;\n }\n }\n\n async save(options: SaveOptions): Promise<string> {\n const hasPermission = await this.hasMediaLibraryPermission('write');\n if (!hasPermission) {\n const granted = await this.requestMediaLibraryPermission('write');\n if (!granted) throw new Error('Permission not granted');\n }\n\n const basePath = fsModule.documentDirectory || fsModule.cacheDirectory;\n if (!basePath) throw new Error('Cannot determine directory');\n\n const downloadPath = `${basePath}/${options.fileName}`;\n\n const response = await fsModule.downloadAsync(options.fileUrl, downloadPath);\n if (getFileType(options.fileType || '').match(/video|image/)) {\n await mediaLibraryModule.saveToLibraryAsync(response.uri);\n }\n return response.uri;\n }\n }\n\n return new ExpoFileServiceInterface();\n};\n\nexport default createExpoFileService;\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"names":["getFileType","SBUError","expoBackwardUtils","expoPermissionGranted","normalizeFile","createExpoFileService","_ref","imagePickerModule","documentPickerModule","mediaLibraryModule","fsModule","ExpoFileServiceInterface","hasCameraPermission","res","getCameraPermissionsAsync","requestCameraPermission","requestCameraPermissionsAsync","hasMediaLibraryPermission","type","perms","getPermissionsAsync","requestMediaLibraryPermission","requestPermissionsAsync","openCamera","options","hasPermission","granted","_options$onOpenFailur","onOpenFailure","call","PERMISSIONS_DENIED","response","launchCameraAsync","mediaTypes","mediaType","MediaTypeOptions","Images","Videos","All","toCanceled","filePickerRes","toFilePickerResponses","openMediaLibrary","_options$onOpenFailur2","selectionLimit","launchImageLibraryAsync","openDocument","getDocumentAsync","mimeType","uri","size","name","e","_options$onOpenFailur3","UNKNOWN","save","Error","basePath","documentDirectory","cacheDirectory","downloadPath","fileName","downloadAsync","fileUrl","fileType","match","saveToLibraryAsync"],"sources":["createFileService.expo.ts"],"sourcesContent":["import type * as ExpoDocumentPicker from 'expo-document-picker';\nimport type * as ExpoFs from 'expo-file-system';\nimport type * as ExpoImagePicker from 'expo-image-picker';\nimport type * as ExpoMediaLibrary from 'expo-media-library';\n\nimport { getFileType } from '@sendbird/uikit-utils';\n\nimport SBUError from '../libs/SBUError';\nimport expoBackwardUtils from '../utils/expoBackwardUtils';\nimport type { ExpoMediaLibraryPermissionResponse, ExpoPermissionResponse } from '../utils/expoPermissionGranted';\nimport expoPermissionGranted from '../utils/expoPermissionGranted';\nimport normalizeFile from '../utils/normalizeFile';\nimport type {\n FilePickerResponse,\n FileServiceInterface,\n OpenCameraOptions,\n OpenDocumentOptions,\n OpenMediaLibraryOptions,\n SaveOptions,\n} from './types';\n\nconst createExpoFileService = ({\n imagePickerModule,\n documentPickerModule,\n mediaLibraryModule,\n fsModule,\n}: {\n imagePickerModule: typeof ExpoImagePicker;\n documentPickerModule: typeof ExpoDocumentPicker;\n mediaLibraryModule: typeof ExpoMediaLibrary;\n fsModule: typeof ExpoFs;\n}): FileServiceInterface => {\n class ExpoFileServiceInterface implements FileServiceInterface {\n async hasCameraPermission(): Promise<boolean> {\n const res = (await imagePickerModule.getCameraPermissionsAsync()) as ExpoPermissionResponse;\n return expoPermissionGranted([res]);\n }\n async requestCameraPermission(): Promise<boolean> {\n const res = (await imagePickerModule.requestCameraPermissionsAsync()) as ExpoPermissionResponse;\n return expoPermissionGranted([res]);\n }\n async hasMediaLibraryPermission(type: 'write' | 'read'): Promise<boolean> {\n const perms = (await mediaLibraryModule.getPermissionsAsync(\n type === 'write',\n )) as ExpoMediaLibraryPermissionResponse;\n return expoPermissionGranted([perms]);\n }\n async requestMediaLibraryPermission(type: 'write' | 'read'): Promise<boolean> {\n const perms = (await mediaLibraryModule.requestPermissionsAsync(\n type === 'write',\n )) as ExpoMediaLibraryPermissionResponse;\n return expoPermissionGranted([perms]);\n }\n\n async openCamera(options?: OpenCameraOptions): Promise<FilePickerResponse> {\n const hasPermission = await this.hasCameraPermission();\n if (!hasPermission) {\n const granted = await this.requestCameraPermission();\n if (!granted) {\n options?.onOpenFailure?.(SBUError.PERMISSIONS_DENIED);\n return null;\n }\n }\n\n const response = await imagePickerModule.launchCameraAsync({\n mediaTypes: (() => {\n switch (options?.mediaType) {\n case 'photo':\n return imagePickerModule.MediaTypeOptions.Images;\n case 'video':\n return imagePickerModule.MediaTypeOptions.Videos;\n case 'all':\n return imagePickerModule.MediaTypeOptions.All;\n default:\n return imagePickerModule.MediaTypeOptions.Images;\n }\n })(),\n });\n\n if (expoBackwardUtils.toCanceled(response)) return null;\n\n const filePickerRes = await expoBackwardUtils.toFilePickerResponses(response, fsModule);\n return filePickerRes[0];\n }\n async openMediaLibrary(options: OpenMediaLibraryOptions) {\n const hasPermission = await this.hasMediaLibraryPermission('read');\n if (!hasPermission) {\n const granted = await this.requestMediaLibraryPermission('read');\n if (!granted) {\n options?.onOpenFailure?.(SBUError.PERMISSIONS_DENIED);\n return null;\n }\n }\n\n const selectionLimit = options?.selectionLimit || 1;\n const response = await imagePickerModule.launchImageLibraryAsync({\n selectionLimit,\n mediaTypes: (() => {\n switch (options?.mediaType) {\n case 'photo':\n return imagePickerModule.MediaTypeOptions.Images;\n case 'video':\n return imagePickerModule.MediaTypeOptions.Videos;\n case 'all':\n return imagePickerModule.MediaTypeOptions.All;\n default:\n return imagePickerModule.MediaTypeOptions.Images;\n }\n })(),\n });\n if (expoBackwardUtils.toCanceled(response)) return null;\n return expoBackwardUtils.toFilePickerResponses(response, fsModule);\n }\n\n async openDocument(options?: OpenDocumentOptions): Promise<FilePickerResponse> {\n try {\n const response = await documentPickerModule.getDocumentAsync({ type: '*/*' });\n if (response.type === 'cancel') return null;\n const { mimeType, uri, size, name } = response;\n return normalizeFile({ uri, size, name, type: mimeType });\n } catch (e) {\n options?.onOpenFailure?.(SBUError.UNKNOWN, e);\n return null;\n }\n }\n\n async save(options: SaveOptions): Promise<string> {\n const hasPermission = await this.hasMediaLibraryPermission('write');\n if (!hasPermission) {\n const granted = await this.requestMediaLibraryPermission('write');\n if (!granted) throw new Error('Permission not granted');\n }\n\n const basePath = fsModule.documentDirectory || fsModule.cacheDirectory;\n if (!basePath) throw new Error('Cannot determine directory');\n\n const downloadPath = `${basePath}/${options.fileName}`;\n\n const response = await fsModule.downloadAsync(options.fileUrl, downloadPath);\n if (getFileType(options.fileType || '').match(/video|image/)) {\n await mediaLibraryModule.saveToLibraryAsync(response.uri);\n }\n return response.uri;\n }\n }\n\n return new ExpoFileServiceInterface();\n};\n\nexport default createExpoFileService;\n"],"mappings":"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"}
|
|
@@ -2,6 +2,7 @@ function _extends() { _extends = Object.assign ? Object.assign.bind() : function
|
|
|
2
2
|
import React from 'react';
|
|
3
3
|
import { getDownscaleSize } from '@sendbird/uikit-utils';
|
|
4
4
|
import SBUUtils from '../libs/SBUUtils';
|
|
5
|
+
import expoBackwardUtils from '../utils/expoBackwardUtils';
|
|
5
6
|
const createExpoMediaService = _ref => {
|
|
6
7
|
let {
|
|
7
8
|
avModule,
|
|
@@ -65,12 +66,10 @@ const createExpoMediaService = _ref => {
|
|
|
65
66
|
}], {
|
|
66
67
|
compress: Math.min(Math.max(0, compressionRate), 1)
|
|
67
68
|
});
|
|
68
|
-
const
|
|
69
|
-
size = 0
|
|
70
|
-
} = await fsModule.getInfoAsync(uri);
|
|
69
|
+
const fileInfo = await fsModule.getInfoAsync(uri);
|
|
71
70
|
return {
|
|
72
71
|
uri: compressedURI,
|
|
73
|
-
size
|
|
72
|
+
size: expoBackwardUtils.toFileSize(fileInfo)
|
|
74
73
|
};
|
|
75
74
|
}
|
|
76
75
|
};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["React","getDownscaleSize","SBUUtils","createExpoMediaService","_ref","avModule","thumbnailModule","imageManipulator","fsModule","VideoComponent","_ref2","source","resizeMode","onLoad","props","createElement","Video","_extends","useNativeControls","getVideoThumbnail","_ref3","url","quality","timeMills","uri","getThumbnailAsync","time","path","compressImage","_ref4","maxWidth","maxHeight","compressionRate","originSize","getImageSize","resizingSize","width","height","compressedURI","manipulateAsync","resize","compress","Math","min","max","
|
|
1
|
+
{"version":3,"names":["React","getDownscaleSize","SBUUtils","expoBackwardUtils","createExpoMediaService","_ref","avModule","thumbnailModule","imageManipulator","fsModule","VideoComponent","_ref2","source","resizeMode","onLoad","props","createElement","Video","_extends","useNativeControls","getVideoThumbnail","_ref3","url","quality","timeMills","uri","getThumbnailAsync","time","path","compressImage","_ref4","maxWidth","maxHeight","compressionRate","originSize","getImageSize","resizingSize","width","height","compressedURI","manipulateAsync","resize","compress","Math","min","max","fileInfo","getInfoAsync","size","toFileSize"],"sources":["createMediaService.expo.tsx"],"sourcesContent":["import type * as ExpoAV from 'expo-av';\nimport type * as ExpoFS from 'expo-file-system';\nimport type * as ExpoImageManipulator from 'expo-image-manipulator';\nimport type * as ExpoVideoThumbnail from 'expo-video-thumbnails';\nimport React from 'react';\n\nimport { getDownscaleSize } from '@sendbird/uikit-utils';\n\nimport SBUUtils from '../libs/SBUUtils';\nimport expoBackwardUtils from '../utils/expoBackwardUtils';\nimport type { MediaServiceInterface } from './types';\n\ntype Modules = {\n avModule: typeof ExpoAV;\n thumbnailModule: typeof ExpoVideoThumbnail;\n imageManipulator: typeof ExpoImageManipulator;\n fsModule: typeof ExpoFS;\n};\n\nconst createExpoMediaService = ({\n avModule,\n thumbnailModule,\n imageManipulator,\n fsModule,\n}: Modules): MediaServiceInterface => {\n return {\n VideoComponent({ source, resizeMode, onLoad, ...props }) {\n // FIXME: type error https://github.com/expo/expo/issues/17101\n // @ts-ignore\n return <avModule.Video {...props} source={source} resizeMode={resizeMode} onLoad={onLoad} useNativeControls />;\n },\n async getVideoThumbnail({ url, quality, timeMills }) {\n try {\n const { uri } = await thumbnailModule.getThumbnailAsync(url, { quality, time: timeMills });\n return { path: uri };\n } catch {\n return null;\n }\n },\n async compressImage({ maxWidth, maxHeight, compressionRate = 1, uri }) {\n const originSize = await SBUUtils.getImageSize(uri);\n const resizingSize = getDownscaleSize(originSize, { width: maxWidth, height: maxHeight });\n\n const { uri: compressedURI } = await imageManipulator.manipulateAsync(uri, [{ resize: resizingSize }], {\n compress: Math.min(Math.max(0, compressionRate), 1),\n });\n const fileInfo = await fsModule.getInfoAsync(uri);\n\n return { uri: compressedURI, size: expoBackwardUtils.toFileSize(fileInfo) };\n },\n };\n};\n\nexport default createExpoMediaService;\n"],"mappings":";AAIA,OAAOA,KAAK,MAAM,OAAO;AAEzB,SAASC,gBAAgB,QAAQ,uBAAuB;AAExD,OAAOC,QAAQ,MAAM,kBAAkB;AACvC,OAAOC,iBAAiB,MAAM,4BAA4B;AAU1D,MAAMC,sBAAsB,GAAGC,IAAA,IAKO;EAAA,IALN;IAC9BC,QAAQ;IACRC,eAAe;IACfC,gBAAgB;IAChBC;EACO,CAAC,GAAAJ,IAAA;EACR,OAAO;IACLK,cAAcA,CAAAC,KAAA,EAA2C;MAAA,IAA1C;QAAEC,MAAM;QAAEC,UAAU;QAAEC,MAAM;QAAE,GAAGC;MAAM,CAAC,GAAAJ,KAAA;MACrD;MACA;MACA,oBAAOX,KAAA,CAAAgB,aAAA,CAACV,QAAQ,CAACW,KAAK,EAAAC,QAAA,KAAKH,KAAK;QAAEH,MAAM,EAAEA,MAAO;QAACC,UAAU,EAAEA,UAAW;QAACC,MAAM,EAAEA,MAAO;QAACK,iBAAiB;MAAA,GAAG;IAChH,CAAC;IACD,MAAMC,iBAAiBA,CAAAC,KAAA,EAA8B;MAAA,IAA7B;QAAEC,GAAG;QAAEC,OAAO;QAAEC;MAAU,CAAC,GAAAH,KAAA;MACjD,IAAI;QACF,MAAM;UAAEI;QAAI,CAAC,GAAG,MAAMlB,eAAe,CAACmB,iBAAiB,CAACJ,GAAG,EAAE;UAAEC,OAAO;UAAEI,IAAI,EAAEH;QAAU,CAAC,CAAC;QAC1F,OAAO;UAAEI,IAAI,EAAEH;QAAI,CAAC;MACtB,CAAC,CAAC,MAAM;QACN,OAAO,IAAI;MACb;IACF,CAAC;IACD,MAAMI,aAAaA,CAAAC,KAAA,EAAoD;MAAA,IAAnD;QAAEC,QAAQ;QAAEC,SAAS;QAAEC,eAAe,GAAG,CAAC;QAAER;MAAI,CAAC,GAAAK,KAAA;MACnE,MAAMI,UAAU,GAAG,MAAMhC,QAAQ,CAACiC,YAAY,CAACV,GAAG,CAAC;MACnD,MAAMW,YAAY,GAAGnC,gBAAgB,CAACiC,UAAU,EAAE;QAAEG,KAAK,EAAEN,QAAQ;QAAEO,MAAM,EAAEN;MAAU,CAAC,CAAC;MAEzF,MAAM;QAAEP,GAAG,EAAEc;MAAc,CAAC,GAAG,MAAM/B,gBAAgB,CAACgC,eAAe,CAACf,GAAG,EAAE,CAAC;QAAEgB,MAAM,EAAEL;MAAa,CAAC,CAAC,EAAE;QACrGM,QAAQ,EAAEC,IAAI,CAACC,GAAG,CAACD,IAAI,CAACE,GAAG,CAAC,CAAC,EAAEZ,eAAe,CAAC,EAAE,CAAC;MACpD,CAAC,CAAC;MACF,MAAMa,QAAQ,GAAG,MAAMrC,QAAQ,CAACsC,YAAY,CAACtB,GAAG,CAAC;MAEjD,OAAO;QAAEA,GAAG,EAAEc,aAAa;QAAES,IAAI,EAAE7C,iBAAiB,CAAC8C,UAAU,CAACH,QAAQ;MAAE,CAAC;IAC7E;EACF,CAAC;AACH,CAAC;AAED,eAAe1C,sBAAsB"}
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
import normalizeFile from './normalizeFile';
|
|
2
|
+
const expoBackwardUtils = {
|
|
3
|
+
toCanceled(result) {
|
|
4
|
+
// @ts-expect-error backward compatibility
|
|
5
|
+
return result.canceled ?? result.cancelled;
|
|
6
|
+
},
|
|
7
|
+
toFileSize(info) {
|
|
8
|
+
if ('size' in info) {
|
|
9
|
+
return info.size;
|
|
10
|
+
} else {
|
|
11
|
+
return 0;
|
|
12
|
+
}
|
|
13
|
+
},
|
|
14
|
+
async toFilePickerResponses(result, fsModule) {
|
|
15
|
+
if (result.assets) {
|
|
16
|
+
const assets = result.assets || [];
|
|
17
|
+
const promises = assets.map(_ref => {
|
|
18
|
+
let {
|
|
19
|
+
fileName: name,
|
|
20
|
+
fileSize: size,
|
|
21
|
+
type,
|
|
22
|
+
uri
|
|
23
|
+
} = _ref;
|
|
24
|
+
return normalizeFile({
|
|
25
|
+
uri,
|
|
26
|
+
size,
|
|
27
|
+
name,
|
|
28
|
+
type
|
|
29
|
+
});
|
|
30
|
+
});
|
|
31
|
+
return Promise.all(promises);
|
|
32
|
+
} else if ('uri' in result && typeof result.uri === 'string') {
|
|
33
|
+
const fileInfo = await fsModule.getInfoAsync(result.uri);
|
|
34
|
+
const response = await normalizeFile({
|
|
35
|
+
uri: result.uri,
|
|
36
|
+
size: this.toFileSize(fileInfo)
|
|
37
|
+
});
|
|
38
|
+
return [response];
|
|
39
|
+
} else {
|
|
40
|
+
return [];
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
};
|
|
44
|
+
export default expoBackwardUtils;
|
|
45
|
+
//# sourceMappingURL=expoBackwardUtils.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"names":["normalizeFile","expoBackwardUtils","toCanceled","result","canceled","cancelled","toFileSize","info","size","toFilePickerResponses","fsModule","assets","promises","map","_ref","fileName","name","fileSize","type","uri","Promise","all","fileInfo","getInfoAsync","response"],"sources":["expoBackwardUtils.ts"],"sourcesContent":["import type * as ExpoFs from 'expo-file-system';\nimport type * as ExpoImagePicker from 'expo-image-picker';\n\nimport type { FilePickerResponse } from '../platform/types';\nimport normalizeFile from './normalizeFile';\n\nconst expoBackwardUtils = {\n toCanceled(result: ExpoImagePicker.ImagePickerResult) {\n // @ts-expect-error backward compatibility\n return result.canceled ?? result.cancelled;\n },\n toFileSize(info: ExpoFs.FileInfo) {\n if ('size' in info) {\n return info.size;\n } else {\n return 0;\n }\n },\n async toFilePickerResponses(\n result: ExpoImagePicker.ImagePickerResult,\n fsModule: typeof ExpoFs,\n ): Promise<FilePickerResponse[]> {\n if (result.assets) {\n const assets = result.assets || [];\n const promises = assets.map(({ fileName: name, fileSize: size, type, uri }) =>\n normalizeFile({ uri, size, name, type }),\n );\n\n return Promise.all(promises);\n } else if ('uri' in result && typeof result.uri === 'string') {\n const fileInfo = await fsModule.getInfoAsync(result.uri);\n const response = await normalizeFile({ uri: result.uri, size: this.toFileSize(fileInfo) });\n return [response];\n } else {\n return [];\n }\n },\n};\n\nexport default expoBackwardUtils;\n"],"mappings":"AAIA,OAAOA,aAAa,MAAM,iBAAiB;AAE3C,MAAMC,iBAAiB,GAAG;EACxBC,UAAUA,CAACC,MAAyC,EAAE;IACpD;IACA,OAAOA,MAAM,CAACC,QAAQ,IAAID,MAAM,CAACE,SAAS;EAC5C,CAAC;EACDC,UAAUA,CAACC,IAAqB,EAAE;IAChC,IAAI,MAAM,IAAIA,IAAI,EAAE;MAClB,OAAOA,IAAI,CAACC,IAAI;IAClB,CAAC,MAAM;MACL,OAAO,CAAC;IACV;EACF,CAAC;EACD,MAAMC,qBAAqBA,CACzBN,MAAyC,EACzCO,QAAuB,EACQ;IAC/B,IAAIP,MAAM,CAACQ,MAAM,EAAE;MACjB,MAAMA,MAAM,GAAGR,MAAM,CAACQ,MAAM,IAAI,EAAE;MAClC,MAAMC,QAAQ,GAAGD,MAAM,CAACE,GAAG,CAACC,IAAA;QAAA,IAAC;UAAEC,QAAQ,EAAEC,IAAI;UAAEC,QAAQ,EAAET,IAAI;UAAEU,IAAI;UAAEC;QAAI,CAAC,GAAAL,IAAA;QAAA,OACxEd,aAAa,CAAC;UAAEmB,GAAG;UAAEX,IAAI;UAAEQ,IAAI;UAAEE;QAAK,CAAC,CAAC;MAAA,EACzC;MAED,OAAOE,OAAO,CAACC,GAAG,CAACT,QAAQ,CAAC;IAC9B,CAAC,MAAM,IAAI,KAAK,IAAIT,MAAM,IAAI,OAAOA,MAAM,CAACgB,GAAG,KAAK,QAAQ,EAAE;MAC5D,MAAMG,QAAQ,GAAG,MAAMZ,QAAQ,CAACa,YAAY,CAACpB,MAAM,CAACgB,GAAG,CAAC;MACxD,MAAMK,QAAQ,GAAG,MAAMxB,aAAa,CAAC;QAAEmB,GAAG,EAAEhB,MAAM,CAACgB,GAAG;QAAEX,IAAI,EAAE,IAAI,CAACF,UAAU,CAACgB,QAAQ;MAAE,CAAC,CAAC;MAC1F,OAAO,CAACE,QAAQ,CAAC;IACnB,CAAC,MAAM;MACL,OAAO,EAAE;IACX;EACF;AACF,CAAC;AAED,eAAevB,iBAAiB"}
|
|
@@ -13,7 +13,7 @@ const normalizeFile = async _ref => {
|
|
|
13
13
|
const extension = getFileExtension(filename) || getFileExtensionFromMime(filetype) || (await getFileExtensionFromUri(uri));
|
|
14
14
|
if (extension) {
|
|
15
15
|
filename = normalizeFileName(filename, extension);
|
|
16
|
-
if (!filetype) {
|
|
16
|
+
if (!filetype || !isNotMimeType(filetype)) {
|
|
17
17
|
filetype = getMimeFromFileExtension(extension);
|
|
18
18
|
}
|
|
19
19
|
}
|
|
@@ -24,5 +24,8 @@ const normalizeFile = async _ref => {
|
|
|
24
24
|
size: size ?? 0
|
|
25
25
|
};
|
|
26
26
|
};
|
|
27
|
+
function isNotMimeType(str) {
|
|
28
|
+
return str.indexOf('/') === -1;
|
|
29
|
+
}
|
|
27
30
|
export default normalizeFile;
|
|
28
31
|
//# sourceMappingURL=normalizeFile.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["getFileExtension","getFileExtensionFromMime","getFileExtensionFromUri","getMimeFromFileExtension","normalizeFileName","normalizeFile","_ref","uri","size","name","type","filename","String","Date","now","filetype","extension"],"sources":["normalizeFile.ts"],"sourcesContent":["import type { PartialNullable } from '@sendbird/uikit-utils';\nimport {\n getFileExtension,\n getFileExtensionFromMime,\n getFileExtensionFromUri,\n getMimeFromFileExtension,\n normalizeFileName,\n} from '@sendbird/uikit-utils';\n\nimport type { FilePickerResponse, FileType } from '../platform/types';\n\nconst normalizeFile = async ({ uri, size, name, type }: PartialNullable<FileType>): Promise<FilePickerResponse> => {\n // URI is required property\n if (!uri) return null;\n\n let filename = name || String(Date.now());\n let filetype = type || '';\n\n const extension =\n getFileExtension(filename) || getFileExtensionFromMime(filetype) || (await getFileExtensionFromUri(uri));\n\n if (extension) {\n filename = normalizeFileName(filename, extension);\n if (!filetype) {\n filetype = getMimeFromFileExtension(extension);\n }\n }\n\n return { uri, name: filename, type: filetype, size: size ?? 0 };\n};\n\nexport default normalizeFile;\n"],"mappings":"AACA,SACEA,gBAAgB,EAChBC,wBAAwB,EACxBC,uBAAuB,EACvBC,wBAAwB,EACxBC,iBAAiB,QACZ,uBAAuB;AAI9B,MAAMC,aAAa,GAAG,MAAAC,IAAA,IAA6F;EAAA,IAAtF;IAAEC,GAAG;IAAEC,IAAI;IAAEC,IAAI;IAAEC;EAAgC,CAAC,GAAAJ,IAAA;EAC/E;EACA,IAAI,CAACC,GAAG,EAAE,OAAO,IAAI;EAErB,IAAII,QAAQ,GAAGF,IAAI,IAAIG,MAAM,CAACC,IAAI,CAACC,GAAG,EAAE,CAAC;EACzC,IAAIC,QAAQ,GAAGL,IAAI,IAAI,EAAE;EAEzB,MAAMM,SAAS,GACbhB,gBAAgB,CAACW,QAAQ,CAAC,IAAIV,wBAAwB,CAACc,QAAQ,CAAC,KAAK,MAAMb,uBAAuB,CAACK,GAAG,CAAC,CAAC;EAE1G,IAAIS,SAAS,EAAE;IACbL,QAAQ,GAAGP,iBAAiB,CAACO,QAAQ,EAAEK,SAAS,CAAC;IACjD,IAAI,CAACD,QAAQ,EAAE;
|
|
1
|
+
{"version":3,"names":["getFileExtension","getFileExtensionFromMime","getFileExtensionFromUri","getMimeFromFileExtension","normalizeFileName","normalizeFile","_ref","uri","size","name","type","filename","String","Date","now","filetype","extension","isNotMimeType","str","indexOf"],"sources":["normalizeFile.ts"],"sourcesContent":["import type { PartialNullable } from '@sendbird/uikit-utils';\nimport {\n getFileExtension,\n getFileExtensionFromMime,\n getFileExtensionFromUri,\n getMimeFromFileExtension,\n normalizeFileName,\n} from '@sendbird/uikit-utils';\n\nimport type { FilePickerResponse, FileType } from '../platform/types';\n\nconst normalizeFile = async ({ uri, size, name, type }: PartialNullable<FileType>): Promise<FilePickerResponse> => {\n // URI is required property\n if (!uri) return null;\n\n let filename = name || String(Date.now());\n let filetype = type || '';\n\n const extension =\n getFileExtension(filename) || getFileExtensionFromMime(filetype) || (await getFileExtensionFromUri(uri));\n\n if (extension) {\n filename = normalizeFileName(filename, extension);\n if (!filetype || !isNotMimeType(filetype)) {\n filetype = getMimeFromFileExtension(extension);\n }\n }\n\n return { uri, name: filename, type: filetype, size: size ?? 0 };\n};\n\nfunction isNotMimeType(str: string) {\n return str.indexOf('/') === -1;\n}\n\nexport default normalizeFile;\n"],"mappings":"AACA,SACEA,gBAAgB,EAChBC,wBAAwB,EACxBC,uBAAuB,EACvBC,wBAAwB,EACxBC,iBAAiB,QACZ,uBAAuB;AAI9B,MAAMC,aAAa,GAAG,MAAAC,IAAA,IAA6F;EAAA,IAAtF;IAAEC,GAAG;IAAEC,IAAI;IAAEC,IAAI;IAAEC;EAAgC,CAAC,GAAAJ,IAAA;EAC/E;EACA,IAAI,CAACC,GAAG,EAAE,OAAO,IAAI;EAErB,IAAII,QAAQ,GAAGF,IAAI,IAAIG,MAAM,CAACC,IAAI,CAACC,GAAG,EAAE,CAAC;EACzC,IAAIC,QAAQ,GAAGL,IAAI,IAAI,EAAE;EAEzB,MAAMM,SAAS,GACbhB,gBAAgB,CAACW,QAAQ,CAAC,IAAIV,wBAAwB,CAACc,QAAQ,CAAC,KAAK,MAAMb,uBAAuB,CAACK,GAAG,CAAC,CAAC;EAE1G,IAAIS,SAAS,EAAE;IACbL,QAAQ,GAAGP,iBAAiB,CAACO,QAAQ,EAAEK,SAAS,CAAC;IACjD,IAAI,CAACD,QAAQ,IAAI,CAACE,aAAa,CAACF,QAAQ,CAAC,EAAE;MACzCA,QAAQ,GAAGZ,wBAAwB,CAACa,SAAS,CAAC;IAChD;EACF;EAEA,OAAO;IAAET,GAAG;IAAEE,IAAI,EAAEE,QAAQ;IAAED,IAAI,EAAEK,QAAQ;IAAEP,IAAI,EAAEA,IAAI,IAAI;EAAE,CAAC;AACjE,CAAC;AAED,SAASS,aAAaA,CAACC,GAAW,EAAE;EAClC,OAAOA,GAAG,CAACC,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;AAChC;AAEA,eAAed,aAAa"}
|
package/lib/module/version.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["VERSION"],"sources":["version.ts"],"sourcesContent":["const VERSION = '3.0.
|
|
1
|
+
{"version":3,"names":["VERSION"],"sources":["version.ts"],"sourcesContent":["const VERSION = '3.0.1';\nexport default VERSION;\n"],"mappings":"AAAA,MAAMA,OAAO,GAAG,OAAO;AACvB,eAAeA,OAAO"}
|
|
@@ -10,7 +10,7 @@ import type { ClipboardServiceInterface, FileServiceInterface, MediaServiceInter
|
|
|
10
10
|
import type { ErrorBoundaryProps, LocalCacheStorage } from '../types';
|
|
11
11
|
type UnimplementedFeatures = 'enableVoiceMessage' | 'threadReplySelectType' | 'replyType';
|
|
12
12
|
export declare const SendbirdUIKit: Readonly<{
|
|
13
|
-
VERSION: "3.0.
|
|
13
|
+
VERSION: "3.0.1";
|
|
14
14
|
PLATFORM: string;
|
|
15
15
|
DEFAULT: {
|
|
16
16
|
AUTO_PUSH_TOKEN_REGISTRATION: boolean;
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import type * as ExpoFs from 'expo-file-system';
|
|
2
|
+
import type * as ExpoImagePicker from 'expo-image-picker';
|
|
3
|
+
import type { FilePickerResponse } from '../platform/types';
|
|
4
|
+
declare const expoBackwardUtils: {
|
|
5
|
+
toCanceled(result: ExpoImagePicker.ImagePickerResult): boolean;
|
|
6
|
+
toFileSize(info: ExpoFs.FileInfo): number;
|
|
7
|
+
toFilePickerResponses(result: ExpoImagePicker.ImagePickerResult, fsModule: typeof ExpoFs): Promise<FilePickerResponse[]>;
|
|
8
|
+
};
|
|
9
|
+
export default expoBackwardUtils;
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
declare const VERSION = "3.0.
|
|
1
|
+
declare const VERSION = "3.0.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.0.
|
|
3
|
+
"version": "3.0.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",
|
|
@@ -58,10 +58,10 @@
|
|
|
58
58
|
"access": "public"
|
|
59
59
|
},
|
|
60
60
|
"dependencies": {
|
|
61
|
-
"@sendbird/uikit-chat-hooks": "3.0.
|
|
62
|
-
"@sendbird/uikit-react-native-foundation": "3.0.
|
|
61
|
+
"@sendbird/uikit-chat-hooks": "3.0.1",
|
|
62
|
+
"@sendbird/uikit-react-native-foundation": "3.0.1",
|
|
63
63
|
"@sendbird/uikit-tools": "^0.0.1-alpha.38",
|
|
64
|
-
"@sendbird/uikit-utils": "3.0.
|
|
64
|
+
"@sendbird/uikit-utils": "3.0.1"
|
|
65
65
|
},
|
|
66
66
|
"devDependencies": {
|
|
67
67
|
"@bam.tech/react-native-image-resizer": "^3.0.4",
|
|
@@ -75,15 +75,15 @@
|
|
|
75
75
|
"@types/react-native": "*",
|
|
76
76
|
"@types/react-native-video": "^5.0.14",
|
|
77
77
|
"date-fns": "^2.28.0",
|
|
78
|
-
"expo-av": "^
|
|
79
|
-
"expo-clipboard": "^
|
|
80
|
-
"expo-document-picker": "^
|
|
81
|
-
"expo-file-system": "^
|
|
82
|
-
"expo-image-manipulator": "^11.
|
|
83
|
-
"expo-image-picker": "^
|
|
84
|
-
"expo-media-library": "^
|
|
85
|
-
"expo-notifications": "^0.
|
|
86
|
-
"expo-video-thumbnails": "^
|
|
78
|
+
"expo-av": "^13.2.1",
|
|
79
|
+
"expo-clipboard": "^4.1.2",
|
|
80
|
+
"expo-document-picker": "^11.2.2",
|
|
81
|
+
"expo-file-system": "^15.2.2",
|
|
82
|
+
"expo-image-manipulator": "^11.1.1",
|
|
83
|
+
"expo-image-picker": "^14.1.1",
|
|
84
|
+
"expo-media-library": "^15.2.3",
|
|
85
|
+
"expo-notifications": "^0.18.1",
|
|
86
|
+
"expo-video-thumbnails": "^7.2.1",
|
|
87
87
|
"glob": "^7.2.0",
|
|
88
88
|
"inquirer": "^8.2.0",
|
|
89
89
|
"js-convert-case": "^4.2.0",
|
|
@@ -204,5 +204,5 @@
|
|
|
204
204
|
"readmeFile": "./README.md",
|
|
205
205
|
"displayName": "@sendbird/uikit-react-native"
|
|
206
206
|
},
|
|
207
|
-
"gitHead": "
|
|
207
|
+
"gitHead": "6dbea50a7b0fd5690ed34faec2c7456c73677912"
|
|
208
208
|
}
|
|
@@ -1,5 +1,3 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* */
|
|
3
1
|
import type { ForwardedRef, ReactElement } from 'react';
|
|
4
2
|
import type { FlatListProps, FlatList as RNFlatList, ScrollViewProps } from 'react-native';
|
|
5
3
|
import { Platform } from 'react-native';
|
|
@@ -17,13 +15,16 @@ type BidirectionalProps<T> = {
|
|
|
17
15
|
};
|
|
18
16
|
|
|
19
17
|
function shouldUseScrollViewEnhancer() {
|
|
20
|
-
if (Platform.
|
|
21
|
-
|
|
18
|
+
if (Platform.OS !== 'android') return false;
|
|
19
|
+
|
|
20
|
+
if (Platform.constants.reactNativeVersion?.major < 1) {
|
|
21
|
+
if (Platform.constants.reactNativeVersion?.minor < 72) {
|
|
22
22
|
return true;
|
|
23
23
|
}
|
|
24
24
|
}
|
|
25
25
|
return false;
|
|
26
26
|
}
|
|
27
|
+
|
|
27
28
|
function getFlatList(): FlatListBidirectional {
|
|
28
29
|
if (shouldUseScrollViewEnhancer()) {
|
|
29
30
|
try {
|
|
@@ -16,7 +16,7 @@ type Props = Omit<FlatListProps<SendbirdMessage>, 'onEndReached'> & {
|
|
|
16
16
|
onScrolledAwayFromBottom: (value: boolean) => void;
|
|
17
17
|
};
|
|
18
18
|
// FIXME: Inverted FlatList performance issue on Android {@link https://github.com/facebook/react-native/issues/30034}
|
|
19
|
-
const ChatFlatList = forwardRef<RNFlatList, Props>(function
|
|
19
|
+
const ChatFlatList = forwardRef<RNFlatList, Props>(function ChatFlatList(
|
|
20
20
|
{ onTopReached, onBottomReached, onScrolledAwayFromBottom, onScroll, ...props },
|
|
21
21
|
ref,
|
|
22
22
|
) {
|
|
@@ -6,6 +6,7 @@ import type * as ExpoMediaLibrary from 'expo-media-library';
|
|
|
6
6
|
import { getFileType } from '@sendbird/uikit-utils';
|
|
7
7
|
|
|
8
8
|
import SBUError from '../libs/SBUError';
|
|
9
|
+
import expoBackwardUtils from '../utils/expoBackwardUtils';
|
|
9
10
|
import type { ExpoMediaLibraryPermissionResponse, ExpoPermissionResponse } from '../utils/expoPermissionGranted';
|
|
10
11
|
import expoPermissionGranted from '../utils/expoPermissionGranted';
|
|
11
12
|
import normalizeFile from '../utils/normalizeFile';
|
|
@@ -76,12 +77,10 @@ const createExpoFileService = ({
|
|
|
76
77
|
})(),
|
|
77
78
|
});
|
|
78
79
|
|
|
79
|
-
if (response
|
|
80
|
+
if (expoBackwardUtils.toCanceled(response)) return null;
|
|
80
81
|
|
|
81
|
-
const
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
return normalizeFile({ uri, size });
|
|
82
|
+
const filePickerRes = await expoBackwardUtils.toFilePickerResponses(response, fsModule);
|
|
83
|
+
return filePickerRes[0];
|
|
85
84
|
}
|
|
86
85
|
async openMediaLibrary(options: OpenMediaLibraryOptions) {
|
|
87
86
|
const hasPermission = await this.hasMediaLibraryPermission('read');
|
|
@@ -93,7 +92,9 @@ const createExpoFileService = ({
|
|
|
93
92
|
}
|
|
94
93
|
}
|
|
95
94
|
|
|
95
|
+
const selectionLimit = options?.selectionLimit || 1;
|
|
96
96
|
const response = await imagePickerModule.launchImageLibraryAsync({
|
|
97
|
+
selectionLimit,
|
|
97
98
|
mediaTypes: (() => {
|
|
98
99
|
switch (options?.mediaType) {
|
|
99
100
|
case 'photo':
|
|
@@ -107,10 +108,8 @@ const createExpoFileService = ({
|
|
|
107
108
|
}
|
|
108
109
|
})(),
|
|
109
110
|
});
|
|
110
|
-
if (response
|
|
111
|
-
|
|
112
|
-
const { size } = await fsModule.getInfoAsync(uri);
|
|
113
|
-
return [await normalizeFile({ uri, size })];
|
|
111
|
+
if (expoBackwardUtils.toCanceled(response)) return null;
|
|
112
|
+
return expoBackwardUtils.toFilePickerResponses(response, fsModule);
|
|
114
113
|
}
|
|
115
114
|
|
|
116
115
|
async openDocument(options?: OpenDocumentOptions): Promise<FilePickerResponse> {
|
|
@@ -7,6 +7,7 @@ import React from 'react';
|
|
|
7
7
|
import { getDownscaleSize } from '@sendbird/uikit-utils';
|
|
8
8
|
|
|
9
9
|
import SBUUtils from '../libs/SBUUtils';
|
|
10
|
+
import expoBackwardUtils from '../utils/expoBackwardUtils';
|
|
10
11
|
import type { MediaServiceInterface } from './types';
|
|
11
12
|
|
|
12
13
|
type Modules = {
|
|
@@ -43,9 +44,9 @@ const createExpoMediaService = ({
|
|
|
43
44
|
const { uri: compressedURI } = await imageManipulator.manipulateAsync(uri, [{ resize: resizingSize }], {
|
|
44
45
|
compress: Math.min(Math.max(0, compressionRate), 1),
|
|
45
46
|
});
|
|
46
|
-
const
|
|
47
|
+
const fileInfo = await fsModule.getInfoAsync(uri);
|
|
47
48
|
|
|
48
|
-
return { uri: compressedURI, size };
|
|
49
|
+
return { uri: compressedURI, size: expoBackwardUtils.toFileSize(fileInfo) };
|
|
49
50
|
},
|
|
50
51
|
};
|
|
51
52
|
};
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
import type * as ExpoFs from 'expo-file-system';
|
|
2
|
+
import type * as ExpoImagePicker from 'expo-image-picker';
|
|
3
|
+
|
|
4
|
+
import type { FilePickerResponse } from '../platform/types';
|
|
5
|
+
import normalizeFile from './normalizeFile';
|
|
6
|
+
|
|
7
|
+
const expoBackwardUtils = {
|
|
8
|
+
toCanceled(result: ExpoImagePicker.ImagePickerResult) {
|
|
9
|
+
// @ts-expect-error backward compatibility
|
|
10
|
+
return result.canceled ?? result.cancelled;
|
|
11
|
+
},
|
|
12
|
+
toFileSize(info: ExpoFs.FileInfo) {
|
|
13
|
+
if ('size' in info) {
|
|
14
|
+
return info.size;
|
|
15
|
+
} else {
|
|
16
|
+
return 0;
|
|
17
|
+
}
|
|
18
|
+
},
|
|
19
|
+
async toFilePickerResponses(
|
|
20
|
+
result: ExpoImagePicker.ImagePickerResult,
|
|
21
|
+
fsModule: typeof ExpoFs,
|
|
22
|
+
): Promise<FilePickerResponse[]> {
|
|
23
|
+
if (result.assets) {
|
|
24
|
+
const assets = result.assets || [];
|
|
25
|
+
const promises = assets.map(({ fileName: name, fileSize: size, type, uri }) =>
|
|
26
|
+
normalizeFile({ uri, size, name, type }),
|
|
27
|
+
);
|
|
28
|
+
|
|
29
|
+
return Promise.all(promises);
|
|
30
|
+
} else if ('uri' in result && typeof result.uri === 'string') {
|
|
31
|
+
const fileInfo = await fsModule.getInfoAsync(result.uri);
|
|
32
|
+
const response = await normalizeFile({ uri: result.uri, size: this.toFileSize(fileInfo) });
|
|
33
|
+
return [response];
|
|
34
|
+
} else {
|
|
35
|
+
return [];
|
|
36
|
+
}
|
|
37
|
+
},
|
|
38
|
+
};
|
|
39
|
+
|
|
40
|
+
export default expoBackwardUtils;
|
|
@@ -21,7 +21,7 @@ const normalizeFile = async ({ uri, size, name, type }: PartialNullable<FileType
|
|
|
21
21
|
|
|
22
22
|
if (extension) {
|
|
23
23
|
filename = normalizeFileName(filename, extension);
|
|
24
|
-
if (!filetype) {
|
|
24
|
+
if (!filetype || !isNotMimeType(filetype)) {
|
|
25
25
|
filetype = getMimeFromFileExtension(extension);
|
|
26
26
|
}
|
|
27
27
|
}
|
|
@@ -29,4 +29,8 @@ const normalizeFile = async ({ uri, size, name, type }: PartialNullable<FileType
|
|
|
29
29
|
return { uri, name: filename, type: filetype, size: size ?? 0 };
|
|
30
30
|
};
|
|
31
31
|
|
|
32
|
+
function isNotMimeType(str: string) {
|
|
33
|
+
return str.indexOf('/') === -1;
|
|
34
|
+
}
|
|
35
|
+
|
|
32
36
|
export default normalizeFile;
|
package/src/version.ts
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
const VERSION = '3.0.
|
|
1
|
+
const VERSION = '3.0.1';
|
|
2
2
|
export default VERSION;
|