@sendbird/uikit-react-native 1.0.2 → 1.1.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +7 -7
- package/lib/commonjs/components/FileViewer.js +319 -0
- package/lib/commonjs/components/FileViewer.js.map +1 -0
- package/lib/commonjs/components/MessageRenderer/FileMessage/VideoFileMessage.js +116 -0
- package/lib/commonjs/components/MessageRenderer/FileMessage/VideoFileMessage.js.map +1 -0
- package/lib/commonjs/components/MessageRenderer/FileMessage/index.js +8 -0
- package/lib/commonjs/components/MessageRenderer/FileMessage/index.js.map +1 -1
- package/lib/commonjs/components/MessageRenderer/MessageOutgoingStatus.js +20 -65
- package/lib/commonjs/components/MessageRenderer/MessageOutgoingStatus.js.map +1 -1
- package/lib/commonjs/components/UserActionBar.js +1 -3
- package/lib/commonjs/components/UserActionBar.js.map +1 -1
- package/lib/commonjs/components/UserSelectableBar.js +1 -3
- package/lib/commonjs/components/UserSelectableBar.js.map +1 -1
- package/lib/commonjs/constants.js +7 -1
- package/lib/commonjs/constants.js.map +1 -1
- package/lib/commonjs/containers/GroupChannelPreviewContainer.js +157 -0
- package/lib/commonjs/containers/GroupChannelPreviewContainer.js.map +1 -0
- package/lib/commonjs/{InternalErrorBoundary.js → containers/InternalErrorBoundaryContainer.js} +5 -5
- package/lib/commonjs/containers/InternalErrorBoundaryContainer.js.map +1 -0
- package/lib/commonjs/{SendbirdUIKitContainer.js → containers/SendbirdUIKitContainer.js} +15 -12
- package/lib/commonjs/containers/SendbirdUIKitContainer.js.map +1 -0
- package/lib/commonjs/contexts/PlatformService.js +4 -2
- package/lib/commonjs/contexts/PlatformService.js.map +1 -1
- package/lib/commonjs/contexts/SendbirdChat.js +6 -2
- package/lib/commonjs/contexts/SendbirdChat.js.map +1 -1
- package/lib/commonjs/domain/groupChannel/component/GroupChannelInput/SendInput.js +1 -1
- package/lib/commonjs/domain/groupChannel/component/GroupChannelInput/SendInput.js.map +1 -1
- package/lib/commonjs/domain/groupChannel/component/GroupChannelMessageList.js +30 -7
- package/lib/commonjs/domain/groupChannel/component/GroupChannelMessageList.js.map +1 -1
- package/lib/commonjs/domain/groupChannel/module/moduleContext.js +2 -3
- package/lib/commonjs/domain/groupChannel/module/moduleContext.js.map +1 -1
- package/lib/commonjs/domain/groupChannel/types.js.map +1 -1
- package/lib/commonjs/domain/groupChannelList/types.js.map +1 -1
- package/lib/commonjs/domain/groupChannelSettings/module/moduleContext.js +1 -1
- package/lib/commonjs/domain/groupChannelSettings/module/moduleContext.js.map +1 -1
- package/lib/commonjs/fragments/createGroupChannelCreateFragment.js +3 -7
- package/lib/commonjs/fragments/createGroupChannelCreateFragment.js.map +1 -1
- package/lib/commonjs/fragments/createGroupChannelFragment.js +14 -12
- package/lib/commonjs/fragments/createGroupChannelFragment.js.map +1 -1
- package/lib/commonjs/fragments/createGroupChannelListFragment.js +10 -40
- package/lib/commonjs/fragments/createGroupChannelListFragment.js.map +1 -1
- package/lib/commonjs/fragments/createGroupChannelMembersFragment.js +1 -1
- package/lib/commonjs/fragments/createGroupChannelMembersFragment.js.map +1 -1
- package/lib/commonjs/hooks/useContext.js.map +1 -1
- package/lib/commonjs/index.js +30 -3
- package/lib/commonjs/index.js.map +1 -1
- package/lib/commonjs/{InternalLocalCacheStorage.js → libs/InternalLocalCacheStorage.js} +0 -0
- package/lib/commonjs/libs/InternalLocalCacheStorage.js.map +1 -0
- package/lib/commonjs/localization/StringSet.type.js +8 -0
- package/lib/commonjs/localization/StringSet.type.js.map +1 -1
- package/lib/commonjs/platform/createFileService.expo.js +21 -2
- package/lib/commonjs/platform/createFileService.expo.js.map +1 -1
- package/lib/commonjs/platform/createFileService.native.js +20 -3
- package/lib/commonjs/platform/createFileService.native.js.map +1 -1
- package/lib/commonjs/platform/createMediaService.expo.js +64 -0
- package/lib/commonjs/platform/createMediaService.expo.js.map +1 -0
- package/lib/commonjs/platform/createMediaService.native.js +67 -0
- package/lib/commonjs/platform/createMediaService.native.js.map +1 -0
- package/lib/commonjs/platform/createNotificationService.expo.js.map +1 -1
- package/lib/commonjs/platform/types.js.map +1 -1
- package/lib/commonjs/version.js +1 -1
- package/lib/commonjs/version.js.map +1 -1
- package/lib/module/components/FileViewer.js +300 -0
- package/lib/module/components/FileViewer.js.map +1 -0
- package/lib/module/components/MessageRenderer/FileMessage/VideoFileMessage.js +100 -0
- package/lib/module/components/MessageRenderer/FileMessage/VideoFileMessage.js.map +1 -0
- package/lib/module/components/MessageRenderer/FileMessage/index.js +6 -0
- package/lib/module/components/MessageRenderer/FileMessage/index.js.map +1 -1
- package/lib/module/components/MessageRenderer/MessageOutgoingStatus.js +17 -60
- package/lib/module/components/MessageRenderer/MessageOutgoingStatus.js.map +1 -1
- package/lib/module/components/UserActionBar.js +1 -1
- package/lib/module/components/UserActionBar.js.map +1 -1
- package/lib/module/components/UserSelectableBar.js +1 -1
- package/lib/module/components/UserSelectableBar.js.map +1 -1
- package/lib/module/constants.js +5 -0
- package/lib/module/constants.js.map +1 -1
- package/lib/module/containers/GroupChannelPreviewContainer.js +135 -0
- package/lib/module/containers/GroupChannelPreviewContainer.js.map +1 -0
- package/lib/module/{InternalErrorBoundary.js → containers/InternalErrorBoundaryContainer.js} +5 -5
- package/lib/module/containers/InternalErrorBoundaryContainer.js.map +1 -0
- package/lib/module/{SendbirdUIKitContainer.js → containers/SendbirdUIKitContainer.js} +15 -12
- package/lib/module/containers/SendbirdUIKitContainer.js.map +1 -0
- package/lib/module/contexts/PlatformService.js +4 -2
- package/lib/module/contexts/PlatformService.js.map +1 -1
- package/lib/module/contexts/SendbirdChat.js +6 -2
- package/lib/module/contexts/SendbirdChat.js.map +1 -1
- package/lib/module/domain/groupChannel/component/GroupChannelInput/SendInput.js +1 -1
- package/lib/module/domain/groupChannel/component/GroupChannelInput/SendInput.js.map +1 -1
- package/lib/module/domain/groupChannel/component/GroupChannelMessageList.js +28 -7
- package/lib/module/domain/groupChannel/component/GroupChannelMessageList.js.map +1 -1
- package/lib/module/domain/groupChannel/module/moduleContext.js +2 -3
- package/lib/module/domain/groupChannel/module/moduleContext.js.map +1 -1
- package/lib/module/domain/groupChannel/types.js.map +1 -1
- package/lib/module/domain/groupChannelList/types.js.map +1 -1
- package/lib/module/domain/groupChannelSettings/module/moduleContext.js +1 -1
- package/lib/module/domain/groupChannelSettings/module/moduleContext.js.map +1 -1
- package/lib/module/fragments/createGroupChannelCreateFragment.js +4 -4
- package/lib/module/fragments/createGroupChannelCreateFragment.js.map +1 -1
- package/lib/module/fragments/createGroupChannelFragment.js +16 -14
- package/lib/module/fragments/createGroupChannelFragment.js.map +1 -1
- package/lib/module/fragments/createGroupChannelListFragment.js +14 -41
- package/lib/module/fragments/createGroupChannelListFragment.js.map +1 -1
- package/lib/module/fragments/createGroupChannelMembersFragment.js +1 -1
- package/lib/module/fragments/createGroupChannelMembersFragment.js.map +1 -1
- package/lib/module/hooks/useContext.js.map +1 -1
- package/lib/module/index.js +5 -2
- package/lib/module/index.js.map +1 -1
- package/lib/module/{InternalLocalCacheStorage.js → libs/InternalLocalCacheStorage.js} +0 -0
- package/lib/module/libs/InternalLocalCacheStorage.js.map +1 -0
- package/lib/module/localization/StringSet.type.js +8 -0
- package/lib/module/localization/StringSet.type.js.map +1 -1
- package/lib/module/platform/createFileService.expo.js +21 -2
- package/lib/module/platform/createFileService.expo.js.map +1 -1
- package/lib/module/platform/createFileService.native.js +20 -3
- package/lib/module/platform/createFileService.native.js.map +1 -1
- package/lib/module/platform/createMediaService.expo.js +54 -0
- package/lib/module/platform/createMediaService.expo.js.map +1 -0
- package/lib/module/platform/createMediaService.native.js +57 -0
- package/lib/module/platform/createMediaService.native.js.map +1 -0
- package/lib/module/platform/createNotificationService.expo.js.map +1 -1
- package/lib/module/platform/types.js.map +1 -1
- package/lib/module/version.js +1 -1
- package/lib/module/version.js.map +1 -1
- package/lib/typescript/src/components/FileViewer.d.ts +12 -0
- package/lib/typescript/src/components/MessageRenderer/FileMessage/VideoFileMessage.d.ts +3 -0
- package/lib/typescript/src/components/UserActionBar.d.ts +2 -3
- package/lib/typescript/src/components/UserSelectableBar.d.ts +2 -3
- package/lib/typescript/src/constants.d.ts +5 -0
- package/lib/typescript/src/containers/GroupChannelPreviewContainer.d.ts +8 -0
- package/lib/typescript/src/{InternalErrorBoundary.d.ts → containers/InternalErrorBoundaryContainer.d.ts} +3 -3
- package/lib/typescript/src/{SendbirdUIKitContainer.d.ts → containers/SendbirdUIKitContainer.d.ts} +9 -5
- package/lib/typescript/src/contexts/PlatformService.d.ts +3 -2
- package/lib/typescript/src/contexts/SendbirdChat.d.ts +5 -1
- package/lib/typescript/src/domain/groupChannel/component/GroupChannelMessageList.d.ts +3 -2
- package/lib/typescript/src/domain/groupChannel/types.d.ts +6 -2
- package/lib/typescript/src/domain/groupChannelList/types.d.ts +2 -2
- package/lib/typescript/src/hooks/useContext.d.ts +7 -5
- package/lib/typescript/src/index.d.ts +4 -1
- package/lib/typescript/src/{InternalLocalCacheStorage.d.ts → libs/InternalLocalCacheStorage.d.ts} +2 -2
- package/lib/typescript/src/localization/StringSet.type.d.ts +4 -0
- package/lib/typescript/src/platform/createMediaService.expo.d.ts +9 -0
- package/lib/typescript/src/platform/createMediaService.native.d.ts +9 -0
- package/lib/typescript/src/platform/createNotificationService.expo.d.ts +1 -1
- package/lib/typescript/src/platform/types.d.ts +20 -1
- package/lib/typescript/src/version.d.ts +1 -1
- package/package.json +14 -5
- package/src/components/FileViewer.tsx +283 -0
- package/src/components/MessageRenderer/FileMessage/VideoFileMessage.tsx +91 -0
- package/src/components/MessageRenderer/FileMessage/index.tsx +6 -0
- package/src/components/MessageRenderer/MessageOutgoingStatus.tsx +14 -54
- package/src/components/UserActionBar.tsx +1 -1
- package/src/components/UserSelectableBar.tsx +1 -1
- package/src/constants.ts +5 -0
- package/src/containers/GroupChannelPreviewContainer.tsx +117 -0
- package/src/{InternalErrorBoundary.tsx → containers/InternalErrorBoundaryContainer.tsx} +4 -4
- package/src/{SendbirdUIKitContainer.tsx → containers/SendbirdUIKitContainer.tsx} +26 -14
- package/src/contexts/PlatformService.tsx +15 -3
- package/src/contexts/SendbirdChat.tsx +13 -5
- package/src/domain/groupChannel/component/GroupChannelInput/SendInput.tsx +1 -1
- package/src/domain/groupChannel/component/GroupChannelMessageList.tsx +23 -6
- package/src/domain/groupChannel/module/moduleContext.tsx +6 -13
- package/src/domain/groupChannel/types.ts +8 -2
- package/src/domain/groupChannelList/types.ts +3 -2
- package/src/domain/groupChannelSettings/module/moduleContext.tsx +5 -10
- package/src/fragments/createGroupChannelCreateFragment.tsx +38 -41
- package/src/fragments/createGroupChannelFragment.tsx +24 -34
- package/src/fragments/createGroupChannelListFragment.tsx +13 -35
- package/src/fragments/createGroupChannelMembersFragment.tsx +34 -39
- package/src/hooks/useContext.ts +3 -5
- package/src/index.ts +6 -2
- package/src/{InternalLocalCacheStorage.ts → libs/InternalLocalCacheStorage.ts} +1 -1
- package/src/localization/StringSet.type.ts +8 -0
- package/src/platform/createFileService.expo.ts +17 -2
- package/src/platform/createFileService.native.ts +16 -3
- package/src/platform/createMediaService.expo.tsx +30 -0
- package/src/platform/createMediaService.native.tsx +37 -0
- package/src/platform/createNotificationService.expo.ts +1 -1
- package/src/platform/types.ts +26 -1
- package/src/version.ts +1 -1
- package/lib/commonjs/InternalErrorBoundary.js.map +0 -1
- package/lib/commonjs/InternalLocalCacheStorage.js.map +0 -1
- package/lib/commonjs/SendbirdUIKitContainer.js.map +0 -1
- package/lib/module/InternalErrorBoundary.js.map +0 -1
- package/lib/module/InternalLocalCacheStorage.js.map +0 -1
- package/lib/module/SendbirdUIKitContainer.js.map +0 -1
|
@@ -65,8 +65,11 @@ const createExpoFileService = _ref => {
|
|
|
65
65
|
case 'video':
|
|
66
66
|
return imagePickerModule.MediaTypeOptions.Videos;
|
|
67
67
|
|
|
68
|
-
|
|
68
|
+
case 'all':
|
|
69
69
|
return imagePickerModule.MediaTypeOptions.All;
|
|
70
|
+
|
|
71
|
+
default:
|
|
72
|
+
return imagePickerModule.MediaTypeOptions.Images;
|
|
70
73
|
}
|
|
71
74
|
})()
|
|
72
75
|
});
|
|
@@ -101,7 +104,23 @@ const createExpoFileService = _ref => {
|
|
|
101
104
|
}
|
|
102
105
|
}
|
|
103
106
|
|
|
104
|
-
const response = await imagePickerModule.launchImageLibraryAsync(
|
|
107
|
+
const response = await imagePickerModule.launchImageLibraryAsync({
|
|
108
|
+
mediaTypes: (() => {
|
|
109
|
+
switch (options === null || options === void 0 ? void 0 : options.mediaType) {
|
|
110
|
+
case 'photo':
|
|
111
|
+
return imagePickerModule.MediaTypeOptions.Images;
|
|
112
|
+
|
|
113
|
+
case 'video':
|
|
114
|
+
return imagePickerModule.MediaTypeOptions.Videos;
|
|
115
|
+
|
|
116
|
+
case 'all':
|
|
117
|
+
return imagePickerModule.MediaTypeOptions.All;
|
|
118
|
+
|
|
119
|
+
default:
|
|
120
|
+
return imagePickerModule.MediaTypeOptions.Images;
|
|
121
|
+
}
|
|
122
|
+
})()
|
|
123
|
+
});
|
|
105
124
|
if (response.cancelled) return null;
|
|
106
125
|
const {
|
|
107
126
|
uri
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["createExpoFileService","imagePickerModule","documentPickerModule","mediaLibraryModule","fsModule","ExpoFileServiceInterface","hasCameraPermission","res","getCameraPermissionsAsync","expoPermissionGranted","requestCameraPermission","requestCameraPermissionsAsync","hasMediaLibraryPermission","type","perms","getPermissionsAsync","requestMediaLibraryPermission","requestPermissionsAsync","openCamera","options","hasPermission","granted","onOpenFailureWithToastMessage","response","launchCameraAsync","mediaTypes","mediaType","MediaTypeOptions","Images","Videos","All","cancelled","uri","size","getInfoAsync","ext","getFileExtension","getFileType","fileTypeGuard","slice","name","Date","now","openMediaLibrary","launchImageLibraryAsync","openDocument","getDocumentAsync","mimeType","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 { getFileExtension, getFileType } from '@sendbird/uikit-utils';\n\nimport type { ExpoMediaLibraryPermissionResponse, ExpoPermissionResponse } from '../utils/expoPermissionGranted';\nimport expoPermissionGranted from '../utils/expoPermissionGranted';\nimport fileTypeGuard from '../utils/fileTypeGuard';\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?.onOpenFailureWithToastMessage?.();\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 default:\n return imagePickerModule.MediaTypeOptions.All;\n }\n })(),\n });\n\n if (response.cancelled) return null;\n\n const { uri } = response;\n const { size } = await fsModule.getInfoAsync(response.uri);\n const ext = getFileExtension(uri);\n const type = getFileType(ext);\n\n return fileTypeGuard({ uri, size, type: `${type}/${ext.slice(1)}`, name: Date.now() + ext });\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?.onOpenFailureWithToastMessage?.();\n return null;\n }\n }\n\n const response = await imagePickerModule.launchImageLibraryAsync();\n if (response.cancelled) return null;\n const { uri } = response;\n\n const { size } = await fsModule.getInfoAsync(uri);\n const ext = getFileExtension(uri);\n const type = getFileType(ext);\n return [fileTypeGuard({ uri, size, type: `${type}/${ext.slice(1)}`, name: Date.now() + ext })];\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 fileTypeGuard({ uri, size, name, type: mimeType });\n } catch {\n options?.onOpenFailureWithToastMessage?.();\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":["createExpoFileService","imagePickerModule","documentPickerModule","mediaLibraryModule","fsModule","ExpoFileServiceInterface","hasCameraPermission","res","getCameraPermissionsAsync","expoPermissionGranted","requestCameraPermission","requestCameraPermissionsAsync","hasMediaLibraryPermission","type","perms","getPermissionsAsync","requestMediaLibraryPermission","requestPermissionsAsync","openCamera","options","hasPermission","granted","onOpenFailureWithToastMessage","response","launchCameraAsync","mediaTypes","mediaType","MediaTypeOptions","Images","Videos","All","cancelled","uri","size","getInfoAsync","ext","getFileExtension","getFileType","fileTypeGuard","slice","name","Date","now","openMediaLibrary","launchImageLibraryAsync","openDocument","getDocumentAsync","mimeType","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 { getFileExtension, getFileType } from '@sendbird/uikit-utils';\n\nimport type { ExpoMediaLibraryPermissionResponse, ExpoPermissionResponse } from '../utils/expoPermissionGranted';\nimport expoPermissionGranted from '../utils/expoPermissionGranted';\nimport fileTypeGuard from '../utils/fileTypeGuard';\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?.onOpenFailureWithToastMessage?.();\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 const ext = getFileExtension(uri);\n const type = getFileType(ext);\n\n return fileTypeGuard({ uri, size, type: `${type}/${ext.slice(1)}`, name: Date.now() + ext });\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?.onOpenFailureWithToastMessage?.();\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\n const { size } = await fsModule.getInfoAsync(uri);\n const ext = getFileExtension(uri);\n const type = getFileType(ext);\n return [fileTypeGuard({ uri, size, type: `${type}/${ext.slice(1)}`, name: Date.now() + ext })];\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 fileTypeGuard({ uri, size, name, type: mimeType });\n } catch {\n options?.onOpenFailureWithToastMessage?.();\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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"}
|
|
@@ -39,7 +39,7 @@ const createNativeFileService = _ref => {
|
|
|
39
39
|
} = _ref;
|
|
40
40
|
|
|
41
41
|
const cameraPermissions = _reactNative.Platform.select({
|
|
42
|
-
ios: [permissionModule.PERMISSIONS.IOS.CAMERA],
|
|
42
|
+
ios: [permissionModule.PERMISSIONS.IOS.CAMERA, permissionModule.PERMISSIONS.IOS.MICROPHONE],
|
|
43
43
|
android: [permissionModule.PERMISSIONS.ANDROID.CAMERA],
|
|
44
44
|
default: []
|
|
45
45
|
});
|
|
@@ -89,7 +89,21 @@ const createNativeFileService = _ref => {
|
|
|
89
89
|
|
|
90
90
|
const response = await imagePickerModule.launchCamera({
|
|
91
91
|
cameraType: (options === null || options === void 0 ? void 0 : options.cameraType) ?? 'back',
|
|
92
|
-
mediaType: (
|
|
92
|
+
mediaType: (() => {
|
|
93
|
+
switch (options === null || options === void 0 ? void 0 : options.mediaType) {
|
|
94
|
+
case 'photo':
|
|
95
|
+
return 'photo';
|
|
96
|
+
|
|
97
|
+
case 'video':
|
|
98
|
+
return 'video';
|
|
99
|
+
|
|
100
|
+
case 'all':
|
|
101
|
+
return 'mixed';
|
|
102
|
+
|
|
103
|
+
default:
|
|
104
|
+
return 'photo';
|
|
105
|
+
}
|
|
106
|
+
})()
|
|
93
107
|
});
|
|
94
108
|
if (response.didCancel) return null;
|
|
95
109
|
|
|
@@ -143,8 +157,11 @@ const createNativeFileService = _ref => {
|
|
|
143
157
|
case 'video':
|
|
144
158
|
return 'video';
|
|
145
159
|
|
|
146
|
-
|
|
160
|
+
case 'all':
|
|
147
161
|
return 'mixed';
|
|
162
|
+
|
|
163
|
+
default:
|
|
164
|
+
return 'photo';
|
|
148
165
|
}
|
|
149
166
|
})()
|
|
150
167
|
});
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["getAndroidStoragePermissionsByAPILevel","permissionModule","Platform","OS","Version","PERMISSIONS","ANDROID","READ_MEDIA_AUDIO","READ_MEDIA_IMAGES","READ_MEDIA_VIDEO","READ_EXTERNAL_STORAGE","WRITE_EXTERNAL_STORAGE","createNativeFileService","imagePickerModule","documentPickerModule","mediaLibraryModule","fsModule","cameraPermissions","select","ios","IOS","CAMERA","android","default","mediaLibraryPermissions","MEDIA_LIBRARY","PHOTO_LIBRARY","NativeFileService","hasCameraPermission","status","checkMultiple","nativePermissionGranted","requestCameraPermission","requestMultiple","hasMediaLibraryPermission","requestMediaLibraryPermission","openCamera","options","hasPermission","granted","onOpenFailureWithToastMessage","response","launchCamera","cameraType","mediaType","didCancel","errorCode","fileName","name","fileSize","size","type","uri","assets","fileTypeGuard","openMediaLibrary","selectionLimit","launchImageLibrary","slice","map","openDocument","pickSingle","e","isCancel","isInProgress","save","Error","basePath","Dirs","CacheDir","DocumentDir","downloadPath","getFileExtension","extensionFromUrl","fileUrl","getFileType","match","FileSystem","fetch","path","fileType","dirType","cpExternal"],"sources":["createFileService.native.ts"],"sourcesContent":["import type CameraRoll from '@react-native-community/cameraroll';\nimport { Platform } from 'react-native';\nimport type * as DocumentPicker from 'react-native-document-picker';\nimport type * as FileAccess from 'react-native-file-access';\nimport type * as ImagePicker from 'react-native-image-picker';\nimport type * as Permissions from 'react-native-permissions';\nimport type { Permission } from 'react-native-permissions';\n\nimport { getFileExtension, getFileType } from '@sendbird/uikit-utils';\n\nimport fileTypeGuard from '../utils/fileTypeGuard';\nimport nativePermissionGranted from '../utils/nativePermissionGranted';\nimport type {\n FilePickerResponse,\n FileServiceInterface,\n OpenCameraOptions,\n OpenDocumentOptions,\n OpenMediaLibraryOptions,\n SaveOptions,\n} from './types';\n\nfunction getAndroidStoragePermissionsByAPILevel(permissionModule: typeof Permissions): Permission[] {\n if (Platform.OS !== 'android') return [];\n\n if (Platform.Version > 32) {\n return [\n permissionModule.PERMISSIONS.ANDROID.READ_MEDIA_AUDIO,\n permissionModule.PERMISSIONS.ANDROID.READ_MEDIA_IMAGES,\n permissionModule.PERMISSIONS.ANDROID.READ_MEDIA_VIDEO,\n ];\n }\n\n if (Platform.Version > 28) {\n return [permissionModule.PERMISSIONS.ANDROID.READ_EXTERNAL_STORAGE];\n }\n\n return [\n permissionModule.PERMISSIONS.ANDROID.WRITE_EXTERNAL_STORAGE,\n permissionModule.PERMISSIONS.ANDROID.READ_EXTERNAL_STORAGE,\n ];\n}\n\nconst createNativeFileService = ({\n imagePickerModule,\n documentPickerModule,\n permissionModule,\n mediaLibraryModule,\n fsModule,\n}: {\n imagePickerModule: typeof ImagePicker;\n documentPickerModule: typeof DocumentPicker;\n permissionModule: typeof Permissions;\n mediaLibraryModule: typeof CameraRoll;\n fsModule: typeof FileAccess;\n}): FileServiceInterface => {\n const cameraPermissions: Permission[] = Platform.select({\n ios: [permissionModule.PERMISSIONS.IOS.CAMERA],\n android: [permissionModule.PERMISSIONS.ANDROID.CAMERA],\n default: [],\n });\n const mediaLibraryPermissions: Permission[] = Platform.select({\n ios: [permissionModule.PERMISSIONS.IOS.MEDIA_LIBRARY, permissionModule.PERMISSIONS.IOS.PHOTO_LIBRARY],\n android: getAndroidStoragePermissionsByAPILevel(permissionModule),\n default: [],\n });\n\n class NativeFileService implements FileServiceInterface {\n async hasCameraPermission(): Promise<boolean> {\n const status = await permissionModule.checkMultiple(cameraPermissions);\n return nativePermissionGranted(status);\n }\n async requestCameraPermission(): Promise<boolean> {\n const status = await permissionModule.requestMultiple(cameraPermissions);\n return nativePermissionGranted(status);\n }\n async hasMediaLibraryPermission(): Promise<boolean> {\n const status = await permissionModule.checkMultiple(mediaLibraryPermissions);\n return nativePermissionGranted(status);\n }\n async requestMediaLibraryPermission(): Promise<boolean> {\n const status = await permissionModule.requestMultiple(mediaLibraryPermissions);\n return nativePermissionGranted(status);\n }\n\n async openCamera(options?: OpenCameraOptions): Promise<FilePickerResponse> {\n const hasPermission = await this.hasCameraPermission();\n if (!hasPermission) {\n const granted = await this.requestCameraPermission();\n if (!granted) {\n options?.onOpenFailureWithToastMessage?.();\n return null;\n }\n }\n\n const response = await imagePickerModule.launchCamera({\n cameraType: options?.cameraType ?? 'back',\n mediaType: options?.mediaType ?? 'photo',\n });\n if (response.didCancel) return null;\n if (response.errorCode === 'camera_unavailable') {\n options?.onOpenFailureWithToastMessage?.();\n return null;\n }\n\n const { fileName: name, fileSize: size, type, uri } = response.assets?.[0] ?? {};\n return fileTypeGuard({ uri, size, name, type });\n }\n async openMediaLibrary(options?: OpenMediaLibraryOptions): Promise<FilePickerResponse[] | null> {\n /**\n * NOTE: options.selectionLimit {@link https://github.com/react-native-image-picker/react-native-image-picker#options}\n * We do not support 0 (any number of files)\n **/\n const selectionLimit = options?.selectionLimit || 1;\n const hasPermission = await this.hasMediaLibraryPermission();\n if (!hasPermission) {\n const granted = await this.requestMediaLibraryPermission();\n if (!granted) {\n options?.onOpenFailureWithToastMessage?.();\n return null;\n }\n }\n\n const response = await imagePickerModule.launchImageLibrary({\n selectionLimit,\n mediaType: (() => {\n switch (options?.mediaType) {\n case 'photo':\n return 'photo';\n case 'video':\n return 'video';\n default:\n return 'mixed';\n }\n })(),\n });\n if (response.didCancel) return null;\n if (response.errorCode === 'camera_unavailable') {\n options?.onOpenFailureWithToastMessage?.();\n return null;\n }\n\n return (response.assets || [])\n .slice(0, selectionLimit)\n .map(({ fileName: name, fileSize: size, type, uri }) => fileTypeGuard({ uri, size, name, type }));\n }\n async openDocument(options?: OpenDocumentOptions): Promise<FilePickerResponse> {\n try {\n const { uri, size, name, type } = await documentPickerModule.pickSingle();\n return fileTypeGuard({ uri, size, name, type });\n } catch (e) {\n if (!documentPickerModule.isCancel(e) && documentPickerModule.isInProgress(e)) {\n options?.onOpenFailureWithToastMessage?.();\n }\n return null;\n }\n }\n async save(options: SaveOptions): Promise<string> {\n const hasPermission = await this.hasMediaLibraryPermission();\n if (!hasPermission) {\n const granted = await this.requestMediaLibraryPermission();\n if (!granted) throw new Error('Permission not granted');\n }\n\n const basePath = Platform.select({ android: fsModule.Dirs.CacheDir, default: fsModule.Dirs.DocumentDir });\n let downloadPath = `${basePath}/${options.fileName}`;\n if (!getFileExtension(options.fileName)) {\n const extensionFromUrl = getFileExtension(options.fileUrl);\n if (getFileType(extensionFromUrl).match(/image|video/)) {\n downloadPath += extensionFromUrl;\n }\n }\n\n await fsModule.FileSystem.fetch(options.fileUrl, { path: downloadPath });\n const fileType = getFileType(getFileExtension(options.fileUrl));\n\n if (Platform.OS === 'ios' && fileType.match(/image|video/)) {\n await mediaLibraryModule.save(downloadPath);\n }\n\n if (Platform.OS === 'android') {\n const dirType = { 'file': 'downloads', 'audio': 'audio', 'image': 'images', 'video': 'video' } as const;\n await fsModule.FileSystem.cpExternal(downloadPath, options.fileName, dirType[fileType]);\n }\n return downloadPath;\n }\n }\n\n return new NativeFileService();\n};\n\nexport default createNativeFileService;\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"names":["getAndroidStoragePermissionsByAPILevel","permissionModule","Platform","OS","Version","PERMISSIONS","ANDROID","READ_MEDIA_AUDIO","READ_MEDIA_IMAGES","READ_MEDIA_VIDEO","READ_EXTERNAL_STORAGE","WRITE_EXTERNAL_STORAGE","createNativeFileService","imagePickerModule","documentPickerModule","mediaLibraryModule","fsModule","cameraPermissions","select","ios","IOS","CAMERA","MICROPHONE","android","default","mediaLibraryPermissions","MEDIA_LIBRARY","PHOTO_LIBRARY","NativeFileService","hasCameraPermission","status","checkMultiple","nativePermissionGranted","requestCameraPermission","requestMultiple","hasMediaLibraryPermission","requestMediaLibraryPermission","openCamera","options","hasPermission","granted","onOpenFailureWithToastMessage","response","launchCamera","cameraType","mediaType","didCancel","errorCode","fileName","name","fileSize","size","type","uri","assets","fileTypeGuard","openMediaLibrary","selectionLimit","launchImageLibrary","slice","map","openDocument","pickSingle","e","isCancel","isInProgress","save","Error","basePath","Dirs","CacheDir","DocumentDir","downloadPath","getFileExtension","extensionFromUrl","fileUrl","getFileType","match","FileSystem","fetch","path","fileType","dirType","cpExternal"],"sources":["createFileService.native.ts"],"sourcesContent":["import type CameraRoll from '@react-native-community/cameraroll';\nimport { Platform } from 'react-native';\nimport type * as DocumentPicker from 'react-native-document-picker';\nimport type * as FileAccess from 'react-native-file-access';\nimport type * as ImagePicker from 'react-native-image-picker';\nimport type * as Permissions from 'react-native-permissions';\nimport type { Permission } from 'react-native-permissions';\n\nimport { getFileExtension, getFileType } from '@sendbird/uikit-utils';\n\nimport fileTypeGuard from '../utils/fileTypeGuard';\nimport nativePermissionGranted from '../utils/nativePermissionGranted';\nimport type {\n FilePickerResponse,\n FileServiceInterface,\n OpenCameraOptions,\n OpenDocumentOptions,\n OpenMediaLibraryOptions,\n SaveOptions,\n} from './types';\n\nfunction getAndroidStoragePermissionsByAPILevel(permissionModule: typeof Permissions): Permission[] {\n if (Platform.OS !== 'android') return [];\n\n if (Platform.Version > 32) {\n return [\n permissionModule.PERMISSIONS.ANDROID.READ_MEDIA_AUDIO,\n permissionModule.PERMISSIONS.ANDROID.READ_MEDIA_IMAGES,\n permissionModule.PERMISSIONS.ANDROID.READ_MEDIA_VIDEO,\n ];\n }\n\n if (Platform.Version > 28) {\n return [permissionModule.PERMISSIONS.ANDROID.READ_EXTERNAL_STORAGE];\n }\n\n return [\n permissionModule.PERMISSIONS.ANDROID.WRITE_EXTERNAL_STORAGE,\n permissionModule.PERMISSIONS.ANDROID.READ_EXTERNAL_STORAGE,\n ];\n}\n\nconst createNativeFileService = ({\n imagePickerModule,\n documentPickerModule,\n permissionModule,\n mediaLibraryModule,\n fsModule,\n}: {\n imagePickerModule: typeof ImagePicker;\n documentPickerModule: typeof DocumentPicker;\n permissionModule: typeof Permissions;\n mediaLibraryModule: typeof CameraRoll;\n fsModule: typeof FileAccess;\n}): FileServiceInterface => {\n const cameraPermissions: Permission[] = Platform.select({\n ios: [permissionModule.PERMISSIONS.IOS.CAMERA, permissionModule.PERMISSIONS.IOS.MICROPHONE],\n android: [permissionModule.PERMISSIONS.ANDROID.CAMERA],\n default: [],\n });\n const mediaLibraryPermissions: Permission[] = Platform.select({\n ios: [permissionModule.PERMISSIONS.IOS.MEDIA_LIBRARY, permissionModule.PERMISSIONS.IOS.PHOTO_LIBRARY],\n android: getAndroidStoragePermissionsByAPILevel(permissionModule),\n default: [],\n });\n\n class NativeFileService implements FileServiceInterface {\n async hasCameraPermission(): Promise<boolean> {\n const status = await permissionModule.checkMultiple(cameraPermissions);\n return nativePermissionGranted(status);\n }\n async requestCameraPermission(): Promise<boolean> {\n const status = await permissionModule.requestMultiple(cameraPermissions);\n return nativePermissionGranted(status);\n }\n async hasMediaLibraryPermission(): Promise<boolean> {\n const status = await permissionModule.checkMultiple(mediaLibraryPermissions);\n return nativePermissionGranted(status);\n }\n async requestMediaLibraryPermission(): Promise<boolean> {\n const status = await permissionModule.requestMultiple(mediaLibraryPermissions);\n return nativePermissionGranted(status);\n }\n\n async openCamera(options?: OpenCameraOptions): Promise<FilePickerResponse> {\n const hasPermission = await this.hasCameraPermission();\n if (!hasPermission) {\n const granted = await this.requestCameraPermission();\n if (!granted) {\n options?.onOpenFailureWithToastMessage?.();\n return null;\n }\n }\n\n const response = await imagePickerModule.launchCamera({\n cameraType: options?.cameraType ?? 'back',\n mediaType: (() => {\n switch (options?.mediaType) {\n case 'photo':\n return 'photo';\n case 'video':\n return 'video';\n case 'all':\n return 'mixed';\n default:\n return 'photo';\n }\n })(),\n });\n if (response.didCancel) return null;\n if (response.errorCode === 'camera_unavailable') {\n options?.onOpenFailureWithToastMessage?.();\n return null;\n }\n\n const { fileName: name, fileSize: size, type, uri } = response.assets?.[0] ?? {};\n return fileTypeGuard({ uri, size, name, type });\n }\n async openMediaLibrary(options?: OpenMediaLibraryOptions): Promise<FilePickerResponse[] | null> {\n /**\n * NOTE: options.selectionLimit {@link https://github.com/react-native-image-picker/react-native-image-picker#options}\n * We do not support 0 (any number of files)\n **/\n const selectionLimit = options?.selectionLimit || 1;\n const hasPermission = await this.hasMediaLibraryPermission();\n if (!hasPermission) {\n const granted = await this.requestMediaLibraryPermission();\n if (!granted) {\n options?.onOpenFailureWithToastMessage?.();\n return null;\n }\n }\n\n const response = await imagePickerModule.launchImageLibrary({\n selectionLimit,\n mediaType: (() => {\n switch (options?.mediaType) {\n case 'photo':\n return 'photo';\n case 'video':\n return 'video';\n case 'all':\n return 'mixed';\n default:\n return 'photo';\n }\n })(),\n });\n if (response.didCancel) return null;\n if (response.errorCode === 'camera_unavailable') {\n options?.onOpenFailureWithToastMessage?.();\n return null;\n }\n\n return (response.assets || [])\n .slice(0, selectionLimit)\n .map(({ fileName: name, fileSize: size, type, uri }) => fileTypeGuard({ uri, size, name, type }));\n }\n async openDocument(options?: OpenDocumentOptions): Promise<FilePickerResponse> {\n try {\n const { uri, size, name, type } = await documentPickerModule.pickSingle();\n return fileTypeGuard({ uri, size, name, type });\n } catch (e) {\n if (!documentPickerModule.isCancel(e) && documentPickerModule.isInProgress(e)) {\n options?.onOpenFailureWithToastMessage?.();\n }\n return null;\n }\n }\n async save(options: SaveOptions): Promise<string> {\n const hasPermission = await this.hasMediaLibraryPermission();\n if (!hasPermission) {\n const granted = await this.requestMediaLibraryPermission();\n if (!granted) throw new Error('Permission not granted');\n }\n\n const basePath = Platform.select({ android: fsModule.Dirs.CacheDir, default: fsModule.Dirs.DocumentDir });\n let downloadPath = `${basePath}/${options.fileName}`;\n if (!getFileExtension(options.fileName)) {\n const extensionFromUrl = getFileExtension(options.fileUrl);\n if (getFileType(extensionFromUrl).match(/image|video/)) {\n downloadPath += extensionFromUrl;\n }\n }\n\n await fsModule.FileSystem.fetch(options.fileUrl, { path: downloadPath });\n const fileType = getFileType(getFileExtension(options.fileUrl));\n\n if (Platform.OS === 'ios' && fileType.match(/image|video/)) {\n await mediaLibraryModule.save(downloadPath);\n }\n\n if (Platform.OS === 'android') {\n const dirType = { 'file': 'downloads', 'audio': 'audio', 'image': 'images', 'video': 'video' } as const;\n await fsModule.FileSystem.cpExternal(downloadPath, options.fileName, dirType[fileType]);\n }\n return downloadPath;\n }\n }\n\n return new NativeFileService();\n};\n\nexport default createNativeFileService;\n"],"mappings":";;;;;;;AACA;;AAOA;;AAEA;;AACA;;;;AAUA,SAASA,sCAAT,CAAgDC,gBAAhD,EAAoG;EAClG,IAAIC,qBAAA,CAASC,EAAT,KAAgB,SAApB,EAA+B,OAAO,EAAP;;EAE/B,IAAID,qBAAA,CAASE,OAAT,GAAmB,EAAvB,EAA2B;IACzB,OAAO,CACLH,gBAAgB,CAACI,WAAjB,CAA6BC,OAA7B,CAAqCC,gBADhC,EAELN,gBAAgB,CAACI,WAAjB,CAA6BC,OAA7B,CAAqCE,iBAFhC,EAGLP,gBAAgB,CAACI,WAAjB,CAA6BC,OAA7B,CAAqCG,gBAHhC,CAAP;EAKD;;EAED,IAAIP,qBAAA,CAASE,OAAT,GAAmB,EAAvB,EAA2B;IACzB,OAAO,CAACH,gBAAgB,CAACI,WAAjB,CAA6BC,OAA7B,CAAqCI,qBAAtC,CAAP;EACD;;EAED,OAAO,CACLT,gBAAgB,CAACI,WAAjB,CAA6BC,OAA7B,CAAqCK,sBADhC,EAELV,gBAAgB,CAACI,WAAjB,CAA6BC,OAA7B,CAAqCI,qBAFhC,CAAP;AAID;;AAED,MAAME,uBAAuB,GAAG,QAYJ;EAAA,IAZK;IAC/BC,iBAD+B;IAE/BC,oBAF+B;IAG/Bb,gBAH+B;IAI/Bc,kBAJ+B;IAK/BC;EAL+B,CAYL;;EAC1B,MAAMC,iBAA+B,GAAGf,qBAAA,CAASgB,MAAT,CAAgB;IACtDC,GAAG,EAAE,CAAClB,gBAAgB,CAACI,WAAjB,CAA6Be,GAA7B,CAAiCC,MAAlC,EAA0CpB,gBAAgB,CAACI,WAAjB,CAA6Be,GAA7B,CAAiCE,UAA3E,CADiD;IAEtDC,OAAO,EAAE,CAACtB,gBAAgB,CAACI,WAAjB,CAA6BC,OAA7B,CAAqCe,MAAtC,CAF6C;IAGtDG,OAAO,EAAE;EAH6C,CAAhB,CAAxC;;EAKA,MAAMC,uBAAqC,GAAGvB,qBAAA,CAASgB,MAAT,CAAgB;IAC5DC,GAAG,EAAE,CAAClB,gBAAgB,CAACI,WAAjB,CAA6Be,GAA7B,CAAiCM,aAAlC,EAAiDzB,gBAAgB,CAACI,WAAjB,CAA6Be,GAA7B,CAAiCO,aAAlF,CADuD;IAE5DJ,OAAO,EAAEvB,sCAAsC,CAACC,gBAAD,CAFa;IAG5DuB,OAAO,EAAE;EAHmD,CAAhB,CAA9C;;EAMA,MAAMI,iBAAN,CAAwD;IAC7B,MAAnBC,mBAAmB,GAAqB;MAC5C,MAAMC,MAAM,GAAG,MAAM7B,gBAAgB,CAAC8B,aAAjB,CAA+Bd,iBAA/B,CAArB;MACA,OAAO,IAAAe,gCAAA,EAAwBF,MAAxB,CAAP;IACD;;IAC4B,MAAvBG,uBAAuB,GAAqB;MAChD,MAAMH,MAAM,GAAG,MAAM7B,gBAAgB,CAACiC,eAAjB,CAAiCjB,iBAAjC,CAArB;MACA,OAAO,IAAAe,gCAAA,EAAwBF,MAAxB,CAAP;IACD;;IAC8B,MAAzBK,yBAAyB,GAAqB;MAClD,MAAML,MAAM,GAAG,MAAM7B,gBAAgB,CAAC8B,aAAjB,CAA+BN,uBAA/B,CAArB;MACA,OAAO,IAAAO,gCAAA,EAAwBF,MAAxB,CAAP;IACD;;IACkC,MAA7BM,6BAA6B,GAAqB;MACtD,MAAMN,MAAM,GAAG,MAAM7B,gBAAgB,CAACiC,eAAjB,CAAiCT,uBAAjC,CAArB;MACA,OAAO,IAAAO,gCAAA,EAAwBF,MAAxB,CAAP;IACD;;IAEe,MAAVO,UAAU,CAACC,OAAD,EAA2D;MAAA;;MACzE,MAAMC,aAAa,GAAG,MAAM,KAAKV,mBAAL,EAA5B;;MACA,IAAI,CAACU,aAAL,EAAoB;QAClB,MAAMC,OAAO,GAAG,MAAM,KAAKP,uBAAL,EAAtB;;QACA,IAAI,CAACO,OAAL,EAAc;UAAA;;UACZF,OAAO,SAAP,IAAAA,OAAO,WAAP,qCAAAA,OAAO,CAAEG,6BAAT,qFAAAH,OAAO;UACP,OAAO,IAAP;QACD;MACF;;MAED,MAAMI,QAAQ,GAAG,MAAM7B,iBAAiB,CAAC8B,YAAlB,CAA+B;QACpDC,UAAU,EAAE,CAAAN,OAAO,SAAP,IAAAA,OAAO,WAAP,YAAAA,OAAO,CAAEM,UAAT,KAAuB,MADiB;QAEpDC,SAAS,EAAE,CAAC,MAAM;UAChB,QAAQP,OAAR,aAAQA,OAAR,uBAAQA,OAAO,CAAEO,SAAjB;YACE,KAAK,OAAL;cACE,OAAO,OAAP;;YACF,KAAK,OAAL;cACE,OAAO,OAAP;;YACF,KAAK,KAAL;cACE,OAAO,OAAP;;YACF;cACE,OAAO,OAAP;UARJ;QAUD,CAXU;MAFyC,CAA/B,CAAvB;MAeA,IAAIH,QAAQ,CAACI,SAAb,EAAwB,OAAO,IAAP;;MACxB,IAAIJ,QAAQ,CAACK,SAAT,KAAuB,oBAA3B,EAAiD;QAAA;;QAC/CT,OAAO,SAAP,IAAAA,OAAO,WAAP,sCAAAA,OAAO,CAAEG,6BAAT,uFAAAH,OAAO;QACP,OAAO,IAAP;MACD;;MAED,MAAM;QAAEU,QAAQ,EAAEC,IAAZ;QAAkBC,QAAQ,EAAEC,IAA5B;QAAkCC,IAAlC;QAAwCC;MAAxC,IAAgD,qBAAAX,QAAQ,CAACY,MAAT,sEAAkB,CAAlB,MAAwB,EAA9E;MACA,OAAO,IAAAC,sBAAA,EAAc;QAAEF,GAAF;QAAOF,IAAP;QAAaF,IAAb;QAAmBG;MAAnB,CAAd,CAAP;IACD;;IACqB,MAAhBI,gBAAgB,CAAClB,OAAD,EAA0E;MAC9F;AACN;AACA;AACA;MACM,MAAMmB,cAAc,GAAG,CAAAnB,OAAO,SAAP,IAAAA,OAAO,WAAP,YAAAA,OAAO,CAAEmB,cAAT,KAA2B,CAAlD;MACA,MAAMlB,aAAa,GAAG,MAAM,KAAKJ,yBAAL,EAA5B;;MACA,IAAI,CAACI,aAAL,EAAoB;QAClB,MAAMC,OAAO,GAAG,MAAM,KAAKJ,6BAAL,EAAtB;;QACA,IAAI,CAACI,OAAL,EAAc;UAAA;;UACZF,OAAO,SAAP,IAAAA,OAAO,WAAP,sCAAAA,OAAO,CAAEG,6BAAT,uFAAAH,OAAO;UACP,OAAO,IAAP;QACD;MACF;;MAED,MAAMI,QAAQ,GAAG,MAAM7B,iBAAiB,CAAC6C,kBAAlB,CAAqC;QAC1DD,cAD0D;QAE1DZ,SAAS,EAAE,CAAC,MAAM;UAChB,QAAQP,OAAR,aAAQA,OAAR,uBAAQA,OAAO,CAAEO,SAAjB;YACE,KAAK,OAAL;cACE,OAAO,OAAP;;YACF,KAAK,OAAL;cACE,OAAO,OAAP;;YACF,KAAK,KAAL;cACE,OAAO,OAAP;;YACF;cACE,OAAO,OAAP;UARJ;QAUD,CAXU;MAF+C,CAArC,CAAvB;MAeA,IAAIH,QAAQ,CAACI,SAAb,EAAwB,OAAO,IAAP;;MACxB,IAAIJ,QAAQ,CAACK,SAAT,KAAuB,oBAA3B,EAAiD;QAAA;;QAC/CT,OAAO,SAAP,IAAAA,OAAO,WAAP,sCAAAA,OAAO,CAAEG,6BAAT,uFAAAH,OAAO;QACP,OAAO,IAAP;MACD;;MAED,OAAO,CAACI,QAAQ,CAACY,MAAT,IAAmB,EAApB,EACJK,KADI,CACE,CADF,EACKF,cADL,EAEJG,GAFI,CAEA;QAAA,IAAC;UAAEZ,QAAQ,EAAEC,IAAZ;UAAkBC,QAAQ,EAAEC,IAA5B;UAAkCC,IAAlC;UAAwCC;QAAxC,CAAD;QAAA,OAAmD,IAAAE,sBAAA,EAAc;UAAEF,GAAF;UAAOF,IAAP;UAAaF,IAAb;UAAmBG;QAAnB,CAAd,CAAnD;MAAA,CAFA,CAAP;IAGD;;IACiB,MAAZS,YAAY,CAACvB,OAAD,EAA6D;MAC7E,IAAI;QACF,MAAM;UAAEe,GAAF;UAAOF,IAAP;UAAaF,IAAb;UAAmBG;QAAnB,IAA4B,MAAMtC,oBAAoB,CAACgD,UAArB,EAAxC;QACA,OAAO,IAAAP,sBAAA,EAAc;UAAEF,GAAF;UAAOF,IAAP;UAAaF,IAAb;UAAmBG;QAAnB,CAAd,CAAP;MACD,CAHD,CAGE,OAAOW,CAAP,EAAU;QACV,IAAI,CAACjD,oBAAoB,CAACkD,QAArB,CAA8BD,CAA9B,CAAD,IAAqCjD,oBAAoB,CAACmD,YAArB,CAAkCF,CAAlC,CAAzC,EAA+E;UAAA;;UAC7EzB,OAAO,SAAP,IAAAA,OAAO,WAAP,sCAAAA,OAAO,CAAEG,6BAAT,uFAAAH,OAAO;QACR;;QACD,OAAO,IAAP;MACD;IACF;;IACS,MAAJ4B,IAAI,CAAC5B,OAAD,EAAwC;MAChD,MAAMC,aAAa,GAAG,MAAM,KAAKJ,yBAAL,EAA5B;;MACA,IAAI,CAACI,aAAL,EAAoB;QAClB,MAAMC,OAAO,GAAG,MAAM,KAAKJ,6BAAL,EAAtB;QACA,IAAI,CAACI,OAAL,EAAc,MAAM,IAAI2B,KAAJ,CAAU,wBAAV,CAAN;MACf;;MAED,MAAMC,QAAQ,GAAGlE,qBAAA,CAASgB,MAAT,CAAgB;QAAEK,OAAO,EAAEP,QAAQ,CAACqD,IAAT,CAAcC,QAAzB;QAAmC9C,OAAO,EAAER,QAAQ,CAACqD,IAAT,CAAcE;MAA1D,CAAhB,CAAjB;;MACA,IAAIC,YAAY,GAAI,GAAEJ,QAAS,IAAG9B,OAAO,CAACU,QAAS,EAAnD;;MACA,IAAI,CAAC,IAAAyB,4BAAA,EAAiBnC,OAAO,CAACU,QAAzB,CAAL,EAAyC;QACvC,MAAM0B,gBAAgB,GAAG,IAAAD,4BAAA,EAAiBnC,OAAO,CAACqC,OAAzB,CAAzB;;QACA,IAAI,IAAAC,uBAAA,EAAYF,gBAAZ,EAA8BG,KAA9B,CAAoC,aAApC,CAAJ,EAAwD;UACtDL,YAAY,IAAIE,gBAAhB;QACD;MACF;;MAED,MAAM1D,QAAQ,CAAC8D,UAAT,CAAoBC,KAApB,CAA0BzC,OAAO,CAACqC,OAAlC,EAA2C;QAAEK,IAAI,EAAER;MAAR,CAA3C,CAAN;MACA,MAAMS,QAAQ,GAAG,IAAAL,uBAAA,EAAY,IAAAH,4BAAA,EAAiBnC,OAAO,CAACqC,OAAzB,CAAZ,CAAjB;;MAEA,IAAIzE,qBAAA,CAASC,EAAT,KAAgB,KAAhB,IAAyB8E,QAAQ,CAACJ,KAAT,CAAe,aAAf,CAA7B,EAA4D;QAC1D,MAAM9D,kBAAkB,CAACmD,IAAnB,CAAwBM,YAAxB,CAAN;MACD;;MAED,IAAItE,qBAAA,CAASC,EAAT,KAAgB,SAApB,EAA+B;QAC7B,MAAM+E,OAAO,GAAG;UAAE,QAAQ,WAAV;UAAuB,SAAS,OAAhC;UAAyC,SAAS,QAAlD;UAA4D,SAAS;QAArE,CAAhB;QACA,MAAMlE,QAAQ,CAAC8D,UAAT,CAAoBK,UAApB,CAA+BX,YAA/B,EAA6ClC,OAAO,CAACU,QAArD,EAA+DkC,OAAO,CAACD,QAAD,CAAtE,CAAN;MACD;;MACD,OAAOT,YAAP;IACD;;EAnIqD;;EAsIxD,OAAO,IAAI5C,iBAAJ,EAAP;AACD,CA/JD;;eAiKehB,uB"}
|
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
Object.defineProperty(exports, "__esModule", {
|
|
4
|
+
value: true
|
|
5
|
+
});
|
|
6
|
+
exports.default = void 0;
|
|
7
|
+
|
|
8
|
+
var _react = _interopRequireDefault(require("react"));
|
|
9
|
+
|
|
10
|
+
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); }
|
|
13
|
+
|
|
14
|
+
const createExpoMediaService = _ref => {
|
|
15
|
+
let {
|
|
16
|
+
avModule,
|
|
17
|
+
thumbnailModule
|
|
18
|
+
} = _ref;
|
|
19
|
+
return {
|
|
20
|
+
VideoComponent(_ref2) {
|
|
21
|
+
let {
|
|
22
|
+
source,
|
|
23
|
+
resizeMode,
|
|
24
|
+
onLoad,
|
|
25
|
+
...props
|
|
26
|
+
} = _ref2;
|
|
27
|
+
// FIXME: type error https://github.com/expo/expo/issues/17101
|
|
28
|
+
// @ts-ignore
|
|
29
|
+
return /*#__PURE__*/_react.default.createElement(avModule.Video, _extends({}, props, {
|
|
30
|
+
source: source,
|
|
31
|
+
resizeMode: resizeMode,
|
|
32
|
+
onLoad: onLoad,
|
|
33
|
+
useNativeControls: true
|
|
34
|
+
}));
|
|
35
|
+
},
|
|
36
|
+
|
|
37
|
+
async getVideoThumbnail(_ref3) {
|
|
38
|
+
let {
|
|
39
|
+
url,
|
|
40
|
+
quality,
|
|
41
|
+
timeMills
|
|
42
|
+
} = _ref3;
|
|
43
|
+
|
|
44
|
+
try {
|
|
45
|
+
const {
|
|
46
|
+
uri
|
|
47
|
+
} = await thumbnailModule.getThumbnailAsync(url, {
|
|
48
|
+
quality,
|
|
49
|
+
time: timeMills
|
|
50
|
+
});
|
|
51
|
+
return {
|
|
52
|
+
path: uri
|
|
53
|
+
};
|
|
54
|
+
} catch {
|
|
55
|
+
return null;
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
};
|
|
60
|
+
};
|
|
61
|
+
|
|
62
|
+
var _default = createExpoMediaService;
|
|
63
|
+
exports.default = _default;
|
|
64
|
+
//# sourceMappingURL=createMediaService.expo.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"names":["createExpoMediaService","avModule","thumbnailModule","VideoComponent","source","resizeMode","onLoad","props","getVideoThumbnail","url","quality","timeMills","uri","getThumbnailAsync","time","path"],"sources":["createMediaService.expo.tsx"],"sourcesContent":["import type * as ExpoAV from 'expo-av';\nimport type * as ExpoVideoThumbnail from 'expo-video-thumbnails';\nimport React from 'react';\n\nimport type { MediaServiceInterface } from './types';\n\ntype Modules = {\n avModule: typeof ExpoAV;\n thumbnailModule: typeof ExpoVideoThumbnail;\n};\n\nconst createExpoMediaService = ({ avModule, thumbnailModule }: 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 };\n};\n\nexport default createExpoMediaService;\n"],"mappings":";;;;;;;AAEA;;;;;;AASA,MAAMA,sBAAsB,GAAG,QAAmE;EAAA,IAAlE;IAAEC,QAAF;IAAYC;EAAZ,CAAkE;EAChG,OAAO;IACLC,cAAc,QAA2C;MAAA,IAA1C;QAAEC,MAAF;QAAUC,UAAV;QAAsBC,MAAtB;QAA8B,GAAGC;MAAjC,CAA0C;MACvD;MACA;MACA,oBAAO,6BAAC,QAAD,CAAU,KAAV,eAAoBA,KAApB;QAA2B,MAAM,EAAEH,MAAnC;QAA2C,UAAU,EAAEC,UAAvD;QAAmE,MAAM,EAAEC,MAA3E;QAAmF,iBAAiB;MAApG,GAAP;IACD,CALI;;IAML,MAAME,iBAAN,QAAqD;MAAA,IAA7B;QAAEC,GAAF;QAAOC,OAAP;QAAgBC;MAAhB,CAA6B;;MACnD,IAAI;QACF,MAAM;UAAEC;QAAF,IAAU,MAAMV,eAAe,CAACW,iBAAhB,CAAkCJ,GAAlC,EAAuC;UAAEC,OAAF;UAAWI,IAAI,EAAEH;QAAjB,CAAvC,CAAtB;QACA,OAAO;UAAEI,IAAI,EAAEH;QAAR,CAAP;MACD,CAHD,CAGE,MAAM;QACN,OAAO,IAAP;MACD;IACF;;EAbI,CAAP;AAeD,CAhBD;;eAkBeZ,sB"}
|
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
Object.defineProperty(exports, "__esModule", {
|
|
4
|
+
value: true
|
|
5
|
+
});
|
|
6
|
+
exports.default = void 0;
|
|
7
|
+
|
|
8
|
+
var _react = _interopRequireDefault(require("react"));
|
|
9
|
+
|
|
10
|
+
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); }
|
|
13
|
+
|
|
14
|
+
function hash(str) {
|
|
15
|
+
return String(Math.abs(str.split('').reduce((a, c) => (a << 5) - a + c.charCodeAt(0) | 0, 0)));
|
|
16
|
+
}
|
|
17
|
+
|
|
18
|
+
const createNativeMediaService = _ref => {
|
|
19
|
+
let {
|
|
20
|
+
VideoComponent,
|
|
21
|
+
thumbnailModule
|
|
22
|
+
} = _ref;
|
|
23
|
+
return {
|
|
24
|
+
VideoComponent(_ref2) {
|
|
25
|
+
let {
|
|
26
|
+
source,
|
|
27
|
+
resizeMode,
|
|
28
|
+
onLoad,
|
|
29
|
+
...props
|
|
30
|
+
} = _ref2;
|
|
31
|
+
return /*#__PURE__*/_react.default.createElement(VideoComponent, _extends({}, props, {
|
|
32
|
+
source: source,
|
|
33
|
+
resizeMode: resizeMode,
|
|
34
|
+
onLoad: onLoad,
|
|
35
|
+
controls: true
|
|
36
|
+
}));
|
|
37
|
+
},
|
|
38
|
+
|
|
39
|
+
async getVideoThumbnail(_ref3) {
|
|
40
|
+
let {
|
|
41
|
+
url,
|
|
42
|
+
timeMills
|
|
43
|
+
} = _ref3;
|
|
44
|
+
|
|
45
|
+
try {
|
|
46
|
+
const {
|
|
47
|
+
path
|
|
48
|
+
} = await thumbnailModule.createThumbnail({
|
|
49
|
+
url,
|
|
50
|
+
format: 'jpeg',
|
|
51
|
+
timeStamp: timeMills,
|
|
52
|
+
cacheName: hash(url)
|
|
53
|
+
});
|
|
54
|
+
return {
|
|
55
|
+
path
|
|
56
|
+
};
|
|
57
|
+
} catch {
|
|
58
|
+
return null;
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
};
|
|
63
|
+
};
|
|
64
|
+
|
|
65
|
+
var _default = createNativeMediaService;
|
|
66
|
+
exports.default = _default;
|
|
67
|
+
//# sourceMappingURL=createMediaService.native.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"names":["hash","str","String","Math","abs","split","reduce","a","c","charCodeAt","createNativeMediaService","VideoComponent","thumbnailModule","source","resizeMode","onLoad","props","getVideoThumbnail","url","timeMills","path","createThumbnail","format","timeStamp","cacheName"],"sources":["createMediaService.native.tsx"],"sourcesContent":["import React from 'react';\nimport type * as CreateThumbnail from 'react-native-create-thumbnail';\nimport type Video from 'react-native-video';\n\nimport type { MediaServiceInterface } from './types';\n\ntype Modules = {\n VideoComponent: typeof Video;\n thumbnailModule: typeof CreateThumbnail;\n};\n\nfunction hash(str: string) {\n return String(Math.abs(str.split('').reduce((a, c) => ((a << 5) - a + c.charCodeAt(0)) | 0, 0)));\n}\n\nconst createNativeMediaService = ({ VideoComponent, thumbnailModule }: Modules): MediaServiceInterface => {\n return {\n VideoComponent({ source, resizeMode, onLoad, ...props }) {\n return <VideoComponent {...props} source={source} resizeMode={resizeMode} onLoad={onLoad} controls />;\n },\n async getVideoThumbnail({ url, timeMills }) {\n try {\n const { path } = await thumbnailModule.createThumbnail({\n url,\n format: 'jpeg',\n timeStamp: timeMills,\n cacheName: hash(url),\n });\n return { path };\n } catch {\n return null;\n }\n },\n };\n};\n\nexport default createNativeMediaService;\n"],"mappings":";;;;;;;AAAA;;;;;;AAWA,SAASA,IAAT,CAAcC,GAAd,EAA2B;EACzB,OAAOC,MAAM,CAACC,IAAI,CAACC,GAAL,CAASH,GAAG,CAACI,KAAJ,CAAU,EAAV,EAAcC,MAAd,CAAqB,CAACC,CAAD,EAAIC,CAAJ,KAAW,CAACD,CAAC,IAAI,CAAN,IAAWA,CAAX,GAAeC,CAAC,CAACC,UAAF,CAAa,CAAb,CAAhB,GAAmC,CAAlE,EAAqE,CAArE,CAAT,CAAD,CAAb;AACD;;AAED,MAAMC,wBAAwB,GAAG,QAAyE;EAAA,IAAxE;IAAEC,cAAF;IAAkBC;EAAlB,CAAwE;EACxG,OAAO;IACLD,cAAc,QAA2C;MAAA,IAA1C;QAAEE,MAAF;QAAUC,UAAV;QAAsBC,MAAtB;QAA8B,GAAGC;MAAjC,CAA0C;MACvD,oBAAO,6BAAC,cAAD,eAAoBA,KAApB;QAA2B,MAAM,EAAEH,MAAnC;QAA2C,UAAU,EAAEC,UAAvD;QAAmE,MAAM,EAAEC,MAA3E;QAAmF,QAAQ;MAA3F,GAAP;IACD,CAHI;;IAIL,MAAME,iBAAN,QAA4C;MAAA,IAApB;QAAEC,GAAF;QAAOC;MAAP,CAAoB;;MAC1C,IAAI;QACF,MAAM;UAAEC;QAAF,IAAW,MAAMR,eAAe,CAACS,eAAhB,CAAgC;UACrDH,GADqD;UAErDI,MAAM,EAAE,MAF6C;UAGrDC,SAAS,EAAEJ,SAH0C;UAIrDK,SAAS,EAAExB,IAAI,CAACkB,GAAD;QAJsC,CAAhC,CAAvB;QAMA,OAAO;UAAEE;QAAF,CAAP;MACD,CARD,CAQE,MAAM;QACN,OAAO,IAAP;MACD;IACF;;EAhBI,CAAP;AAkBD,CAnBD;;eAqBeV,wB"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["createExpoNotificationService","messagingModule","authorizedStatus","IosAuthorizationStatus","AUTHORIZED","PROVISIONAL","getAPNSToken","response","getDevicePushTokenAsync","data","getFCMToken","hasPushPermission","status","getPermissionsAsync","Boolean","granted","ios","includes","requestPushPermission","requestPermissionsAsync","onTokenRefresh","handler","subscription","addPushTokenListener","removePushTokenSubscription"],"sources":["createNotificationService.expo.ts"],"sourcesContent":["import type ExpoNotification from 'expo-notifications';\n\nimport type { ExpoPushPermissionResponse } from '../utils/expoPermissionGranted';\nimport type { NotificationServiceInterface } from './types';\n\nconst createExpoNotificationService = (messagingModule: typeof ExpoNotification): NotificationServiceInterface => {\n const authorizedStatus = [\n messagingModule.IosAuthorizationStatus.AUTHORIZED,\n messagingModule.IosAuthorizationStatus.PROVISIONAL,\n ];\n\n return {\n async getAPNSToken(): Promise<string | null> {\n const response = await messagingModule.getDevicePushTokenAsync();\n return response.data;\n },\n async getFCMToken(): Promise<string | null> {\n const response = await messagingModule.getDevicePushTokenAsync();\n return response.data;\n },\n async hasPushPermission(): Promise<boolean> {\n const status = (await messagingModule.getPermissionsAsync()) as ExpoPushPermissionResponse;\n return Boolean(status.granted || (status.ios?.status && authorizedStatus.includes(status.ios.status)));\n },\n async requestPushPermission(): Promise<boolean> {\n const status = (await messagingModule.requestPermissionsAsync()) as ExpoPushPermissionResponse;\n return Boolean(status.granted || (status.ios?.status && authorizedStatus.includes(status.ios.status)));\n },\n onTokenRefresh(handler: (token: string) => void): () => void | undefined {\n const subscription = messagingModule.addPushTokenListener(({ data }) => handler(data));\n return () => messagingModule.removePushTokenSubscription(subscription);\n },\n };\n};\n\nexport default createExpoNotificationService;\n"],"mappings":";;;;;;;AAKA,MAAMA,6BAA6B,GAAIC,eAAD,IAA4E;EAChH,MAAMC,gBAAgB,GAAG,CACvBD,eAAe,CAACE,sBAAhB,CAAuCC,UADhB,EAEvBH,eAAe,CAACE,sBAAhB,CAAuCE,WAFhB,CAAzB;EAKA,OAAO;IACL,MAAMC,YAAN,GAA6C;MAC3C,MAAMC,QAAQ,GAAG,MAAMN,eAAe,CAACO,uBAAhB,EAAvB;MACA,OAAOD,QAAQ,CAACE,IAAhB;IACD,CAJI;;IAKL,MAAMC,WAAN,GAA4C;MAC1C,MAAMH,QAAQ,GAAG,MAAMN,eAAe,CAACO,uBAAhB,EAAvB;MACA,OAAOD,QAAQ,CAACE,IAAhB;IACD,CARI;;IASL,MAAME,iBAAN,GAA4C;MAAA;;MAC1C,MAAMC,MAAM,GAAI,MAAMX,eAAe,CAACY,mBAAhB,EAAtB;MACA,OAAOC,OAAO,CAACF,MAAM,CAACG,OAAP,IAAmB,gBAAAH,MAAM,CAACI,GAAP,4DAAYJ,MAAZ,KAAsBV,gBAAgB,CAACe,QAAjB,CAA0BL,MAAM,CAACI,GAAP,CAAWJ,MAArC,CAA1C,CAAd;IACD,CAZI;;IAaL,MAAMM,qBAAN,GAAgD;MAAA;;MAC9C,MAAMN,MAAM,GAAI,MAAMX,eAAe,CAACkB,uBAAhB,EAAtB;MACA,OAAOL,OAAO,CAACF,MAAM,CAACG,OAAP,IAAmB,iBAAAH,MAAM,CAACI,GAAP,8DAAYJ,MAAZ,KAAsBV,gBAAgB,CAACe,QAAjB,CAA0BL,MAAM,CAACI,GAAP,CAAWJ,MAArC,CAA1C,CAAd;IACD,CAhBI;;IAiBLQ,cAAc,CAACC,OAAD,EAA2D;MACvE,MAAMC,YAAY,GAAGrB,eAAe,CAACsB,oBAAhB,CAAqC;QAAA,IAAC;UAAEd;QAAF,CAAD;QAAA,OAAcY,OAAO,CAACZ,IAAD,CAArB;MAAA,CAArC,CAArB;MACA,OAAO,MAAMR,eAAe,CAACuB,2BAAhB,CAA4CF,YAA5C,CAAb;IACD;;EApBI,CAAP;AAsBD,CA5BD;;eA8BetB,6B"}
|
|
1
|
+
{"version":3,"names":["createExpoNotificationService","messagingModule","authorizedStatus","IosAuthorizationStatus","AUTHORIZED","PROVISIONAL","getAPNSToken","response","getDevicePushTokenAsync","data","getFCMToken","hasPushPermission","status","getPermissionsAsync","Boolean","granted","ios","includes","requestPushPermission","requestPermissionsAsync","onTokenRefresh","handler","subscription","addPushTokenListener","removePushTokenSubscription"],"sources":["createNotificationService.expo.ts"],"sourcesContent":["import type * as ExpoNotification from 'expo-notifications';\n\nimport type { ExpoPushPermissionResponse } from '../utils/expoPermissionGranted';\nimport type { NotificationServiceInterface } from './types';\n\nconst createExpoNotificationService = (messagingModule: typeof ExpoNotification): NotificationServiceInterface => {\n const authorizedStatus = [\n messagingModule.IosAuthorizationStatus.AUTHORIZED,\n messagingModule.IosAuthorizationStatus.PROVISIONAL,\n ];\n\n return {\n async getAPNSToken(): Promise<string | null> {\n const response = await messagingModule.getDevicePushTokenAsync();\n return response.data;\n },\n async getFCMToken(): Promise<string | null> {\n const response = await messagingModule.getDevicePushTokenAsync();\n return response.data;\n },\n async hasPushPermission(): Promise<boolean> {\n const status = (await messagingModule.getPermissionsAsync()) as ExpoPushPermissionResponse;\n return Boolean(status.granted || (status.ios?.status && authorizedStatus.includes(status.ios.status)));\n },\n async requestPushPermission(): Promise<boolean> {\n const status = (await messagingModule.requestPermissionsAsync()) as ExpoPushPermissionResponse;\n return Boolean(status.granted || (status.ios?.status && authorizedStatus.includes(status.ios.status)));\n },\n onTokenRefresh(handler: (token: string) => void): () => void | undefined {\n const subscription = messagingModule.addPushTokenListener(({ data }) => handler(data));\n return () => messagingModule.removePushTokenSubscription(subscription);\n },\n };\n};\n\nexport default createExpoNotificationService;\n"],"mappings":";;;;;;;AAKA,MAAMA,6BAA6B,GAAIC,eAAD,IAA4E;EAChH,MAAMC,gBAAgB,GAAG,CACvBD,eAAe,CAACE,sBAAhB,CAAuCC,UADhB,EAEvBH,eAAe,CAACE,sBAAhB,CAAuCE,WAFhB,CAAzB;EAKA,OAAO;IACL,MAAMC,YAAN,GAA6C;MAC3C,MAAMC,QAAQ,GAAG,MAAMN,eAAe,CAACO,uBAAhB,EAAvB;MACA,OAAOD,QAAQ,CAACE,IAAhB;IACD,CAJI;;IAKL,MAAMC,WAAN,GAA4C;MAC1C,MAAMH,QAAQ,GAAG,MAAMN,eAAe,CAACO,uBAAhB,EAAvB;MACA,OAAOD,QAAQ,CAACE,IAAhB;IACD,CARI;;IASL,MAAME,iBAAN,GAA4C;MAAA;;MAC1C,MAAMC,MAAM,GAAI,MAAMX,eAAe,CAACY,mBAAhB,EAAtB;MACA,OAAOC,OAAO,CAACF,MAAM,CAACG,OAAP,IAAmB,gBAAAH,MAAM,CAACI,GAAP,4DAAYJ,MAAZ,KAAsBV,gBAAgB,CAACe,QAAjB,CAA0BL,MAAM,CAACI,GAAP,CAAWJ,MAArC,CAA1C,CAAd;IACD,CAZI;;IAaL,MAAMM,qBAAN,GAAgD;MAAA;;MAC9C,MAAMN,MAAM,GAAI,MAAMX,eAAe,CAACkB,uBAAhB,EAAtB;MACA,OAAOL,OAAO,CAACF,MAAM,CAACG,OAAP,IAAmB,iBAAAH,MAAM,CAACI,GAAP,8DAAYJ,MAAZ,KAAsBV,gBAAgB,CAACe,QAAjB,CAA0BL,MAAM,CAACI,GAAP,CAAWJ,MAArC,CAA1C,CAAd;IACD,CAhBI;;IAiBLQ,cAAc,CAACC,OAAD,EAA2D;MACvE,MAAMC,YAAY,GAAGrB,eAAe,CAACsB,oBAAhB,CAAqC;QAAA,IAAC;UAAEd;QAAF,CAAD;QAAA,OAAcY,OAAO,CAACZ,IAAD,CAArB;MAAA,CAArC,CAArB;MACA,OAAO,MAAMR,eAAe,CAACuB,2BAAhB,CAA4CF,YAA5C,CAAb;IACD;;EApBI,CAAP;AAsBD,CA5BD;;eA8BetB,6B"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":[],"sources":["types.ts"],"sourcesContent":["export type Unsubscribe = () => void | undefined;\nexport type DownloadedPath = string;\nexport type FilePickerResponse = FileType | null;\nexport type FileType = { uri: string; size: number; name: string; type: string };\n\nexport interface NotificationServiceInterface {\n hasPushPermission(): Promise<boolean>;\n requestPushPermission(): Promise<boolean>;\n\n getAPNSToken(): Promise<string | null>;\n getFCMToken(): Promise<string | null>;\n onTokenRefresh(handler: (token: string) => void): Unsubscribe;\n}\n\nexport interface ClipboardServiceInterface {\n setString(text: string): void;\n getString(): Promise<string>;\n}\n\nexport interface FileServiceInterface extends FilePickerServiceInterface, FileSystemServiceInterface {}\n\nexport interface OpenResultListener {\n onOpenFailureWithToastMessage?: () => void;\n}\nexport interface OpenMediaLibraryOptions extends OpenResultListener {\n selectionLimit?: number;\n mediaType?: 'photo' | 'video' | 'all';\n}\nexport interface OpenCameraOptions extends OpenResultListener {\n cameraType?: 'front' | 'back';\n mediaType?: 'photo' | 'video';\n}\nexport type OpenDocumentOptions = OpenResultListener;\nexport interface SaveOptions {\n fileUrl: string;\n fileName: string;\n fileType?: string | null;\n}\n\nexport interface FilePickerServiceInterface {\n openMediaLibrary(options?: OpenMediaLibraryOptions): Promise<null | FilePickerResponse[]>;\n openCamera(options?: OpenCameraOptions): Promise<FilePickerResponse>;\n openDocument(options?: OpenDocumentOptions): Promise<FilePickerResponse>;\n}\n\nexport interface FileSystemServiceInterface {\n // NOTE: On iOS, You can access the downloaded files by providing options below to info.plist\n // - Supports opening documents in place\n // - Application supports iTunes file sharing\n save(options?: SaveOptions): Promise<DownloadedPath | null>;\n}\n"],"mappings":""}
|
|
1
|
+
{"version":3,"names":[],"sources":["types.ts"],"sourcesContent":["export type Unsubscribe = () => void | undefined;\nexport type DownloadedPath = string;\nexport type FilePickerResponse = FileType | null;\nexport type FileType = { uri: string; size: number; name: string; type: string };\n\n// ---------- NotificationService ---------- //\nexport interface NotificationServiceInterface {\n hasPushPermission(): Promise<boolean>;\n requestPushPermission(): Promise<boolean>;\n\n getAPNSToken(): Promise<string | null>;\n getFCMToken(): Promise<string | null>;\n onTokenRefresh(handler: (token: string) => void): Unsubscribe;\n}\n\n// ---------- ClipboardService ---------- //\nexport interface ClipboardServiceInterface {\n setString(text: string): void;\n getString(): Promise<string>;\n}\n\n// ---------- FileService ---------- //\nexport interface FileServiceInterface extends FilePickerServiceInterface, FileSystemServiceInterface {}\n\nexport interface OpenResultListener {\n onOpenFailureWithToastMessage?: () => void;\n}\nexport interface OpenMediaLibraryOptions extends OpenResultListener {\n selectionLimit?: number;\n mediaType?: 'photo' | 'video' | 'all';\n}\nexport interface OpenCameraOptions extends OpenResultListener {\n cameraType?: 'front' | 'back';\n mediaType?: 'photo' | 'video' | 'all';\n}\nexport type OpenDocumentOptions = OpenResultListener;\nexport interface SaveOptions {\n fileUrl: string;\n fileName: string;\n fileType?: string | null;\n}\n\nexport interface FilePickerServiceInterface {\n openMediaLibrary(options?: OpenMediaLibraryOptions): Promise<null | FilePickerResponse[]>;\n openCamera(options?: OpenCameraOptions): Promise<FilePickerResponse>;\n openDocument(options?: OpenDocumentOptions): Promise<FilePickerResponse>;\n}\n\nexport interface FileSystemServiceInterface {\n // NOTE: On iOS, You can access the downloaded files by providing options below to info.plist\n // - Supports opening documents in place\n // - Application supports iTunes file sharing\n save(options?: SaveOptions): Promise<DownloadedPath | null>;\n}\n\n// ---------- MediaService ---------- //\ninterface VideoProps {\n source: { uri: string } | number;\n resizeMode?: 'cover' | 'contain' | 'stretch';\n onLoad?: () => void;\n}\ninterface GetVideoThumbnailOptions {\n url: string;\n timeMills?: number;\n quality?: number;\n}\nexport interface MediaServiceInterface {\n VideoComponent<Props = {}>(props: VideoProps & Props): JSX.Element;\n getVideoThumbnail(options: GetVideoThumbnailOptions): Promise<{ path: string } | null>;\n // compressImage(options: {\n // path: string;\n // compressionRate: number;\n // resizingWidth: number;\n // resizingHeight: number;\n // }): Promise<{ path: string }>;\n}\n"],"mappings":""}
|
package/lib/commonjs/version.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["VERSION"],"sources":["version.ts"],"sourcesContent":["const VERSION = '1.
|
|
1
|
+
{"version":3,"names":["VERSION"],"sources":["version.ts"],"sourcesContent":["const VERSION = '1.1.1';\nexport default VERSION;\n"],"mappings":";;;;;;AAAA,MAAMA,OAAO,GAAG,OAAhB;eACeA,O"}
|