@sendbird/uikit-react-native 3.7.3 → 3.7.5
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 +5 -4
- package/lib/commonjs/components/ChannelInput/SendInput.js +2 -1
- package/lib/commonjs/components/ChannelInput/SendInput.js.map +1 -1
- package/lib/commonjs/components/ChannelInput/VoiceMessageInput.js +33 -23
- package/lib/commonjs/components/ChannelInput/VoiceMessageInput.js.map +1 -1
- package/lib/commonjs/components/ChannelInput/index.js +11 -5
- package/lib/commonjs/components/ChannelInput/index.js.map +1 -1
- package/lib/commonjs/components/ChannelMessageList/index.js +6 -1
- package/lib/commonjs/components/ChannelMessageList/index.js.map +1 -1
- package/lib/commonjs/components/ChannelThreadMessageList/index.js +6 -1
- package/lib/commonjs/components/ChannelThreadMessageList/index.js.map +1 -1
- package/lib/commonjs/components/FileViewer/FileViewerContent.js +1 -1
- package/lib/commonjs/components/FileViewer/FileViewerContent.js.map +1 -1
- package/lib/commonjs/components/FileViewer/FileViewerFooter.js +1 -0
- package/lib/commonjs/components/FileViewer/FileViewerFooter.js.map +1 -1
- package/lib/commonjs/components/FileViewer/FileViewerHeader.js +1 -0
- package/lib/commonjs/components/FileViewer/FileViewerHeader.js.map +1 -1
- package/lib/commonjs/components/GroupChannelMessageRenderer/index.js +1 -1
- package/lib/commonjs/components/GroupChannelMessageRenderer/index.js.map +1 -1
- package/lib/commonjs/components/ReactionAddons/BottomSheetReactionAddon.js +9 -3
- package/lib/commonjs/components/ReactionAddons/BottomSheetReactionAddon.js.map +1 -1
- package/lib/commonjs/components/ReactionBottomSheets/ReactionListBottomSheet.js +9 -3
- package/lib/commonjs/components/ReactionBottomSheets/ReactionListBottomSheet.js.map +1 -1
- package/lib/commonjs/components/ThreadParentMessageRenderer/index.js +1 -1
- package/lib/commonjs/components/ThreadParentMessageRenderer/index.js.map +1 -1
- package/lib/commonjs/containers/SendbirdUIKitContainer.js +0 -1
- package/lib/commonjs/containers/SendbirdUIKitContainer.js.map +1 -1
- package/lib/commonjs/contexts/PlatformServiceCtx.js +2 -1
- package/lib/commonjs/contexts/PlatformServiceCtx.js.map +1 -1
- package/lib/commonjs/contexts/SBUHandlersCtx.js.map +1 -1
- package/lib/commonjs/domain/groupChannel/component/GroupChannelMessageList.js +17 -3
- package/lib/commonjs/domain/groupChannel/component/GroupChannelMessageList.js.map +1 -1
- package/lib/commonjs/domain/groupChannelSettings/component/GroupChannelSettingsMenu.js +8 -4
- package/lib/commonjs/domain/groupChannelSettings/component/GroupChannelSettingsMenu.js.map +1 -1
- package/lib/commonjs/domain/groupChannelThread/component/GroupChannelThreadMessageList.js +16 -2
- package/lib/commonjs/domain/groupChannelThread/component/GroupChannelThreadMessageList.js.map +1 -1
- package/lib/commonjs/domain/groupChannelThread/component/GroupChannelThreadParentMessageInfo.js +8 -3
- package/lib/commonjs/domain/groupChannelThread/component/GroupChannelThreadParentMessageInfo.js.map +1 -1
- package/lib/commonjs/fragments/createGroupChannelFragment.js +3 -2
- package/lib/commonjs/fragments/createGroupChannelFragment.js.map +1 -1
- package/lib/commonjs/fragments/createGroupChannelThreadFragment.js +3 -2
- package/lib/commonjs/fragments/createGroupChannelThreadFragment.js.map +1 -1
- package/lib/commonjs/hooks/useConnection.js +2 -2
- package/lib/commonjs/hooks/useConnection.js.map +1 -1
- package/lib/commonjs/hooks/usePushTokenRegistration.js +24 -6
- package/lib/commonjs/hooks/usePushTokenRegistration.js.map +1 -1
- package/lib/commonjs/platform/createFileService.native.js +2 -2
- package/lib/commonjs/platform/createFileService.native.js.map +1 -1
- package/lib/commonjs/platform/createPlayerService.expo.js +8 -2
- package/lib/commonjs/platform/createPlayerService.expo.js.map +1 -1
- package/lib/commonjs/platform/createPlayerService.native.js +12 -7
- package/lib/commonjs/platform/createPlayerService.native.js.map +1 -1
- package/lib/commonjs/platform/createRecorderService.native.js +8 -2
- package/lib/commonjs/platform/createRecorderService.native.js.map +1 -1
- package/lib/commonjs/version.js +1 -1
- package/lib/commonjs/version.js.map +1 -1
- package/lib/module/components/ChannelInput/SendInput.js +2 -1
- package/lib/module/components/ChannelInput/SendInput.js.map +1 -1
- package/lib/module/components/ChannelInput/VoiceMessageInput.js +34 -24
- package/lib/module/components/ChannelInput/VoiceMessageInput.js.map +1 -1
- package/lib/module/components/ChannelInput/index.js +12 -6
- package/lib/module/components/ChannelInput/index.js.map +1 -1
- package/lib/module/components/ChannelMessageList/index.js +6 -1
- package/lib/module/components/ChannelMessageList/index.js.map +1 -1
- package/lib/module/components/ChannelThreadMessageList/index.js +6 -1
- package/lib/module/components/ChannelThreadMessageList/index.js.map +1 -1
- package/lib/module/components/FileViewer/FileViewerContent.js +1 -1
- package/lib/module/components/FileViewer/FileViewerContent.js.map +1 -1
- package/lib/module/components/FileViewer/FileViewerFooter.js +1 -0
- package/lib/module/components/FileViewer/FileViewerFooter.js.map +1 -1
- package/lib/module/components/FileViewer/FileViewerHeader.js +1 -0
- package/lib/module/components/FileViewer/FileViewerHeader.js.map +1 -1
- package/lib/module/components/GroupChannelMessageRenderer/index.js +1 -1
- package/lib/module/components/GroupChannelMessageRenderer/index.js.map +1 -1
- package/lib/module/components/ReactionAddons/BottomSheetReactionAddon.js +10 -4
- package/lib/module/components/ReactionAddons/BottomSheetReactionAddon.js.map +1 -1
- package/lib/module/components/ReactionBottomSheets/ReactionListBottomSheet.js +9 -3
- package/lib/module/components/ReactionBottomSheets/ReactionListBottomSheet.js.map +1 -1
- package/lib/module/components/ThreadParentMessageRenderer/index.js +1 -1
- package/lib/module/components/ThreadParentMessageRenderer/index.js.map +1 -1
- package/lib/module/containers/SendbirdUIKitContainer.js +0 -1
- package/lib/module/containers/SendbirdUIKitContainer.js.map +1 -1
- package/lib/module/contexts/PlatformServiceCtx.js +2 -1
- package/lib/module/contexts/PlatformServiceCtx.js.map +1 -1
- package/lib/module/contexts/SBUHandlersCtx.js.map +1 -1
- package/lib/module/domain/groupChannel/component/GroupChannelMessageList.js +17 -3
- package/lib/module/domain/groupChannel/component/GroupChannelMessageList.js.map +1 -1
- package/lib/module/domain/groupChannelSettings/component/GroupChannelSettingsMenu.js +8 -4
- package/lib/module/domain/groupChannelSettings/component/GroupChannelSettingsMenu.js.map +1 -1
- package/lib/module/domain/groupChannelThread/component/GroupChannelThreadMessageList.js +16 -2
- package/lib/module/domain/groupChannelThread/component/GroupChannelThreadMessageList.js.map +1 -1
- package/lib/module/domain/groupChannelThread/component/GroupChannelThreadParentMessageInfo.js +8 -3
- package/lib/module/domain/groupChannelThread/component/GroupChannelThreadParentMessageInfo.js.map +1 -1
- package/lib/module/fragments/createGroupChannelFragment.js +3 -2
- package/lib/module/fragments/createGroupChannelFragment.js.map +1 -1
- package/lib/module/fragments/createGroupChannelThreadFragment.js +3 -2
- package/lib/module/fragments/createGroupChannelThreadFragment.js.map +1 -1
- package/lib/module/hooks/useConnection.js +2 -2
- package/lib/module/hooks/useConnection.js.map +1 -1
- package/lib/module/hooks/usePushTokenRegistration.js +24 -6
- package/lib/module/hooks/usePushTokenRegistration.js.map +1 -1
- package/lib/module/platform/createFileService.native.js +2 -2
- package/lib/module/platform/createFileService.native.js.map +1 -1
- package/lib/module/platform/createPlayerService.expo.js +9 -3
- package/lib/module/platform/createPlayerService.expo.js.map +1 -1
- package/lib/module/platform/createPlayerService.native.js +13 -8
- package/lib/module/platform/createPlayerService.native.js.map +1 -1
- package/lib/module/platform/createRecorderService.native.js +9 -3
- package/lib/module/platform/createRecorderService.native.js.map +1 -1
- package/lib/module/version.js +1 -1
- package/lib/module/version.js.map +1 -1
- package/lib/typescript/src/containers/SendbirdUIKitContainer.d.ts +1 -1
- package/lib/typescript/src/contexts/SBUHandlersCtx.d.ts +1 -1
- package/lib/typescript/src/version.d.ts +1 -1
- package/package.json +6 -6
- package/src/components/ChannelInput/SendInput.tsx +2 -1
- package/src/components/ChannelInput/VoiceMessageInput.tsx +40 -24
- package/src/components/ChannelInput/index.tsx +16 -6
- package/src/components/ChannelMessageList/index.tsx +5 -1
- package/src/components/ChannelThreadMessageList/index.tsx +5 -1
- package/src/components/FileViewer/FileViewerContent.tsx +1 -1
- package/src/components/FileViewer/FileViewerFooter.tsx +1 -0
- package/src/components/FileViewer/FileViewerHeader.tsx +1 -0
- package/src/components/GroupChannelMessageRenderer/index.tsx +1 -1
- package/src/components/ReactionAddons/BottomSheetReactionAddon.tsx +13 -5
- package/src/components/ReactionBottomSheets/ReactionListBottomSheet.tsx +11 -4
- package/src/components/ThreadParentMessageRenderer/index.tsx +1 -1
- package/src/containers/SendbirdUIKitContainer.tsx +0 -1
- package/src/contexts/PlatformServiceCtx.tsx +2 -1
- package/src/contexts/SBUHandlersCtx.tsx +1 -1
- package/src/domain/groupChannel/component/GroupChannelMessageList.tsx +19 -3
- package/src/domain/groupChannelSettings/component/GroupChannelSettingsMenu.tsx +8 -4
- package/src/domain/groupChannelThread/component/GroupChannelThreadMessageList.tsx +17 -2
- package/src/domain/groupChannelThread/component/GroupChannelThreadParentMessageInfo.tsx +7 -3
- package/src/fragments/createGroupChannelFragment.tsx +3 -2
- package/src/fragments/createGroupChannelThreadFragment.tsx +3 -2
- package/src/hooks/useConnection.ts +8 -2
- package/src/hooks/usePushTokenRegistration.ts +24 -6
- package/src/platform/createFileService.native.ts +2 -6
- package/src/platform/createPlayerService.expo.tsx +9 -3
- package/src/platform/createPlayerService.native.tsx +15 -8
- package/src/platform/createRecorderService.native.tsx +9 -3
- package/src/version.ts +1 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["_reactNative","require","_uikitUtils","_SBUError","_interopRequireDefault","_nativePermissionGranted","_normalizeFile","obj","__esModule","default","_defineProperty","key","value","_toPropertyKey","Object","defineProperty","enumerable","configurable","writable","arg","_toPrimitive","String","input","hint","prim","Symbol","toPrimitive","undefined","res","call","TypeError","Number","getAndroidStoragePermissionsByAPILevel","permissionModule","Platform","OS","Version","PERMISSIONS","ANDROID","READ_MEDIA_AUDIO","READ_MEDIA_IMAGES","READ_MEDIA_VIDEO","READ_EXTERNAL_STORAGE","WRITE_EXTERNAL_STORAGE","createNativeFileService","_ref","imagePickerModule","documentPickerModule","mediaLibraryModule","fsModule","cameraPermissions","select","ios","IOS","CAMERA","MICROPHONE","android","mediaLibraryPermissions","PHOTO_LIBRARY","PHOTO_LIBRARY_ADD_ONLY","NativeFileService","constructor","options","dirname","Dirs","CacheDir","DocumentDir","context","filename","fileName","extension","getFileExtension","getFileExtensionFromMime","fileType","fileUrl","getFileExtensionFromUri","normalizeFileName","path","buildDownloadPath","FileSystem","fetch","downloadedPath","file","name","type","getFileType","hasCameraPermission","status","checkMultiple","nativePermissionGranted","requestCameraPermission","requestMultiple","hasMediaLibraryPermission","requestMediaLibraryPermission","openCamera","_response$assets","hasPermission","granted","_options$onOpenFailur","onOpenFailure","SBUError","PERMISSIONS_DENIED","response","launchCamera","presentationStyle","cameraType","mediaType","didCancel","errorCode","_options$onOpenFailur2","DEVICE_UNAVAILABLE","Error","errorMessage","fileSize","size","uri","assets","normalizeFile","openMediaLibrary","selectionLimit","_options$onOpenFailur3","launchImageLibrary","_options$onOpenFailur4","Promise","all","slice","map","_ref2","openDocument","pickSingle","e","isCancel","isInProgress","_options$onOpenFailur5","UNKNOWN","save","downloadFile","mediaTypeMap","externalDirMap","externalDir","cpExternal","catch","Logger","error","createRecordFilePath","customExtension","arguments","length","Date","now","recordFilePath","startsWith","_default","exports"],"sources":["createFileService.native.ts"],"sourcesContent":["import type { CameraRoll } from '@react-native-camera-roll/camera-roll';\nimport { Platform } from 'react-native';\nimport type * as DocumentPicker from 'react-native-document-picker';\nimport type * as FileAccess from 'react-native-file-access';\nimport type * as ImagePicker from 'react-native-image-picker';\nimport type * as Permissions from 'react-native-permissions';\nimport type { Permission } from 'react-native-permissions';\n\nimport {\n Logger,\n getFileExtension,\n getFileExtensionFromMime,\n getFileExtensionFromUri,\n getFileType,\n normalizeFileName,\n} from '@sendbird/uikit-utils';\n\nimport SBUError from '../libs/SBUError';\nimport nativePermissionGranted from '../utils/nativePermissionGranted';\nimport normalizeFile from '../utils/normalizeFile';\nimport type {\n FilePickerResponse,\n FileServiceInterface,\n OpenCameraOptions,\n OpenDocumentOptions,\n OpenMediaLibraryOptions,\n SaveOptions,\n} from './types';\n\nfunction getAndroidStoragePermissionsByAPILevel(permissionModule: typeof Permissions): Permission[] {\n if (Platform.OS !== 'android') return [];\n\n if (Platform.Version > 32) {\n return [\n 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.PHOTO_LIBRARY, permissionModule.PERMISSIONS.IOS.PHOTO_LIBRARY_ADD_ONLY],\n android: getAndroidStoragePermissionsByAPILevel(permissionModule),\n default: [],\n });\n\n class NativeFileService implements FileServiceInterface {\n async hasCameraPermission(): Promise<boolean> {\n const status = await permissionModule.checkMultiple(cameraPermissions);\n return nativePermissionGranted(status);\n }\n async requestCameraPermission(): Promise<boolean> {\n const status = await permissionModule.requestMultiple(cameraPermissions);\n return nativePermissionGranted(status);\n }\n async hasMediaLibraryPermission(): Promise<boolean> {\n const status = await permissionModule.checkMultiple(mediaLibraryPermissions);\n return nativePermissionGranted(status);\n }\n async requestMediaLibraryPermission(): Promise<boolean> {\n const status = await permissionModule.requestMultiple(mediaLibraryPermissions);\n return nativePermissionGranted(status);\n }\n\n async openCamera(options?: OpenCameraOptions): Promise<FilePickerResponse> {\n const hasPermission = await this.hasCameraPermission();\n if (!hasPermission) {\n const granted = await this.requestCameraPermission();\n if (!granted) {\n options?.onOpenFailure?.(SBUError.PERMISSIONS_DENIED);\n return null;\n }\n }\n\n const response = await imagePickerModule.launchCamera({\n presentationStyle: 'fullScreen',\n cameraType: options?.cameraType ?? 'back',\n mediaType: (() => {\n switch (options?.mediaType) {\n case 'photo':\n return 'photo';\n case 'video':\n return 'video';\n case 'all':\n return 'mixed';\n default:\n return 'photo';\n }\n })(),\n });\n if (response.didCancel) return null;\n if (response.errorCode === 'camera_unavailable') {\n options?.onOpenFailure?.(SBUError.DEVICE_UNAVAILABLE, new Error(response.errorMessage));\n return null;\n }\n\n const { fileName: name, fileSize: size, type, uri } = response.assets?.[0] ?? {};\n return normalizeFile({ uri, size, name, type });\n }\n async openMediaLibrary(options?: OpenMediaLibraryOptions): Promise<FilePickerResponse[] | null> {\n /**\n * NOTE: options.selectionLimit {@link https://github.com/react-native-image-picker/react-native-image-picker#options}\n * We do not support 0 (any number of files)\n **/\n const selectionLimit = options?.selectionLimit || 1;\n const hasPermission = await this.hasMediaLibraryPermission();\n if (!hasPermission) {\n const granted = await this.requestMediaLibraryPermission();\n if (!granted) {\n options?.onOpenFailure?.(SBUError.PERMISSIONS_DENIED);\n return null;\n }\n }\n\n const response = await imagePickerModule.launchImageLibrary({\n presentationStyle: 'fullScreen',\n selectionLimit,\n mediaType: (() => {\n switch (options?.mediaType) {\n case 'photo':\n return 'photo';\n case 'video':\n return 'video';\n case 'all':\n return 'mixed';\n default:\n return 'photo';\n }\n })(),\n });\n if (response.didCancel) return null;\n if (response.errorCode === 'camera_unavailable') {\n options?.onOpenFailure?.(SBUError.DEVICE_UNAVAILABLE, new Error(response.errorMessage));\n return null;\n }\n\n return Promise.all(\n (response.assets || [])\n .slice(0, selectionLimit)\n .map(({ fileName: name, fileSize: size, type, uri }) => normalizeFile({ uri, size, name, type })),\n );\n }\n async openDocument(options?: OpenDocumentOptions): Promise<FilePickerResponse> {\n try {\n const { uri, size, name, type } = await documentPickerModule.pickSingle();\n return normalizeFile({ uri, size, name, type });\n } catch (e) {\n if (!documentPickerModule.isCancel(e) && documentPickerModule.isInProgress(e)) {\n options?.onOpenFailure?.(SBUError.UNKNOWN, e);\n }\n return null;\n }\n }\n async save(options: SaveOptions): Promise<string> {\n const hasPermission = await this.hasMediaLibraryPermission();\n if (!hasPermission) {\n const granted = await this.requestMediaLibraryPermission();\n if (!granted) throw new Error('Permission not granted');\n }\n\n const { downloadedPath, file } = await this.downloadFile(options);\n\n if (Platform.OS === 'ios') {\n if (file.type === 'image' || file.type === 'video') {\n const mediaTypeMap = { 'image': 'photo', 'video': 'video' } as const;\n const mediaType = mediaTypeMap[file.type];\n await mediaLibraryModule.save(downloadedPath, { type: mediaType });\n }\n }\n\n if (Platform.OS === 'android') {\n const externalDirMap = { 'file': 'downloads', 'audio': 'audio', 'image': 'images', 'video': 'video' } as const;\n const externalDir = externalDirMap[file.type];\n await fsModule.FileSystem.cpExternal(downloadedPath, file.name, externalDir).catch(() => {\n Logger.error('Failed to save file to external storage. Retry saving to downloads directory instead.');\n return fsModule.FileSystem.cpExternal(downloadedPath, file.name, 'downloads');\n });\n }\n\n return downloadedPath;\n }\n\n private buildDownloadPath = async (options: SaveOptions) => {\n const dirname = Platform.select({ android: fsModule.Dirs.CacheDir, default: fsModule.Dirs.DocumentDir });\n const context = { dirname, filename: options.fileName };\n const extension =\n getFileExtension(options.fileName) ||\n getFileExtensionFromMime(options.fileType) ||\n getFileExtension(options.fileUrl) ||\n (await getFileExtensionFromUri(options.fileUrl));\n\n if (extension) context.filename = normalizeFileName(context.filename, extension);\n\n return { path: `${context.dirname}/${context.filename}`, ...context };\n };\n\n private downloadFile = async (options: SaveOptions) => {\n const { path, filename } = await this.buildDownloadPath(options);\n await fsModule.FileSystem.fetch(options.fileUrl, { path });\n return {\n downloadedPath: path,\n file: {\n name: filename,\n type: getFileType(getFileExtension(path)),\n } as const,\n };\n };\n\n createRecordFilePath(customExtension = 'm4a'): { recordFilePath: string; uri: string } {\n const filename = `record-${Date.now()}.${customExtension}`;\n const path = `${fsModule.Dirs.CacheDir}/${filename}`;\n return Platform.select({\n ios: {\n uri: path,\n recordFilePath: filename,\n },\n android: {\n uri: path.startsWith('file://') ? path : 'file://' + path,\n recordFilePath: path,\n },\n default: {\n uri: path,\n recordFilePath: path,\n },\n });\n }\n }\n\n return new NativeFileService();\n};\n\nexport default createNativeFileService;\n"],"mappings":";;;;;;AACA,IAAAA,YAAA,GAAAC,OAAA;AAOA,IAAAC,WAAA,GAAAD,OAAA;AASA,IAAAE,SAAA,GAAAC,sBAAA,CAAAH,OAAA;AACA,IAAAI,wBAAA,GAAAD,sBAAA,CAAAH,OAAA;AACA,IAAAK,cAAA,GAAAF,sBAAA,CAAAH,OAAA;AAAmD,SAAAG,uBAAAG,GAAA,WAAAA,GAAA,IAAAA,GAAA,CAAAC,UAAA,GAAAD,GAAA,KAAAE,OAAA,EAAAF,GAAA;AAAA,SAAAG,gBAAAH,GAAA,EAAAI,GAAA,EAAAC,KAAA,IAAAD,GAAA,GAAAE,cAAA,CAAAF,GAAA,OAAAA,GAAA,IAAAJ,GAAA,IAAAO,MAAA,CAAAC,cAAA,CAAAR,GAAA,EAAAI,GAAA,IAAAC,KAAA,EAAAA,KAAA,EAAAI,UAAA,QAAAC,YAAA,QAAAC,QAAA,oBAAAX,GAAA,CAAAI,GAAA,IAAAC,KAAA,WAAAL,GAAA;AAAA,SAAAM,eAAAM,GAAA,QAAAR,GAAA,GAAAS,YAAA,CAAAD,GAAA,2BAAAR,GAAA,gBAAAA,GAAA,GAAAU,MAAA,CAAAV,GAAA;AAAA,SAAAS,aAAAE,KAAA,EAAAC,IAAA,eAAAD,KAAA,iBAAAA,KAAA,kBAAAA,KAAA,MAAAE,IAAA,GAAAF,KAAA,CAAAG,MAAA,CAAAC,WAAA,OAAAF,IAAA,KAAAG,SAAA,QAAAC,GAAA,GAAAJ,IAAA,CAAAK,IAAA,CAAAP,KAAA,EAAAC,IAAA,2BAAAK,GAAA,sBAAAA,GAAA,YAAAE,SAAA,4DAAAP,IAAA,gBAAAF,MAAA,GAAAU,MAAA,EAAAT,KAAA;AAUnD,SAASU,sCAAsCA,CAACC,gBAAoC,EAAgB;EAClG,IAAIC,qBAAQ,CAACC,EAAE,KAAK,SAAS,EAAE,OAAO,EAAE;EAExC,IAAID,qBAAQ,CAACE,OAAO,GAAG,EAAE,EAAE;IACzB,OAAO,CACLH,gBAAgB,CAACI,WAAW,CAACC,OAAO,CAACC,gBAAgB,EACrDN,gBAAgB,CAACI,WAAW,CAACC,OAAO,CAACE,iBAAiB,EACtDP,gBAAgB,CAACI,WAAW,CAACC,OAAO,CAACG,gBAAgB,CACtD;EACH;EAEA,IAAIP,qBAAQ,CAACE,OAAO,GAAG,EAAE,EAAE;IACzB,OAAO,CAACH,gBAAgB,CAACI,WAAW,CAACC,OAAO,CAACI,qBAAqB,CAAC;EACrE;EAEA,OAAO,CACLT,gBAAgB,CAACI,WAAW,CAACC,OAAO,CAACK,sBAAsB,EAC3DV,gBAAgB,CAACI,WAAW,CAACC,OAAO,CAACI,qBAAqB,CAC3D;AACH;AAEA,MAAME,uBAAuB,GAAGC,IAAA,IAYJ;EAAA,IAZK;IAC/BC,iBAAiB;IACjBC,oBAAoB;IACpBd,gBAAgB;IAChBe,kBAAkB;IAClBC;EAOF,CAAC,GAAAJ,IAAA;EACC,MAAMK,iBAA+B,GAAGhB,qBAAQ,CAACiB,MAAM,CAAC;IACtDC,GAAG,EAAE,CAACnB,gBAAgB,CAACI,WAAW,CAACgB,GAAG,CAACC,MAAM,EAAErB,gBAAgB,CAACI,WAAW,CAACgB,GAAG,CAACE,UAAU,CAAC;IAC3FC,OAAO,EAAE,CAACvB,gBAAgB,CAACI,WAAW,CAACC,OAAO,CAACgB,MAAM,CAAC;IACtD7C,OAAO,EAAE;EACX,CAAC,CAAC;EACF,MAAMgD,uBAAqC,GAAGvB,qBAAQ,CAACiB,MAAM,CAAC;IAC5DC,GAAG,EAAE,CAACnB,gBAAgB,CAACI,WAAW,CAACgB,GAAG,CAACK,aAAa,EAAEzB,gBAAgB,CAACI,WAAW,CAACgB,GAAG,CAACM,sBAAsB,CAAC;IAC9GH,OAAO,EAAExB,sCAAsC,CAACC,gBAAgB,CAAC;IACjExB,OAAO,EAAE;EACX,CAAC,CAAC;EAEF,MAAMmD,iBAAiB,CAAiC;IAAAC,YAAA;MAAAnD,eAAA,4BAwI1B,MAAOoD,OAAoB,IAAK;QAC1D,MAAMC,OAAO,GAAG7B,qBAAQ,CAACiB,MAAM,CAAC;UAAEK,OAAO,EAAEP,QAAQ,CAACe,IAAI,CAACC,QAAQ;UAAExD,OAAO,EAAEwC,QAAQ,CAACe,IAAI,CAACE;QAAY,CAAC,CAAC;QACxG,MAAMC,OAAO,GAAG;UAAEJ,OAAO;UAAEK,QAAQ,EAAEN,OAAO,CAACO;QAAS,CAAC;QACvD,MAAMC,SAAS,GACb,IAAAC,4BAAgB,EAACT,OAAO,CAACO,QAAQ,CAAC,IAClC,IAAAG,oCAAwB,EAACV,OAAO,CAACW,QAAQ,CAAC,IAC1C,IAAAF,4BAAgB,EAACT,OAAO,CAACY,OAAO,CAAC,KAChC,MAAM,IAAAC,mCAAuB,EAACb,OAAO,CAACY,OAAO,CAAC,CAAC;QAElD,IAAIJ,SAAS,EAAEH,OAAO,CAACC,QAAQ,GAAG,IAAAQ,6BAAiB,EAACT,OAAO,CAACC,QAAQ,EAAEE,SAAS,CAAC;QAEhF,OAAO;UAAEO,IAAI,EAAG,GAAEV,OAAO,CAACJ,OAAQ,IAAGI,OAAO,CAACC,QAAS,EAAC;UAAE,GAAGD;QAAQ,CAAC;MACvE,CAAC;MAAAzD,eAAA,uBAEsB,MAAOoD,OAAoB,IAAK;QACrD,MAAM;UAAEe,IAAI;UAAET;QAAS,CAAC,GAAG,MAAM,IAAI,CAACU,iBAAiB,CAAChB,OAAO,CAAC;QAChE,MAAMb,QAAQ,CAAC8B,UAAU,CAACC,KAAK,CAAClB,OAAO,CAACY,OAAO,EAAE;UAAEG;QAAK,CAAC,CAAC;QAC1D,OAAO;UACLI,cAAc,EAAEJ,IAAI;UACpBK,IAAI,EAAE;YACJC,IAAI,EAAEf,QAAQ;YACdgB,IAAI,EAAE,IAAAC,uBAAW,EAAC,IAAAd,4BAAgB,EAACM,IAAI,CAAC;UAC1C;QACF,CAAC;MACH,CAAC;IAAA;IA/JD,MAAMS,mBAAmBA,CAAA,EAAqB;MAC5C,MAAMC,MAAM,GAAG,MAAMtD,gBAAgB,CAACuD,aAAa,CAACtC,iBAAiB,CAAC;MACtE,OAAO,IAAAuC,gCAAuB,EAACF,MAAM,CAAC;IACxC;IACA,MAAMG,uBAAuBA,CAAA,EAAqB;MAChD,MAAMH,MAAM,GAAG,MAAMtD,gBAAgB,CAAC0D,eAAe,CAACzC,iBAAiB,CAAC;MACxE,OAAO,IAAAuC,gCAAuB,EAACF,MAAM,CAAC;IACxC;IACA,MAAMK,yBAAyBA,CAAA,EAAqB;MAClD,MAAML,MAAM,GAAG,MAAMtD,gBAAgB,CAACuD,aAAa,CAAC/B,uBAAuB,CAAC;MAC5E,OAAO,IAAAgC,gCAAuB,EAACF,MAAM,CAAC;IACxC;IACA,MAAMM,6BAA6BA,CAAA,EAAqB;MACtD,MAAMN,MAAM,GAAG,MAAMtD,gBAAgB,CAAC0D,eAAe,CAAClC,uBAAuB,CAAC;MAC9E,OAAO,IAAAgC,gCAAuB,EAACF,MAAM,CAAC;IACxC;IAEA,MAAMO,UAAUA,CAAChC,OAA2B,EAA+B;MAAA,IAAAiC,gBAAA;MACzE,MAAMC,aAAa,GAAG,MAAM,IAAI,CAACV,mBAAmB,EAAE;MACtD,IAAI,CAACU,aAAa,EAAE;QAClB,MAAMC,OAAO,GAAG,MAAM,IAAI,CAACP,uBAAuB,EAAE;QACpD,IAAI,CAACO,OAAO,EAAE;UAAA,IAAAC,qBAAA;UACZpC,OAAO,aAAPA,OAAO,wBAAAoC,qBAAA,GAAPpC,OAAO,CAAEqC,aAAa,cAAAD,qBAAA,uBAAtBA,qBAAA,CAAArE,IAAA,CAAAiC,OAAO,EAAkBsC,iBAAQ,CAACC,kBAAkB,CAAC;UACrD,OAAO,IAAI;QACb;MACF;MAEA,MAAMC,QAAQ,GAAG,MAAMxD,iBAAiB,CAACyD,YAAY,CAAC;QACpDC,iBAAiB,EAAE,YAAY;QAC/BC,UAAU,EAAE,CAAA3C,OAAO,aAAPA,OAAO,uBAAPA,OAAO,CAAE2C,UAAU,KAAI,MAAM;QACzCC,SAAS,EAAE,CAAC,MAAM;UAChB,QAAQ5C,OAAO,aAAPA,OAAO,uBAAPA,OAAO,CAAE4C,SAAS;YACxB,KAAK,OAAO;cACV,OAAO,OAAO;YAChB,KAAK,OAAO;cACV,OAAO,OAAO;YAChB,KAAK,KAAK;cACR,OAAO,OAAO;YAChB;cACE,OAAO,OAAO;UAAC;QAErB,CAAC;MACH,CAAC,CAAC;MACF,IAAIJ,QAAQ,CAACK,SAAS,EAAE,OAAO,IAAI;MACnC,IAAIL,QAAQ,CAACM,SAAS,KAAK,oBAAoB,EAAE;QAAA,IAAAC,sBAAA;QAC/C/C,OAAO,aAAPA,OAAO,wBAAA+C,sBAAA,GAAP/C,OAAO,CAAEqC,aAAa,cAAAU,sBAAA,uBAAtBA,sBAAA,CAAAhF,IAAA,CAAAiC,OAAO,EAAkBsC,iBAAQ,CAACU,kBAAkB,EAAE,IAAIC,KAAK,CAACT,QAAQ,CAACU,YAAY,CAAC,CAAC;QACvF,OAAO,IAAI;MACb;MAEA,MAAM;QAAE3C,QAAQ,EAAEc,IAAI;QAAE8B,QAAQ,EAAEC,IAAI;QAAE9B,IAAI;QAAE+B;MAAI,CAAC,GAAG,EAAApB,gBAAA,GAAAO,QAAQ,CAACc,MAAM,cAAArB,gBAAA,uBAAfA,gBAAA,CAAkB,CAAC,CAAC,KAAI,CAAC,CAAC;MAChF,OAAO,IAAAsB,sBAAa,EAAC;QAAEF,GAAG;QAAED,IAAI;QAAE/B,IAAI;QAAEC;MAAK,CAAC,CAAC;IACjD;IACA,MAAMkC,gBAAgBA,CAACxD,OAAiC,EAAwC;MAC9F;AACN;AACA;AACA;MACM,MAAMyD,cAAc,GAAG,CAAAzD,OAAO,aAAPA,OAAO,uBAAPA,OAAO,CAAEyD,cAAc,KAAI,CAAC;MACnD,MAAMvB,aAAa,GAAG,MAAM,IAAI,CAACJ,yBAAyB,EAAE;MAC5D,IAAI,CAACI,aAAa,EAAE;QAClB,MAAMC,OAAO,GAAG,MAAM,IAAI,CAACJ,6BAA6B,EAAE;QAC1D,IAAI,CAACI,OAAO,EAAE;UAAA,IAAAuB,sBAAA;UACZ1D,OAAO,aAAPA,OAAO,wBAAA0D,sBAAA,GAAP1D,OAAO,CAAEqC,aAAa,cAAAqB,sBAAA,uBAAtBA,sBAAA,CAAA3F,IAAA,CAAAiC,OAAO,EAAkBsC,iBAAQ,CAACC,kBAAkB,CAAC;UACrD,OAAO,IAAI;QACb;MACF;MAEA,MAAMC,QAAQ,GAAG,MAAMxD,iBAAiB,CAAC2E,kBAAkB,CAAC;QAC1DjB,iBAAiB,EAAE,YAAY;QAC/Be,cAAc;QACdb,SAAS,EAAE,CAAC,MAAM;UAChB,QAAQ5C,OAAO,aAAPA,OAAO,uBAAPA,OAAO,CAAE4C,SAAS;YACxB,KAAK,OAAO;cACV,OAAO,OAAO;YAChB,KAAK,OAAO;cACV,OAAO,OAAO;YAChB,KAAK,KAAK;cACR,OAAO,OAAO;YAChB;cACE,OAAO,OAAO;UAAC;QAErB,CAAC;MACH,CAAC,CAAC;MACF,IAAIJ,QAAQ,CAACK,SAAS,EAAE,OAAO,IAAI;MACnC,IAAIL,QAAQ,CAACM,SAAS,KAAK,oBAAoB,EAAE;QAAA,IAAAc,sBAAA;QAC/C5D,OAAO,aAAPA,OAAO,wBAAA4D,sBAAA,GAAP5D,OAAO,CAAEqC,aAAa,cAAAuB,sBAAA,uBAAtBA,sBAAA,CAAA7F,IAAA,CAAAiC,OAAO,EAAkBsC,iBAAQ,CAACU,kBAAkB,EAAE,IAAIC,KAAK,CAACT,QAAQ,CAACU,YAAY,CAAC,CAAC;QACvF,OAAO,IAAI;MACb;MAEA,OAAOW,OAAO,CAACC,GAAG,CAChB,CAACtB,QAAQ,CAACc,MAAM,IAAI,EAAE,EACnBS,KAAK,CAAC,CAAC,EAAEN,cAAc,CAAC,CACxBO,GAAG,CAACC,KAAA;QAAA,IAAC;UAAE1D,QAAQ,EAAEc,IAAI;UAAE8B,QAAQ,EAAEC,IAAI;UAAE9B,IAAI;UAAE+B;QAAI,CAAC,GAAAY,KAAA;QAAA,OAAK,IAAAV,sBAAa,EAAC;UAAEF,GAAG;UAAED,IAAI;UAAE/B,IAAI;UAAEC;QAAK,CAAC,CAAC;MAAA,EAAC,CACpG;IACH;IACA,MAAM4C,YAAYA,CAAClE,OAA6B,EAA+B;MAC7E,IAAI;QACF,MAAM;UAAEqD,GAAG;UAAED,IAAI;UAAE/B,IAAI;UAAEC;QAAK,CAAC,GAAG,MAAMrC,oBAAoB,CAACkF,UAAU,EAAE;QACzE,OAAO,IAAAZ,sBAAa,EAAC;UAAEF,GAAG;UAAED,IAAI;UAAE/B,IAAI;UAAEC;QAAK,CAAC,CAAC;MACjD,CAAC,CAAC,OAAO8C,CAAC,EAAE;QACV,IAAI,CAACnF,oBAAoB,CAACoF,QAAQ,CAACD,CAAC,CAAC,IAAInF,oBAAoB,CAACqF,YAAY,CAACF,CAAC,CAAC,EAAE;UAAA,IAAAG,sBAAA;UAC7EvE,OAAO,aAAPA,OAAO,wBAAAuE,sBAAA,GAAPvE,OAAO,CAAEqC,aAAa,cAAAkC,sBAAA,uBAAtBA,sBAAA,CAAAxG,IAAA,CAAAiC,OAAO,EAAkBsC,iBAAQ,CAACkC,OAAO,EAAEJ,CAAC,CAAC;QAC/C;QACA,OAAO,IAAI;MACb;IACF;IACA,MAAMK,IAAIA,CAACzE,OAAoB,EAAmB;MAChD,MAAMkC,aAAa,GAAG,MAAM,IAAI,CAACJ,yBAAyB,EAAE;MAC5D,IAAI,CAACI,aAAa,EAAE;QAClB,MAAMC,OAAO,GAAG,MAAM,IAAI,CAACJ,6BAA6B,EAAE;QAC1D,IAAI,CAACI,OAAO,EAAE,MAAM,IAAIc,KAAK,CAAC,wBAAwB,CAAC;MACzD;MAEA,MAAM;QAAE9B,cAAc;QAAEC;MAAK,CAAC,GAAG,MAAM,IAAI,CAACsD,YAAY,CAAC1E,OAAO,CAAC;MAEjE,IAAI5B,qBAAQ,CAACC,EAAE,KAAK,KAAK,EAAE;QACzB,IAAI+C,IAAI,CAACE,IAAI,KAAK,OAAO,IAAIF,IAAI,CAACE,IAAI,KAAK,OAAO,EAAE;UAClD,MAAMqD,YAAY,GAAG;YAAE,OAAO,EAAE,OAAO;YAAE,OAAO,EAAE;UAAQ,CAAU;UACpE,MAAM/B,SAAS,GAAG+B,YAAY,CAACvD,IAAI,CAACE,IAAI,CAAC;UACzC,MAAMpC,kBAAkB,CAACuF,IAAI,CAACtD,cAAc,EAAE;YAAEG,IAAI,EAAEsB;UAAU,CAAC,CAAC;QACpE;MACF;MAEA,IAAIxE,qBAAQ,CAACC,EAAE,KAAK,SAAS,EAAE;QAC7B,MAAMuG,cAAc,GAAG;UAAE,MAAM,EAAE,WAAW;UAAE,OAAO,EAAE,OAAO;UAAE,OAAO,EAAE,QAAQ;UAAE,OAAO,EAAE;QAAQ,CAAU;QAC9G,MAAMC,WAAW,GAAGD,cAAc,CAACxD,IAAI,CAACE,IAAI,CAAC;QAC7C,MAAMnC,QAAQ,CAAC8B,UAAU,CAAC6D,UAAU,CAAC3D,cAAc,EAAEC,IAAI,CAACC,IAAI,EAAEwD,WAAW,CAAC,CAACE,KAAK,CAAC,MAAM;UACvFC,kBAAM,CAACC,KAAK,CAAC,uFAAuF,CAAC;UACrG,OAAO9F,QAAQ,CAAC8B,UAAU,CAAC6D,UAAU,CAAC3D,cAAc,EAAEC,IAAI,CAACC,IAAI,EAAE,WAAW,CAAC;QAC/E,CAAC,CAAC;MACJ;MAEA,OAAOF,cAAc;IACvB;IA4BA+D,oBAAoBA,CAAA,EAAmE;MAAA,IAAlEC,eAAe,GAAAC,SAAA,CAAAC,MAAA,QAAAD,SAAA,QAAAvH,SAAA,GAAAuH,SAAA,MAAG,KAAK;MAC1C,MAAM9E,QAAQ,GAAI,UAASgF,IAAI,CAACC,GAAG,EAAG,IAAGJ,eAAgB,EAAC;MAC1D,MAAMpE,IAAI,GAAI,GAAE5B,QAAQ,CAACe,IAAI,CAACC,QAAS,IAAGG,QAAS,EAAC;MACpD,OAAOlC,qBAAQ,CAACiB,MAAM,CAAC;QACrBC,GAAG,EAAE;UACH+D,GAAG,EAAEtC,IAAI;UACTyE,cAAc,EAAElF;QAClB,CAAC;QACDZ,OAAO,EAAE;UACP2D,GAAG,EAAEtC,IAAI,CAAC0E,UAAU,CAAC,SAAS,CAAC,GAAG1E,IAAI,GAAG,SAAS,GAAGA,IAAI;UACzDyE,cAAc,EAAEzE;QAClB,CAAC;QACDpE,OAAO,EAAE;UACP0G,GAAG,EAAEtC,IAAI;UACTyE,cAAc,EAAEzE;QAClB;MACF,CAAC,CAAC;IACJ;EACF;EAEA,OAAO,IAAIjB,iBAAiB,EAAE;AAChC,CAAC;AAAC,IAAA4F,QAAA,GAEa5G,uBAAuB;AAAA6G,OAAA,CAAAhJ,OAAA,GAAA+I,QAAA"}
|
|
1
|
+
{"version":3,"names":["_reactNative","require","_uikitUtils","_SBUError","_interopRequireDefault","_nativePermissionGranted","_normalizeFile","obj","__esModule","default","_defineProperty","key","value","_toPropertyKey","Object","defineProperty","enumerable","configurable","writable","arg","_toPrimitive","String","input","hint","prim","Symbol","toPrimitive","undefined","res","call","TypeError","Number","getAndroidStoragePermissionsByAPILevel","permissionModule","Platform","OS","Version","PERMISSIONS","ANDROID","READ_EXTERNAL_STORAGE","WRITE_EXTERNAL_STORAGE","createNativeFileService","_ref","imagePickerModule","documentPickerModule","mediaLibraryModule","fsModule","cameraPermissions","select","ios","IOS","CAMERA","MICROPHONE","android","mediaLibraryPermissions","PHOTO_LIBRARY","PHOTO_LIBRARY_ADD_ONLY","NativeFileService","constructor","options","dirname","Dirs","CacheDir","DocumentDir","context","filename","fileName","extension","getFileExtension","getFileExtensionFromMime","fileType","fileUrl","getFileExtensionFromUri","normalizeFileName","path","buildDownloadPath","FileSystem","fetch","downloadedPath","file","name","type","getFileType","hasCameraPermission","status","checkMultiple","nativePermissionGranted","requestCameraPermission","requestMultiple","hasMediaLibraryPermission","requestMediaLibraryPermission","openCamera","_response$assets","hasPermission","granted","_options$onOpenFailur","onOpenFailure","SBUError","PERMISSIONS_DENIED","response","launchCamera","presentationStyle","cameraType","mediaType","didCancel","errorCode","_options$onOpenFailur2","DEVICE_UNAVAILABLE","Error","errorMessage","fileSize","size","uri","assets","normalizeFile","openMediaLibrary","selectionLimit","_options$onOpenFailur3","launchImageLibrary","_options$onOpenFailur4","Promise","all","slice","map","_ref2","openDocument","pickSingle","e","isCancel","isInProgress","_options$onOpenFailur5","UNKNOWN","save","downloadFile","mediaTypeMap","externalDirMap","externalDir","cpExternal","catch","Logger","error","createRecordFilePath","customExtension","arguments","length","Date","now","recordFilePath","startsWith","_default","exports"],"sources":["createFileService.native.ts"],"sourcesContent":["import type { CameraRoll } from '@react-native-camera-roll/camera-roll';\nimport { Platform } from 'react-native';\nimport type * as DocumentPicker from 'react-native-document-picker';\nimport type * as FileAccess from 'react-native-file-access';\nimport type * as ImagePicker from 'react-native-image-picker';\nimport type * as Permissions from 'react-native-permissions';\nimport type { Permission } from 'react-native-permissions';\n\nimport {\n Logger,\n getFileExtension,\n getFileExtensionFromMime,\n getFileExtensionFromUri,\n getFileType,\n normalizeFileName,\n} from '@sendbird/uikit-utils';\n\nimport SBUError from '../libs/SBUError';\nimport nativePermissionGranted from '../utils/nativePermissionGranted';\nimport normalizeFile from '../utils/normalizeFile';\nimport type {\n FilePickerResponse,\n FileServiceInterface,\n OpenCameraOptions,\n OpenDocumentOptions,\n OpenMediaLibraryOptions,\n SaveOptions,\n} from './types';\n\nfunction getAndroidStoragePermissionsByAPILevel(permissionModule: typeof Permissions): Permission[] {\n if (Platform.OS !== 'android') return [];\n\n if (Platform.Version > 32) {\n return [];\n }\n\n if (Platform.Version > 28) {\n return [permissionModule.PERMISSIONS.ANDROID.READ_EXTERNAL_STORAGE];\n }\n\n return [\n permissionModule.PERMISSIONS.ANDROID.WRITE_EXTERNAL_STORAGE,\n permissionModule.PERMISSIONS.ANDROID.READ_EXTERNAL_STORAGE,\n ];\n}\n\nconst createNativeFileService = ({\n imagePickerModule,\n documentPickerModule,\n permissionModule,\n mediaLibraryModule,\n fsModule,\n}: {\n imagePickerModule: typeof ImagePicker;\n documentPickerModule: typeof DocumentPicker;\n permissionModule: typeof Permissions;\n mediaLibraryModule: typeof CameraRoll;\n fsModule: typeof FileAccess;\n}): FileServiceInterface => {\n const cameraPermissions: Permission[] = Platform.select({\n ios: [permissionModule.PERMISSIONS.IOS.CAMERA, permissionModule.PERMISSIONS.IOS.MICROPHONE],\n android: [],\n default: [],\n });\n const mediaLibraryPermissions: Permission[] = Platform.select({\n ios: [permissionModule.PERMISSIONS.IOS.PHOTO_LIBRARY, permissionModule.PERMISSIONS.IOS.PHOTO_LIBRARY_ADD_ONLY],\n android: getAndroidStoragePermissionsByAPILevel(permissionModule),\n default: [],\n });\n\n class NativeFileService implements FileServiceInterface {\n async hasCameraPermission(): Promise<boolean> {\n const status = await permissionModule.checkMultiple(cameraPermissions);\n return nativePermissionGranted(status);\n }\n async requestCameraPermission(): Promise<boolean> {\n const status = await permissionModule.requestMultiple(cameraPermissions);\n return nativePermissionGranted(status);\n }\n async hasMediaLibraryPermission(): Promise<boolean> {\n const status = await permissionModule.checkMultiple(mediaLibraryPermissions);\n return nativePermissionGranted(status);\n }\n async requestMediaLibraryPermission(): Promise<boolean> {\n const status = await permissionModule.requestMultiple(mediaLibraryPermissions);\n return nativePermissionGranted(status);\n }\n\n async openCamera(options?: OpenCameraOptions): Promise<FilePickerResponse> {\n const hasPermission = await this.hasCameraPermission();\n if (!hasPermission) {\n const granted = await this.requestCameraPermission();\n if (!granted) {\n options?.onOpenFailure?.(SBUError.PERMISSIONS_DENIED);\n return null;\n }\n }\n\n const response = await imagePickerModule.launchCamera({\n presentationStyle: 'fullScreen',\n cameraType: options?.cameraType ?? 'back',\n mediaType: (() => {\n switch (options?.mediaType) {\n case 'photo':\n return 'photo';\n case 'video':\n return 'video';\n case 'all':\n return 'mixed';\n default:\n return 'photo';\n }\n })(),\n });\n if (response.didCancel) return null;\n if (response.errorCode === 'camera_unavailable') {\n options?.onOpenFailure?.(SBUError.DEVICE_UNAVAILABLE, new Error(response.errorMessage));\n return null;\n }\n\n const { fileName: name, fileSize: size, type, uri } = response.assets?.[0] ?? {};\n return normalizeFile({ uri, size, name, type });\n }\n async openMediaLibrary(options?: OpenMediaLibraryOptions): Promise<FilePickerResponse[] | null> {\n /**\n * NOTE: options.selectionLimit {@link https://github.com/react-native-image-picker/react-native-image-picker#options}\n * We do not support 0 (any number of files)\n **/\n const selectionLimit = options?.selectionLimit || 1;\n const hasPermission = await this.hasMediaLibraryPermission();\n if (!hasPermission) {\n const granted = await this.requestMediaLibraryPermission();\n if (!granted) {\n options?.onOpenFailure?.(SBUError.PERMISSIONS_DENIED);\n return null;\n }\n }\n\n const response = await imagePickerModule.launchImageLibrary({\n presentationStyle: 'fullScreen',\n selectionLimit,\n mediaType: (() => {\n switch (options?.mediaType) {\n case 'photo':\n return 'photo';\n case 'video':\n return 'video';\n case 'all':\n return 'mixed';\n default:\n return 'photo';\n }\n })(),\n });\n if (response.didCancel) return null;\n if (response.errorCode === 'camera_unavailable') {\n options?.onOpenFailure?.(SBUError.DEVICE_UNAVAILABLE, new Error(response.errorMessage));\n return null;\n }\n\n return Promise.all(\n (response.assets || [])\n .slice(0, selectionLimit)\n .map(({ fileName: name, fileSize: size, type, uri }) => normalizeFile({ uri, size, name, type })),\n );\n }\n async openDocument(options?: OpenDocumentOptions): Promise<FilePickerResponse> {\n try {\n const { uri, size, name, type } = await documentPickerModule.pickSingle();\n return normalizeFile({ uri, size, name, type });\n } catch (e) {\n if (!documentPickerModule.isCancel(e) && documentPickerModule.isInProgress(e)) {\n options?.onOpenFailure?.(SBUError.UNKNOWN, e);\n }\n return null;\n }\n }\n async save(options: SaveOptions): Promise<string> {\n const hasPermission = await this.hasMediaLibraryPermission();\n if (!hasPermission) {\n const granted = await this.requestMediaLibraryPermission();\n if (!granted) throw new Error('Permission not granted');\n }\n\n const { downloadedPath, file } = await this.downloadFile(options);\n\n if (Platform.OS === 'ios') {\n if (file.type === 'image' || file.type === 'video') {\n const mediaTypeMap = { 'image': 'photo', 'video': 'video' } as const;\n const mediaType = mediaTypeMap[file.type];\n await mediaLibraryModule.save(downloadedPath, { type: mediaType });\n }\n }\n\n if (Platform.OS === 'android') {\n const externalDirMap = { 'file': 'downloads', 'audio': 'audio', 'image': 'images', 'video': 'video' } as const;\n const externalDir = externalDirMap[file.type];\n await fsModule.FileSystem.cpExternal(downloadedPath, file.name, externalDir).catch(() => {\n Logger.error('Failed to save file to external storage. Retry saving to downloads directory instead.');\n return fsModule.FileSystem.cpExternal(downloadedPath, file.name, 'downloads');\n });\n }\n\n return downloadedPath;\n }\n\n private buildDownloadPath = async (options: SaveOptions) => {\n const dirname = Platform.select({ android: fsModule.Dirs.CacheDir, default: fsModule.Dirs.DocumentDir });\n const context = { dirname, filename: options.fileName };\n const extension =\n getFileExtension(options.fileName) ||\n getFileExtensionFromMime(options.fileType) ||\n getFileExtension(options.fileUrl) ||\n (await getFileExtensionFromUri(options.fileUrl));\n\n if (extension) context.filename = normalizeFileName(context.filename, extension);\n\n return { path: `${context.dirname}/${context.filename}`, ...context };\n };\n\n private downloadFile = async (options: SaveOptions) => {\n const { path, filename } = await this.buildDownloadPath(options);\n await fsModule.FileSystem.fetch(options.fileUrl, { path });\n return {\n downloadedPath: path,\n file: {\n name: filename,\n type: getFileType(getFileExtension(path)),\n } as const,\n };\n };\n\n createRecordFilePath(customExtension = 'm4a'): { recordFilePath: string; uri: string } {\n const filename = `record-${Date.now()}.${customExtension}`;\n const path = `${fsModule.Dirs.CacheDir}/${filename}`;\n return Platform.select({\n ios: {\n uri: path,\n recordFilePath: filename,\n },\n android: {\n uri: path.startsWith('file://') ? path : 'file://' + path,\n recordFilePath: path,\n },\n default: {\n uri: path,\n recordFilePath: path,\n },\n });\n }\n }\n\n return new NativeFileService();\n};\n\nexport default createNativeFileService;\n"],"mappings":";;;;;;AACA,IAAAA,YAAA,GAAAC,OAAA;AAOA,IAAAC,WAAA,GAAAD,OAAA;AASA,IAAAE,SAAA,GAAAC,sBAAA,CAAAH,OAAA;AACA,IAAAI,wBAAA,GAAAD,sBAAA,CAAAH,OAAA;AACA,IAAAK,cAAA,GAAAF,sBAAA,CAAAH,OAAA;AAAmD,SAAAG,uBAAAG,GAAA,WAAAA,GAAA,IAAAA,GAAA,CAAAC,UAAA,GAAAD,GAAA,KAAAE,OAAA,EAAAF,GAAA;AAAA,SAAAG,gBAAAH,GAAA,EAAAI,GAAA,EAAAC,KAAA,IAAAD,GAAA,GAAAE,cAAA,CAAAF,GAAA,OAAAA,GAAA,IAAAJ,GAAA,IAAAO,MAAA,CAAAC,cAAA,CAAAR,GAAA,EAAAI,GAAA,IAAAC,KAAA,EAAAA,KAAA,EAAAI,UAAA,QAAAC,YAAA,QAAAC,QAAA,oBAAAX,GAAA,CAAAI,GAAA,IAAAC,KAAA,WAAAL,GAAA;AAAA,SAAAM,eAAAM,GAAA,QAAAR,GAAA,GAAAS,YAAA,CAAAD,GAAA,2BAAAR,GAAA,gBAAAA,GAAA,GAAAU,MAAA,CAAAV,GAAA;AAAA,SAAAS,aAAAE,KAAA,EAAAC,IAAA,eAAAD,KAAA,iBAAAA,KAAA,kBAAAA,KAAA,MAAAE,IAAA,GAAAF,KAAA,CAAAG,MAAA,CAAAC,WAAA,OAAAF,IAAA,KAAAG,SAAA,QAAAC,GAAA,GAAAJ,IAAA,CAAAK,IAAA,CAAAP,KAAA,EAAAC,IAAA,2BAAAK,GAAA,sBAAAA,GAAA,YAAAE,SAAA,4DAAAP,IAAA,gBAAAF,MAAA,GAAAU,MAAA,EAAAT,KAAA;AAUnD,SAASU,sCAAsCA,CAACC,gBAAoC,EAAgB;EAClG,IAAIC,qBAAQ,CAACC,EAAE,KAAK,SAAS,EAAE,OAAO,EAAE;EAExC,IAAID,qBAAQ,CAACE,OAAO,GAAG,EAAE,EAAE;IACzB,OAAO,EAAE;EACX;EAEA,IAAIF,qBAAQ,CAACE,OAAO,GAAG,EAAE,EAAE;IACzB,OAAO,CAACH,gBAAgB,CAACI,WAAW,CAACC,OAAO,CAACC,qBAAqB,CAAC;EACrE;EAEA,OAAO,CACLN,gBAAgB,CAACI,WAAW,CAACC,OAAO,CAACE,sBAAsB,EAC3DP,gBAAgB,CAACI,WAAW,CAACC,OAAO,CAACC,qBAAqB,CAC3D;AACH;AAEA,MAAME,uBAAuB,GAAGC,IAAA,IAYJ;EAAA,IAZK;IAC/BC,iBAAiB;IACjBC,oBAAoB;IACpBX,gBAAgB;IAChBY,kBAAkB;IAClBC;EAOF,CAAC,GAAAJ,IAAA;EACC,MAAMK,iBAA+B,GAAGb,qBAAQ,CAACc,MAAM,CAAC;IACtDC,GAAG,EAAE,CAAChB,gBAAgB,CAACI,WAAW,CAACa,GAAG,CAACC,MAAM,EAAElB,gBAAgB,CAACI,WAAW,CAACa,GAAG,CAACE,UAAU,CAAC;IAC3FC,OAAO,EAAE,EAAE;IACX5C,OAAO,EAAE;EACX,CAAC,CAAC;EACF,MAAM6C,uBAAqC,GAAGpB,qBAAQ,CAACc,MAAM,CAAC;IAC5DC,GAAG,EAAE,CAAChB,gBAAgB,CAACI,WAAW,CAACa,GAAG,CAACK,aAAa,EAAEtB,gBAAgB,CAACI,WAAW,CAACa,GAAG,CAACM,sBAAsB,CAAC;IAC9GH,OAAO,EAAErB,sCAAsC,CAACC,gBAAgB,CAAC;IACjExB,OAAO,EAAE;EACX,CAAC,CAAC;EAEF,MAAMgD,iBAAiB,CAAiC;IAAAC,YAAA;MAAAhD,eAAA,4BAwI1B,MAAOiD,OAAoB,IAAK;QAC1D,MAAMC,OAAO,GAAG1B,qBAAQ,CAACc,MAAM,CAAC;UAAEK,OAAO,EAAEP,QAAQ,CAACe,IAAI,CAACC,QAAQ;UAAErD,OAAO,EAAEqC,QAAQ,CAACe,IAAI,CAACE;QAAY,CAAC,CAAC;QACxG,MAAMC,OAAO,GAAG;UAAEJ,OAAO;UAAEK,QAAQ,EAAEN,OAAO,CAACO;QAAS,CAAC;QACvD,MAAMC,SAAS,GACb,IAAAC,4BAAgB,EAACT,OAAO,CAACO,QAAQ,CAAC,IAClC,IAAAG,oCAAwB,EAACV,OAAO,CAACW,QAAQ,CAAC,IAC1C,IAAAF,4BAAgB,EAACT,OAAO,CAACY,OAAO,CAAC,KAChC,MAAM,IAAAC,mCAAuB,EAACb,OAAO,CAACY,OAAO,CAAC,CAAC;QAElD,IAAIJ,SAAS,EAAEH,OAAO,CAACC,QAAQ,GAAG,IAAAQ,6BAAiB,EAACT,OAAO,CAACC,QAAQ,EAAEE,SAAS,CAAC;QAEhF,OAAO;UAAEO,IAAI,EAAG,GAAEV,OAAO,CAACJ,OAAQ,IAAGI,OAAO,CAACC,QAAS,EAAC;UAAE,GAAGD;QAAQ,CAAC;MACvE,CAAC;MAAAtD,eAAA,uBAEsB,MAAOiD,OAAoB,IAAK;QACrD,MAAM;UAAEe,IAAI;UAAET;QAAS,CAAC,GAAG,MAAM,IAAI,CAACU,iBAAiB,CAAChB,OAAO,CAAC;QAChE,MAAMb,QAAQ,CAAC8B,UAAU,CAACC,KAAK,CAAClB,OAAO,CAACY,OAAO,EAAE;UAAEG;QAAK,CAAC,CAAC;QAC1D,OAAO;UACLI,cAAc,EAAEJ,IAAI;UACpBK,IAAI,EAAE;YACJC,IAAI,EAAEf,QAAQ;YACdgB,IAAI,EAAE,IAAAC,uBAAW,EAAC,IAAAd,4BAAgB,EAACM,IAAI,CAAC;UAC1C;QACF,CAAC;MACH,CAAC;IAAA;IA/JD,MAAMS,mBAAmBA,CAAA,EAAqB;MAC5C,MAAMC,MAAM,GAAG,MAAMnD,gBAAgB,CAACoD,aAAa,CAACtC,iBAAiB,CAAC;MACtE,OAAO,IAAAuC,gCAAuB,EAACF,MAAM,CAAC;IACxC;IACA,MAAMG,uBAAuBA,CAAA,EAAqB;MAChD,MAAMH,MAAM,GAAG,MAAMnD,gBAAgB,CAACuD,eAAe,CAACzC,iBAAiB,CAAC;MACxE,OAAO,IAAAuC,gCAAuB,EAACF,MAAM,CAAC;IACxC;IACA,MAAMK,yBAAyBA,CAAA,EAAqB;MAClD,MAAML,MAAM,GAAG,MAAMnD,gBAAgB,CAACoD,aAAa,CAAC/B,uBAAuB,CAAC;MAC5E,OAAO,IAAAgC,gCAAuB,EAACF,MAAM,CAAC;IACxC;IACA,MAAMM,6BAA6BA,CAAA,EAAqB;MACtD,MAAMN,MAAM,GAAG,MAAMnD,gBAAgB,CAACuD,eAAe,CAAClC,uBAAuB,CAAC;MAC9E,OAAO,IAAAgC,gCAAuB,EAACF,MAAM,CAAC;IACxC;IAEA,MAAMO,UAAUA,CAAChC,OAA2B,EAA+B;MAAA,IAAAiC,gBAAA;MACzE,MAAMC,aAAa,GAAG,MAAM,IAAI,CAACV,mBAAmB,EAAE;MACtD,IAAI,CAACU,aAAa,EAAE;QAClB,MAAMC,OAAO,GAAG,MAAM,IAAI,CAACP,uBAAuB,EAAE;QACpD,IAAI,CAACO,OAAO,EAAE;UAAA,IAAAC,qBAAA;UACZpC,OAAO,aAAPA,OAAO,wBAAAoC,qBAAA,GAAPpC,OAAO,CAAEqC,aAAa,cAAAD,qBAAA,uBAAtBA,qBAAA,CAAAlE,IAAA,CAAA8B,OAAO,EAAkBsC,iBAAQ,CAACC,kBAAkB,CAAC;UACrD,OAAO,IAAI;QACb;MACF;MAEA,MAAMC,QAAQ,GAAG,MAAMxD,iBAAiB,CAACyD,YAAY,CAAC;QACpDC,iBAAiB,EAAE,YAAY;QAC/BC,UAAU,EAAE,CAAA3C,OAAO,aAAPA,OAAO,uBAAPA,OAAO,CAAE2C,UAAU,KAAI,MAAM;QACzCC,SAAS,EAAE,CAAC,MAAM;UAChB,QAAQ5C,OAAO,aAAPA,OAAO,uBAAPA,OAAO,CAAE4C,SAAS;YACxB,KAAK,OAAO;cACV,OAAO,OAAO;YAChB,KAAK,OAAO;cACV,OAAO,OAAO;YAChB,KAAK,KAAK;cACR,OAAO,OAAO;YAChB;cACE,OAAO,OAAO;UAAC;QAErB,CAAC;MACH,CAAC,CAAC;MACF,IAAIJ,QAAQ,CAACK,SAAS,EAAE,OAAO,IAAI;MACnC,IAAIL,QAAQ,CAACM,SAAS,KAAK,oBAAoB,EAAE;QAAA,IAAAC,sBAAA;QAC/C/C,OAAO,aAAPA,OAAO,wBAAA+C,sBAAA,GAAP/C,OAAO,CAAEqC,aAAa,cAAAU,sBAAA,uBAAtBA,sBAAA,CAAA7E,IAAA,CAAA8B,OAAO,EAAkBsC,iBAAQ,CAACU,kBAAkB,EAAE,IAAIC,KAAK,CAACT,QAAQ,CAACU,YAAY,CAAC,CAAC;QACvF,OAAO,IAAI;MACb;MAEA,MAAM;QAAE3C,QAAQ,EAAEc,IAAI;QAAE8B,QAAQ,EAAEC,IAAI;QAAE9B,IAAI;QAAE+B;MAAI,CAAC,GAAG,EAAApB,gBAAA,GAAAO,QAAQ,CAACc,MAAM,cAAArB,gBAAA,uBAAfA,gBAAA,CAAkB,CAAC,CAAC,KAAI,CAAC,CAAC;MAChF,OAAO,IAAAsB,sBAAa,EAAC;QAAEF,GAAG;QAAED,IAAI;QAAE/B,IAAI;QAAEC;MAAK,CAAC,CAAC;IACjD;IACA,MAAMkC,gBAAgBA,CAACxD,OAAiC,EAAwC;MAC9F;AACN;AACA;AACA;MACM,MAAMyD,cAAc,GAAG,CAAAzD,OAAO,aAAPA,OAAO,uBAAPA,OAAO,CAAEyD,cAAc,KAAI,CAAC;MACnD,MAAMvB,aAAa,GAAG,MAAM,IAAI,CAACJ,yBAAyB,EAAE;MAC5D,IAAI,CAACI,aAAa,EAAE;QAClB,MAAMC,OAAO,GAAG,MAAM,IAAI,CAACJ,6BAA6B,EAAE;QAC1D,IAAI,CAACI,OAAO,EAAE;UAAA,IAAAuB,sBAAA;UACZ1D,OAAO,aAAPA,OAAO,wBAAA0D,sBAAA,GAAP1D,OAAO,CAAEqC,aAAa,cAAAqB,sBAAA,uBAAtBA,sBAAA,CAAAxF,IAAA,CAAA8B,OAAO,EAAkBsC,iBAAQ,CAACC,kBAAkB,CAAC;UACrD,OAAO,IAAI;QACb;MACF;MAEA,MAAMC,QAAQ,GAAG,MAAMxD,iBAAiB,CAAC2E,kBAAkB,CAAC;QAC1DjB,iBAAiB,EAAE,YAAY;QAC/Be,cAAc;QACdb,SAAS,EAAE,CAAC,MAAM;UAChB,QAAQ5C,OAAO,aAAPA,OAAO,uBAAPA,OAAO,CAAE4C,SAAS;YACxB,KAAK,OAAO;cACV,OAAO,OAAO;YAChB,KAAK,OAAO;cACV,OAAO,OAAO;YAChB,KAAK,KAAK;cACR,OAAO,OAAO;YAChB;cACE,OAAO,OAAO;UAAC;QAErB,CAAC;MACH,CAAC,CAAC;MACF,IAAIJ,QAAQ,CAACK,SAAS,EAAE,OAAO,IAAI;MACnC,IAAIL,QAAQ,CAACM,SAAS,KAAK,oBAAoB,EAAE;QAAA,IAAAc,sBAAA;QAC/C5D,OAAO,aAAPA,OAAO,wBAAA4D,sBAAA,GAAP5D,OAAO,CAAEqC,aAAa,cAAAuB,sBAAA,uBAAtBA,sBAAA,CAAA1F,IAAA,CAAA8B,OAAO,EAAkBsC,iBAAQ,CAACU,kBAAkB,EAAE,IAAIC,KAAK,CAACT,QAAQ,CAACU,YAAY,CAAC,CAAC;QACvF,OAAO,IAAI;MACb;MAEA,OAAOW,OAAO,CAACC,GAAG,CAChB,CAACtB,QAAQ,CAACc,MAAM,IAAI,EAAE,EACnBS,KAAK,CAAC,CAAC,EAAEN,cAAc,CAAC,CACxBO,GAAG,CAACC,KAAA;QAAA,IAAC;UAAE1D,QAAQ,EAAEc,IAAI;UAAE8B,QAAQ,EAAEC,IAAI;UAAE9B,IAAI;UAAE+B;QAAI,CAAC,GAAAY,KAAA;QAAA,OAAK,IAAAV,sBAAa,EAAC;UAAEF,GAAG;UAAED,IAAI;UAAE/B,IAAI;UAAEC;QAAK,CAAC,CAAC;MAAA,EAAC,CACpG;IACH;IACA,MAAM4C,YAAYA,CAAClE,OAA6B,EAA+B;MAC7E,IAAI;QACF,MAAM;UAAEqD,GAAG;UAAED,IAAI;UAAE/B,IAAI;UAAEC;QAAK,CAAC,GAAG,MAAMrC,oBAAoB,CAACkF,UAAU,EAAE;QACzE,OAAO,IAAAZ,sBAAa,EAAC;UAAEF,GAAG;UAAED,IAAI;UAAE/B,IAAI;UAAEC;QAAK,CAAC,CAAC;MACjD,CAAC,CAAC,OAAO8C,CAAC,EAAE;QACV,IAAI,CAACnF,oBAAoB,CAACoF,QAAQ,CAACD,CAAC,CAAC,IAAInF,oBAAoB,CAACqF,YAAY,CAACF,CAAC,CAAC,EAAE;UAAA,IAAAG,sBAAA;UAC7EvE,OAAO,aAAPA,OAAO,wBAAAuE,sBAAA,GAAPvE,OAAO,CAAEqC,aAAa,cAAAkC,sBAAA,uBAAtBA,sBAAA,CAAArG,IAAA,CAAA8B,OAAO,EAAkBsC,iBAAQ,CAACkC,OAAO,EAAEJ,CAAC,CAAC;QAC/C;QACA,OAAO,IAAI;MACb;IACF;IACA,MAAMK,IAAIA,CAACzE,OAAoB,EAAmB;MAChD,MAAMkC,aAAa,GAAG,MAAM,IAAI,CAACJ,yBAAyB,EAAE;MAC5D,IAAI,CAACI,aAAa,EAAE;QAClB,MAAMC,OAAO,GAAG,MAAM,IAAI,CAACJ,6BAA6B,EAAE;QAC1D,IAAI,CAACI,OAAO,EAAE,MAAM,IAAIc,KAAK,CAAC,wBAAwB,CAAC;MACzD;MAEA,MAAM;QAAE9B,cAAc;QAAEC;MAAK,CAAC,GAAG,MAAM,IAAI,CAACsD,YAAY,CAAC1E,OAAO,CAAC;MAEjE,IAAIzB,qBAAQ,CAACC,EAAE,KAAK,KAAK,EAAE;QACzB,IAAI4C,IAAI,CAACE,IAAI,KAAK,OAAO,IAAIF,IAAI,CAACE,IAAI,KAAK,OAAO,EAAE;UAClD,MAAMqD,YAAY,GAAG;YAAE,OAAO,EAAE,OAAO;YAAE,OAAO,EAAE;UAAQ,CAAU;UACpE,MAAM/B,SAAS,GAAG+B,YAAY,CAACvD,IAAI,CAACE,IAAI,CAAC;UACzC,MAAMpC,kBAAkB,CAACuF,IAAI,CAACtD,cAAc,EAAE;YAAEG,IAAI,EAAEsB;UAAU,CAAC,CAAC;QACpE;MACF;MAEA,IAAIrE,qBAAQ,CAACC,EAAE,KAAK,SAAS,EAAE;QAC7B,MAAMoG,cAAc,GAAG;UAAE,MAAM,EAAE,WAAW;UAAE,OAAO,EAAE,OAAO;UAAE,OAAO,EAAE,QAAQ;UAAE,OAAO,EAAE;QAAQ,CAAU;QAC9G,MAAMC,WAAW,GAAGD,cAAc,CAACxD,IAAI,CAACE,IAAI,CAAC;QAC7C,MAAMnC,QAAQ,CAAC8B,UAAU,CAAC6D,UAAU,CAAC3D,cAAc,EAAEC,IAAI,CAACC,IAAI,EAAEwD,WAAW,CAAC,CAACE,KAAK,CAAC,MAAM;UACvFC,kBAAM,CAACC,KAAK,CAAC,uFAAuF,CAAC;UACrG,OAAO9F,QAAQ,CAAC8B,UAAU,CAAC6D,UAAU,CAAC3D,cAAc,EAAEC,IAAI,CAACC,IAAI,EAAE,WAAW,CAAC;QAC/E,CAAC,CAAC;MACJ;MAEA,OAAOF,cAAc;IACvB;IA4BA+D,oBAAoBA,CAAA,EAAmE;MAAA,IAAlEC,eAAe,GAAAC,SAAA,CAAAC,MAAA,QAAAD,SAAA,QAAApH,SAAA,GAAAoH,SAAA,MAAG,KAAK;MAC1C,MAAM9E,QAAQ,GAAI,UAASgF,IAAI,CAACC,GAAG,EAAG,IAAGJ,eAAgB,EAAC;MAC1D,MAAMpE,IAAI,GAAI,GAAE5B,QAAQ,CAACe,IAAI,CAACC,QAAS,IAAGG,QAAS,EAAC;MACpD,OAAO/B,qBAAQ,CAACc,MAAM,CAAC;QACrBC,GAAG,EAAE;UACH+D,GAAG,EAAEtC,IAAI;UACTyE,cAAc,EAAElF;QAClB,CAAC;QACDZ,OAAO,EAAE;UACP2D,GAAG,EAAEtC,IAAI,CAAC0E,UAAU,CAAC,SAAS,CAAC,GAAG1E,IAAI,GAAG,SAAS,GAAGA,IAAI;UACzDyE,cAAc,EAAEzE;QAClB,CAAC;QACDjE,OAAO,EAAE;UACPuG,GAAG,EAAEtC,IAAI;UACTyE,cAAc,EAAEzE;QAClB;MACF,CAAC,CAAC;IACJ;EACF;EAEA,OAAO,IAAIjB,iBAAiB,EAAE;AAChC,CAAC;AAAC,IAAA4F,QAAA,GAEa5G,uBAAuB;AAAA6G,OAAA,CAAA7I,OAAA,GAAA4I,QAAA"}
|
|
@@ -28,10 +28,16 @@ const createExpoPlayerService = _ref => {
|
|
|
28
28
|
});
|
|
29
29
|
});
|
|
30
30
|
_defineProperty(this, "setListener", () => {
|
|
31
|
-
sound.setProgressUpdateIntervalAsync(100)
|
|
31
|
+
sound.setProgressUpdateIntervalAsync(100).catch(error => {
|
|
32
|
+
_uikitUtils.Logger.warn('[PlayerService.Expo] Failed to set progress update interval', error);
|
|
33
|
+
});
|
|
32
34
|
sound.setOnPlaybackStatusUpdate(status => {
|
|
33
35
|
if (status.isLoaded) {
|
|
34
|
-
if (status.didJustFinish)
|
|
36
|
+
if (status.didJustFinish) {
|
|
37
|
+
this.stop().catch(error => {
|
|
38
|
+
_uikitUtils.Logger.warn('[PlayerService.Expo] Failed to stop in OnPlaybackStatusUpdate', error);
|
|
39
|
+
});
|
|
40
|
+
}
|
|
35
41
|
if (status.isPlaying) {
|
|
36
42
|
this.playbackSubscribers.forEach(callback => {
|
|
37
43
|
callback({
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["_uikitUtils","require","_expoPermissionGranted","_interopRequireDefault","obj","__esModule","default","_defineProperty","key","value","_toPropertyKey","Object","defineProperty","enumerable","configurable","writable","arg","_toPrimitive","String","input","hint","prim","Symbol","toPrimitive","undefined","res","call","TypeError","Number","createExpoPlayerService","_ref","avModule","sound","Audio","Sound","VoicePlayer","constructor","Set","state","stateSubscribers","forEach","callback","setProgressUpdateIntervalAsync","setOnPlaybackStatusUpdate","status","isLoaded","didJustFinish","stop","isPlaying","playbackSubscribers","currentTime","positionMillis","duration","durationMillis","stopped","getPermissionsAsync","expoPermissionGranted","requestPermissionsAsync","add","delete","uri","setState","loadAsync","shouldPlay","matchesOneOf","prepare","setListener","playAsync","e","removeListener","pauseAsync","stopAsync","unloadAsync","clear","time","playFromPositionAsync","_default","exports"],"sources":["createPlayerService.expo.tsx"],"sourcesContent":["import type * as ExpoAV from 'expo-av';\n\nimport { matchesOneOf } from '@sendbird/uikit-utils';\n\nimport expoPermissionGranted from '../utils/expoPermissionGranted';\nimport type { PlayerServiceInterface, Unsubscribe } from './types';\n\ntype Modules = {\n avModule: typeof ExpoAV;\n};\ntype PlaybackListener = Parameters<PlayerServiceInterface['addPlaybackListener']>[number];\ntype StateListener = Parameters<PlayerServiceInterface['addStateListener']>[number];\nconst createExpoPlayerService = ({ avModule }: Modules): PlayerServiceInterface => {\n const sound = new avModule.Audio.Sound();\n\n class VoicePlayer implements PlayerServiceInterface {\n uri?: string;\n state: PlayerServiceInterface['state'] = 'idle';\n\n private readonly playbackSubscribers = new Set<PlaybackListener>();\n private readonly stateSubscribers = new Set<StateListener>();\n\n private setState = (state: PlayerServiceInterface['state']) => {\n this.state = state;\n this.stateSubscribers.forEach((callback) => {\n callback(state);\n });\n };\n\n private setListener = () => {\n sound.setProgressUpdateIntervalAsync(100);\n sound.setOnPlaybackStatusUpdate((status) => {\n if (status.isLoaded) {\n if (status.didJustFinish) this.stop();\n if (status.isPlaying) {\n this.playbackSubscribers.forEach((callback) => {\n callback({\n currentTime: status.positionMillis,\n duration: status.durationMillis ?? 0,\n stopped: status.didJustFinish,\n });\n });\n }\n }\n });\n };\n\n private removeListener = () => {\n sound.setOnPlaybackStatusUpdate(null);\n };\n\n public requestPermission = async (): Promise<boolean> => {\n const status = await avModule.Audio.getPermissionsAsync();\n if (expoPermissionGranted([status])) {\n return true;\n } else {\n const status = await avModule.Audio.requestPermissionsAsync();\n return expoPermissionGranted([status]);\n }\n };\n\n public addPlaybackListener = (callback: PlaybackListener): Unsubscribe => {\n this.playbackSubscribers.add(callback);\n return () => {\n this.playbackSubscribers.delete(callback);\n };\n };\n\n public addStateListener = (callback: (state: PlayerServiceInterface['state']) => void): Unsubscribe => {\n this.stateSubscribers.add(callback);\n return () => {\n this.stateSubscribers.delete(callback);\n };\n };\n\n private prepare = async (uri: string) => {\n this.setState('preparing');\n await sound.loadAsync({ uri }, { shouldPlay: false }, true);\n this.uri = uri;\n };\n\n public play = async (uri: string): Promise<void> => {\n if (matchesOneOf(this.state, ['idle', 'stopped'])) {\n try {\n await this.prepare(uri);\n this.setListener();\n await sound.playAsync();\n this.setState('playing');\n } catch (e) {\n this.setState('idle');\n this.uri = undefined;\n this.removeListener();\n throw e;\n }\n } else if (matchesOneOf(this.state, ['paused']) && this.uri === uri) {\n try {\n this.setListener();\n await sound.playAsync();\n this.setState('playing');\n } catch (e) {\n this.removeListener();\n throw e;\n }\n }\n };\n\n public pause = async (): Promise<void> => {\n if (matchesOneOf(this.state, ['playing'])) {\n await sound.pauseAsync();\n this.removeListener();\n this.setState('paused');\n }\n };\n\n public stop = async (): Promise<void> => {\n if (matchesOneOf(this.state, ['playing', 'paused'])) {\n await sound.stopAsync();\n await sound.unloadAsync();\n this.removeListener();\n this.setState('stopped');\n }\n };\n\n public reset = async (): Promise<void> => {\n await this.stop();\n this.setState('idle');\n this.uri = undefined;\n this.playbackSubscribers.clear();\n this.stateSubscribers.clear();\n };\n\n public seek = async (time: number): Promise<void> => {\n if (matchesOneOf(this.state, ['playing', 'paused'])) {\n await sound.playFromPositionAsync(time);\n }\n };\n }\n\n return new VoicePlayer();\n};\n\nexport default createExpoPlayerService;\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"names":["_uikitUtils","require","_expoPermissionGranted","_interopRequireDefault","obj","__esModule","default","_defineProperty","key","value","_toPropertyKey","Object","defineProperty","enumerable","configurable","writable","arg","_toPrimitive","String","input","hint","prim","Symbol","toPrimitive","undefined","res","call","TypeError","Number","createExpoPlayerService","_ref","avModule","sound","Audio","Sound","VoicePlayer","constructor","Set","state","stateSubscribers","forEach","callback","setProgressUpdateIntervalAsync","catch","error","Logger","warn","setOnPlaybackStatusUpdate","status","isLoaded","didJustFinish","stop","isPlaying","playbackSubscribers","currentTime","positionMillis","duration","durationMillis","stopped","getPermissionsAsync","expoPermissionGranted","requestPermissionsAsync","add","delete","uri","setState","loadAsync","shouldPlay","matchesOneOf","prepare","setListener","playAsync","e","removeListener","pauseAsync","stopAsync","unloadAsync","clear","time","playFromPositionAsync","_default","exports"],"sources":["createPlayerService.expo.tsx"],"sourcesContent":["import type * as ExpoAV from 'expo-av';\n\nimport { Logger, matchesOneOf } from '@sendbird/uikit-utils';\n\nimport expoPermissionGranted from '../utils/expoPermissionGranted';\nimport type { PlayerServiceInterface, Unsubscribe } from './types';\n\ntype Modules = {\n avModule: typeof ExpoAV;\n};\ntype PlaybackListener = Parameters<PlayerServiceInterface['addPlaybackListener']>[number];\ntype StateListener = Parameters<PlayerServiceInterface['addStateListener']>[number];\nconst createExpoPlayerService = ({ avModule }: Modules): PlayerServiceInterface => {\n const sound = new avModule.Audio.Sound();\n\n class VoicePlayer implements PlayerServiceInterface {\n uri?: string;\n state: PlayerServiceInterface['state'] = 'idle';\n\n private readonly playbackSubscribers = new Set<PlaybackListener>();\n private readonly stateSubscribers = new Set<StateListener>();\n\n private setState = (state: PlayerServiceInterface['state']) => {\n this.state = state;\n this.stateSubscribers.forEach((callback) => {\n callback(state);\n });\n };\n\n private setListener = () => {\n sound.setProgressUpdateIntervalAsync(100).catch((error) => {\n Logger.warn('[PlayerService.Expo] Failed to set progress update interval', error);\n });\n sound.setOnPlaybackStatusUpdate((status) => {\n if (status.isLoaded) {\n if (status.didJustFinish) {\n this.stop().catch((error) => {\n Logger.warn('[PlayerService.Expo] Failed to stop in OnPlaybackStatusUpdate', error);\n });\n }\n if (status.isPlaying) {\n this.playbackSubscribers.forEach((callback) => {\n callback({\n currentTime: status.positionMillis,\n duration: status.durationMillis ?? 0,\n stopped: status.didJustFinish,\n });\n });\n }\n }\n });\n };\n\n private removeListener = () => {\n sound.setOnPlaybackStatusUpdate(null);\n };\n\n public requestPermission = async (): Promise<boolean> => {\n const status = await avModule.Audio.getPermissionsAsync();\n if (expoPermissionGranted([status])) {\n return true;\n } else {\n const status = await avModule.Audio.requestPermissionsAsync();\n return expoPermissionGranted([status]);\n }\n };\n\n public addPlaybackListener = (callback: PlaybackListener): Unsubscribe => {\n this.playbackSubscribers.add(callback);\n return () => {\n this.playbackSubscribers.delete(callback);\n };\n };\n\n public addStateListener = (callback: (state: PlayerServiceInterface['state']) => void): Unsubscribe => {\n this.stateSubscribers.add(callback);\n return () => {\n this.stateSubscribers.delete(callback);\n };\n };\n\n private prepare = async (uri: string) => {\n this.setState('preparing');\n await sound.loadAsync({ uri }, { shouldPlay: false }, true);\n this.uri = uri;\n };\n\n public play = async (uri: string): Promise<void> => {\n if (matchesOneOf(this.state, ['idle', 'stopped'])) {\n try {\n await this.prepare(uri);\n this.setListener();\n await sound.playAsync();\n this.setState('playing');\n } catch (e) {\n this.setState('idle');\n this.uri = undefined;\n this.removeListener();\n throw e;\n }\n } else if (matchesOneOf(this.state, ['paused']) && this.uri === uri) {\n try {\n this.setListener();\n await sound.playAsync();\n this.setState('playing');\n } catch (e) {\n this.removeListener();\n throw e;\n }\n }\n };\n\n public pause = async (): Promise<void> => {\n if (matchesOneOf(this.state, ['playing'])) {\n await sound.pauseAsync();\n this.removeListener();\n this.setState('paused');\n }\n };\n\n public stop = async (): Promise<void> => {\n if (matchesOneOf(this.state, ['playing', 'paused'])) {\n await sound.stopAsync();\n await sound.unloadAsync();\n this.removeListener();\n this.setState('stopped');\n }\n };\n\n public reset = async (): Promise<void> => {\n await this.stop();\n this.setState('idle');\n this.uri = undefined;\n this.playbackSubscribers.clear();\n this.stateSubscribers.clear();\n };\n\n public seek = async (time: number): Promise<void> => {\n if (matchesOneOf(this.state, ['playing', 'paused'])) {\n await sound.playFromPositionAsync(time);\n }\n };\n }\n\n return new VoicePlayer();\n};\n\nexport default createExpoPlayerService;\n"],"mappings":";;;;;;AAEA,IAAAA,WAAA,GAAAC,OAAA;AAEA,IAAAC,sBAAA,GAAAC,sBAAA,CAAAF,OAAA;AAAmE,SAAAE,uBAAAC,GAAA,WAAAA,GAAA,IAAAA,GAAA,CAAAC,UAAA,GAAAD,GAAA,KAAAE,OAAA,EAAAF,GAAA;AAAA,SAAAG,gBAAAH,GAAA,EAAAI,GAAA,EAAAC,KAAA,IAAAD,GAAA,GAAAE,cAAA,CAAAF,GAAA,OAAAA,GAAA,IAAAJ,GAAA,IAAAO,MAAA,CAAAC,cAAA,CAAAR,GAAA,EAAAI,GAAA,IAAAC,KAAA,EAAAA,KAAA,EAAAI,UAAA,QAAAC,YAAA,QAAAC,QAAA,oBAAAX,GAAA,CAAAI,GAAA,IAAAC,KAAA,WAAAL,GAAA;AAAA,SAAAM,eAAAM,GAAA,QAAAR,GAAA,GAAAS,YAAA,CAAAD,GAAA,2BAAAR,GAAA,gBAAAA,GAAA,GAAAU,MAAA,CAAAV,GAAA;AAAA,SAAAS,aAAAE,KAAA,EAAAC,IAAA,eAAAD,KAAA,iBAAAA,KAAA,kBAAAA,KAAA,MAAAE,IAAA,GAAAF,KAAA,CAAAG,MAAA,CAAAC,WAAA,OAAAF,IAAA,KAAAG,SAAA,QAAAC,GAAA,GAAAJ,IAAA,CAAAK,IAAA,CAAAP,KAAA,EAAAC,IAAA,2BAAAK,GAAA,sBAAAA,GAAA,YAAAE,SAAA,4DAAAP,IAAA,gBAAAF,MAAA,GAAAU,MAAA,EAAAT,KAAA;AAQnE,MAAMU,uBAAuB,GAAGC,IAAA,IAAmD;EAAA,IAAlD;IAAEC;EAAkB,CAAC,GAAAD,IAAA;EACpD,MAAME,KAAK,GAAG,IAAID,QAAQ,CAACE,KAAK,CAACC,KAAK,EAAE;EAExC,MAAMC,WAAW,CAAmC;IAAAC,YAAA;MAAA7B,eAAA;MAAAA,eAAA,gBAET,MAAM;MAAAA,eAAA,8BAER,IAAI8B,GAAG,EAAoB;MAAA9B,eAAA,2BAC9B,IAAI8B,GAAG,EAAiB;MAAA9B,eAAA,mBAExC+B,KAAsC,IAAK;QAC7D,IAAI,CAACA,KAAK,GAAGA,KAAK;QAClB,IAAI,CAACC,gBAAgB,CAACC,OAAO,CAAEC,QAAQ,IAAK;UAC1CA,QAAQ,CAACH,KAAK,CAAC;QACjB,CAAC,CAAC;MACJ,CAAC;MAAA/B,eAAA,sBAEqB,MAAM;QAC1ByB,KAAK,CAACU,8BAA8B,CAAC,GAAG,CAAC,CAACC,KAAK,CAAEC,KAAK,IAAK;UACzDC,kBAAM,CAACC,IAAI,CAAC,6DAA6D,EAAEF,KAAK,CAAC;QACnF,CAAC,CAAC;QACFZ,KAAK,CAACe,yBAAyB,CAAEC,MAAM,IAAK;UAC1C,IAAIA,MAAM,CAACC,QAAQ,EAAE;YACnB,IAAID,MAAM,CAACE,aAAa,EAAE;cACxB,IAAI,CAACC,IAAI,EAAE,CAACR,KAAK,CAAEC,KAAK,IAAK;gBAC3BC,kBAAM,CAACC,IAAI,CAAC,+DAA+D,EAAEF,KAAK,CAAC;cACrF,CAAC,CAAC;YACJ;YACA,IAAII,MAAM,CAACI,SAAS,EAAE;cACpB,IAAI,CAACC,mBAAmB,CAACb,OAAO,CAAEC,QAAQ,IAAK;gBAC7CA,QAAQ,CAAC;kBACPa,WAAW,EAAEN,MAAM,CAACO,cAAc;kBAClCC,QAAQ,EAAER,MAAM,CAACS,cAAc,IAAI,CAAC;kBACpCC,OAAO,EAAEV,MAAM,CAACE;gBAClB,CAAC,CAAC;cACJ,CAAC,CAAC;YACJ;UACF;QACF,CAAC,CAAC;MACJ,CAAC;MAAA3C,eAAA,yBAEwB,MAAM;QAC7ByB,KAAK,CAACe,yBAAyB,CAAC,IAAI,CAAC;MACvC,CAAC;MAAAxC,eAAA,4BAE0B,YAA8B;QACvD,MAAMyC,MAAM,GAAG,MAAMjB,QAAQ,CAACE,KAAK,CAAC0B,mBAAmB,EAAE;QACzD,IAAI,IAAAC,8BAAqB,EAAC,CAACZ,MAAM,CAAC,CAAC,EAAE;UACnC,OAAO,IAAI;QACb,CAAC,MAAM;UACL,MAAMA,MAAM,GAAG,MAAMjB,QAAQ,CAACE,KAAK,CAAC4B,uBAAuB,EAAE;UAC7D,OAAO,IAAAD,8BAAqB,EAAC,CAACZ,MAAM,CAAC,CAAC;QACxC;MACF,CAAC;MAAAzC,eAAA,8BAE6BkC,QAA0B,IAAkB;QACxE,IAAI,CAACY,mBAAmB,CAACS,GAAG,CAACrB,QAAQ,CAAC;QACtC,OAAO,MAAM;UACX,IAAI,CAACY,mBAAmB,CAACU,MAAM,CAACtB,QAAQ,CAAC;QAC3C,CAAC;MACH,CAAC;MAAAlC,eAAA,2BAE0BkC,QAA0D,IAAkB;QACrG,IAAI,CAACF,gBAAgB,CAACuB,GAAG,CAACrB,QAAQ,CAAC;QACnC,OAAO,MAAM;UACX,IAAI,CAACF,gBAAgB,CAACwB,MAAM,CAACtB,QAAQ,CAAC;QACxC,CAAC;MACH,CAAC;MAAAlC,eAAA,kBAEiB,MAAOyD,GAAW,IAAK;QACvC,IAAI,CAACC,QAAQ,CAAC,WAAW,CAAC;QAC1B,MAAMjC,KAAK,CAACkC,SAAS,CAAC;UAAEF;QAAI,CAAC,EAAE;UAAEG,UAAU,EAAE;QAAM,CAAC,EAAE,IAAI,CAAC;QAC3D,IAAI,CAACH,GAAG,GAAGA,GAAG;MAChB,CAAC;MAAAzD,eAAA,eAEa,MAAOyD,GAAW,IAAoB;QAClD,IAAI,IAAAI,wBAAY,EAAC,IAAI,CAAC9B,KAAK,EAAE,CAAC,MAAM,EAAE,SAAS,CAAC,CAAC,EAAE;UACjD,IAAI;YACF,MAAM,IAAI,CAAC+B,OAAO,CAACL,GAAG,CAAC;YACvB,IAAI,CAACM,WAAW,EAAE;YAClB,MAAMtC,KAAK,CAACuC,SAAS,EAAE;YACvB,IAAI,CAACN,QAAQ,CAAC,SAAS,CAAC;UAC1B,CAAC,CAAC,OAAOO,CAAC,EAAE;YACV,IAAI,CAACP,QAAQ,CAAC,MAAM,CAAC;YACrB,IAAI,CAACD,GAAG,GAAGxC,SAAS;YACpB,IAAI,CAACiD,cAAc,EAAE;YACrB,MAAMD,CAAC;UACT;QACF,CAAC,MAAM,IAAI,IAAAJ,wBAAY,EAAC,IAAI,CAAC9B,KAAK,EAAE,CAAC,QAAQ,CAAC,CAAC,IAAI,IAAI,CAAC0B,GAAG,KAAKA,GAAG,EAAE;UACnE,IAAI;YACF,IAAI,CAACM,WAAW,EAAE;YAClB,MAAMtC,KAAK,CAACuC,SAAS,EAAE;YACvB,IAAI,CAACN,QAAQ,CAAC,SAAS,CAAC;UAC1B,CAAC,CAAC,OAAOO,CAAC,EAAE;YACV,IAAI,CAACC,cAAc,EAAE;YACrB,MAAMD,CAAC;UACT;QACF;MACF,CAAC;MAAAjE,eAAA,gBAEc,YAA2B;QACxC,IAAI,IAAA6D,wBAAY,EAAC,IAAI,CAAC9B,KAAK,EAAE,CAAC,SAAS,CAAC,CAAC,EAAE;UACzC,MAAMN,KAAK,CAAC0C,UAAU,EAAE;UACxB,IAAI,CAACD,cAAc,EAAE;UACrB,IAAI,CAACR,QAAQ,CAAC,QAAQ,CAAC;QACzB;MACF,CAAC;MAAA1D,eAAA,eAEa,YAA2B;QACvC,IAAI,IAAA6D,wBAAY,EAAC,IAAI,CAAC9B,KAAK,EAAE,CAAC,SAAS,EAAE,QAAQ,CAAC,CAAC,EAAE;UACnD,MAAMN,KAAK,CAAC2C,SAAS,EAAE;UACvB,MAAM3C,KAAK,CAAC4C,WAAW,EAAE;UACzB,IAAI,CAACH,cAAc,EAAE;UACrB,IAAI,CAACR,QAAQ,CAAC,SAAS,CAAC;QAC1B;MACF,CAAC;MAAA1D,eAAA,gBAEc,YAA2B;QACxC,MAAM,IAAI,CAAC4C,IAAI,EAAE;QACjB,IAAI,CAACc,QAAQ,CAAC,MAAM,CAAC;QACrB,IAAI,CAACD,GAAG,GAAGxC,SAAS;QACpB,IAAI,CAAC6B,mBAAmB,CAACwB,KAAK,EAAE;QAChC,IAAI,CAACtC,gBAAgB,CAACsC,KAAK,EAAE;MAC/B,CAAC;MAAAtE,eAAA,eAEa,MAAOuE,IAAY,IAAoB;QACnD,IAAI,IAAAV,wBAAY,EAAC,IAAI,CAAC9B,KAAK,EAAE,CAAC,SAAS,EAAE,QAAQ,CAAC,CAAC,EAAE;UACnD,MAAMN,KAAK,CAAC+C,qBAAqB,CAACD,IAAI,CAAC;QACzC;MACF,CAAC;IAAA;EACH;EAEA,OAAO,IAAI3C,WAAW,EAAE;AAC1B,CAAC;AAAC,IAAA6C,QAAA,GAEanD,uBAAuB;AAAAoD,OAAA,CAAA3E,OAAA,GAAA0E,QAAA"}
|
|
@@ -28,9 +28,13 @@ const createNativePlayerService = _ref => {
|
|
|
28
28
|
});
|
|
29
29
|
});
|
|
30
30
|
_defineProperty(this, "setListener", () => {
|
|
31
|
-
module.addPlayBackListener(data => {
|
|
31
|
+
module.addPlayBackListener(async data => {
|
|
32
32
|
const stopped = data.currentPosition >= data.duration;
|
|
33
|
-
if (stopped)
|
|
33
|
+
if (stopped) {
|
|
34
|
+
this.stop().catch(error => {
|
|
35
|
+
_uikitUtils.Logger.warn('[PlayerService.Native] Failed to stop in PlayBackListener', error);
|
|
36
|
+
});
|
|
37
|
+
}
|
|
34
38
|
if (this.state === 'playing') {
|
|
35
39
|
this.playbackSubscribers.forEach(callback => {
|
|
36
40
|
callback({
|
|
@@ -47,16 +51,15 @@ const createNativePlayerService = _ref => {
|
|
|
47
51
|
});
|
|
48
52
|
_defineProperty(this, "requestPermission", async () => {
|
|
49
53
|
if (_reactNative.Platform.OS === 'android') {
|
|
54
|
+
if (_reactNative.Platform.Version > 32) return true;
|
|
50
55
|
const {
|
|
51
|
-
READ_MEDIA_AUDIO,
|
|
52
56
|
READ_EXTERNAL_STORAGE
|
|
53
57
|
} = permissionModule.PERMISSIONS.ANDROID;
|
|
54
|
-
const
|
|
55
|
-
const status = await permissionModule.check(permission);
|
|
58
|
+
const status = await permissionModule.check(READ_EXTERNAL_STORAGE);
|
|
56
59
|
if (status === 'granted') {
|
|
57
60
|
return true;
|
|
58
61
|
} else {
|
|
59
|
-
const status = await permissionModule.request(
|
|
62
|
+
const status = await permissionModule.request(READ_EXTERNAL_STORAGE);
|
|
60
63
|
return status === 'granted';
|
|
61
64
|
}
|
|
62
65
|
} else {
|
|
@@ -129,7 +132,9 @@ const createNativePlayerService = _ref => {
|
|
|
129
132
|
await module.seekToPlayer(time);
|
|
130
133
|
}
|
|
131
134
|
});
|
|
132
|
-
module.setSubscriptionDuration(0.1)
|
|
135
|
+
module.setSubscriptionDuration(0.1).catch(error => {
|
|
136
|
+
_uikitUtils.Logger.warn('[PlayerService.Native] Failed to set subscription duration', error);
|
|
137
|
+
});
|
|
133
138
|
}
|
|
134
139
|
}
|
|
135
140
|
return new VoicePlayer();
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["_reactNative","require","_uikitUtils","_defineProperty","obj","key","value","_toPropertyKey","Object","defineProperty","enumerable","configurable","writable","arg","_toPrimitive","String","input","hint","prim","Symbol","toPrimitive","undefined","res","call","TypeError","Number","createNativePlayerService","_ref","audioRecorderModule","permissionModule","module","default","VoicePlayer","constructor","Set","state","stateSubscribers","forEach","callback","addPlayBackListener","data","stopped","currentPosition","duration","stop","playbackSubscribers","currentTime","removePlayBackListener","Platform","OS","READ_MEDIA_AUDIO","READ_EXTERNAL_STORAGE","PERMISSIONS","ANDROID","permission","Version","status","check","request","add","delete","uri","matchesOneOf","setState","setListener","sleep","startPlayer","e","removeListener","resumePlayer","pausePlayer","stopPlayer","clear","time","seekToPlayer","setSubscriptionDuration","_default","exports"],"sources":["createPlayerService.native.tsx"],"sourcesContent":["import { Platform } from 'react-native';\nimport type * as RNAudioRecorder from 'react-native-audio-recorder-player';\nimport * as Permissions from 'react-native-permissions';\n\nimport { matchesOneOf, sleep } from '@sendbird/uikit-utils';\n\nimport type { PlayerServiceInterface, Unsubscribe } from './types';\n\ntype Modules = {\n audioRecorderModule: typeof RNAudioRecorder;\n permissionModule: typeof Permissions;\n};\ntype PlaybackListener = Parameters<PlayerServiceInterface['addPlaybackListener']>[number];\ntype StateListener = Parameters<PlayerServiceInterface['addStateListener']>[number];\nconst createNativePlayerService = ({ audioRecorderModule, permissionModule }: Modules): PlayerServiceInterface => {\n const module = new audioRecorderModule.default();\n\n class VoicePlayer implements PlayerServiceInterface {\n uri?: string;\n state: PlayerServiceInterface['state'] = 'idle';\n\n private readonly playbackSubscribers = new Set<PlaybackListener>();\n private readonly stateSubscribers = new Set<StateListener>();\n\n constructor() {\n module.setSubscriptionDuration(0.1);\n }\n\n private setState = (state: PlayerServiceInterface['state']) => {\n this.state = state;\n this.stateSubscribers.forEach((callback) => {\n callback(state);\n });\n };\n\n private setListener = () => {\n module.addPlayBackListener((data) => {\n const stopped = data.currentPosition >= data.duration;\n\n if (stopped) this.stop();\n if (this.state === 'playing') {\n this.playbackSubscribers.forEach((callback) => {\n callback({ currentTime: data.currentPosition, duration: data.duration, stopped });\n });\n }\n });\n };\n\n private removeListener = () => {\n module.removePlayBackListener();\n };\n\n public requestPermission = async (): Promise<boolean> => {\n if (Platform.OS === 'android') {\n const { READ_MEDIA_AUDIO, READ_EXTERNAL_STORAGE } = permissionModule.PERMISSIONS.ANDROID;\n const permission = Platform.Version > 32 ? READ_MEDIA_AUDIO : READ_EXTERNAL_STORAGE;\n\n const status = await permissionModule.check(permission);\n if (status === 'granted') {\n return true;\n } else {\n const status = await permissionModule.request(permission);\n return status === 'granted';\n }\n } else {\n return true;\n }\n };\n\n public addPlaybackListener = (callback: PlaybackListener): Unsubscribe => {\n this.playbackSubscribers.add(callback);\n return () => {\n this.playbackSubscribers.delete(callback);\n };\n };\n\n public addStateListener = (callback: (state: PlayerServiceInterface['state']) => void): Unsubscribe => {\n this.stateSubscribers.add(callback);\n return () => {\n this.stateSubscribers.delete(callback);\n };\n };\n\n public play = async (uri: string): Promise<void> => {\n if (matchesOneOf(this.state, ['idle', 'stopped'])) {\n try {\n this.setState('preparing');\n this.uri = uri;\n this.setListener();\n\n // FIXME: Workaround, `module.startPlayer()` caused a significant frame-drop and prevented the 'preparing' UI transition.\n await sleep(0);\n await module.startPlayer(uri);\n\n this.setState('playing');\n } catch (e) {\n this.setState('idle');\n this.uri = undefined;\n this.removeListener();\n throw e;\n }\n } else if (matchesOneOf(this.state, ['paused']) && this.uri === uri) {\n try {\n this.setListener();\n await module.resumePlayer();\n this.setState('playing');\n } catch (e) {\n this.removeListener();\n throw e;\n }\n }\n };\n\n public pause = async (): Promise<void> => {\n if (matchesOneOf(this.state, ['playing'])) {\n await module.pausePlayer();\n this.removeListener();\n this.setState('paused');\n }\n };\n\n public stop = async (): Promise<void> => {\n if (matchesOneOf(this.state, ['preparing', 'playing', 'paused'])) {\n await module.stopPlayer();\n this.removeListener();\n this.setState('stopped');\n }\n };\n\n public reset = async (): Promise<void> => {\n await this.stop();\n this.setState('idle');\n this.uri = undefined;\n this.playbackSubscribers.clear();\n this.stateSubscribers.clear();\n };\n\n public seek = async (time: number): Promise<void> => {\n if (matchesOneOf(this.state, ['playing', 'paused'])) {\n await module.seekToPlayer(time);\n }\n };\n }\n\n return new VoicePlayer();\n};\n\nexport default createNativePlayerService;\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"names":["_reactNative","require","_uikitUtils","_defineProperty","obj","key","value","_toPropertyKey","Object","defineProperty","enumerable","configurable","writable","arg","_toPrimitive","String","input","hint","prim","Symbol","toPrimitive","undefined","res","call","TypeError","Number","createNativePlayerService","_ref","audioRecorderModule","permissionModule","module","default","VoicePlayer","constructor","Set","state","stateSubscribers","forEach","callback","addPlayBackListener","data","stopped","currentPosition","duration","stop","catch","error","Logger","warn","playbackSubscribers","currentTime","removePlayBackListener","Platform","OS","Version","READ_EXTERNAL_STORAGE","PERMISSIONS","ANDROID","status","check","request","add","delete","uri","matchesOneOf","setState","setListener","sleep","startPlayer","e","removeListener","resumePlayer","pausePlayer","stopPlayer","clear","time","seekToPlayer","setSubscriptionDuration","_default","exports"],"sources":["createPlayerService.native.tsx"],"sourcesContent":["import { Platform } from 'react-native';\nimport type * as RNAudioRecorder from 'react-native-audio-recorder-player';\nimport * as Permissions from 'react-native-permissions';\n\nimport { Logger, matchesOneOf, sleep } from '@sendbird/uikit-utils';\n\nimport type { PlayerServiceInterface, Unsubscribe } from './types';\n\ntype Modules = {\n audioRecorderModule: typeof RNAudioRecorder;\n permissionModule: typeof Permissions;\n};\ntype PlaybackListener = Parameters<PlayerServiceInterface['addPlaybackListener']>[number];\ntype StateListener = Parameters<PlayerServiceInterface['addStateListener']>[number];\nconst createNativePlayerService = ({ audioRecorderModule, permissionModule }: Modules): PlayerServiceInterface => {\n const module = new audioRecorderModule.default();\n\n class VoicePlayer implements PlayerServiceInterface {\n uri?: string;\n state: PlayerServiceInterface['state'] = 'idle';\n\n private readonly playbackSubscribers = new Set<PlaybackListener>();\n private readonly stateSubscribers = new Set<StateListener>();\n\n constructor() {\n module.setSubscriptionDuration(0.1).catch((error) => {\n Logger.warn('[PlayerService.Native] Failed to set subscription duration', error);\n });\n }\n\n private setState = (state: PlayerServiceInterface['state']) => {\n this.state = state;\n this.stateSubscribers.forEach((callback) => {\n callback(state);\n });\n };\n\n private setListener = () => {\n module.addPlayBackListener(async (data) => {\n const stopped = data.currentPosition >= data.duration;\n\n if (stopped) {\n this.stop().catch((error) => {\n Logger.warn('[PlayerService.Native] Failed to stop in PlayBackListener', error);\n });\n }\n if (this.state === 'playing') {\n this.playbackSubscribers.forEach((callback) => {\n callback({ currentTime: data.currentPosition, duration: data.duration, stopped });\n });\n }\n });\n };\n\n private removeListener = () => {\n module.removePlayBackListener();\n };\n\n public requestPermission = async (): Promise<boolean> => {\n if (Platform.OS === 'android') {\n if (Platform.Version > 32) return true;\n\n const { READ_EXTERNAL_STORAGE } = permissionModule.PERMISSIONS.ANDROID;\n\n const status = await permissionModule.check(READ_EXTERNAL_STORAGE);\n if (status === 'granted') {\n return true;\n } else {\n const status = await permissionModule.request(READ_EXTERNAL_STORAGE);\n return status === 'granted';\n }\n } else {\n return true;\n }\n };\n\n public addPlaybackListener = (callback: PlaybackListener): Unsubscribe => {\n this.playbackSubscribers.add(callback);\n return () => {\n this.playbackSubscribers.delete(callback);\n };\n };\n\n public addStateListener = (callback: (state: PlayerServiceInterface['state']) => void): Unsubscribe => {\n this.stateSubscribers.add(callback);\n return () => {\n this.stateSubscribers.delete(callback);\n };\n };\n\n public play = async (uri: string): Promise<void> => {\n if (matchesOneOf(this.state, ['idle', 'stopped'])) {\n try {\n this.setState('preparing');\n this.uri = uri;\n this.setListener();\n\n // FIXME: Workaround, `module.startPlayer()` caused a significant frame-drop and prevented the 'preparing' UI transition.\n await sleep(0);\n await module.startPlayer(uri);\n\n this.setState('playing');\n } catch (e) {\n this.setState('idle');\n this.uri = undefined;\n this.removeListener();\n throw e;\n }\n } else if (matchesOneOf(this.state, ['paused']) && this.uri === uri) {\n try {\n this.setListener();\n await module.resumePlayer();\n this.setState('playing');\n } catch (e) {\n this.removeListener();\n throw e;\n }\n }\n };\n\n public pause = async (): Promise<void> => {\n if (matchesOneOf(this.state, ['playing'])) {\n await module.pausePlayer();\n this.removeListener();\n this.setState('paused');\n }\n };\n\n public stop = async (): Promise<void> => {\n if (matchesOneOf(this.state, ['preparing', 'playing', 'paused'])) {\n await module.stopPlayer();\n this.removeListener();\n this.setState('stopped');\n }\n };\n\n public reset = async (): Promise<void> => {\n await this.stop();\n this.setState('idle');\n this.uri = undefined;\n this.playbackSubscribers.clear();\n this.stateSubscribers.clear();\n };\n\n public seek = async (time: number): Promise<void> => {\n if (matchesOneOf(this.state, ['playing', 'paused'])) {\n await module.seekToPlayer(time);\n }\n };\n }\n\n return new VoicePlayer();\n};\n\nexport default createNativePlayerService;\n"],"mappings":"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"}
|
|
@@ -135,10 +135,16 @@ const createNativeRecorderService = _ref => {
|
|
|
135
135
|
this.recordingSubscribers.clear();
|
|
136
136
|
this.setState('idle');
|
|
137
137
|
});
|
|
138
|
-
module.setSubscriptionDuration(0.1)
|
|
138
|
+
module.setSubscriptionDuration(0.1).catch(error => {
|
|
139
|
+
_uikitUtils.Logger.warn('[RecorderService.Native] Failed to set subscription duration', error);
|
|
140
|
+
});
|
|
139
141
|
module.addRecordBackListener(data => {
|
|
140
142
|
const completed = data.currentPosition >= this.options.maxDuration;
|
|
141
|
-
if (completed)
|
|
143
|
+
if (completed) {
|
|
144
|
+
this.stop().catch(error => {
|
|
145
|
+
_uikitUtils.Logger.warn('[RecorderService.Native] Failed to stop in RecordBackListener', error);
|
|
146
|
+
});
|
|
147
|
+
}
|
|
142
148
|
if (this.state === 'recording') {
|
|
143
149
|
this.recordingSubscribers.forEach(callback => {
|
|
144
150
|
callback({
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["_reactNative","require","_uikitUtils","_VoiceMessageConfig","_interopRequireDefault","_nativePermissionGranted","obj","__esModule","default","_defineProperty","key","value","_toPropertyKey","Object","defineProperty","enumerable","configurable","writable","arg","_toPrimitive","String","input","hint","prim","Symbol","toPrimitive","undefined","res","call","TypeError","Number","createNativeRecorderService","_ref","audioRecorderModule","permissionModule","module","VoiceRecorder","constructor","minDuration","VoiceMessageConfig","DEFAULT","RECORDER","MIN_DURATION","maxDuration","MAX_DURATION","extension","EXTENSION","minWaitingTime","elapsedTime","Date","now","_recordStartedAt","Set","sampleRate","SAMPLE_RATE","bitRate","BIT_RATE","audioChannels","CHANNELS","Platform","select","android","AudioEncodingBitRateAndroid","audioSettings","AudioChannelsAndroid","AudioSamplingRateAndroid","AudioEncoderAndroid","AudioEncoderAndroidType","AAC","OutputFormatAndroid","OutputFormatAndroidType","MPEG_4","AudioSourceAndroid","AudioSourceAndroidType","VOICE_RECOGNITION","ios","AVEncoderBitRateKeyIOS","AVNumberOfChannelsKeyIOS","AVSampleRateKeyIOS","AVFormatIDKeyIOS","AVEncodingOption","mp4","AVEncoderAudioQualityKeyIOS","AVEncoderAudioQualityIOSType","high","state","stateSubscribers","forEach","callback","permission","PERMISSIONS","ANDROID","RECORD_AUDIO","IOS","MICROPHONE","windows","WINDOWS","OS","Version","push","WRITE_EXTERNAL_STORAGE","status","checkMultiple","nativePermissionGranted","requestMultiple","recordingSubscribers","add","delete","uri","matchesOneOf","setState","startRecorder","audioOptions","e","buffer","_getRecorderStopSafeBuffer","sleep","stopRecorder","stop","clear","setSubscriptionDuration","addRecordBackListener","data","completed","currentPosition","options","currentTime","_default","exports"],"sources":["createRecorderService.native.tsx"],"sourcesContent":["import { Platform } from 'react-native';\nimport * as RNAudioRecorder from 'react-native-audio-recorder-player';\nimport * as Permissions from 'react-native-permissions';\nimport { Permission } from 'react-native-permissions/src/types';\n\nimport { matchesOneOf, sleep } from '@sendbird/uikit-utils';\n\nimport VoiceMessageConfig from '../libs/VoiceMessageConfig';\nimport nativePermissionGranted from '../utils/nativePermissionGranted';\nimport type { RecorderServiceInterface, Unsubscribe } from './types';\n\ntype RecordingListener = Parameters<RecorderServiceInterface['addRecordingListener']>[number];\ntype StateListener = Parameters<RecorderServiceInterface['addStateListener']>[number];\ntype Modules = {\n audioRecorderModule: typeof RNAudioRecorder;\n permissionModule: typeof Permissions;\n};\nconst createNativeRecorderService = ({ audioRecorderModule, permissionModule }: Modules): RecorderServiceInterface => {\n const module = new audioRecorderModule.default();\n\n class VoiceRecorder implements RecorderServiceInterface {\n public uri: RecorderServiceInterface['uri'] = undefined;\n public state: RecorderServiceInterface['state'] = 'idle';\n public options: RecorderServiceInterface['options'] = {\n minDuration: VoiceMessageConfig.DEFAULT.RECORDER.MIN_DURATION,\n maxDuration: VoiceMessageConfig.DEFAULT.RECORDER.MAX_DURATION,\n extension: VoiceMessageConfig.DEFAULT.RECORDER.EXTENSION,\n };\n\n // NOTE: In Android, even when startRecorder() is awaited, if stop() is executed immediately afterward, an error occurs\n private _recordStartedAt = 0;\n private _getRecorderStopSafeBuffer = () => {\n const minWaitingTime = 500;\n const elapsedTime = Date.now() - this._recordStartedAt;\n if (elapsedTime > minWaitingTime) return 0;\n else return minWaitingTime - elapsedTime;\n };\n\n private readonly recordingSubscribers = new Set<RecordingListener>();\n private readonly stateSubscribers = new Set<StateListener>();\n private readonly audioSettings = {\n sampleRate: VoiceMessageConfig.DEFAULT.RECORDER.SAMPLE_RATE,\n bitRate: VoiceMessageConfig.DEFAULT.RECORDER.BIT_RATE,\n audioChannels: VoiceMessageConfig.DEFAULT.RECORDER.CHANNELS,\n // encoding: mpeg4_aac\n };\n private readonly audioOptions = Platform.select({\n android: {\n AudioEncodingBitRateAndroid: this.audioSettings.bitRate,\n AudioChannelsAndroid: this.audioSettings.audioChannels,\n AudioSamplingRateAndroid: this.audioSettings.sampleRate,\n AudioEncoderAndroid: audioRecorderModule.AudioEncoderAndroidType.AAC,\n OutputFormatAndroid: audioRecorderModule.OutputFormatAndroidType.MPEG_4,\n AudioSourceAndroid: audioRecorderModule.AudioSourceAndroidType.VOICE_RECOGNITION,\n },\n ios: {\n AVEncoderBitRateKeyIOS: this.audioSettings.bitRate,\n AVNumberOfChannelsKeyIOS: this.audioSettings.audioChannels,\n AVSampleRateKeyIOS: this.audioSettings.sampleRate,\n AVFormatIDKeyIOS: audioRecorderModule.AVEncodingOption.mp4, // same with aac\n AVEncoderAudioQualityKeyIOS: audioRecorderModule.AVEncoderAudioQualityIOSType.high,\n },\n default: {},\n });\n\n constructor() {\n module.setSubscriptionDuration(0.1);\n module.addRecordBackListener((data) => {\n const completed = data.currentPosition >= this.options.maxDuration;\n\n if (completed) this.stop();\n if (this.state === 'recording') {\n this.recordingSubscribers.forEach((callback) => {\n callback({ currentTime: data.currentPosition, completed });\n });\n }\n });\n }\n\n private setState = (state: RecorderServiceInterface['state']) => {\n this.state = state;\n this.stateSubscribers.forEach((callback) => {\n callback(state);\n });\n };\n\n public requestPermission = async (): Promise<boolean> => {\n const permission: Permission[] | undefined = Platform.select({\n android: [permissionModule.PERMISSIONS.ANDROID.RECORD_AUDIO],\n ios: [permissionModule.PERMISSIONS.IOS.MICROPHONE],\n windows: [permissionModule.PERMISSIONS.WINDOWS.MICROPHONE],\n default: undefined,\n });\n\n if (Platform.OS === 'android' && Platform.Version <= 28) {\n permission?.push(permissionModule.PERMISSIONS.ANDROID.WRITE_EXTERNAL_STORAGE);\n }\n\n if (permission) {\n const status = await permissionModule.checkMultiple(permission);\n if (nativePermissionGranted(status)) {\n return true;\n } else {\n const status = await permissionModule.requestMultiple(permission);\n return nativePermissionGranted(status);\n }\n } else {\n return true;\n }\n };\n\n public addRecordingListener = (callback: RecordingListener): Unsubscribe => {\n this.recordingSubscribers.add(callback);\n return () => {\n this.recordingSubscribers.delete(callback);\n };\n };\n\n public addStateListener = (callback: StateListener): Unsubscribe => {\n this.stateSubscribers.add(callback);\n return () => {\n this.stateSubscribers.delete(callback);\n };\n };\n\n public record = async (uri: string): Promise<void> => {\n if (matchesOneOf(this.state, ['idle', 'completed'])) {\n try {\n this.setState('preparing');\n await module.startRecorder(uri, {\n ...this.audioOptions,\n });\n\n if (Platform.OS === 'android') {\n this._recordStartedAt = Date.now();\n }\n\n this.uri = uri;\n this.setState('recording');\n } catch (e) {\n this.setState('idle');\n throw e;\n }\n }\n };\n\n public stop = async (): Promise<void> => {\n if (matchesOneOf(this.state, ['recording'])) {\n if (Platform.OS === 'android') {\n const buffer = this._getRecorderStopSafeBuffer();\n if (buffer > 0) await sleep(buffer);\n }\n\n await module.stopRecorder();\n this.setState('completed');\n }\n };\n\n public reset = async (): Promise<void> => {\n await this.stop();\n this.uri = undefined;\n this.recordingSubscribers.clear();\n this.setState('idle');\n };\n }\n\n return new VoiceRecorder();\n};\n\nexport default createNativeRecorderService;\n"],"mappings":";;;;;;AAAA,IAAAA,YAAA,GAAAC,OAAA;AAKA,IAAAC,WAAA,GAAAD,OAAA;AAEA,IAAAE,mBAAA,GAAAC,sBAAA,CAAAH,OAAA;AACA,IAAAI,wBAAA,GAAAD,sBAAA,CAAAH,OAAA;AAAuE,SAAAG,uBAAAE,GAAA,WAAAA,GAAA,IAAAA,GAAA,CAAAC,UAAA,GAAAD,GAAA,KAAAE,OAAA,EAAAF,GAAA;AAAA,SAAAG,gBAAAH,GAAA,EAAAI,GAAA,EAAAC,KAAA,IAAAD,GAAA,GAAAE,cAAA,CAAAF,GAAA,OAAAA,GAAA,IAAAJ,GAAA,IAAAO,MAAA,CAAAC,cAAA,CAAAR,GAAA,EAAAI,GAAA,IAAAC,KAAA,EAAAA,KAAA,EAAAI,UAAA,QAAAC,YAAA,QAAAC,QAAA,oBAAAX,GAAA,CAAAI,GAAA,IAAAC,KAAA,WAAAL,GAAA;AAAA,SAAAM,eAAAM,GAAA,QAAAR,GAAA,GAAAS,YAAA,CAAAD,GAAA,2BAAAR,GAAA,gBAAAA,GAAA,GAAAU,MAAA,CAAAV,GAAA;AAAA,SAAAS,aAAAE,KAAA,EAAAC,IAAA,eAAAD,KAAA,iBAAAA,KAAA,kBAAAA,KAAA,MAAAE,IAAA,GAAAF,KAAA,CAAAG,MAAA,CAAAC,WAAA,OAAAF,IAAA,KAAAG,SAAA,QAAAC,GAAA,GAAAJ,IAAA,CAAAK,IAAA,CAAAP,KAAA,EAAAC,IAAA,2BAAAK,GAAA,sBAAAA,GAAA,YAAAE,SAAA,4DAAAP,IAAA,gBAAAF,MAAA,GAAAU,MAAA,EAAAT,KAAA;AASvE,MAAMU,2BAA2B,GAAGC,IAAA,IAAkF;EAAA,IAAjF;IAAEC,mBAAmB;IAAEC;EAA0B,CAAC,GAAAF,IAAA;EACrF,MAAMG,MAAM,GAAG,IAAIF,mBAAmB,CAACzB,OAAO,EAAE;EAEhD,MAAM4B,aAAa,CAAqC;IA6CtDC,WAAWA,CAAA,EAAG;MAAA5B,eAAA,cA5CgCiB,SAAS;MAAAjB,eAAA,gBACL,MAAM;MAAAA,eAAA,kBACF;QACpD6B,WAAW,EAAEC,2BAAkB,CAACC,OAAO,CAACC,QAAQ,CAACC,YAAY;QAC7DC,WAAW,EAAEJ,2BAAkB,CAACC,OAAO,CAACC,QAAQ,CAACG,YAAY;QAC7DC,SAAS,EAAEN,2BAAkB,CAACC,OAAO,CAACC,QAAQ,CAACK;MACjD,CAAC;MAED;MAAArC,eAAA,2BAC2B,CAAC;MAAAA,eAAA,qCACS,MAAM;QACzC,MAAMsC,cAAc,GAAG,GAAG;QAC1B,MAAMC,WAAW,GAAGC,IAAI,CAACC,GAAG,EAAE,GAAG,IAAI,CAACC,gBAAgB;QACtD,IAAIH,WAAW,GAAGD,cAAc,EAAE,OAAO,CAAC,CAAC,KACtC,OAAOA,cAAc,GAAGC,WAAW;MAC1C,CAAC;MAAAvC,eAAA,+BAEuC,IAAI2C,GAAG,EAAqB;MAAA3C,eAAA,2BAChC,IAAI2C,GAAG,EAAiB;MAAA3C,eAAA,wBAC3B;QAC/B4C,UAAU,EAAEd,2BAAkB,CAACC,OAAO,CAACC,QAAQ,CAACa,WAAW;QAC3DC,OAAO,EAAEhB,2BAAkB,CAACC,OAAO,CAACC,QAAQ,CAACe,QAAQ;QACrDC,aAAa,EAAElB,2BAAkB,CAACC,OAAO,CAACC,QAAQ,CAACiB;QACnD;MACF,CAAC;MAAAjD,eAAA,uBAC+BkD,qBAAQ,CAACC,MAAM,CAAC;QAC9CC,OAAO,EAAE;UACPC,2BAA2B,EAAE,IAAI,CAACC,aAAa,CAACR,OAAO;UACvDS,oBAAoB,EAAE,IAAI,CAACD,aAAa,CAACN,aAAa;UACtDQ,wBAAwB,EAAE,IAAI,CAACF,aAAa,CAACV,UAAU;UACvDa,mBAAmB,EAAEjC,mBAAmB,CAACkC,uBAAuB,CAACC,GAAG;UACpEC,mBAAmB,EAAEpC,mBAAmB,CAACqC,uBAAuB,CAACC,MAAM;UACvEC,kBAAkB,EAAEvC,mBAAmB,CAACwC,sBAAsB,CAACC;QACjE,CAAC;QACDC,GAAG,EAAE;UACHC,sBAAsB,EAAE,IAAI,CAACb,aAAa,CAACR,OAAO;UAClDsB,wBAAwB,EAAE,IAAI,CAACd,aAAa,CAACN,aAAa;UAC1DqB,kBAAkB,EAAE,IAAI,CAACf,aAAa,CAACV,UAAU;UACjD0B,gBAAgB,EAAE9C,mBAAmB,CAAC+C,gBAAgB,CAACC,GAAG;UAAE;UAC5DC,2BAA2B,EAAEjD,mBAAmB,CAACkD,4BAA4B,CAACC;QAChF,CAAC;QACD5E,OAAO,EAAE,CAAC;MACZ,CAAC,CAAC;MAAAC,eAAA,mBAgBkB4E,KAAwC,IAAK;QAC/D,IAAI,CAACA,KAAK,GAAGA,KAAK;QAClB,IAAI,CAACC,gBAAgB,CAACC,OAAO,CAAEC,QAAQ,IAAK;UAC1CA,QAAQ,CAACH,KAAK,CAAC;QACjB,CAAC,CAAC;MACJ,CAAC;MAAA5E,eAAA,4BAE0B,YAA8B;QACvD,MAAMgF,UAAoC,GAAG9B,qBAAQ,CAACC,MAAM,CAAC;UAC3DC,OAAO,EAAE,CAAC3B,gBAAgB,CAACwD,WAAW,CAACC,OAAO,CAACC,YAAY,CAAC;UAC5DjB,GAAG,EAAE,CAACzC,gBAAgB,CAACwD,WAAW,CAACG,GAAG,CAACC,UAAU,CAAC;UAClDC,OAAO,EAAE,CAAC7D,gBAAgB,CAACwD,WAAW,CAACM,OAAO,CAACF,UAAU,CAAC;UAC1DtF,OAAO,EAAEkB;QACX,CAAC,CAAC;QAEF,IAAIiC,qBAAQ,CAACsC,EAAE,KAAK,SAAS,IAAItC,qBAAQ,CAACuC,OAAO,IAAI,EAAE,EAAE;UACvDT,UAAU,aAAVA,UAAU,uBAAVA,UAAU,CAAEU,IAAI,CAACjE,gBAAgB,CAACwD,WAAW,CAACC,OAAO,CAACS,sBAAsB,CAAC;QAC/E;QAEA,IAAIX,UAAU,EAAE;UACd,MAAMY,MAAM,GAAG,MAAMnE,gBAAgB,CAACoE,aAAa,CAACb,UAAU,CAAC;UAC/D,IAAI,IAAAc,gCAAuB,EAACF,MAAM,CAAC,EAAE;YACnC,OAAO,IAAI;UACb,CAAC,MAAM;YACL,MAAMA,MAAM,GAAG,MAAMnE,gBAAgB,CAACsE,eAAe,CAACf,UAAU,CAAC;YACjE,OAAO,IAAAc,gCAAuB,EAACF,MAAM,CAAC;UACxC;QACF,CAAC,MAAM;UACL,OAAO,IAAI;QACb;MACF,CAAC;MAAA5F,eAAA,+BAE8B+E,QAA2B,IAAkB;QAC1E,IAAI,CAACiB,oBAAoB,CAACC,GAAG,CAAClB,QAAQ,CAAC;QACvC,OAAO,MAAM;UACX,IAAI,CAACiB,oBAAoB,CAACE,MAAM,CAACnB,QAAQ,CAAC;QAC5C,CAAC;MACH,CAAC;MAAA/E,eAAA,2BAE0B+E,QAAuB,IAAkB;QAClE,IAAI,CAACF,gBAAgB,CAACoB,GAAG,CAAClB,QAAQ,CAAC;QACnC,OAAO,MAAM;UACX,IAAI,CAACF,gBAAgB,CAACqB,MAAM,CAACnB,QAAQ,CAAC;QACxC,CAAC;MACH,CAAC;MAAA/E,eAAA,iBAEe,MAAOmG,GAAW,IAAoB;QACpD,IAAI,IAAAC,wBAAY,EAAC,IAAI,CAACxB,KAAK,EAAE,CAAC,MAAM,EAAE,WAAW,CAAC,CAAC,EAAE;UACnD,IAAI;YACF,IAAI,CAACyB,QAAQ,CAAC,WAAW,CAAC;YAC1B,MAAM3E,MAAM,CAAC4E,aAAa,CAACH,GAAG,EAAE;cAC9B,GAAG,IAAI,CAACI;YACV,CAAC,CAAC;YAEF,IAAIrD,qBAAQ,CAACsC,EAAE,KAAK,SAAS,EAAE;cAC7B,IAAI,CAAC9C,gBAAgB,GAAGF,IAAI,CAACC,GAAG,EAAE;YACpC;YAEA,IAAI,CAAC0D,GAAG,GAAGA,GAAG;YACd,IAAI,CAACE,QAAQ,CAAC,WAAW,CAAC;UAC5B,CAAC,CAAC,OAAOG,CAAC,EAAE;YACV,IAAI,CAACH,QAAQ,CAAC,MAAM,CAAC;YACrB,MAAMG,CAAC;UACT;QACF;MACF,CAAC;MAAAxG,eAAA,eAEa,YAA2B;QACvC,IAAI,IAAAoG,wBAAY,EAAC,IAAI,CAACxB,KAAK,EAAE,CAAC,WAAW,CAAC,CAAC,EAAE;UAC3C,IAAI1B,qBAAQ,CAACsC,EAAE,KAAK,SAAS,EAAE;YAC7B,MAAMiB,MAAM,GAAG,IAAI,CAACC,0BAA0B,EAAE;YAChD,IAAID,MAAM,GAAG,CAAC,EAAE,MAAM,IAAAE,iBAAK,EAACF,MAAM,CAAC;UACrC;UAEA,MAAM/E,MAAM,CAACkF,YAAY,EAAE;UAC3B,IAAI,CAACP,QAAQ,CAAC,WAAW,CAAC;QAC5B;MACF,CAAC;MAAArG,eAAA,gBAEc,YAA2B;QACxC,MAAM,IAAI,CAAC6G,IAAI,EAAE;QACjB,IAAI,CAACV,GAAG,GAAGlF,SAAS;QACpB,IAAI,CAAC+E,oBAAoB,CAACc,KAAK,EAAE;QACjC,IAAI,CAACT,QAAQ,CAAC,MAAM,CAAC;MACvB,CAAC;MAjGC3E,MAAM,CAACqF,uBAAuB,CAAC,GAAG,CAAC;MACnCrF,MAAM,CAACsF,qBAAqB,CAAEC,IAAI,IAAK;QACrC,MAAMC,SAAS,GAAGD,IAAI,CAACE,eAAe,IAAI,IAAI,CAACC,OAAO,CAAClF,WAAW;QAElE,IAAIgF,SAAS,EAAE,IAAI,CAACL,IAAI,EAAE;QAC1B,IAAI,IAAI,CAACjC,KAAK,KAAK,WAAW,EAAE;UAC9B,IAAI,CAACoB,oBAAoB,CAAClB,OAAO,CAAEC,QAAQ,IAAK;YAC9CA,QAAQ,CAAC;cAAEsC,WAAW,EAAEJ,IAAI,CAACE,eAAe;cAAED;YAAU,CAAC,CAAC;UAC5D,CAAC,CAAC;QACJ;MACF,CAAC,CAAC;IACJ;EAuFF;EAEA,OAAO,IAAIvF,aAAa,EAAE;AAC5B,CAAC;AAAC,IAAA2F,QAAA,GAEahG,2BAA2B;AAAAiG,OAAA,CAAAxH,OAAA,GAAAuH,QAAA"}
|
|
1
|
+
{"version":3,"names":["_reactNative","require","_uikitUtils","_VoiceMessageConfig","_interopRequireDefault","_nativePermissionGranted","obj","__esModule","default","_defineProperty","key","value","_toPropertyKey","Object","defineProperty","enumerable","configurable","writable","arg","_toPrimitive","String","input","hint","prim","Symbol","toPrimitive","undefined","res","call","TypeError","Number","createNativeRecorderService","_ref","audioRecorderModule","permissionModule","module","VoiceRecorder","constructor","minDuration","VoiceMessageConfig","DEFAULT","RECORDER","MIN_DURATION","maxDuration","MAX_DURATION","extension","EXTENSION","minWaitingTime","elapsedTime","Date","now","_recordStartedAt","Set","sampleRate","SAMPLE_RATE","bitRate","BIT_RATE","audioChannels","CHANNELS","Platform","select","android","AudioEncodingBitRateAndroid","audioSettings","AudioChannelsAndroid","AudioSamplingRateAndroid","AudioEncoderAndroid","AudioEncoderAndroidType","AAC","OutputFormatAndroid","OutputFormatAndroidType","MPEG_4","AudioSourceAndroid","AudioSourceAndroidType","VOICE_RECOGNITION","ios","AVEncoderBitRateKeyIOS","AVNumberOfChannelsKeyIOS","AVSampleRateKeyIOS","AVFormatIDKeyIOS","AVEncodingOption","mp4","AVEncoderAudioQualityKeyIOS","AVEncoderAudioQualityIOSType","high","state","stateSubscribers","forEach","callback","permission","PERMISSIONS","ANDROID","RECORD_AUDIO","IOS","MICROPHONE","windows","WINDOWS","OS","Version","push","WRITE_EXTERNAL_STORAGE","status","checkMultiple","nativePermissionGranted","requestMultiple","recordingSubscribers","add","delete","uri","matchesOneOf","setState","startRecorder","audioOptions","e","buffer","_getRecorderStopSafeBuffer","sleep","stopRecorder","stop","clear","setSubscriptionDuration","catch","error","Logger","warn","addRecordBackListener","data","completed","currentPosition","options","currentTime","_default","exports"],"sources":["createRecorderService.native.tsx"],"sourcesContent":["import { Platform } from 'react-native';\nimport * as RNAudioRecorder from 'react-native-audio-recorder-player';\nimport * as Permissions from 'react-native-permissions';\nimport { Permission } from 'react-native-permissions/src/types';\n\nimport { Logger, matchesOneOf, sleep } from '@sendbird/uikit-utils';\n\nimport VoiceMessageConfig from '../libs/VoiceMessageConfig';\nimport nativePermissionGranted from '../utils/nativePermissionGranted';\nimport type { RecorderServiceInterface, Unsubscribe } from './types';\n\ntype RecordingListener = Parameters<RecorderServiceInterface['addRecordingListener']>[number];\ntype StateListener = Parameters<RecorderServiceInterface['addStateListener']>[number];\ntype Modules = {\n audioRecorderModule: typeof RNAudioRecorder;\n permissionModule: typeof Permissions;\n};\nconst createNativeRecorderService = ({ audioRecorderModule, permissionModule }: Modules): RecorderServiceInterface => {\n const module = new audioRecorderModule.default();\n\n class VoiceRecorder implements RecorderServiceInterface {\n public uri: RecorderServiceInterface['uri'] = undefined;\n public state: RecorderServiceInterface['state'] = 'idle';\n public options: RecorderServiceInterface['options'] = {\n minDuration: VoiceMessageConfig.DEFAULT.RECORDER.MIN_DURATION,\n maxDuration: VoiceMessageConfig.DEFAULT.RECORDER.MAX_DURATION,\n extension: VoiceMessageConfig.DEFAULT.RECORDER.EXTENSION,\n };\n\n // NOTE: In Android, even when startRecorder() is awaited, if stop() is executed immediately afterward, an error occurs\n private _recordStartedAt = 0;\n private _getRecorderStopSafeBuffer = () => {\n const minWaitingTime = 500;\n const elapsedTime = Date.now() - this._recordStartedAt;\n if (elapsedTime > minWaitingTime) return 0;\n else return minWaitingTime - elapsedTime;\n };\n\n private readonly recordingSubscribers = new Set<RecordingListener>();\n private readonly stateSubscribers = new Set<StateListener>();\n private readonly audioSettings = {\n sampleRate: VoiceMessageConfig.DEFAULT.RECORDER.SAMPLE_RATE,\n bitRate: VoiceMessageConfig.DEFAULT.RECORDER.BIT_RATE,\n audioChannels: VoiceMessageConfig.DEFAULT.RECORDER.CHANNELS,\n // encoding: mpeg4_aac\n };\n private readonly audioOptions = Platform.select({\n android: {\n AudioEncodingBitRateAndroid: this.audioSettings.bitRate,\n AudioChannelsAndroid: this.audioSettings.audioChannels,\n AudioSamplingRateAndroid: this.audioSettings.sampleRate,\n AudioEncoderAndroid: audioRecorderModule.AudioEncoderAndroidType.AAC,\n OutputFormatAndroid: audioRecorderModule.OutputFormatAndroidType.MPEG_4,\n AudioSourceAndroid: audioRecorderModule.AudioSourceAndroidType.VOICE_RECOGNITION,\n },\n ios: {\n AVEncoderBitRateKeyIOS: this.audioSettings.bitRate,\n AVNumberOfChannelsKeyIOS: this.audioSettings.audioChannels,\n AVSampleRateKeyIOS: this.audioSettings.sampleRate,\n AVFormatIDKeyIOS: audioRecorderModule.AVEncodingOption.mp4, // same with aac\n AVEncoderAudioQualityKeyIOS: audioRecorderModule.AVEncoderAudioQualityIOSType.high,\n },\n default: {},\n });\n\n constructor() {\n module.setSubscriptionDuration(0.1).catch((error) => {\n Logger.warn('[RecorderService.Native] Failed to set subscription duration', error);\n });\n module.addRecordBackListener((data) => {\n const completed = data.currentPosition >= this.options.maxDuration;\n\n if (completed) {\n this.stop().catch((error) => {\n Logger.warn('[RecorderService.Native] Failed to stop in RecordBackListener', error);\n });\n }\n if (this.state === 'recording') {\n this.recordingSubscribers.forEach((callback) => {\n callback({ currentTime: data.currentPosition, completed });\n });\n }\n });\n }\n\n private setState = (state: RecorderServiceInterface['state']) => {\n this.state = state;\n this.stateSubscribers.forEach((callback) => {\n callback(state);\n });\n };\n\n public requestPermission = async (): Promise<boolean> => {\n const permission: Permission[] | undefined = Platform.select({\n android: [permissionModule.PERMISSIONS.ANDROID.RECORD_AUDIO],\n ios: [permissionModule.PERMISSIONS.IOS.MICROPHONE],\n windows: [permissionModule.PERMISSIONS.WINDOWS.MICROPHONE],\n default: undefined,\n });\n\n if (Platform.OS === 'android' && Platform.Version <= 28) {\n permission?.push(permissionModule.PERMISSIONS.ANDROID.WRITE_EXTERNAL_STORAGE);\n }\n\n if (permission) {\n const status = await permissionModule.checkMultiple(permission);\n if (nativePermissionGranted(status)) {\n return true;\n } else {\n const status = await permissionModule.requestMultiple(permission);\n return nativePermissionGranted(status);\n }\n } else {\n return true;\n }\n };\n\n public addRecordingListener = (callback: RecordingListener): Unsubscribe => {\n this.recordingSubscribers.add(callback);\n return () => {\n this.recordingSubscribers.delete(callback);\n };\n };\n\n public addStateListener = (callback: StateListener): Unsubscribe => {\n this.stateSubscribers.add(callback);\n return () => {\n this.stateSubscribers.delete(callback);\n };\n };\n\n public record = async (uri: string): Promise<void> => {\n if (matchesOneOf(this.state, ['idle', 'completed'])) {\n try {\n this.setState('preparing');\n await module.startRecorder(uri, {\n ...this.audioOptions,\n });\n\n if (Platform.OS === 'android') {\n this._recordStartedAt = Date.now();\n }\n\n this.uri = uri;\n this.setState('recording');\n } catch (e) {\n this.setState('idle');\n throw e;\n }\n }\n };\n\n public stop = async (): Promise<void> => {\n if (matchesOneOf(this.state, ['recording'])) {\n if (Platform.OS === 'android') {\n const buffer = this._getRecorderStopSafeBuffer();\n if (buffer > 0) await sleep(buffer);\n }\n\n await module.stopRecorder();\n this.setState('completed');\n }\n };\n\n public reset = async (): Promise<void> => {\n await this.stop();\n this.uri = undefined;\n this.recordingSubscribers.clear();\n this.setState('idle');\n };\n }\n\n return new VoiceRecorder();\n};\n\nexport default createNativeRecorderService;\n"],"mappings":"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"}
|
package/lib/commonjs/version.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["VERSION","_default","exports","default"],"sources":["version.ts"],"sourcesContent":["const VERSION = '3.7.
|
|
1
|
+
{"version":3,"names":["VERSION","_default","exports","default"],"sources":["version.ts"],"sourcesContent":["const VERSION = '3.7.5';\nexport default VERSION;\n"],"mappings":";;;;;;AAAA,MAAMA,OAAO,GAAG,OAAO;AAAC,IAAAC,QAAA,GACTD,OAAO;AAAAE,OAAA,CAAAC,OAAA,GAAAF,QAAA"}
|
|
@@ -170,7 +170,8 @@ const SendInput = /*#__PURE__*/forwardRef(function SendInput(_ref, ref) {
|
|
|
170
170
|
onClose: onClose,
|
|
171
171
|
onDismiss: () => {
|
|
172
172
|
onDismiss();
|
|
173
|
-
|
|
173
|
+
playerService.reset().catch(() => {});
|
|
174
|
+
recorderService.reset().catch(() => {});
|
|
174
175
|
},
|
|
175
176
|
backgroundStyle: {
|
|
176
177
|
justifyContent: 'flex-end'
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["React","forwardRef","TouchableOpacity","View","MentionType","MessageMetaArray","Icon","Modal","TextInput","createStyleSheet","useAlert","useBottomSheet","useToast","useUIKitTheme","Logger","useDeferredModalState","useIIFE","VOICE_MESSAGE_META_ARRAY_DURATION_KEY","VOICE_MESSAGE_META_ARRAY_MESSAGE_TYPE_KEY","useChannelInputItems","useLocalization","usePlatformService","useSendbirdChat","SBUUtils","SendInput","_ref","ref","style","VoiceMessageInput","MessageToReplyPreview","AttachmentsButton","onPressSendUserMessage","onPressSendFileMessage","text","onChangeText","onSelectionChange","mentionedUsers","inputDisabled","inputFrozen","inputMuted","channel","messageToReply","setMessageToReply","messageForThread","playerService","recorderService","mentionManager","sbOptions","STRINGS","openSheet","toast","onClose","onDismiss","visible","voiceMessageInputVisible","setVisible","setVoiceMessageInputVisible","messageReplyParams","groupChannel","uikit","isGroupChannel","replyType","parentMessageId","messageId","isReplyToChannel","messageMentionParams","enableMention","mentionType","USERS","mentionedUserIds","map","it","user","userId","mentionedMessageTemplate","textToMentionedMessageTemplate","onFailureToSend","error","show","TOAST","SEND_MSG_ERROR","sendUserMessage","message","catch","sendFileMessage","file","sendVoiceMessage","durationMills","USER_MUTED_ERROR","CHANNEL_FROZEN_ERROR","metaArrays","key","value","String","options","extension","sheetItems","getPlaceholder","LABELS","CHANNEL_INPUT_PLACEHOLDER_MUTED","CHANNEL_INPUT_PLACEHOLDER_DISABLED","CHANNEL_INPUT_PLACEHOLDER_REPLY","threadInfo","replyCount","CHANNEL_INPUT_PLACEHOLDER_REPLY_TO_THREAD","CHANNEL_INPUT_PLACEHOLDER_REPLY_IN_THREAD","CHANNEL_INPUT_PLACEHOLDER_ACTIVE","voiceMessageEnabled","enableVoiceMessage","sendButtonVisible","Boolean","trim","createElement","styles","sendInputContainer","onPress","disabled","multiline","disableFullscreenUI","editable","placeholder","textToMentionedComponents","VoiceMessageButton","UserMessageSendButton","disableBackgroundClose","Promise","allSettled","reset","backgroundStyle","justifyContent","type","onSend","_ref2","duration","_ref3","alert","colors","onPressWithPermissionCheck","recorderGranted","requestPermission","title","DIALOG","ALERT_PERMISSIONS_TITLE","ALERT_PERMISSIONS_MESSAGE","PERMISSION_MICROPHONE","PERMISSION_APP_NAME","buttons","ALERT_PERMISSIONS_OK","openSettings","playerGranted","PERMISSION_DEVICE_STORAGE","color","ui","input","default","highlight","active","icon","size","containerStyle","sendIcon","_ref4","paddingVertical","paddingHorizontal","alignItems","flexDirection","marginLeft","padding"],"sources":["SendInput.tsx"],"sourcesContent":["import React, { forwardRef } from 'react';\nimport {\n NativeSyntheticEvent,\n TextInput as RNTextInput,\n TextInputSelectionChangeEventData,\n TouchableOpacity,\n View,\n} from 'react-native';\n\nimport { MentionType, MessageMetaArray } from '@sendbird/chat/message';\nimport {\n Icon,\n Modal,\n TextInput,\n createStyleSheet,\n useAlert,\n useBottomSheet,\n useToast,\n useUIKitTheme,\n} from '@sendbird/uikit-react-native-foundation';\nimport { Logger, useDeferredModalState, useIIFE } from '@sendbird/uikit-utils';\n\nimport { VOICE_MESSAGE_META_ARRAY_DURATION_KEY, VOICE_MESSAGE_META_ARRAY_MESSAGE_TYPE_KEY } from '../../constants';\nimport { useChannelInputItems } from '../../hooks/useChannelInputItems';\nimport { useLocalization, usePlatformService, useSendbirdChat } from '../../hooks/useContext';\nimport SBUUtils from '../../libs/SBUUtils';\nimport type { FileType } from '../../platform/types';\nimport type { MentionedUser } from '../../types';\nimport type { ChannelInputProps } from './index';\n\ninterface SendInputProps extends ChannelInputProps {\n text: string;\n onChangeText: (val: string) => void;\n onSelectionChange: (e: NativeSyntheticEvent<TextInputSelectionChangeEventData>) => void;\n mentionedUsers: MentionedUser[];\n}\n\nconst SendInput = forwardRef<RNTextInput, SendInputProps>(function SendInput(\n {\n style,\n VoiceMessageInput,\n MessageToReplyPreview,\n AttachmentsButton,\n onPressSendUserMessage,\n onPressSendFileMessage,\n text,\n onChangeText,\n onSelectionChange,\n mentionedUsers,\n inputDisabled,\n inputFrozen,\n inputMuted,\n channel,\n messageToReply,\n setMessageToReply,\n messageForThread,\n },\n ref,\n) {\n const { playerService, recorderService } = usePlatformService();\n const { mentionManager, sbOptions } = useSendbirdChat();\n const { STRINGS } = useLocalization();\n const { openSheet } = useBottomSheet();\n const toast = useToast();\n\n const {\n onClose,\n onDismiss,\n visible: voiceMessageInputVisible,\n setVisible: setVoiceMessageInputVisible,\n } = useDeferredModalState();\n\n const messageReplyParams = useIIFE(() => {\n const { groupChannel } = sbOptions.uikit;\n\n if (channel.isGroupChannel()) {\n if (groupChannel.channel.replyType === 'quote_reply' && messageToReply) {\n return {\n parentMessageId: messageToReply.messageId,\n isReplyToChannel: true,\n };\n } else if (groupChannel.channel.replyType === 'thread' && messageForThread) {\n return {\n parentMessageId: messageForThread.messageId,\n isReplyToChannel: true,\n };\n }\n }\n\n return {};\n });\n\n const messageMentionParams = useIIFE(() => {\n const { groupChannel } = sbOptions.uikit;\n if (!channel.isGroupChannel() || !groupChannel.channel.enableMention) return {};\n return {\n mentionType: MentionType.USERS,\n mentionedUserIds: mentionedUsers.map((it) => it.user.userId),\n mentionedMessageTemplate: mentionManager.textToMentionedMessageTemplate(\n text,\n mentionedUsers,\n groupChannel.channel.enableMention,\n ),\n };\n });\n\n const onFailureToSend = (error: Error) => {\n toast.show(STRINGS.TOAST.SEND_MSG_ERROR, 'error');\n Logger.error(STRINGS.TOAST.SEND_MSG_ERROR, error);\n };\n\n const sendUserMessage = () => {\n onPressSendUserMessage({\n message: text,\n ...messageMentionParams,\n ...messageReplyParams,\n }).catch(onFailureToSend);\n\n onChangeText('');\n setMessageToReply?.();\n };\n\n const sendFileMessage = (file: FileType) => {\n onPressSendFileMessage({\n file,\n ...messageReplyParams,\n }).catch(onFailureToSend);\n\n setMessageToReply?.();\n };\n\n const sendVoiceMessage = (file: FileType, durationMills: number) => {\n if (inputMuted) {\n toast.show(STRINGS.TOAST.USER_MUTED_ERROR, 'error');\n Logger.error(STRINGS.TOAST.USER_MUTED_ERROR);\n } else if (inputFrozen) {\n toast.show(STRINGS.TOAST.CHANNEL_FROZEN_ERROR, 'error');\n Logger.error(STRINGS.TOAST.CHANNEL_FROZEN_ERROR);\n } else {\n onPressSendFileMessage({\n file,\n metaArrays: [\n new MessageMetaArray({\n key: VOICE_MESSAGE_META_ARRAY_DURATION_KEY,\n value: [String(durationMills)],\n }),\n new MessageMetaArray({\n key: VOICE_MESSAGE_META_ARRAY_MESSAGE_TYPE_KEY,\n value: [`voice/${recorderService.options.extension}`],\n }),\n ],\n ...messageReplyParams,\n }).catch(onFailureToSend);\n }\n\n onChangeText('');\n setMessageToReply?.();\n };\n\n const sheetItems = useChannelInputItems(channel, sendFileMessage);\n\n const getPlaceholder = () => {\n if (inputMuted) return STRINGS.LABELS.CHANNEL_INPUT_PLACEHOLDER_MUTED;\n if (inputFrozen) return STRINGS.LABELS.CHANNEL_INPUT_PLACEHOLDER_DISABLED;\n if (inputDisabled) return STRINGS.LABELS.CHANNEL_INPUT_PLACEHOLDER_DISABLED;\n if (messageToReply) return STRINGS.LABELS.CHANNEL_INPUT_PLACEHOLDER_REPLY;\n if (messageForThread) {\n if (messageForThread.threadInfo && messageForThread.threadInfo.replyCount > 0) {\n return STRINGS.LABELS.CHANNEL_INPUT_PLACEHOLDER_REPLY_TO_THREAD;\n } else {\n return STRINGS.LABELS.CHANNEL_INPUT_PLACEHOLDER_REPLY_IN_THREAD;\n }\n }\n\n return STRINGS.LABELS.CHANNEL_INPUT_PLACEHOLDER_ACTIVE;\n };\n\n const voiceMessageEnabled = channel.isGroupChannel() && sbOptions.uikit.groupChannel.channel.enableVoiceMessage;\n const sendButtonVisible = Boolean(text.trim());\n\n return (\n <View>\n {MessageToReplyPreview && (\n <MessageToReplyPreview messageToReply={messageToReply} setMessageToReply={setMessageToReply} />\n )}\n <View style={styles.sendInputContainer}>\n {AttachmentsButton && <AttachmentsButton onPress={() => openSheet({ sheetItems })} disabled={inputDisabled} />}\n <TextInput\n ref={ref}\n multiline\n disableFullscreenUI\n onSelectionChange={onSelectionChange}\n editable={!inputDisabled}\n onChangeText={onChangeText}\n style={style}\n placeholder={getPlaceholder()}\n >\n {mentionManager.textToMentionedComponents(\n text,\n mentionedUsers,\n sbOptions.uikit.groupChannel.channel.enableMention,\n )}\n </TextInput>\n\n {voiceMessageEnabled && (\n <VoiceMessageButton\n visible={!sendButtonVisible}\n disabled={inputDisabled}\n onPress={() => setVoiceMessageInputVisible(true)}\n />\n )}\n <UserMessageSendButton visible={sendButtonVisible} disabled={inputDisabled} onPress={sendUserMessage} />\n {voiceMessageEnabled && VoiceMessageInput && (\n <Modal\n disableBackgroundClose\n onClose={onClose}\n onDismiss={() => {\n onDismiss();\n Promise.allSettled([playerService.reset(), recorderService.reset()]);\n }}\n backgroundStyle={{ justifyContent: 'flex-end' }}\n visible={voiceMessageInputVisible}\n type={'slide-no-gesture'}\n >\n <VoiceMessageInput onClose={onClose} onSend={({ file, duration }) => sendVoiceMessage(file, duration)} />\n </Modal>\n )}\n </View>\n </View>\n );\n});\n\ntype InputButtonProps = { visible: boolean; disabled: boolean; onPress: () => void };\nconst VoiceMessageButton = ({ visible, disabled, onPress }: InputButtonProps) => {\n const { STRINGS } = useLocalization();\n const { alert } = useAlert();\n const { playerService, recorderService } = usePlatformService();\n const { colors } = useUIKitTheme();\n if (!visible) return null;\n\n const onPressWithPermissionCheck = async () => {\n const recorderGranted = await recorderService.requestPermission();\n if (!recorderGranted) {\n alert({\n title: STRINGS.DIALOG.ALERT_PERMISSIONS_TITLE,\n message: STRINGS.DIALOG.ALERT_PERMISSIONS_MESSAGE(\n STRINGS.LABELS.PERMISSION_MICROPHONE,\n STRINGS.LABELS.PERMISSION_APP_NAME,\n ),\n buttons: [{ text: STRINGS.DIALOG.ALERT_PERMISSIONS_OK, onPress: () => SBUUtils.openSettings() }],\n });\n Logger.error('Failed to request permission for recorder');\n return;\n }\n\n const playerGranted = await playerService.requestPermission();\n if (!playerGranted) {\n alert({\n title: STRINGS.DIALOG.ALERT_PERMISSIONS_TITLE,\n message: STRINGS.DIALOG.ALERT_PERMISSIONS_MESSAGE(\n STRINGS.LABELS.PERMISSION_DEVICE_STORAGE,\n STRINGS.LABELS.PERMISSION_APP_NAME,\n ),\n buttons: [{ text: STRINGS.DIALOG.ALERT_PERMISSIONS_OK, onPress: () => SBUUtils.openSettings() }],\n });\n Logger.error('Failed to request permission for player');\n return;\n }\n\n onPress();\n };\n\n return (\n <TouchableOpacity onPress={onPressWithPermissionCheck} disabled={disabled}>\n <Icon\n color={disabled ? colors.ui.input.default.disabled.highlight : colors.ui.input.default.active.highlight}\n icon={'audio-on'}\n size={24}\n containerStyle={styles.sendIcon}\n />\n </TouchableOpacity>\n );\n};\nconst UserMessageSendButton = ({ visible, disabled, onPress }: InputButtonProps) => {\n const { colors } = useUIKitTheme();\n if (!visible) return null;\n return (\n <TouchableOpacity onPress={onPress} disabled={disabled}>\n <Icon\n color={disabled ? colors.ui.input.default.disabled.highlight : colors.ui.input.default.active.highlight}\n icon={'send'}\n size={24}\n containerStyle={styles.sendIcon}\n />\n </TouchableOpacity>\n );\n};\n\nconst styles = createStyleSheet({\n sendInputContainer: {\n paddingVertical: 10,\n paddingHorizontal: 12,\n alignItems: 'center',\n flexDirection: 'row',\n },\n sendIcon: {\n marginLeft: 4,\n padding: 4,\n },\n});\n\nexport default SendInput;\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"names":["React","forwardRef","TouchableOpacity","View","MentionType","MessageMetaArray","Icon","Modal","TextInput","createStyleSheet","useAlert","useBottomSheet","useToast","useUIKitTheme","Logger","useDeferredModalState","useIIFE","VOICE_MESSAGE_META_ARRAY_DURATION_KEY","VOICE_MESSAGE_META_ARRAY_MESSAGE_TYPE_KEY","useChannelInputItems","useLocalization","usePlatformService","useSendbirdChat","SBUUtils","SendInput","_ref","ref","style","VoiceMessageInput","MessageToReplyPreview","AttachmentsButton","onPressSendUserMessage","onPressSendFileMessage","text","onChangeText","onSelectionChange","mentionedUsers","inputDisabled","inputFrozen","inputMuted","channel","messageToReply","setMessageToReply","messageForThread","playerService","recorderService","mentionManager","sbOptions","STRINGS","openSheet","toast","onClose","onDismiss","visible","voiceMessageInputVisible","setVisible","setVoiceMessageInputVisible","messageReplyParams","groupChannel","uikit","isGroupChannel","replyType","parentMessageId","messageId","isReplyToChannel","messageMentionParams","enableMention","mentionType","USERS","mentionedUserIds","map","it","user","userId","mentionedMessageTemplate","textToMentionedMessageTemplate","onFailureToSend","error","show","TOAST","SEND_MSG_ERROR","sendUserMessage","message","catch","sendFileMessage","file","sendVoiceMessage","durationMills","USER_MUTED_ERROR","CHANNEL_FROZEN_ERROR","metaArrays","key","value","String","options","extension","sheetItems","getPlaceholder","LABELS","CHANNEL_INPUT_PLACEHOLDER_MUTED","CHANNEL_INPUT_PLACEHOLDER_DISABLED","CHANNEL_INPUT_PLACEHOLDER_REPLY","threadInfo","replyCount","CHANNEL_INPUT_PLACEHOLDER_REPLY_TO_THREAD","CHANNEL_INPUT_PLACEHOLDER_REPLY_IN_THREAD","CHANNEL_INPUT_PLACEHOLDER_ACTIVE","voiceMessageEnabled","enableVoiceMessage","sendButtonVisible","Boolean","trim","createElement","styles","sendInputContainer","onPress","disabled","multiline","disableFullscreenUI","editable","placeholder","textToMentionedComponents","VoiceMessageButton","UserMessageSendButton","disableBackgroundClose","reset","backgroundStyle","justifyContent","type","onSend","_ref2","duration","_ref3","alert","colors","onPressWithPermissionCheck","recorderGranted","requestPermission","title","DIALOG","ALERT_PERMISSIONS_TITLE","ALERT_PERMISSIONS_MESSAGE","PERMISSION_MICROPHONE","PERMISSION_APP_NAME","buttons","ALERT_PERMISSIONS_OK","openSettings","playerGranted","PERMISSION_DEVICE_STORAGE","color","ui","input","default","highlight","active","icon","size","containerStyle","sendIcon","_ref4","paddingVertical","paddingHorizontal","alignItems","flexDirection","marginLeft","padding"],"sources":["SendInput.tsx"],"sourcesContent":["import React, { forwardRef } from 'react';\nimport {\n NativeSyntheticEvent,\n TextInput as RNTextInput,\n TextInputSelectionChangeEventData,\n TouchableOpacity,\n View,\n} from 'react-native';\n\nimport { MentionType, MessageMetaArray } from '@sendbird/chat/message';\nimport {\n Icon,\n Modal,\n TextInput,\n createStyleSheet,\n useAlert,\n useBottomSheet,\n useToast,\n useUIKitTheme,\n} from '@sendbird/uikit-react-native-foundation';\nimport { Logger, useDeferredModalState, useIIFE } from '@sendbird/uikit-utils';\n\nimport { VOICE_MESSAGE_META_ARRAY_DURATION_KEY, VOICE_MESSAGE_META_ARRAY_MESSAGE_TYPE_KEY } from '../../constants';\nimport { useChannelInputItems } from '../../hooks/useChannelInputItems';\nimport { useLocalization, usePlatformService, useSendbirdChat } from '../../hooks/useContext';\nimport SBUUtils from '../../libs/SBUUtils';\nimport type { FileType } from '../../platform/types';\nimport type { MentionedUser } from '../../types';\nimport type { ChannelInputProps } from './index';\n\ninterface SendInputProps extends ChannelInputProps {\n text: string;\n onChangeText: (val: string) => void;\n onSelectionChange: (e: NativeSyntheticEvent<TextInputSelectionChangeEventData>) => void;\n mentionedUsers: MentionedUser[];\n}\n\nconst SendInput = forwardRef<RNTextInput, SendInputProps>(function SendInput(\n {\n style,\n VoiceMessageInput,\n MessageToReplyPreview,\n AttachmentsButton,\n onPressSendUserMessage,\n onPressSendFileMessage,\n text,\n onChangeText,\n onSelectionChange,\n mentionedUsers,\n inputDisabled,\n inputFrozen,\n inputMuted,\n channel,\n messageToReply,\n setMessageToReply,\n messageForThread,\n },\n ref,\n) {\n const { playerService, recorderService } = usePlatformService();\n const { mentionManager, sbOptions } = useSendbirdChat();\n const { STRINGS } = useLocalization();\n const { openSheet } = useBottomSheet();\n const toast = useToast();\n\n const {\n onClose,\n onDismiss,\n visible: voiceMessageInputVisible,\n setVisible: setVoiceMessageInputVisible,\n } = useDeferredModalState();\n\n const messageReplyParams = useIIFE(() => {\n const { groupChannel } = sbOptions.uikit;\n\n if (channel.isGroupChannel()) {\n if (groupChannel.channel.replyType === 'quote_reply' && messageToReply) {\n return {\n parentMessageId: messageToReply.messageId,\n isReplyToChannel: true,\n };\n } else if (groupChannel.channel.replyType === 'thread' && messageForThread) {\n return {\n parentMessageId: messageForThread.messageId,\n isReplyToChannel: true,\n };\n }\n }\n\n return {};\n });\n\n const messageMentionParams = useIIFE(() => {\n const { groupChannel } = sbOptions.uikit;\n if (!channel.isGroupChannel() || !groupChannel.channel.enableMention) return {};\n return {\n mentionType: MentionType.USERS,\n mentionedUserIds: mentionedUsers.map((it) => it.user.userId),\n mentionedMessageTemplate: mentionManager.textToMentionedMessageTemplate(\n text,\n mentionedUsers,\n groupChannel.channel.enableMention,\n ),\n };\n });\n\n const onFailureToSend = (error: Error) => {\n toast.show(STRINGS.TOAST.SEND_MSG_ERROR, 'error');\n Logger.error(STRINGS.TOAST.SEND_MSG_ERROR, error);\n };\n\n const sendUserMessage = () => {\n onPressSendUserMessage({\n message: text,\n ...messageMentionParams,\n ...messageReplyParams,\n }).catch(onFailureToSend);\n\n onChangeText('');\n setMessageToReply?.();\n };\n\n const sendFileMessage = (file: FileType) => {\n onPressSendFileMessage({\n file,\n ...messageReplyParams,\n }).catch(onFailureToSend);\n\n setMessageToReply?.();\n };\n\n const sendVoiceMessage = (file: FileType, durationMills: number) => {\n if (inputMuted) {\n toast.show(STRINGS.TOAST.USER_MUTED_ERROR, 'error');\n Logger.error(STRINGS.TOAST.USER_MUTED_ERROR);\n } else if (inputFrozen) {\n toast.show(STRINGS.TOAST.CHANNEL_FROZEN_ERROR, 'error');\n Logger.error(STRINGS.TOAST.CHANNEL_FROZEN_ERROR);\n } else {\n onPressSendFileMessage({\n file,\n metaArrays: [\n new MessageMetaArray({\n key: VOICE_MESSAGE_META_ARRAY_DURATION_KEY,\n value: [String(durationMills)],\n }),\n new MessageMetaArray({\n key: VOICE_MESSAGE_META_ARRAY_MESSAGE_TYPE_KEY,\n value: [`voice/${recorderService.options.extension}`],\n }),\n ],\n ...messageReplyParams,\n }).catch(onFailureToSend);\n }\n\n onChangeText('');\n setMessageToReply?.();\n };\n\n const sheetItems = useChannelInputItems(channel, sendFileMessage);\n\n const getPlaceholder = () => {\n if (inputMuted) return STRINGS.LABELS.CHANNEL_INPUT_PLACEHOLDER_MUTED;\n if (inputFrozen) return STRINGS.LABELS.CHANNEL_INPUT_PLACEHOLDER_DISABLED;\n if (inputDisabled) return STRINGS.LABELS.CHANNEL_INPUT_PLACEHOLDER_DISABLED;\n if (messageToReply) return STRINGS.LABELS.CHANNEL_INPUT_PLACEHOLDER_REPLY;\n if (messageForThread) {\n if (messageForThread.threadInfo && messageForThread.threadInfo.replyCount > 0) {\n return STRINGS.LABELS.CHANNEL_INPUT_PLACEHOLDER_REPLY_TO_THREAD;\n } else {\n return STRINGS.LABELS.CHANNEL_INPUT_PLACEHOLDER_REPLY_IN_THREAD;\n }\n }\n\n return STRINGS.LABELS.CHANNEL_INPUT_PLACEHOLDER_ACTIVE;\n };\n\n const voiceMessageEnabled = channel.isGroupChannel() && sbOptions.uikit.groupChannel.channel.enableVoiceMessage;\n const sendButtonVisible = Boolean(text.trim());\n\n return (\n <View>\n {MessageToReplyPreview && (\n <MessageToReplyPreview messageToReply={messageToReply} setMessageToReply={setMessageToReply} />\n )}\n <View style={styles.sendInputContainer}>\n {AttachmentsButton && <AttachmentsButton onPress={() => openSheet({ sheetItems })} disabled={inputDisabled} />}\n <TextInput\n ref={ref}\n multiline\n disableFullscreenUI\n onSelectionChange={onSelectionChange}\n editable={!inputDisabled}\n onChangeText={onChangeText}\n style={style}\n placeholder={getPlaceholder()}\n >\n {mentionManager.textToMentionedComponents(\n text,\n mentionedUsers,\n sbOptions.uikit.groupChannel.channel.enableMention,\n )}\n </TextInput>\n\n {voiceMessageEnabled && (\n <VoiceMessageButton\n visible={!sendButtonVisible}\n disabled={inputDisabled}\n onPress={() => setVoiceMessageInputVisible(true)}\n />\n )}\n <UserMessageSendButton visible={sendButtonVisible} disabled={inputDisabled} onPress={sendUserMessage} />\n {voiceMessageEnabled && VoiceMessageInput && (\n <Modal\n disableBackgroundClose\n onClose={onClose}\n onDismiss={() => {\n onDismiss();\n playerService.reset().catch(() => {});\n recorderService.reset().catch(() => {});\n }}\n backgroundStyle={{ justifyContent: 'flex-end' }}\n visible={voiceMessageInputVisible}\n type={'slide-no-gesture'}\n >\n <VoiceMessageInput onClose={onClose} onSend={({ file, duration }) => sendVoiceMessage(file, duration)} />\n </Modal>\n )}\n </View>\n </View>\n );\n});\n\ntype InputButtonProps = { visible: boolean; disabled: boolean; onPress: () => void };\nconst VoiceMessageButton = ({ visible, disabled, onPress }: InputButtonProps) => {\n const { STRINGS } = useLocalization();\n const { alert } = useAlert();\n const { playerService, recorderService } = usePlatformService();\n const { colors } = useUIKitTheme();\n if (!visible) return null;\n\n const onPressWithPermissionCheck = async () => {\n const recorderGranted = await recorderService.requestPermission();\n if (!recorderGranted) {\n alert({\n title: STRINGS.DIALOG.ALERT_PERMISSIONS_TITLE,\n message: STRINGS.DIALOG.ALERT_PERMISSIONS_MESSAGE(\n STRINGS.LABELS.PERMISSION_MICROPHONE,\n STRINGS.LABELS.PERMISSION_APP_NAME,\n ),\n buttons: [{ text: STRINGS.DIALOG.ALERT_PERMISSIONS_OK, onPress: () => SBUUtils.openSettings() }],\n });\n Logger.error('Failed to request permission for recorder');\n return;\n }\n\n const playerGranted = await playerService.requestPermission();\n if (!playerGranted) {\n alert({\n title: STRINGS.DIALOG.ALERT_PERMISSIONS_TITLE,\n message: STRINGS.DIALOG.ALERT_PERMISSIONS_MESSAGE(\n STRINGS.LABELS.PERMISSION_DEVICE_STORAGE,\n STRINGS.LABELS.PERMISSION_APP_NAME,\n ),\n buttons: [{ text: STRINGS.DIALOG.ALERT_PERMISSIONS_OK, onPress: () => SBUUtils.openSettings() }],\n });\n Logger.error('Failed to request permission for player');\n return;\n }\n\n onPress();\n };\n\n return (\n <TouchableOpacity onPress={onPressWithPermissionCheck} disabled={disabled}>\n <Icon\n color={disabled ? colors.ui.input.default.disabled.highlight : colors.ui.input.default.active.highlight}\n icon={'audio-on'}\n size={24}\n containerStyle={styles.sendIcon}\n />\n </TouchableOpacity>\n );\n};\nconst UserMessageSendButton = ({ visible, disabled, onPress }: InputButtonProps) => {\n const { colors } = useUIKitTheme();\n if (!visible) return null;\n return (\n <TouchableOpacity onPress={onPress} disabled={disabled}>\n <Icon\n color={disabled ? colors.ui.input.default.disabled.highlight : colors.ui.input.default.active.highlight}\n icon={'send'}\n size={24}\n containerStyle={styles.sendIcon}\n />\n </TouchableOpacity>\n );\n};\n\nconst styles = createStyleSheet({\n sendInputContainer: {\n paddingVertical: 10,\n paddingHorizontal: 12,\n alignItems: 'center',\n flexDirection: 'row',\n },\n sendIcon: {\n marginLeft: 4,\n padding: 4,\n },\n});\n\nexport default SendInput;\n"],"mappings":"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"}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import React, { useEffect, useRef } from 'react';
|
|
2
2
|
import { Animated } from 'react-native';
|
|
3
3
|
import { Box, Icon, PressBox, ProgressBar, Text, createStyleSheet, useUIKitTheme } from '@sendbird/uikit-react-native-foundation';
|
|
4
|
-
import { conditionChaining, millsToMMSS } from '@sendbird/uikit-utils';
|
|
4
|
+
import { Logger, conditionChaining, millsToMMSS } from '@sendbird/uikit-utils';
|
|
5
5
|
import { useLocalization } from '../../hooks/useContext';
|
|
6
6
|
import useVoiceMessageInput from '../../hooks/useVoiceMessageInput';
|
|
7
7
|
const VoiceMessageInput = _ref => {
|
|
@@ -27,32 +27,42 @@ const VoiceMessageInput = _ref => {
|
|
|
27
27
|
});
|
|
28
28
|
const uiColors = colors.ui.voiceMessageInput.default[state.status !== 'idle' ? 'active' : 'inactive'];
|
|
29
29
|
const onPressCancel = async () => {
|
|
30
|
-
actions.cancel()
|
|
31
|
-
|
|
30
|
+
await actions.cancel().catch(error => {
|
|
31
|
+
Logger.warn('Failed to cancel voice message input', error);
|
|
32
|
+
}).finally(() => {
|
|
33
|
+
onClose();
|
|
34
|
+
});
|
|
32
35
|
};
|
|
33
36
|
const onPressSend = async () => {
|
|
34
|
-
actions.send()
|
|
35
|
-
|
|
37
|
+
await actions.send().catch(error => {
|
|
38
|
+
Logger.warn('Failed to send voice message', error);
|
|
39
|
+
}).finally(() => {
|
|
40
|
+
onClose();
|
|
41
|
+
});
|
|
36
42
|
};
|
|
37
|
-
const onPressVoiceMessageAction = () => {
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
43
|
+
const onPressVoiceMessageAction = async () => {
|
|
44
|
+
try {
|
|
45
|
+
switch (state.status) {
|
|
46
|
+
case 'idle':
|
|
47
|
+
await actions.startRecording();
|
|
48
|
+
break;
|
|
49
|
+
case 'recording':
|
|
50
|
+
if (lessThanMinimumDuration) {
|
|
51
|
+
await actions.cancel();
|
|
52
|
+
} else {
|
|
53
|
+
await actions.stopRecording();
|
|
54
|
+
}
|
|
55
|
+
break;
|
|
56
|
+
case 'recording_completed':
|
|
57
|
+
case 'playing_paused':
|
|
58
|
+
await actions.playPlayer();
|
|
59
|
+
break;
|
|
60
|
+
case 'playing':
|
|
61
|
+
await actions.pausePlayer();
|
|
62
|
+
break;
|
|
63
|
+
}
|
|
64
|
+
} catch (error) {
|
|
65
|
+
Logger.warn('Failed to run voice message action.', state);
|
|
56
66
|
}
|
|
57
67
|
};
|
|
58
68
|
const renderActionIcon = () => {
|