@sendbird/uikit-react-native 3.10.2 → 3.11.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +2 -2
- package/lib/commonjs/components/ChannelInput/VoiceMessageInput.js +1 -1
- package/lib/commonjs/components/ChannelInput/VoiceMessageInput.js.map +1 -1
- package/lib/commonjs/components/ChannelInput/index.js +2 -25
- package/lib/commonjs/components/ChannelInput/index.js.map +1 -1
- package/lib/commonjs/hooks/useVoiceMessageInput.js +10 -2
- package/lib/commonjs/hooks/useVoiceMessageInput.js.map +1 -1
- package/lib/commonjs/platform/createFileService.native.js +1 -1
- package/lib/commonjs/platform/createFileService.native.js.map +1 -1
- package/lib/commonjs/platform/createPlayerService.native.js +191 -114
- package/lib/commonjs/platform/createPlayerService.native.js.map +1 -1
- package/lib/commonjs/platform/createRecorderService.expo.js +3 -0
- package/lib/commonjs/platform/createRecorderService.expo.js.map +1 -1
- package/lib/commonjs/platform/createRecorderService.native.js +212 -129
- package/lib/commonjs/platform/createRecorderService.native.js.map +1 -1
- package/lib/commonjs/platform/types.js.map +1 -1
- package/lib/commonjs/version.js +1 -1
- package/lib/commonjs/version.js.map +1 -1
- package/lib/module/components/ChannelInput/VoiceMessageInput.js +1 -1
- package/lib/module/components/ChannelInput/VoiceMessageInput.js.map +1 -1
- package/lib/module/components/ChannelInput/index.js +3 -26
- package/lib/module/components/ChannelInput/index.js.map +1 -1
- package/lib/module/hooks/useVoiceMessageInput.js +10 -2
- package/lib/module/hooks/useVoiceMessageInput.js.map +1 -1
- package/lib/module/platform/createFileService.native.js +1 -1
- package/lib/module/platform/createFileService.native.js.map +1 -1
- package/lib/module/platform/createPlayerService.native.js +191 -114
- package/lib/module/platform/createPlayerService.native.js.map +1 -1
- package/lib/module/platform/createRecorderService.expo.js +3 -0
- package/lib/module/platform/createRecorderService.expo.js.map +1 -1
- package/lib/module/platform/createRecorderService.native.js +212 -129
- package/lib/module/platform/createRecorderService.native.js.map +1 -1
- package/lib/module/platform/types.js.map +1 -1
- package/lib/module/version.js +1 -1
- package/lib/module/version.js.map +1 -1
- package/lib/typescript/src/containers/SendbirdUIKitContainer.d.ts +1 -1
- package/lib/typescript/src/platform/createPlayerService.native.d.ts +5 -3
- package/lib/typescript/src/platform/createRecorderService.native.d.ts +5 -3
- package/lib/typescript/src/platform/types.d.ts +4 -0
- package/lib/typescript/src/version.d.ts +1 -1
- package/package.json +18 -5
- package/src/components/ChannelInput/VoiceMessageInput.tsx +1 -1
- package/src/components/ChannelInput/index.tsx +6 -36
- package/src/hooks/useVoiceMessageInput.ts +7 -2
- package/src/platform/createFileService.native.ts +1 -1
- package/src/platform/createPlayerService.native.tsx +237 -113
- package/src/platform/createRecorderService.expo.tsx +4 -0
- package/src/platform/createRecorderService.native.tsx +240 -118
- package/src/platform/types.ts +5 -0
- package/src/version.ts +1 -1
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
function _extends() { return _extends = Object.assign ? Object.assign.bind() : function (n) { for (var e = 1; e < arguments.length; e++) { var t = arguments[e]; for (var r in t) ({}).hasOwnProperty.call(t, r) && (n[r] = t[r]); } return n; }, _extends.apply(null, arguments); }
|
|
2
2
|
import React, { useEffect, useMemo, useState } from 'react';
|
|
3
|
-
import {
|
|
3
|
+
import { KeyboardAvoidingView, Platform, StyleSheet, View } from 'react-native';
|
|
4
4
|
import { createStyleSheet, useUIKitTheme } from '@sendbird/uikit-react-native-foundation';
|
|
5
5
|
import { Logger, replace, useIIFE, useSafeAreaPadding } from '@sendbird/uikit-utils';
|
|
6
6
|
import { useSendbirdChat } from '../../hooks/useContext';
|
|
@@ -15,10 +15,8 @@ const AUTO_FOCUS = Platform.select({
|
|
|
15
15
|
android: true,
|
|
16
16
|
default: false
|
|
17
17
|
});
|
|
18
|
-
const isAndroidApi35Plus = Platform.OS === 'android' && Platform.Version >= 35;
|
|
19
18
|
const KEYBOARD_AVOID_VIEW_BEHAVIOR = Platform.select({
|
|
20
19
|
ios: 'padding',
|
|
21
|
-
android: isAndroidApi35Plus ? 'padding' : undefined,
|
|
22
20
|
default: undefined
|
|
23
21
|
});
|
|
24
22
|
|
|
@@ -38,15 +36,6 @@ const ChannelInput = props => {
|
|
|
38
36
|
setMessageToEdit
|
|
39
37
|
} = props;
|
|
40
38
|
const safeArea = useSafeAreaPadding(['top', 'left', 'right', 'bottom']);
|
|
41
|
-
|
|
42
|
-
// Android API 35+ keyboard avoidance handling
|
|
43
|
-
/**
|
|
44
|
-
* Android API 35+ introduced edge-to-edge layouts, which changed how keyboard avoidance should be handled.
|
|
45
|
-
* For API 35+, the system manages insets automatically, so we use the provided keyboardAvoidOffset directly.
|
|
46
|
-
* For older Android versions, we manually subtract the safe area bottom padding to avoid overlapping with system UI.
|
|
47
|
-
* See: https://developer.android.com/develop/ui/views/layout/edge-to-edge
|
|
48
|
-
*/
|
|
49
|
-
const keyboardVerticalOffset = isAndroidApi35Plus ? keyboardAvoidOffset : -safeArea.paddingBottom + keyboardAvoidOffset;
|
|
50
39
|
const {
|
|
51
40
|
colors,
|
|
52
41
|
typography
|
|
@@ -96,25 +85,13 @@ const ChannelInput = props => {
|
|
|
96
85
|
range
|
|
97
86
|
});
|
|
98
87
|
};
|
|
99
|
-
const [keyboardShown, setKeyboardShown] = useState(false);
|
|
100
|
-
useEffect(() => {
|
|
101
|
-
const keyboardDidShow = () => setKeyboardShown(true);
|
|
102
|
-
const keyboardDidHide = () => setKeyboardShown(false);
|
|
103
|
-
const showSubscription = Keyboard.addListener('keyboardDidShow', keyboardDidShow);
|
|
104
|
-
const hideSubscription = Keyboard.addListener('keyboardDidHide', keyboardDidHide);
|
|
105
|
-
return () => {
|
|
106
|
-
showSubscription.remove();
|
|
107
|
-
hideSubscription.remove();
|
|
108
|
-
};
|
|
109
|
-
}, []);
|
|
110
|
-
const shouldShowSafeAreaBottom = !isAndroidApi35Plus || isAndroidApi35Plus && !keyboardShown;
|
|
111
88
|
if (!props.shouldRenderInput) {
|
|
112
89
|
return /*#__PURE__*/React.createElement(SafeAreaBottom, {
|
|
113
90
|
height: safeArea.paddingBottom
|
|
114
91
|
});
|
|
115
92
|
}
|
|
116
93
|
return /*#__PURE__*/React.createElement(React.Fragment, null, /*#__PURE__*/React.createElement(KeyboardAvoidingView, {
|
|
117
|
-
keyboardVerticalOffset:
|
|
94
|
+
keyboardVerticalOffset: -safeArea.paddingBottom + keyboardAvoidOffset,
|
|
118
95
|
behavior: KEYBOARD_AVOID_VIEW_BEHAVIOR
|
|
119
96
|
}, /*#__PURE__*/React.createElement(View, {
|
|
120
97
|
style: {
|
|
@@ -147,7 +124,7 @@ const ChannelInput = props => {
|
|
|
147
124
|
messageToEdit: messageToEdit,
|
|
148
125
|
setMessageToEdit: setMessageToEdit,
|
|
149
126
|
style: textInputStyle
|
|
150
|
-
}))),
|
|
127
|
+
}))), /*#__PURE__*/React.createElement(SafeAreaBottom, {
|
|
151
128
|
height: safeArea.paddingBottom
|
|
152
129
|
}))), mentionAvailable && props.SuggestedMentionList && /*#__PURE__*/React.createElement(props.SuggestedMentionList, {
|
|
153
130
|
text: text,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["React","useEffect","useMemo","useState","Keyboard","KeyboardAvoidingView","Platform","StyleSheet","View","createStyleSheet","useUIKitTheme","Logger","replace","useIIFE","useSafeAreaPadding","useSendbirdChat","useMentionTextInput","AttachmentsButton","EditInput","MessageToReplyPreview","SendInput","VoiceMessageInput","AUTO_FOCUS","select","ios","android","default","isAndroidApi35Plus","OS","Version","KEYBOARD_AVOID_VIEW_BEHAVIOR","undefined","ChannelInput","props","channel","keyboardAvoidOffset","messageToEdit","setMessageToEdit","safeArea","keyboardVerticalOffset","paddingBottom","colors","typography","sbOptions","mentionManager","selection","onSelectionChange","textInputRef","text","onChangeText","mentionedUsers","inputMode","isFileMessage","mentionAvailable","uikit","groupChannel","enableMention","isGroupChannel","isBroadcast","inputKeyToRemount","inputHeight","setInputHeight","styles","inputDefault","height","fontStyle","body3","fontSize","lineHeight","textAlignVertical","textInputStyle","flatten","input","style","useTypingTrigger","useTextClearOnDisabled","inputDisabled","useAutoFocusOnEditMode","onPressToMention","user","searchStringRange","mentionedMessageText","asMentionedMessageText","range","start","end","length","keyboardShown","setKeyboardShown","keyboardDidShow","keyboardDidHide","showSubscription","addListener","hideSubscription","remove","shouldShowSafeAreaBottom","shouldRenderInput","createElement","SafeAreaBottom","Fragment","behavior","paddingStart","paddingEnd","backgroundColor","background","onLayout","e","nativeEvent","layout","inputContainer","_extends","key","ref","autoFocus","SuggestedMentionList","topInset","paddingTop","bottomInset","triggerTyping","action","endTyping","startTyping","catch","error","debug","setText","chatDisabled","isUserMessage","setTimeout","_textInputRef$current","current","focus","justifyContent","width","flex","marginEnd","borderRadius","minHeight","maxHeight","memo"],"sources":["index.tsx"],"sourcesContent":["import React, { useEffect, useMemo, useState } from 'react';\nimport {\n Keyboard,\n KeyboardAvoidingView,\n Platform,\n StyleProp,\n StyleSheet,\n TextInput,\n TextInputProps,\n TextStyle,\n View,\n} from 'react-native';\n\nimport { createStyleSheet, useUIKitTheme } from '@sendbird/uikit-react-native-foundation';\nimport {\n Logger,\n SendbirdBaseChannel,\n SendbirdBaseMessage,\n SendbirdFileMessage,\n SendbirdFileMessageCreateParams,\n SendbirdFileMessageUpdateParams,\n SendbirdMember,\n SendbirdUserMessage,\n SendbirdUserMessageCreateParams,\n SendbirdUserMessageUpdateParams,\n replace,\n useIIFE,\n useSafeAreaPadding,\n} from '@sendbird/uikit-utils';\n\nimport { useSendbirdChat } from '../../hooks/useContext';\nimport useMentionTextInput from '../../hooks/useMentionTextInput';\nimport type { CommonComponent, MentionedUser, Range } from '../../types';\nimport type { AttachmentsButtonProps } from './AttachmentsButton';\nimport AttachmentsButton from './AttachmentsButton';\nimport EditInput from './EditInput';\nimport type { MessageToReplyPreviewProps } from './MessageToReplyPreview';\nimport { MessageToReplyPreview } from './MessageToReplyPreview';\nimport SendInput from './SendInput';\nimport VoiceMessageInput, { VoiceMessageInputProps } from './VoiceMessageInput';\n\nexport type SuggestedMentionListProps = {\n text: string;\n selection: Range;\n topInset: number;\n bottomInset: number;\n inputHeight: number;\n onPressToMention: (user: SendbirdMember, searchStringRange: Range) => void;\n mentionedUsers: MentionedUser[];\n /**\n * Whether to show user id information on each item.\n * */\n showUserId?: boolean;\n};\n\nexport type ChannelInputProps = {\n // style\n style?: StyleProp<TextStyle>;\n\n // default\n channel: SendbirdBaseChannel;\n shouldRenderInput: boolean;\n keyboardAvoidOffset: number;\n\n // default actions\n onPressSendUserMessage: (params: SendbirdUserMessageCreateParams) => Promise<void>;\n onPressSendFileMessage: (params: SendbirdFileMessageCreateParams) => Promise<void>;\n onPressUpdateUserMessage: (message: SendbirdUserMessage, params: SendbirdUserMessageUpdateParams) => Promise<void>;\n onPressUpdateFileMessage: (message: SendbirdFileMessage, params: SendbirdFileMessageUpdateParams) => Promise<void>;\n\n // input status\n inputFrozen: boolean;\n inputMuted: boolean;\n inputDisabled: boolean;\n\n // edit\n messageToEdit: undefined | SendbirdUserMessage | SendbirdFileMessage;\n setMessageToEdit: (message?: undefined | SendbirdUserMessage | SendbirdFileMessage) => void;\n\n // reply - only available on group channel\n messageToReply?: undefined | SendbirdUserMessage | SendbirdFileMessage;\n setMessageToReply?: (message?: undefined | SendbirdUserMessage | SendbirdFileMessage) => void;\n messageForThread?: undefined | SendbirdUserMessage | SendbirdFileMessage;\n\n // mention\n SuggestedMentionList?: CommonComponent<SuggestedMentionListProps>;\n\n // sub-components\n AttachmentsButton?: (props: AttachmentsButtonProps) => React.ReactNode | null;\n MessageToReplyPreview?: (props: MessageToReplyPreviewProps) => React.ReactNode | null;\n VoiceMessageInput?: (props: VoiceMessageInputProps) => React.ReactNode | null;\n\n // TextInput props - only safe properties that don't interfere with UIKit functionality\n partialTextInputProps?: Partial<Pick<TextInputProps, 'autoCorrect'>>;\n};\n\nconst AUTO_FOCUS = Platform.select({ ios: false, android: true, default: false });\nconst isAndroidApi35Plus = Platform.OS === 'android' && Platform.Version >= 35;\nconst KEYBOARD_AVOID_VIEW_BEHAVIOR = Platform.select({\n ios: 'padding' as const,\n android: isAndroidApi35Plus ? ('padding' as const) : undefined,\n default: undefined,\n});\n\n// FIXME(iOS): Dynamic style does not work properly when typing the CJK. (https://github.com/facebook/react-native/issues/26107)\n// To workaround temporarily, change the key for re-mount the component.\n// -> This will affect to keyboard blur when add/remove first mentioned user.\n// const GET_INPUT_KEY = (shouldReset: boolean) => {\n// return Platform.OS === 'ios' && shouldReset ? 'uikit-input-clear' : 'uikit-input';\n// };\n\n// TODO: Refactor 'Edit' mode to clearly\nconst ChannelInput = (props: ChannelInputProps) => {\n const { channel, keyboardAvoidOffset, messageToEdit, setMessageToEdit } = props;\n\n const safeArea = useSafeAreaPadding(['top', 'left', 'right', 'bottom']);\n\n // Android API 35+ keyboard avoidance handling\n /**\n * Android API 35+ introduced edge-to-edge layouts, which changed how keyboard avoidance should be handled.\n * For API 35+, the system manages insets automatically, so we use the provided keyboardAvoidOffset directly.\n * For older Android versions, we manually subtract the safe area bottom padding to avoid overlapping with system UI.\n * See: https://developer.android.com/develop/ui/views/layout/edge-to-edge\n */\n const keyboardVerticalOffset = isAndroidApi35Plus\n ? keyboardAvoidOffset\n : -safeArea.paddingBottom + keyboardAvoidOffset;\n const { colors, typography } = useUIKitTheme();\n const { sbOptions, mentionManager } = useSendbirdChat();\n\n const { selection, onSelectionChange, textInputRef, text, onChangeText, mentionedUsers } = useMentionTextInput({\n messageToEdit,\n });\n const inputMode = useIIFE(() => {\n if (messageToEdit && !messageToEdit.isFileMessage()) return 'edit';\n else return 'send';\n });\n\n const mentionAvailable =\n sbOptions.uikit.groupChannel.channel.enableMention && channel.isGroupChannel() && !channel.isBroadcast;\n const inputKeyToRemount = 'input'; //GET_INPUT_KEY(mentionAvailable ? mentionedUsers.length === 0 : false);\n\n const [inputHeight, setInputHeight] = useState(styles.inputDefault.height);\n\n const fontStyle = useMemo(() => {\n if (!typography.body3.fontSize) return typography.body3;\n // NOTE: iOS does not support textAlignVertical, so we should adjust lineHeight to center the text in multiline TextInput.\n return { ...typography.body3, lineHeight: typography.body3.fontSize * 1.275, textAlignVertical: 'center' };\n }, [typography.body3.fontSize]);\n\n const textInputStyle = StyleSheet.flatten([styles.input, fontStyle, props.style]);\n\n useTypingTrigger(text, channel);\n useTextClearOnDisabled(onChangeText, props.inputDisabled);\n useAutoFocusOnEditMode(textInputRef, messageToEdit);\n\n const onPressToMention = (user: SendbirdMember, searchStringRange: Range) => {\n const mentionedMessageText = mentionManager.asMentionedMessageText(user, true);\n const range = { start: searchStringRange.start, end: searchStringRange.start + mentionedMessageText.length - 1 };\n\n onChangeText(replace(text, searchStringRange.start, searchStringRange.end, mentionedMessageText), { user, range });\n };\n\n const [keyboardShown, setKeyboardShown] = useState(false);\n\n useEffect(() => {\n const keyboardDidShow = () => setKeyboardShown(true);\n const keyboardDidHide = () => setKeyboardShown(false);\n\n const showSubscription = Keyboard.addListener('keyboardDidShow', keyboardDidShow);\n const hideSubscription = Keyboard.addListener('keyboardDidHide', keyboardDidHide);\n\n return () => {\n showSubscription.remove();\n hideSubscription.remove();\n };\n }, []);\n\n const shouldShowSafeAreaBottom = !isAndroidApi35Plus || (isAndroidApi35Plus && !keyboardShown);\n\n if (!props.shouldRenderInput) {\n return <SafeAreaBottom height={safeArea.paddingBottom} />;\n }\n\n return (\n <>\n <KeyboardAvoidingView keyboardVerticalOffset={keyboardVerticalOffset} behavior={KEYBOARD_AVOID_VIEW_BEHAVIOR}>\n <View\n style={{\n paddingStart: safeArea.paddingStart,\n paddingEnd: safeArea.paddingEnd,\n backgroundColor: colors.background,\n }}\n >\n <View onLayout={(e) => setInputHeight(e.nativeEvent.layout.height)} style={styles.inputContainer}>\n {inputMode === 'send' && (\n <SendInput\n {...props}\n key={inputKeyToRemount}\n ref={textInputRef as never}\n text={text}\n onChangeText={onChangeText}\n onSelectionChange={onSelectionChange}\n mentionedUsers={mentionedUsers}\n VoiceMessageInput={props.VoiceMessageInput ?? VoiceMessageInput}\n AttachmentsButton={props.AttachmentsButton ?? AttachmentsButton}\n MessageToReplyPreview={props.MessageToReplyPreview ?? MessageToReplyPreview}\n style={textInputStyle}\n />\n )}\n {inputMode === 'edit' && messageToEdit && (\n <EditInput\n {...props}\n key={inputKeyToRemount}\n ref={textInputRef as never}\n text={text}\n onChangeText={onChangeText}\n autoFocus={AUTO_FOCUS}\n onSelectionChange={onSelectionChange}\n mentionedUsers={mentionedUsers}\n messageToEdit={messageToEdit}\n setMessageToEdit={setMessageToEdit}\n style={textInputStyle}\n />\n )}\n </View>\n {shouldShowSafeAreaBottom && <SafeAreaBottom height={safeArea.paddingBottom} />}\n </View>\n </KeyboardAvoidingView>\n {mentionAvailable && props.SuggestedMentionList && (\n <props.SuggestedMentionList\n text={text}\n selection={selection}\n inputHeight={inputHeight}\n topInset={safeArea.paddingTop}\n bottomInset={safeArea.paddingBottom}\n onPressToMention={onPressToMention}\n mentionedUsers={mentionedUsers}\n />\n )}\n </>\n );\n};\n\nconst useTypingTrigger = (text: string, channel: SendbirdBaseChannel) => {\n useEffect(\n () => {\n function triggerTyping() {\n if (channel.isGroupChannel()) {\n const action = () => (text.length === 0 ? channel.endTyping() : channel.startTyping());\n action().catch((error) => {\n Logger.debug('ChannelInput: Failed to trigger typing', error);\n });\n }\n }\n\n triggerTyping();\n },\n channel.isGroupChannel() ? [text] : [],\n );\n};\n\nconst useTextClearOnDisabled = (setText: (val: string) => void, chatDisabled: boolean) => {\n useEffect(() => {\n if (chatDisabled) setText('');\n }, [chatDisabled]);\n};\n\nconst useAutoFocusOnEditMode = (\n textInputRef: React.MutableRefObject<TextInput | undefined>,\n messageToEdit?: SendbirdBaseMessage,\n) => {\n useEffect(() => {\n if (messageToEdit?.isUserMessage()) {\n if (!AUTO_FOCUS) setTimeout(() => textInputRef.current?.focus(), 500);\n }\n }, [messageToEdit]);\n};\n\nconst SafeAreaBottom = ({ height }: { height: number }) => {\n return <View style={{ height }} />;\n};\n\nconst styles = createStyleSheet({\n inputContainer: {\n justifyContent: 'center',\n width: '100%',\n },\n inputDefault: {\n height: 56,\n },\n input: {\n flex: 1,\n marginEnd: 4,\n borderRadius: 20,\n paddingTop: 8,\n paddingBottom: 8,\n minHeight: 36,\n // Android - padding area is hidden\n // iOS - padding area is visible\n maxHeight: Platform.select({ ios: 36 * 2 + 16, android: 36 * 2 }),\n },\n});\n\nexport default React.memo(ChannelInput);\n"],"mappings":"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","ignoreList":[]}
|
|
1
|
+
{"version":3,"names":["React","useEffect","useMemo","useState","KeyboardAvoidingView","Platform","StyleSheet","View","createStyleSheet","useUIKitTheme","Logger","replace","useIIFE","useSafeAreaPadding","useSendbirdChat","useMentionTextInput","AttachmentsButton","EditInput","MessageToReplyPreview","SendInput","VoiceMessageInput","AUTO_FOCUS","select","ios","android","default","KEYBOARD_AVOID_VIEW_BEHAVIOR","undefined","ChannelInput","props","channel","keyboardAvoidOffset","messageToEdit","setMessageToEdit","safeArea","colors","typography","sbOptions","mentionManager","selection","onSelectionChange","textInputRef","text","onChangeText","mentionedUsers","inputMode","isFileMessage","mentionAvailable","uikit","groupChannel","enableMention","isGroupChannel","isBroadcast","inputKeyToRemount","inputHeight","setInputHeight","styles","inputDefault","height","fontStyle","body3","fontSize","lineHeight","textAlignVertical","textInputStyle","flatten","input","style","useTypingTrigger","useTextClearOnDisabled","inputDisabled","useAutoFocusOnEditMode","onPressToMention","user","searchStringRange","mentionedMessageText","asMentionedMessageText","range","start","end","length","shouldRenderInput","createElement","SafeAreaBottom","paddingBottom","Fragment","keyboardVerticalOffset","behavior","paddingStart","paddingEnd","backgroundColor","background","onLayout","e","nativeEvent","layout","inputContainer","_extends","key","ref","autoFocus","SuggestedMentionList","topInset","paddingTop","bottomInset","triggerTyping","action","endTyping","startTyping","catch","error","debug","setText","chatDisabled","isUserMessage","setTimeout","_textInputRef$current","current","focus","justifyContent","width","flex","marginEnd","borderRadius","minHeight","maxHeight","memo"],"sources":["index.tsx"],"sourcesContent":["import React, { useEffect, useMemo, useState } from 'react';\nimport {\n KeyboardAvoidingView,\n Platform,\n StyleProp,\n StyleSheet,\n TextInput,\n TextInputProps,\n TextStyle,\n View,\n} from 'react-native';\n\nimport { createStyleSheet, useUIKitTheme } from '@sendbird/uikit-react-native-foundation';\nimport {\n Logger,\n SendbirdBaseChannel,\n SendbirdBaseMessage,\n SendbirdFileMessage,\n SendbirdFileMessageCreateParams,\n SendbirdFileMessageUpdateParams,\n SendbirdMember,\n SendbirdUserMessage,\n SendbirdUserMessageCreateParams,\n SendbirdUserMessageUpdateParams,\n replace,\n useIIFE,\n useSafeAreaPadding,\n} from '@sendbird/uikit-utils';\n\nimport { useSendbirdChat } from '../../hooks/useContext';\nimport useMentionTextInput from '../../hooks/useMentionTextInput';\nimport type { CommonComponent, MentionedUser, Range } from '../../types';\nimport type { AttachmentsButtonProps } from './AttachmentsButton';\nimport AttachmentsButton from './AttachmentsButton';\nimport EditInput from './EditInput';\nimport type { MessageToReplyPreviewProps } from './MessageToReplyPreview';\nimport { MessageToReplyPreview } from './MessageToReplyPreview';\nimport SendInput from './SendInput';\nimport VoiceMessageInput, { VoiceMessageInputProps } from './VoiceMessageInput';\n\nexport type SuggestedMentionListProps = {\n text: string;\n selection: Range;\n topInset: number;\n bottomInset: number;\n inputHeight: number;\n onPressToMention: (user: SendbirdMember, searchStringRange: Range) => void;\n mentionedUsers: MentionedUser[];\n /**\n * Whether to show user id information on each item.\n * */\n showUserId?: boolean;\n};\n\nexport type ChannelInputProps = {\n // style\n style?: StyleProp<TextStyle>;\n\n // default\n channel: SendbirdBaseChannel;\n shouldRenderInput: boolean;\n keyboardAvoidOffset: number;\n\n // default actions\n onPressSendUserMessage: (params: SendbirdUserMessageCreateParams) => Promise<void>;\n onPressSendFileMessage: (params: SendbirdFileMessageCreateParams) => Promise<void>;\n onPressUpdateUserMessage: (message: SendbirdUserMessage, params: SendbirdUserMessageUpdateParams) => Promise<void>;\n onPressUpdateFileMessage: (message: SendbirdFileMessage, params: SendbirdFileMessageUpdateParams) => Promise<void>;\n\n // input status\n inputFrozen: boolean;\n inputMuted: boolean;\n inputDisabled: boolean;\n\n // edit\n messageToEdit: undefined | SendbirdUserMessage | SendbirdFileMessage;\n setMessageToEdit: (message?: undefined | SendbirdUserMessage | SendbirdFileMessage) => void;\n\n // reply - only available on group channel\n messageToReply?: undefined | SendbirdUserMessage | SendbirdFileMessage;\n setMessageToReply?: (message?: undefined | SendbirdUserMessage | SendbirdFileMessage) => void;\n messageForThread?: undefined | SendbirdUserMessage | SendbirdFileMessage;\n\n // mention\n SuggestedMentionList?: CommonComponent<SuggestedMentionListProps>;\n\n // sub-components\n AttachmentsButton?: (props: AttachmentsButtonProps) => React.ReactNode | null;\n MessageToReplyPreview?: (props: MessageToReplyPreviewProps) => React.ReactNode | null;\n VoiceMessageInput?: (props: VoiceMessageInputProps) => React.ReactNode | null;\n\n // TextInput props - only safe properties that don't interfere with UIKit functionality\n partialTextInputProps?: Partial<Pick<TextInputProps, 'autoCorrect'>>;\n};\n\nconst AUTO_FOCUS = Platform.select({ ios: false, android: true, default: false });\nconst KEYBOARD_AVOID_VIEW_BEHAVIOR = Platform.select({ ios: 'padding' as const, default: undefined });\n\n// FIXME(iOS): Dynamic style does not work properly when typing the CJK. (https://github.com/facebook/react-native/issues/26107)\n// To workaround temporarily, change the key for re-mount the component.\n// -> This will affect to keyboard blur when add/remove first mentioned user.\n// const GET_INPUT_KEY = (shouldReset: boolean) => {\n// return Platform.OS === 'ios' && shouldReset ? 'uikit-input-clear' : 'uikit-input';\n// };\n\n// TODO: Refactor 'Edit' mode to clearly\nconst ChannelInput = (props: ChannelInputProps) => {\n const { channel, keyboardAvoidOffset, messageToEdit, setMessageToEdit } = props;\n\n const safeArea = useSafeAreaPadding(['top', 'left', 'right', 'bottom']);\n\n const { colors, typography } = useUIKitTheme();\n const { sbOptions, mentionManager } = useSendbirdChat();\n\n const { selection, onSelectionChange, textInputRef, text, onChangeText, mentionedUsers } = useMentionTextInput({\n messageToEdit,\n });\n const inputMode = useIIFE(() => {\n if (messageToEdit && !messageToEdit.isFileMessage()) return 'edit';\n else return 'send';\n });\n\n const mentionAvailable =\n sbOptions.uikit.groupChannel.channel.enableMention && channel.isGroupChannel() && !channel.isBroadcast;\n const inputKeyToRemount = 'input'; //GET_INPUT_KEY(mentionAvailable ? mentionedUsers.length === 0 : false);\n\n const [inputHeight, setInputHeight] = useState(styles.inputDefault.height);\n\n const fontStyle = useMemo(() => {\n if (!typography.body3.fontSize) return typography.body3;\n // NOTE: iOS does not support textAlignVertical, so we should adjust lineHeight to center the text in multiline TextInput.\n return { ...typography.body3, lineHeight: typography.body3.fontSize * 1.275, textAlignVertical: 'center' };\n }, [typography.body3.fontSize]);\n\n const textInputStyle = StyleSheet.flatten([styles.input, fontStyle, props.style]);\n\n useTypingTrigger(text, channel);\n useTextClearOnDisabled(onChangeText, props.inputDisabled);\n useAutoFocusOnEditMode(textInputRef, messageToEdit);\n\n const onPressToMention = (user: SendbirdMember, searchStringRange: Range) => {\n const mentionedMessageText = mentionManager.asMentionedMessageText(user, true);\n const range = { start: searchStringRange.start, end: searchStringRange.start + mentionedMessageText.length - 1 };\n\n onChangeText(replace(text, searchStringRange.start, searchStringRange.end, mentionedMessageText), { user, range });\n };\n\n if (!props.shouldRenderInput) {\n return <SafeAreaBottom height={safeArea.paddingBottom} />;\n }\n\n return (\n <>\n <KeyboardAvoidingView\n keyboardVerticalOffset={-safeArea.paddingBottom + keyboardAvoidOffset}\n behavior={KEYBOARD_AVOID_VIEW_BEHAVIOR}\n >\n <View\n style={{\n paddingStart: safeArea.paddingStart,\n paddingEnd: safeArea.paddingEnd,\n backgroundColor: colors.background,\n }}\n >\n <View onLayout={(e) => setInputHeight(e.nativeEvent.layout.height)} style={styles.inputContainer}>\n {inputMode === 'send' && (\n <SendInput\n {...props}\n key={inputKeyToRemount}\n ref={textInputRef as never}\n text={text}\n onChangeText={onChangeText}\n onSelectionChange={onSelectionChange}\n mentionedUsers={mentionedUsers}\n VoiceMessageInput={props.VoiceMessageInput ?? VoiceMessageInput}\n AttachmentsButton={props.AttachmentsButton ?? AttachmentsButton}\n MessageToReplyPreview={props.MessageToReplyPreview ?? MessageToReplyPreview}\n style={textInputStyle}\n />\n )}\n {inputMode === 'edit' && messageToEdit && (\n <EditInput\n {...props}\n key={inputKeyToRemount}\n ref={textInputRef as never}\n text={text}\n onChangeText={onChangeText}\n autoFocus={AUTO_FOCUS}\n onSelectionChange={onSelectionChange}\n mentionedUsers={mentionedUsers}\n messageToEdit={messageToEdit}\n setMessageToEdit={setMessageToEdit}\n style={textInputStyle}\n />\n )}\n </View>\n <SafeAreaBottom height={safeArea.paddingBottom} />\n </View>\n </KeyboardAvoidingView>\n {mentionAvailable && props.SuggestedMentionList && (\n <props.SuggestedMentionList\n text={text}\n selection={selection}\n inputHeight={inputHeight}\n topInset={safeArea.paddingTop}\n bottomInset={safeArea.paddingBottom}\n onPressToMention={onPressToMention}\n mentionedUsers={mentionedUsers}\n />\n )}\n </>\n );\n};\n\nconst useTypingTrigger = (text: string, channel: SendbirdBaseChannel) => {\n useEffect(\n () => {\n function triggerTyping() {\n if (channel.isGroupChannel()) {\n const action = () => (text.length === 0 ? channel.endTyping() : channel.startTyping());\n action().catch((error) => {\n Logger.debug('ChannelInput: Failed to trigger typing', error);\n });\n }\n }\n\n triggerTyping();\n },\n channel.isGroupChannel() ? [text] : [],\n );\n};\n\nconst useTextClearOnDisabled = (setText: (val: string) => void, chatDisabled: boolean) => {\n useEffect(() => {\n if (chatDisabled) setText('');\n }, [chatDisabled]);\n};\n\nconst useAutoFocusOnEditMode = (\n textInputRef: React.MutableRefObject<TextInput | undefined>,\n messageToEdit?: SendbirdBaseMessage,\n) => {\n useEffect(() => {\n if (messageToEdit?.isUserMessage()) {\n if (!AUTO_FOCUS) setTimeout(() => textInputRef.current?.focus(), 500);\n }\n }, [messageToEdit]);\n};\n\nconst SafeAreaBottom = ({ height }: { height: number }) => {\n return <View style={{ height }} />;\n};\n\nconst styles = createStyleSheet({\n inputContainer: {\n justifyContent: 'center',\n width: '100%',\n },\n inputDefault: {\n height: 56,\n },\n input: {\n flex: 1,\n marginEnd: 4,\n borderRadius: 20,\n paddingTop: 8,\n paddingBottom: 8,\n minHeight: 36,\n // Android - padding area is hidden\n // iOS - padding area is visible\n maxHeight: Platform.select({ ios: 36 * 2 + 16, android: 36 * 2 }),\n },\n});\n\nexport default React.memo(ChannelInput);\n"],"mappings":"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","ignoreList":[]}
|
|
@@ -115,8 +115,13 @@ const useVoiceMessageInput = ({
|
|
|
115
115
|
});
|
|
116
116
|
}
|
|
117
117
|
} else {
|
|
118
|
-
|
|
119
|
-
|
|
118
|
+
const recordFilePath = fileService.createRecordFilePath(recorderService.options.extension);
|
|
119
|
+
const convertedRecordPath = recorderService.convertRecordPath(recordFilePath.recordFilePath);
|
|
120
|
+
setVoiceMessageRecordingPath({
|
|
121
|
+
...recordFilePath,
|
|
122
|
+
recordFilePath: convertedRecordPath
|
|
123
|
+
});
|
|
124
|
+
await recorderService.record(convertedRecordPath);
|
|
120
125
|
}
|
|
121
126
|
}
|
|
122
127
|
},
|
|
@@ -184,6 +189,9 @@ const useVoiceMessageInput = ({
|
|
|
184
189
|
},
|
|
185
190
|
async send() {
|
|
186
191
|
if (matchesOneOf(status, ['recording', 'recording_completed', 'playing', 'playing_paused']) && recordingPath.current) {
|
|
192
|
+
if (status === 'recording') {
|
|
193
|
+
await recorderService.stop();
|
|
194
|
+
}
|
|
187
195
|
const voiceFile = getVoiceMessageFileObject(recordingPath.current.uri, recorderService.options.extension);
|
|
188
196
|
onSend(voiceFile, Math.floor(recordingTime.currentTime));
|
|
189
197
|
await clear();
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["useRef","useState","useAlert","Logger","getVoiceMessageFileObject","matchesOneOf","SBUUtils","useLocalization","usePlatformService","useVoiceMessageInput","onSend","onClose","alert","STRINGS","recorderService","playerService","fileService","status","setStatus","recordingTime","setRecordingTime","currentTime","minDuration","options","maxDuration","playingTime","setPlayingTime","duration","recordingPath","getVoiceMessageRecordingPath","current","Error","setVoiceMessageRecordingPath","path","clear","undefined","reset","state","actions","cancel","startRecording","granted","requestPermission","title","DIALOG","ALERT_PERMISSIONS_TITLE","message","ALERT_PERMISSIONS_MESSAGE","LABELS","PERMISSION_MICROPHONE","PERMISSION_APP_NAME","buttons","text","ALERT_PERMISSIONS_OK","onPress","openSettings","error","unsubscribeRecording","addRecordingListener","prev","unsubscribeState","addStateListener","isExpo","record","uri","recordFilePath","createRecordFilePath","extension","stopRecording","stop","playPlayer","PERMISSION_DEVICE_STORAGE","unsubscribePlayback","addPlaybackListener","play","pausePlayer","pause","send","voiceFile","Math","floor"],"sources":["useVoiceMessageInput.ts"],"sourcesContent":["import { useRef, useState } from 'react';\n\nimport { useAlert } from '@sendbird/uikit-react-native-foundation';\nimport { Logger, getVoiceMessageFileObject, matchesOneOf } from '@sendbird/uikit-utils';\n\nimport SBUUtils from '../libs/SBUUtils';\nimport { FileType } from '../platform/types';\nimport { useLocalization, usePlatformService } from './useContext';\n\ntype State = {\n /**\n * Status\n *\n * idle:\n * - cancel(): idle\n * - startRecording(): recording\n * recording:\n * - cancel(): idle\n * - stopRecording(): recording_completed\n * - send(): recording_completed > idle\n * recording_completed:\n * - cancel(): idle\n * - playPlayer(): playing\n * - send(): idle\n * playing:\n * - cancel(): idle\n * - pausePlayer(): playing_paused\n * - send(): idle\n * playing_paused:\n * - cancel(): idle\n * - playPlayer(): playing\n * - send(): idle\n * */\n status: 'idle' | 'recording' | 'recording_completed' | 'playing' | 'playing_paused';\n recordingTime: {\n currentTime: number;\n minDuration: number;\n maxDuration: number;\n };\n playingTime: {\n currentTime: number;\n duration: number;\n };\n};\n\nexport interface VoiceMessageInputResult {\n actions: {\n cancel: () => Promise<void>;\n startRecording: () => Promise<void>;\n stopRecording: () => Promise<void>;\n playPlayer: () => Promise<void>;\n pausePlayer: () => Promise<void>;\n send: () => Promise<void>;\n };\n state: State;\n}\n\ntype Props = {\n onClose: () => Promise<void>;\n onSend: (voiceFile: FileType, duration: number) => void;\n};\n\nconst useVoiceMessageInput = ({ onSend, onClose }: Props): VoiceMessageInputResult => {\n const { alert } = useAlert();\n const { STRINGS } = useLocalization();\n const { recorderService, playerService, fileService } = usePlatformService();\n const [status, setStatus] = useState<State['status']>('idle');\n\n const [recordingTime, setRecordingTime] = useState({\n currentTime: 0,\n minDuration: recorderService.options.minDuration,\n maxDuration: recorderService.options.maxDuration,\n });\n const [playingTime, setPlayingTime] = useState({\n currentTime: 0,\n duration: 0,\n });\n\n const recordingPath = useRef<{ recordFilePath: string; uri: string }>();\n const getVoiceMessageRecordingPath = () => {\n if (!recordingPath.current) throw new Error('No recording path');\n return recordingPath.current;\n };\n const setVoiceMessageRecordingPath = (path: { recordFilePath: string; uri: string }) => {\n recordingPath.current = path;\n };\n\n const clear = async () => {\n recordingPath.current = undefined;\n await playerService.reset();\n await recorderService.reset();\n setRecordingTime({\n currentTime: 0,\n minDuration: recorderService.options.minDuration,\n maxDuration: recorderService.options.maxDuration,\n });\n setPlayingTime({\n currentTime: 0,\n duration: 0,\n });\n setStatus('idle');\n };\n\n return {\n state: {\n status,\n recordingTime,\n playingTime,\n },\n actions: {\n async cancel() {\n await clear();\n },\n async startRecording() {\n const granted = await recorderService.requestPermission();\n if (!granted) {\n await onClose();\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 if (matchesOneOf(status, ['idle'])) {\n // Before start recording, if player is not idle, reset it.\n if (playerService.state !== 'idle') {\n await playerService.reset();\n }\n\n const unsubscribeRecording = recorderService.addRecordingListener(({ currentTime }) => {\n setRecordingTime({\n currentTime,\n maxDuration: recorderService.options.maxDuration,\n minDuration: recorderService.options.minDuration,\n });\n setPlayingTime((prev) => ({ ...prev, duration: currentTime }));\n });\n\n const unsubscribeState = recorderService.addStateListener((state) => {\n switch (state) {\n case 'recording':\n setStatus('recording');\n break;\n case 'completed':\n setStatus('recording_completed');\n unsubscribeRecording();\n unsubscribeState();\n break;\n }\n });\n\n if (SBUUtils.isExpo()) {\n await recorderService.record();\n if (recorderService.uri) {\n setVoiceMessageRecordingPath({ recordFilePath: recorderService.uri, uri: recorderService.uri });\n }\n } else {\n setVoiceMessageRecordingPath(fileService.createRecordFilePath(recorderService.options.extension));\n await recorderService.record(getVoiceMessageRecordingPath().recordFilePath);\n }\n }\n },\n async stopRecording() {\n if (matchesOneOf(status, ['recording'])) {\n await recorderService.stop();\n }\n },\n async playPlayer() {\n const granted = await playerService.requestPermission();\n if (!granted) {\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 if (matchesOneOf(status, ['recording_completed', 'playing_paused'])) {\n const unsubscribePlayback = playerService.addPlaybackListener(({ currentTime, duration }) => {\n setPlayingTime({ currentTime, duration });\n });\n\n const unsubscribeState = playerService.addStateListener((state) => {\n switch (state) {\n case 'playing':\n setStatus('playing');\n break;\n case 'paused': {\n setStatus('playing_paused');\n unsubscribeState();\n unsubscribePlayback();\n break;\n }\n case 'stopped': {\n setStatus('playing_paused');\n unsubscribeState();\n unsubscribePlayback();\n setPlayingTime((prev) => ({ ...prev, currentTime: 0 }));\n break;\n }\n }\n });\n\n await playerService.play(getVoiceMessageRecordingPath().recordFilePath);\n }\n },\n async pausePlayer() {\n if (matchesOneOf(status, ['playing'])) {\n await playerService.pause();\n }\n },\n async send() {\n if (\n matchesOneOf(status, ['recording', 'recording_completed', 'playing', 'playing_paused']) &&\n recordingPath.current\n ) {\n const voiceFile = getVoiceMessageFileObject(recordingPath.current.uri, recorderService.options.extension);\n onSend(voiceFile, Math.floor(recordingTime.currentTime));\n await clear();\n }\n },\n },\n };\n};\n\nexport default useVoiceMessageInput;\n"],"mappings":"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","ignoreList":[]}
|
|
1
|
+
{"version":3,"names":["useRef","useState","useAlert","Logger","getVoiceMessageFileObject","matchesOneOf","SBUUtils","useLocalization","usePlatformService","useVoiceMessageInput","onSend","onClose","alert","STRINGS","recorderService","playerService","fileService","status","setStatus","recordingTime","setRecordingTime","currentTime","minDuration","options","maxDuration","playingTime","setPlayingTime","duration","recordingPath","getVoiceMessageRecordingPath","current","Error","setVoiceMessageRecordingPath","path","clear","undefined","reset","state","actions","cancel","startRecording","granted","requestPermission","title","DIALOG","ALERT_PERMISSIONS_TITLE","message","ALERT_PERMISSIONS_MESSAGE","LABELS","PERMISSION_MICROPHONE","PERMISSION_APP_NAME","buttons","text","ALERT_PERMISSIONS_OK","onPress","openSettings","error","unsubscribeRecording","addRecordingListener","prev","unsubscribeState","addStateListener","isExpo","record","uri","recordFilePath","createRecordFilePath","extension","convertedRecordPath","convertRecordPath","stopRecording","stop","playPlayer","PERMISSION_DEVICE_STORAGE","unsubscribePlayback","addPlaybackListener","play","pausePlayer","pause","send","voiceFile","Math","floor"],"sources":["useVoiceMessageInput.ts"],"sourcesContent":["import { useRef, useState } from 'react';\n\nimport { useAlert } from '@sendbird/uikit-react-native-foundation';\nimport { Logger, getVoiceMessageFileObject, matchesOneOf } from '@sendbird/uikit-utils';\n\nimport SBUUtils from '../libs/SBUUtils';\nimport { FileType } from '../platform/types';\nimport { useLocalization, usePlatformService } from './useContext';\n\ntype State = {\n /**\n * Status\n *\n * idle:\n * - cancel(): idle\n * - startRecording(): recording\n * recording:\n * - cancel(): idle\n * - stopRecording(): recording_completed\n * - send(): recording_completed > idle\n * recording_completed:\n * - cancel(): idle\n * - playPlayer(): playing\n * - send(): idle\n * playing:\n * - cancel(): idle\n * - pausePlayer(): playing_paused\n * - send(): idle\n * playing_paused:\n * - cancel(): idle\n * - playPlayer(): playing\n * - send(): idle\n * */\n status: 'idle' | 'recording' | 'recording_completed' | 'playing' | 'playing_paused';\n recordingTime: {\n currentTime: number;\n minDuration: number;\n maxDuration: number;\n };\n playingTime: {\n currentTime: number;\n duration: number;\n };\n};\n\nexport interface VoiceMessageInputResult {\n actions: {\n cancel: () => Promise<void>;\n startRecording: () => Promise<void>;\n stopRecording: () => Promise<void>;\n playPlayer: () => Promise<void>;\n pausePlayer: () => Promise<void>;\n send: () => Promise<void>;\n };\n state: State;\n}\n\ntype Props = {\n onClose: () => Promise<void>;\n onSend: (voiceFile: FileType, duration: number) => void;\n};\n\nconst useVoiceMessageInput = ({ onSend, onClose }: Props): VoiceMessageInputResult => {\n const { alert } = useAlert();\n const { STRINGS } = useLocalization();\n const { recorderService, playerService, fileService } = usePlatformService();\n const [status, setStatus] = useState<State['status']>('idle');\n\n const [recordingTime, setRecordingTime] = useState({\n currentTime: 0,\n minDuration: recorderService.options.minDuration,\n maxDuration: recorderService.options.maxDuration,\n });\n const [playingTime, setPlayingTime] = useState({\n currentTime: 0,\n duration: 0,\n });\n\n const recordingPath = useRef<{ recordFilePath: string; uri: string }>();\n const getVoiceMessageRecordingPath = () => {\n if (!recordingPath.current) throw new Error('No recording path');\n return recordingPath.current;\n };\n const setVoiceMessageRecordingPath = (path: { recordFilePath: string; uri: string }) => {\n recordingPath.current = path;\n };\n\n const clear = async () => {\n recordingPath.current = undefined;\n await playerService.reset();\n await recorderService.reset();\n setRecordingTime({\n currentTime: 0,\n minDuration: recorderService.options.minDuration,\n maxDuration: recorderService.options.maxDuration,\n });\n setPlayingTime({\n currentTime: 0,\n duration: 0,\n });\n setStatus('idle');\n };\n\n return {\n state: {\n status,\n recordingTime,\n playingTime,\n },\n actions: {\n async cancel() {\n await clear();\n },\n async startRecording() {\n const granted = await recorderService.requestPermission();\n if (!granted) {\n await onClose();\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 if (matchesOneOf(status, ['idle'])) {\n // Before start recording, if player is not idle, reset it.\n if (playerService.state !== 'idle') {\n await playerService.reset();\n }\n\n const unsubscribeRecording = recorderService.addRecordingListener(({ currentTime }) => {\n setRecordingTime({\n currentTime,\n maxDuration: recorderService.options.maxDuration,\n minDuration: recorderService.options.minDuration,\n });\n setPlayingTime((prev) => ({ ...prev, duration: currentTime }));\n });\n\n const unsubscribeState = recorderService.addStateListener((state) => {\n switch (state) {\n case 'recording':\n setStatus('recording');\n break;\n case 'completed':\n setStatus('recording_completed');\n unsubscribeRecording();\n unsubscribeState();\n break;\n }\n });\n\n if (SBUUtils.isExpo()) {\n await recorderService.record();\n if (recorderService.uri) {\n setVoiceMessageRecordingPath({ recordFilePath: recorderService.uri, uri: recorderService.uri });\n }\n } else {\n const recordFilePath = fileService.createRecordFilePath(recorderService.options.extension);\n const convertedRecordPath = recorderService.convertRecordPath(recordFilePath.recordFilePath);\n setVoiceMessageRecordingPath({ ...recordFilePath, recordFilePath: convertedRecordPath });\n await recorderService.record(convertedRecordPath);\n }\n }\n },\n async stopRecording() {\n if (matchesOneOf(status, ['recording'])) {\n await recorderService.stop();\n }\n },\n async playPlayer() {\n const granted = await playerService.requestPermission();\n if (!granted) {\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 if (matchesOneOf(status, ['recording_completed', 'playing_paused'])) {\n const unsubscribePlayback = playerService.addPlaybackListener(({ currentTime, duration }) => {\n setPlayingTime({ currentTime, duration });\n });\n\n const unsubscribeState = playerService.addStateListener((state) => {\n switch (state) {\n case 'playing':\n setStatus('playing');\n break;\n case 'paused': {\n setStatus('playing_paused');\n unsubscribeState();\n unsubscribePlayback();\n break;\n }\n case 'stopped': {\n setStatus('playing_paused');\n unsubscribeState();\n unsubscribePlayback();\n setPlayingTime((prev) => ({ ...prev, currentTime: 0 }));\n break;\n }\n }\n });\n\n await playerService.play(getVoiceMessageRecordingPath().recordFilePath);\n }\n },\n async pausePlayer() {\n if (matchesOneOf(status, ['playing'])) {\n await playerService.pause();\n }\n },\n async send() {\n if (\n matchesOneOf(status, ['recording', 'recording_completed', 'playing', 'playing_paused']) &&\n recordingPath.current\n ) {\n if (status === 'recording') {\n await recorderService.stop();\n }\n const voiceFile = getVoiceMessageFileObject(recordingPath.current.uri, recorderService.options.extension);\n onSend(voiceFile, Math.floor(recordingTime.currentTime));\n await clear();\n }\n },\n },\n };\n};\n\nexport default useVoiceMessageInput;\n"],"mappings":"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","ignoreList":[]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["Platform","Logger","getFileExtension","getFileExtensionFromMime","getFileExtensionFromUri","getFileType","normalizeFileName","SBUError","nativePermissionGranted","normalizeFile","openDocument","getAndroidStoragePermissionsByAPILevel","permissionModule","OS","Version","PERMISSIONS","ANDROID","READ_EXTERNAL_STORAGE","WRITE_EXTERNAL_STORAGE","createNativeFileService","imagePickerModule","documentPickerModule","mediaLibraryModule","fsModule","requiredPermissions","select","ios","IOS","CAMERA","android","default","optionalPermissions","MICROPHONE","mediaLibraryPermissions","PHOTO_LIBRARY","PHOTO_LIBRARY_ADD_ONLY","NativeFileService","constructor","_defineProperty","options","dirname","Dirs","CacheDir","DocumentDir","context","filename","fileName","extension","fileType","fileUrl","path","buildDownloadPath","FileSystem","fetch","downloadedPath","file","name","type","hasCameraPermission","status","checkMultiple","requestCameraPermission","requiredPermissionsStatus","requestMultiple","hasMediaLibraryPermission","requestMediaLibraryPermission","openCamera","_response$assets","hasPermission","granted","_options$onOpenFailur","onOpenFailure","call","PERMISSIONS_DENIED","response","launchCamera","presentationStyle","cameraType","mediaType","didCancel","errorCode","_options$onOpenFailur2","DEVICE_UNAVAILABLE","Error","errorMessage","fileSize","size","uri","assets","openMediaLibrary","selectionLimit","_options$onOpenFailur3","launchImageLibrary","_options$onOpenFailur4","Promise","all","slice","map","save","downloadFile","mediaTypeMap","externalDirMap","externalDir","cpExternal","catch","error","createRecordFilePath","customExtension","Date","now","recordFilePath","startsWith"],"sources":["createFileService.native.ts"],"sourcesContent":["import type { CameraRoll } from '@react-native-camera-roll/camera-roll';\nimport { Platform } from 'react-native';\nimport type * as FileAccess from 'react-native-file-access';\nimport type * as ImagePicker from 'react-native-image-picker';\nimport type * as Permissions from 'react-native-permissions';\nimport type { Permission } from 'react-native-permissions';\n\nimport {\n Logger,\n getFileExtension,\n getFileExtensionFromMime,\n getFileExtensionFromUri,\n getFileType,\n normalizeFileName,\n} from '@sendbird/uikit-utils';\n\nimport SBUError from '../libs/SBUError';\nimport nativePermissionGranted from '../utils/nativePermissionGranted';\nimport normalizeFile from '../utils/normalizeFile';\nimport { DocumentPicker, openDocument } from './openDocument.native';\nimport type {\n FilePickerResponse,\n FileServiceInterface,\n OpenCameraOptions,\n OpenDocumentOptions,\n OpenMediaLibraryOptions,\n SaveOptions,\n} from './types';\n\nfunction getAndroidStoragePermissionsByAPILevel(permissionModule: typeof Permissions): Permission[] {\n if (Platform.OS !== 'android') return [];\n\n if (Platform.Version > 32) {\n return [];\n }\n\n if (Platform.Version > 28) {\n return [permissionModule.PERMISSIONS.ANDROID.READ_EXTERNAL_STORAGE];\n }\n\n return [\n permissionModule.PERMISSIONS.ANDROID.WRITE_EXTERNAL_STORAGE,\n permissionModule.PERMISSIONS.ANDROID.READ_EXTERNAL_STORAGE,\n ];\n}\n\nconst createNativeFileService = ({\n imagePickerModule,\n documentPickerModule,\n permissionModule,\n mediaLibraryModule,\n fsModule,\n}: {\n imagePickerModule: typeof ImagePicker;\n documentPickerModule: DocumentPicker;\n permissionModule: typeof Permissions;\n mediaLibraryModule: typeof CameraRoll;\n fsModule: typeof FileAccess;\n}): FileServiceInterface => {\n const requiredPermissions: Permission[] = Platform.select({\n ios: [permissionModule.PERMISSIONS.IOS.CAMERA],\n android: [permissionModule.PERMISSIONS.ANDROID.CAMERA],\n default: [],\n });\n const optionalPermissions: Permission[] = Platform.select({\n ios: [permissionModule.PERMISSIONS.IOS.MICROPHONE],\n android: [],\n default: [],\n });\n const mediaLibraryPermissions: Permission[] = Platform.select({\n ios: [permissionModule.PERMISSIONS.IOS.PHOTO_LIBRARY, permissionModule.PERMISSIONS.IOS.PHOTO_LIBRARY_ADD_ONLY],\n android: getAndroidStoragePermissionsByAPILevel(permissionModule),\n default: [],\n });\n\n class NativeFileService implements FileServiceInterface {\n async hasCameraPermission(): Promise<boolean> {\n const status = await permissionModule.checkMultiple(requiredPermissions);\n return nativePermissionGranted(status);\n }\n\n async requestCameraPermission(): Promise<boolean> {\n const requiredPermissionsStatus = await permissionModule.requestMultiple(requiredPermissions);\n if (!nativePermissionGranted(requiredPermissionsStatus)) return false;\n\n await permissionModule.requestMultiple(optionalPermissions);\n return true;\n }\n\n async hasMediaLibraryPermission(): Promise<boolean> {\n const status = await permissionModule.checkMultiple(mediaLibraryPermissions);\n return nativePermissionGranted(status);\n }\n\n async requestMediaLibraryPermission(): Promise<boolean> {\n const status = await permissionModule.requestMultiple(mediaLibraryPermissions);\n return nativePermissionGranted(status);\n }\n\n async openCamera(options?: OpenCameraOptions): Promise<FilePickerResponse> {\n const hasPermission = await this.hasCameraPermission();\n if (!hasPermission) {\n const granted = await this.requestCameraPermission();\n if (!granted) {\n options?.onOpenFailure?.(SBUError.PERMISSIONS_DENIED);\n return null;\n }\n }\n\n const response = await imagePickerModule.launchCamera({\n presentationStyle: 'fullScreen',\n cameraType: options?.cameraType ?? 'back',\n mediaType: (() => {\n switch (options?.mediaType) {\n case 'photo':\n return 'photo';\n case 'video':\n return 'video';\n case 'all':\n return 'mixed';\n default:\n return 'photo';\n }\n })(),\n });\n if (response.didCancel) return null;\n if (response.errorCode === 'camera_unavailable') {\n options?.onOpenFailure?.(SBUError.DEVICE_UNAVAILABLE, new Error(response.errorMessage));\n return null;\n }\n\n const { fileName: name, fileSize: size, type, uri } = response.assets?.[0] ?? {};\n return normalizeFile({ uri, size, name, type });\n }\n\n async openMediaLibrary(options?: OpenMediaLibraryOptions): Promise<FilePickerResponse[] | null> {\n /**\n * NOTE: options.selectionLimit {@link https://github.com/react-native-image-picker/react-native-image-picker#options}\n * We do not support 0 (any number of files)\n **/\n const selectionLimit = options?.selectionLimit || 1;\n const hasPermission = await this.hasMediaLibraryPermission();\n if (!hasPermission) {\n const granted = await this.requestMediaLibraryPermission();\n if (!granted) {\n options?.onOpenFailure?.(SBUError.PERMISSIONS_DENIED);\n return null;\n }\n }\n\n const response = await imagePickerModule.launchImageLibrary({\n presentationStyle: 'fullScreen',\n selectionLimit,\n mediaType: (() => {\n switch (options?.mediaType) {\n case 'photo':\n return 'photo';\n case 'video':\n return 'video';\n case 'all':\n return 'mixed';\n default:\n return 'photo';\n }\n })(),\n });\n if (response.didCancel) return null;\n if (response.errorCode === 'camera_unavailable') {\n options?.onOpenFailure?.(SBUError.DEVICE_UNAVAILABLE, new Error(response.errorMessage));\n return null;\n }\n\n return Promise.all(\n (response.assets || [])\n .slice(0, selectionLimit)\n .map(({ fileName: name, fileSize: size, type, uri }) => normalizeFile({ uri, size, name, type })),\n );\n }\n\n async openDocument(options?: OpenDocumentOptions): Promise<FilePickerResponse> {\n return await openDocument(documentPickerModule, options);\n }\n\n async save(options: SaveOptions): Promise<string> {\n const hasPermission = await this.hasMediaLibraryPermission();\n if (!hasPermission) {\n const granted = await this.requestMediaLibraryPermission();\n if (!granted) throw new Error('Permission not granted');\n }\n\n const { downloadedPath, file } = await this.downloadFile(options);\n\n if (Platform.OS === 'ios') {\n if (file.type === 'image' || file.type === 'video') {\n const mediaTypeMap = { 'image': 'photo', 'video': 'video' } as const;\n const mediaType = mediaTypeMap[file.type];\n await mediaLibraryModule.save(downloadedPath, { type: mediaType });\n }\n }\n\n if (Platform.OS === 'android') {\n const externalDirMap = { 'file': 'downloads', 'audio': 'audio', 'image': 'images', 'video': 'video' } as const;\n const externalDir = externalDirMap[file.type];\n await fsModule.FileSystem.cpExternal(downloadedPath, file.name, externalDir).catch(() => {\n Logger.error('Failed to save file to external storage. Retry saving to downloads directory instead.');\n return fsModule.FileSystem.cpExternal(downloadedPath, file.name, 'downloads');\n });\n }\n\n return downloadedPath;\n }\n\n private buildDownloadPath = async (options: SaveOptions) => {\n const dirname = Platform.select({ android: fsModule.Dirs.CacheDir, default: fsModule.Dirs.DocumentDir });\n const context = { dirname, filename: options.fileName };\n const extension =\n getFileExtension(options.fileName) ||\n getFileExtensionFromMime(options.fileType) ||\n getFileExtension(options.fileUrl) ||\n (await getFileExtensionFromUri(options.fileUrl));\n\n if (extension) context.filename = normalizeFileName(context.filename, extension);\n\n return { path: `${context.dirname}/${context.filename}`, ...context };\n };\n\n private downloadFile = async (options: SaveOptions) => {\n const { path, filename } = await this.buildDownloadPath(options);\n await fsModule.FileSystem.fetch(options.fileUrl, { path });\n return {\n downloadedPath: path,\n file: {\n name: filename,\n type: getFileType(getFileExtension(path)),\n } as const,\n };\n };\n\n createRecordFilePath(customExtension = 'm4a'): { recordFilePath: string; uri: string } {\n const filename = `record-${Date.now()}.${customExtension}`;\n const path = `${fsModule.Dirs.CacheDir}/${filename}`;\n return Platform.select({\n ios: {\n uri: path,\n recordFilePath: filename,\n },\n android: {\n uri: path.startsWith('file://') ? path : 'file://' + path,\n recordFilePath: path,\n },\n default: {\n uri: path,\n recordFilePath: path,\n },\n });\n }\n }\n\n return new NativeFileService();\n};\n\nexport default createNativeFileService;\n"],"mappings":"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","ignoreList":[]}
|
|
1
|
+
{"version":3,"names":["Platform","Logger","getFileExtension","getFileExtensionFromMime","getFileExtensionFromUri","getFileType","normalizeFileName","SBUError","nativePermissionGranted","normalizeFile","openDocument","getAndroidStoragePermissionsByAPILevel","permissionModule","OS","Version","PERMISSIONS","ANDROID","READ_EXTERNAL_STORAGE","WRITE_EXTERNAL_STORAGE","createNativeFileService","imagePickerModule","documentPickerModule","mediaLibraryModule","fsModule","requiredPermissions","select","ios","IOS","CAMERA","android","default","optionalPermissions","MICROPHONE","mediaLibraryPermissions","PHOTO_LIBRARY","PHOTO_LIBRARY_ADD_ONLY","NativeFileService","constructor","_defineProperty","options","dirname","Dirs","CacheDir","DocumentDir","context","filename","fileName","extension","fileType","fileUrl","path","buildDownloadPath","FileSystem","fetch","downloadedPath","file","name","type","hasCameraPermission","status","checkMultiple","requestCameraPermission","requiredPermissionsStatus","requestMultiple","hasMediaLibraryPermission","requestMediaLibraryPermission","openCamera","_response$assets","hasPermission","granted","_options$onOpenFailur","onOpenFailure","call","PERMISSIONS_DENIED","response","launchCamera","presentationStyle","cameraType","mediaType","didCancel","errorCode","_options$onOpenFailur2","DEVICE_UNAVAILABLE","Error","errorMessage","fileSize","size","uri","assets","openMediaLibrary","selectionLimit","_options$onOpenFailur3","launchImageLibrary","_options$onOpenFailur4","Promise","all","slice","map","save","downloadFile","mediaTypeMap","externalDirMap","externalDir","cpExternal","catch","error","createRecordFilePath","customExtension","Date","now","recordFilePath","startsWith"],"sources":["createFileService.native.ts"],"sourcesContent":["import type { CameraRoll } from '@react-native-camera-roll/camera-roll';\nimport { Platform } from 'react-native';\nimport type * as FileAccess from 'react-native-file-access';\nimport type * as ImagePicker from 'react-native-image-picker';\nimport type * as Permissions from 'react-native-permissions';\nimport type { Permission } from 'react-native-permissions';\n\nimport {\n Logger,\n getFileExtension,\n getFileExtensionFromMime,\n getFileExtensionFromUri,\n getFileType,\n normalizeFileName,\n} from '@sendbird/uikit-utils';\n\nimport SBUError from '../libs/SBUError';\nimport nativePermissionGranted from '../utils/nativePermissionGranted';\nimport normalizeFile from '../utils/normalizeFile';\nimport { DocumentPicker, openDocument } from './openDocument.native';\nimport type {\n FilePickerResponse,\n FileServiceInterface,\n OpenCameraOptions,\n OpenDocumentOptions,\n OpenMediaLibraryOptions,\n SaveOptions,\n} from './types';\n\nfunction getAndroidStoragePermissionsByAPILevel(permissionModule: typeof Permissions): Permission[] {\n if (Platform.OS !== 'android') return [];\n\n if (Platform.Version > 32) {\n return [];\n }\n\n if (Platform.Version > 28) {\n return [permissionModule.PERMISSIONS.ANDROID.READ_EXTERNAL_STORAGE];\n }\n\n return [\n permissionModule.PERMISSIONS.ANDROID.WRITE_EXTERNAL_STORAGE,\n permissionModule.PERMISSIONS.ANDROID.READ_EXTERNAL_STORAGE,\n ];\n}\n\nconst createNativeFileService = ({\n imagePickerModule,\n documentPickerModule,\n permissionModule,\n mediaLibraryModule,\n fsModule,\n}: {\n imagePickerModule: typeof ImagePicker;\n documentPickerModule: DocumentPicker;\n permissionModule: typeof Permissions;\n mediaLibraryModule: typeof CameraRoll;\n fsModule: typeof FileAccess;\n}): FileServiceInterface => {\n const requiredPermissions: Permission[] = Platform.select({\n ios: [permissionModule.PERMISSIONS.IOS.CAMERA],\n android: [permissionModule.PERMISSIONS.ANDROID.CAMERA],\n default: [],\n });\n const optionalPermissions: Permission[] = Platform.select({\n ios: [permissionModule.PERMISSIONS.IOS.MICROPHONE],\n android: [],\n default: [],\n });\n const mediaLibraryPermissions: Permission[] = Platform.select({\n ios: [permissionModule.PERMISSIONS.IOS.PHOTO_LIBRARY, permissionModule.PERMISSIONS.IOS.PHOTO_LIBRARY_ADD_ONLY],\n android: getAndroidStoragePermissionsByAPILevel(permissionModule),\n default: [],\n });\n\n class NativeFileService implements FileServiceInterface {\n async hasCameraPermission(): Promise<boolean> {\n const status = await permissionModule.checkMultiple(requiredPermissions);\n return nativePermissionGranted(status);\n }\n\n async requestCameraPermission(): Promise<boolean> {\n const requiredPermissionsStatus = await permissionModule.requestMultiple(requiredPermissions);\n if (!nativePermissionGranted(requiredPermissionsStatus)) return false;\n\n await permissionModule.requestMultiple(optionalPermissions);\n return true;\n }\n\n async hasMediaLibraryPermission(): Promise<boolean> {\n const status = await permissionModule.checkMultiple(mediaLibraryPermissions);\n return nativePermissionGranted(status);\n }\n\n async requestMediaLibraryPermission(): Promise<boolean> {\n const status = await permissionModule.requestMultiple(mediaLibraryPermissions);\n return nativePermissionGranted(status);\n }\n\n async openCamera(options?: OpenCameraOptions): Promise<FilePickerResponse> {\n const hasPermission = await this.hasCameraPermission();\n if (!hasPermission) {\n const granted = await this.requestCameraPermission();\n if (!granted) {\n options?.onOpenFailure?.(SBUError.PERMISSIONS_DENIED);\n return null;\n }\n }\n\n const response = await imagePickerModule.launchCamera({\n presentationStyle: 'fullScreen',\n cameraType: options?.cameraType ?? 'back',\n mediaType: (() => {\n switch (options?.mediaType) {\n case 'photo':\n return 'photo';\n case 'video':\n return 'video';\n case 'all':\n return 'mixed';\n default:\n return 'photo';\n }\n })(),\n });\n if (response.didCancel) return null;\n if (response.errorCode === 'camera_unavailable') {\n options?.onOpenFailure?.(SBUError.DEVICE_UNAVAILABLE, new Error(response.errorMessage));\n return null;\n }\n\n const { fileName: name, fileSize: size, type, uri } = response.assets?.[0] ?? {};\n return normalizeFile({ uri, size, name, type });\n }\n\n async openMediaLibrary(options?: OpenMediaLibraryOptions): Promise<FilePickerResponse[] | null> {\n /**\n * NOTE: options.selectionLimit {@link https://github.com/react-native-image-picker/react-native-image-picker#options}\n * We do not support 0 (any number of files)\n **/\n const selectionLimit = options?.selectionLimit || 1;\n const hasPermission = await this.hasMediaLibraryPermission();\n if (!hasPermission) {\n const granted = await this.requestMediaLibraryPermission();\n if (!granted) {\n options?.onOpenFailure?.(SBUError.PERMISSIONS_DENIED);\n return null;\n }\n }\n\n const response = await imagePickerModule.launchImageLibrary({\n presentationStyle: 'fullScreen',\n selectionLimit,\n mediaType: (() => {\n switch (options?.mediaType) {\n case 'photo':\n return 'photo';\n case 'video':\n return 'video';\n case 'all':\n return 'mixed';\n default:\n return 'photo';\n }\n })(),\n });\n if (response.didCancel) return null;\n if (response.errorCode === 'camera_unavailable') {\n options?.onOpenFailure?.(SBUError.DEVICE_UNAVAILABLE, new Error(response.errorMessage));\n return null;\n }\n\n return Promise.all(\n (response.assets || [])\n .slice(0, selectionLimit)\n .map(({ fileName: name, fileSize: size, type, uri }) => normalizeFile({ uri, size, name, type })),\n );\n }\n\n async openDocument(options?: OpenDocumentOptions): Promise<FilePickerResponse> {\n return await openDocument(documentPickerModule, options);\n }\n\n async save(options: SaveOptions): Promise<string> {\n const hasPermission = await this.hasMediaLibraryPermission();\n if (!hasPermission) {\n const granted = await this.requestMediaLibraryPermission();\n if (!granted) throw new Error('Permission not granted');\n }\n\n const { downloadedPath, file } = await this.downloadFile(options);\n\n if (Platform.OS === 'ios') {\n if (file.type === 'image' || file.type === 'video') {\n const mediaTypeMap = { 'image': 'photo', 'video': 'video' } as const;\n const mediaType = mediaTypeMap[file.type];\n await mediaLibraryModule.save(downloadedPath, { type: mediaType });\n }\n }\n\n if (Platform.OS === 'android') {\n const externalDirMap = { 'file': 'downloads', 'audio': 'audio', 'image': 'images', 'video': 'video' } as const;\n const externalDir = externalDirMap[file.type];\n await fsModule.FileSystem.cpExternal(downloadedPath, file.name, externalDir).catch(() => {\n Logger.error('Failed to save file to external storage. Retry saving to downloads directory instead.');\n return fsModule.FileSystem.cpExternal(downloadedPath, file.name, 'downloads');\n });\n }\n\n return downloadedPath;\n }\n\n private buildDownloadPath = async (options: SaveOptions) => {\n const dirname = Platform.select({ android: fsModule.Dirs.CacheDir, default: fsModule.Dirs.DocumentDir });\n const context = { dirname, filename: options.fileName };\n const extension =\n getFileExtension(options.fileName) ||\n getFileExtensionFromMime(options.fileType) ||\n getFileExtension(options.fileUrl) ||\n (await getFileExtensionFromUri(options.fileUrl));\n\n if (extension) context.filename = normalizeFileName(context.filename, extension);\n\n return { path: `${context.dirname}/${context.filename}`, ...context };\n };\n\n private downloadFile = async (options: SaveOptions) => {\n const { path, filename } = await this.buildDownloadPath(options);\n await fsModule.FileSystem.fetch(options.fileUrl, { path });\n return {\n downloadedPath: path,\n file: {\n name: filename,\n type: getFileType(getFileExtension(path)),\n } as const,\n };\n };\n\n createRecordFilePath(customExtension = 'm4a'): { recordFilePath: string; uri: string } {\n const filename = `record-${Date.now()}.${customExtension}`;\n const path = `${fsModule.Dirs.CacheDir}/${filename}`;\n return Platform.select({\n ios: {\n uri: path,\n recordFilePath: path,\n },\n android: {\n uri: path.startsWith('file://') ? path : 'file://' + path,\n recordFilePath: path,\n },\n default: {\n uri: path,\n recordFilePath: path,\n },\n });\n }\n }\n\n return new NativeFileService();\n};\n\nexport default createNativeFileService;\n"],"mappings":"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","ignoreList":[]}
|