@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.
Files changed (50) hide show
  1. package/README.md +2 -2
  2. package/lib/commonjs/components/ChannelInput/VoiceMessageInput.js +1 -1
  3. package/lib/commonjs/components/ChannelInput/VoiceMessageInput.js.map +1 -1
  4. package/lib/commonjs/components/ChannelInput/index.js +2 -25
  5. package/lib/commonjs/components/ChannelInput/index.js.map +1 -1
  6. package/lib/commonjs/hooks/useVoiceMessageInput.js +10 -2
  7. package/lib/commonjs/hooks/useVoiceMessageInput.js.map +1 -1
  8. package/lib/commonjs/platform/createFileService.native.js +1 -1
  9. package/lib/commonjs/platform/createFileService.native.js.map +1 -1
  10. package/lib/commonjs/platform/createPlayerService.native.js +191 -114
  11. package/lib/commonjs/platform/createPlayerService.native.js.map +1 -1
  12. package/lib/commonjs/platform/createRecorderService.expo.js +3 -0
  13. package/lib/commonjs/platform/createRecorderService.expo.js.map +1 -1
  14. package/lib/commonjs/platform/createRecorderService.native.js +212 -129
  15. package/lib/commonjs/platform/createRecorderService.native.js.map +1 -1
  16. package/lib/commonjs/platform/types.js.map +1 -1
  17. package/lib/commonjs/version.js +1 -1
  18. package/lib/commonjs/version.js.map +1 -1
  19. package/lib/module/components/ChannelInput/VoiceMessageInput.js +1 -1
  20. package/lib/module/components/ChannelInput/VoiceMessageInput.js.map +1 -1
  21. package/lib/module/components/ChannelInput/index.js +3 -26
  22. package/lib/module/components/ChannelInput/index.js.map +1 -1
  23. package/lib/module/hooks/useVoiceMessageInput.js +10 -2
  24. package/lib/module/hooks/useVoiceMessageInput.js.map +1 -1
  25. package/lib/module/platform/createFileService.native.js +1 -1
  26. package/lib/module/platform/createFileService.native.js.map +1 -1
  27. package/lib/module/platform/createPlayerService.native.js +191 -114
  28. package/lib/module/platform/createPlayerService.native.js.map +1 -1
  29. package/lib/module/platform/createRecorderService.expo.js +3 -0
  30. package/lib/module/platform/createRecorderService.expo.js.map +1 -1
  31. package/lib/module/platform/createRecorderService.native.js +212 -129
  32. package/lib/module/platform/createRecorderService.native.js.map +1 -1
  33. package/lib/module/platform/types.js.map +1 -1
  34. package/lib/module/version.js +1 -1
  35. package/lib/module/version.js.map +1 -1
  36. package/lib/typescript/src/containers/SendbirdUIKitContainer.d.ts +1 -1
  37. package/lib/typescript/src/platform/createPlayerService.native.d.ts +5 -3
  38. package/lib/typescript/src/platform/createRecorderService.native.d.ts +5 -3
  39. package/lib/typescript/src/platform/types.d.ts +4 -0
  40. package/lib/typescript/src/version.d.ts +1 -1
  41. package/package.json +18 -5
  42. package/src/components/ChannelInput/VoiceMessageInput.tsx +1 -1
  43. package/src/components/ChannelInput/index.tsx +6 -36
  44. package/src/hooks/useVoiceMessageInput.ts +7 -2
  45. package/src/platform/createFileService.native.ts +1 -1
  46. package/src/platform/createPlayerService.native.tsx +237 -113
  47. package/src/platform/createRecorderService.expo.tsx +4 -0
  48. package/src/platform/createRecorderService.native.tsx +240 -118
  49. package/src/platform/types.ts +5 -0
  50. package/src/version.ts +1 -1
package/README.md CHANGED
@@ -150,7 +150,7 @@ npm install react-native-video \
150
150
  react-native-image-picker \
151
151
  react-native-document-picker \
152
152
  react-native-create-thumbnail \
153
- react-native-audio-recorder-player \
153
+ react-native-nitro-sound \
154
154
  @react-native-clipboard/clipboard \
155
155
  @react-native-camera-roll/camera-roll \
156
156
  @react-native-firebase/app \
@@ -171,7 +171,7 @@ import * as ImagePicker from 'react-native-image-picker';
171
171
  import * as Permissions from 'react-native-permissions';
172
172
  import * as CreateThumbnail from 'react-native-create-thumbnail';
173
173
  import * as ImageResizer from '@bam.tech/react-native-image-resizer';
174
- import * as AudioRecorderPlayer from 'react-native-audio-recorder-player';
174
+ import * as AudioRecorderPlayer from 'react-native-nitro-sound';
175
175
 
176
176
  const nativePlatformServices = {
177
177
  clipboard: createNativeClipboardService(Clipboard),
@@ -70,7 +70,7 @@ const VoiceMessageInput = ({
70
70
  break;
71
71
  }
72
72
  } catch (error) {
73
- _uikitUtils.Logger.warn('Failed to run voice message action.', state);
73
+ _uikitUtils.Logger.warn('Failed to run voice message action.', state, error);
74
74
  }
75
75
  };
76
76
  const renderActionIcon = () => {
@@ -1 +1 @@
1
- {"version":3,"names":["_react","_interopRequireWildcard","require","_reactNative","_uikitReactNativeFoundation","_uikitUtils","_useContext","_useVoiceMessageInput","_interopRequireDefault","e","__esModule","default","_getRequireWildcardCache","WeakMap","r","t","has","get","n","__proto__","a","Object","defineProperty","getOwnPropertyDescriptor","u","hasOwnProperty","call","i","set","VoiceMessageInput","onClose","onSend","STRINGS","useLocalization","colors","useUIKitTheme","actions","state","useVoiceMessageInput","file","duration","uiColors","ui","voiceMessageInput","status","onPressCancel","cancel","catch","error","Logger","warn","finally","onPressSend","send","onPressVoiceMessageAction","startRecording","lessThanMinimumDuration","stopRecording","playPlayer","pausePlayer","renderActionIcon","createElement","Icon","icon","size","color","recording","actionIcon","isRecorderState","recordingTime","currentTime","minDuration","remainingTime","playingTime","Box","backgroundColor","background","paddingVertical","paddingHorizontal","style","styles","container","ProgressBar","progressBar","current","conditionChaining","total","maxDuration","trackColor","progressTrack","overlay","flex","flexDirection","alignItems","justifyContent","paddingEnd","RecordingLight","visible","Text","caption1","lineHeight","undefined","marginStart","textTime","millsToMMSS","height","CancelButton","label","LABELS","VOICE_MESSAGE_INPUT_CANCEL","onPress","SendButton","disabled","position","PressBox","activeOpacity","width","borderRadius","actionIconBackground","props","value","useRef","Animated","Value","animation","loop","sequence","timing","toValue","useNativeDriver","useEffect","start","reset","View","opacity","active","button","textCancel","numberOfLines","sendIconBackground","padding","sendIcon","createStyleSheet","borderTopStartRadius","borderTopEndRadius","marginBottom","_default","exports"],"sources":["VoiceMessageInput.tsx"],"sourcesContent":["import React, { useEffect, useRef } from 'react';\nimport { Animated } from 'react-native';\n\nimport {\n Box,\n Icon,\n PressBox,\n ProgressBar,\n Text,\n createStyleSheet,\n useUIKitTheme,\n} from '@sendbird/uikit-react-native-foundation';\nimport { Logger, conditionChaining, millsToMMSS } from '@sendbird/uikit-utils';\n\nimport { useLocalization } from '../../hooks/useContext';\nimport useVoiceMessageInput from '../../hooks/useVoiceMessageInput';\nimport type { FileType } from '../../platform/types';\n\nexport type VoiceMessageInputProps = {\n onClose: () => Promise<void>;\n onSend: (params: { file: FileType; duration: number }) => void;\n};\n\nconst VoiceMessageInput = ({ onClose, onSend }: VoiceMessageInputProps) => {\n const { STRINGS } = useLocalization();\n const { colors } = useUIKitTheme();\n const { actions, state } = useVoiceMessageInput({\n onSend: (file, duration) => onSend({ file, duration }),\n onClose,\n });\n\n const uiColors = colors.ui.voiceMessageInput.default[state.status !== 'idle' ? 'active' : 'inactive'];\n\n const onPressCancel = async () => {\n await actions\n .cancel()\n .catch((error) => {\n Logger.warn('Failed to cancel voice message input', error);\n })\n .finally(() => {\n onClose();\n });\n };\n\n const onPressSend = async () => {\n await actions\n .send()\n .catch((error) => {\n Logger.warn('Failed to send voice message', error);\n })\n .finally(() => {\n onClose();\n });\n };\n\n const onPressVoiceMessageAction = async () => {\n try {\n switch (state.status) {\n case 'idle':\n await actions.startRecording();\n break;\n case 'recording':\n if (lessThanMinimumDuration) {\n await actions.cancel();\n } else {\n await actions.stopRecording();\n }\n break;\n case 'recording_completed':\n case 'playing_paused':\n await actions.playPlayer();\n break;\n case 'playing':\n await actions.pausePlayer();\n break;\n }\n } catch (error) {\n Logger.warn('Failed to run voice message action.', state);\n }\n };\n const renderActionIcon = () => {\n switch (state.status) {\n case 'idle':\n return <Icon icon={'recording'} size={20} color={uiColors.recording} />;\n case 'recording':\n return <Icon icon={'stop'} size={20} color={uiColors.actionIcon} />;\n case 'recording_completed':\n case 'playing_paused':\n return <Icon icon={'play'} size={20} color={uiColors.actionIcon} />;\n case 'playing':\n return <Icon icon={'pause'} size={20} color={uiColors.actionIcon} />;\n }\n };\n\n const isRecorderState = state.status === 'recording' || state.status === 'recording_completed';\n const lessThanMinimumDuration = state.recordingTime.currentTime < state.recordingTime.minDuration;\n const remainingTime = state.playingTime.duration - state.playingTime.currentTime;\n\n return (\n <Box backgroundColor={uiColors.background} paddingVertical={24} paddingHorizontal={16} style={styles.container}>\n {/** Progress bar **/}\n <ProgressBar\n style={styles.progressBar}\n current={conditionChaining(\n [state.status === 'recording', state.status === 'recording_completed'],\n [state.recordingTime.currentTime, 0, state.playingTime.currentTime],\n )}\n total={(isRecorderState ? state.recordingTime.maxDuration : state.playingTime.duration) || 1}\n trackColor={uiColors.progressTrack}\n overlay={\n <Box flex={1} flexDirection={'row'} alignItems={'center'} justifyContent={'flex-end'} paddingEnd={16}>\n <RecordingLight visible={state.status === 'recording'} />\n <Text caption1 style={{ lineHeight: undefined, marginStart: 6 }} color={uiColors.textTime}>\n {millsToMMSS(isRecorderState ? state.recordingTime.currentTime : remainingTime)}\n </Text>\n </Box>\n }\n />\n\n <Box height={34} alignItems={'center'} justifyContent={'center'}>\n {/** Cancel / Send **/}\n <Box flexDirection={'row'}>\n <CancelButton label={STRINGS.LABELS.VOICE_MESSAGE_INPUT_CANCEL} onPress={onPressCancel} />\n <Box flex={1} />\n <SendButton disabled={state.status === 'idle' || lessThanMinimumDuration} onPress={onPressSend} />\n </Box>\n\n {/** Record / Stop / Play / Pause **/}\n <Box style={{ position: 'absolute' }} alignItems={'center'} justifyContent={'center'}>\n <PressBox activeOpacity={0.5} onPress={onPressVoiceMessageAction}>\n <Box\n width={34}\n height={34}\n borderRadius={17}\n alignItems={'center'}\n justifyContent={'center'}\n backgroundColor={uiColors.actionIconBackground}\n >\n {renderActionIcon()}\n </Box>\n </PressBox>\n </Box>\n </Box>\n </Box>\n );\n};\n\nconst RecordingLight = (props: { visible: boolean }) => {\n const { colors } = useUIKitTheme();\n\n const value = useRef(new Animated.Value(0)).current;\n const animation = useRef(\n Animated.loop(\n Animated.sequence([\n Animated.timing(value, { toValue: 1, duration: 500, useNativeDriver: true }),\n Animated.timing(value, { toValue: 0, duration: 500, useNativeDriver: true }),\n ]),\n ),\n ).current;\n\n useEffect(() => {\n if (props.visible) animation.start();\n return () => {\n animation.reset();\n };\n }, [props.visible]);\n\n if (!props.visible) return null;\n return (\n <Animated.View\n style={{\n width: 12,\n height: 12,\n borderRadius: 6,\n opacity: value,\n backgroundColor: colors.ui.voiceMessageInput.default.active.recording,\n }}\n />\n );\n};\n\nconst CancelButton = (props: { onPress: () => void; label: string }) => {\n const { colors } = useUIKitTheme();\n\n return (\n <PressBox activeOpacity={0.8} onPress={props.onPress}>\n <Box paddingHorizontal={12} height={'100%'} alignItems={'center'} justifyContent={'center'}>\n <Text button color={colors.ui.voiceMessageInput.default.active.textCancel} numberOfLines={1}>\n {props.label}\n </Text>\n </Box>\n </PressBox>\n );\n};\n\nconst SendButton = (props: { onPress: () => void; disabled: boolean }) => {\n const { colors } = useUIKitTheme();\n\n const uiColors = colors.ui.voiceMessageInput.default[props.disabled ? 'inactive' : 'active'];\n\n return (\n <PressBox disabled={props.disabled} activeOpacity={0.8} onPress={props.onPress}>\n <Box backgroundColor={uiColors.sendIconBackground} padding={7} borderRadius={40}>\n <Icon icon={'send'} size={20} color={uiColors.sendIcon} />\n </Box>\n </PressBox>\n );\n};\n\nconst styles = createStyleSheet({\n container: {\n borderTopStartRadius: 8,\n borderTopEndRadius: 8,\n },\n progressBar: {\n height: 36,\n marginBottom: 16,\n borderRadius: 18,\n },\n});\n\nexport default VoiceMessageInput;\n"],"mappings":"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","ignoreList":[]}
1
+ {"version":3,"names":["_react","_interopRequireWildcard","require","_reactNative","_uikitReactNativeFoundation","_uikitUtils","_useContext","_useVoiceMessageInput","_interopRequireDefault","e","__esModule","default","_getRequireWildcardCache","WeakMap","r","t","has","get","n","__proto__","a","Object","defineProperty","getOwnPropertyDescriptor","u","hasOwnProperty","call","i","set","VoiceMessageInput","onClose","onSend","STRINGS","useLocalization","colors","useUIKitTheme","actions","state","useVoiceMessageInput","file","duration","uiColors","ui","voiceMessageInput","status","onPressCancel","cancel","catch","error","Logger","warn","finally","onPressSend","send","onPressVoiceMessageAction","startRecording","lessThanMinimumDuration","stopRecording","playPlayer","pausePlayer","renderActionIcon","createElement","Icon","icon","size","color","recording","actionIcon","isRecorderState","recordingTime","currentTime","minDuration","remainingTime","playingTime","Box","backgroundColor","background","paddingVertical","paddingHorizontal","style","styles","container","ProgressBar","progressBar","current","conditionChaining","total","maxDuration","trackColor","progressTrack","overlay","flex","flexDirection","alignItems","justifyContent","paddingEnd","RecordingLight","visible","Text","caption1","lineHeight","undefined","marginStart","textTime","millsToMMSS","height","CancelButton","label","LABELS","VOICE_MESSAGE_INPUT_CANCEL","onPress","SendButton","disabled","position","PressBox","activeOpacity","width","borderRadius","actionIconBackground","props","value","useRef","Animated","Value","animation","loop","sequence","timing","toValue","useNativeDriver","useEffect","start","reset","View","opacity","active","button","textCancel","numberOfLines","sendIconBackground","padding","sendIcon","createStyleSheet","borderTopStartRadius","borderTopEndRadius","marginBottom","_default","exports"],"sources":["VoiceMessageInput.tsx"],"sourcesContent":["import React, { useEffect, useRef } from 'react';\nimport { Animated } from 'react-native';\n\nimport {\n Box,\n Icon,\n PressBox,\n ProgressBar,\n Text,\n createStyleSheet,\n useUIKitTheme,\n} from '@sendbird/uikit-react-native-foundation';\nimport { Logger, conditionChaining, millsToMMSS } from '@sendbird/uikit-utils';\n\nimport { useLocalization } from '../../hooks/useContext';\nimport useVoiceMessageInput from '../../hooks/useVoiceMessageInput';\nimport type { FileType } from '../../platform/types';\n\nexport type VoiceMessageInputProps = {\n onClose: () => Promise<void>;\n onSend: (params: { file: FileType; duration: number }) => void;\n};\n\nconst VoiceMessageInput = ({ onClose, onSend }: VoiceMessageInputProps) => {\n const { STRINGS } = useLocalization();\n const { colors } = useUIKitTheme();\n const { actions, state } = useVoiceMessageInput({\n onSend: (file, duration) => onSend({ file, duration }),\n onClose,\n });\n\n const uiColors = colors.ui.voiceMessageInput.default[state.status !== 'idle' ? 'active' : 'inactive'];\n\n const onPressCancel = async () => {\n await actions\n .cancel()\n .catch((error) => {\n Logger.warn('Failed to cancel voice message input', error);\n })\n .finally(() => {\n onClose();\n });\n };\n\n const onPressSend = async () => {\n await actions\n .send()\n .catch((error) => {\n Logger.warn('Failed to send voice message', error);\n })\n .finally(() => {\n onClose();\n });\n };\n\n const onPressVoiceMessageAction = async () => {\n try {\n switch (state.status) {\n case 'idle':\n await actions.startRecording();\n break;\n case 'recording':\n if (lessThanMinimumDuration) {\n await actions.cancel();\n } else {\n await actions.stopRecording();\n }\n break;\n case 'recording_completed':\n case 'playing_paused':\n await actions.playPlayer();\n break;\n case 'playing':\n await actions.pausePlayer();\n break;\n }\n } catch (error) {\n Logger.warn('Failed to run voice message action.', state, error);\n }\n };\n const renderActionIcon = () => {\n switch (state.status) {\n case 'idle':\n return <Icon icon={'recording'} size={20} color={uiColors.recording} />;\n case 'recording':\n return <Icon icon={'stop'} size={20} color={uiColors.actionIcon} />;\n case 'recording_completed':\n case 'playing_paused':\n return <Icon icon={'play'} size={20} color={uiColors.actionIcon} />;\n case 'playing':\n return <Icon icon={'pause'} size={20} color={uiColors.actionIcon} />;\n }\n };\n\n const isRecorderState = state.status === 'recording' || state.status === 'recording_completed';\n const lessThanMinimumDuration = state.recordingTime.currentTime < state.recordingTime.minDuration;\n const remainingTime = state.playingTime.duration - state.playingTime.currentTime;\n\n return (\n <Box backgroundColor={uiColors.background} paddingVertical={24} paddingHorizontal={16} style={styles.container}>\n {/** Progress bar **/}\n <ProgressBar\n style={styles.progressBar}\n current={conditionChaining(\n [state.status === 'recording', state.status === 'recording_completed'],\n [state.recordingTime.currentTime, 0, state.playingTime.currentTime],\n )}\n total={(isRecorderState ? state.recordingTime.maxDuration : state.playingTime.duration) || 1}\n trackColor={uiColors.progressTrack}\n overlay={\n <Box flex={1} flexDirection={'row'} alignItems={'center'} justifyContent={'flex-end'} paddingEnd={16}>\n <RecordingLight visible={state.status === 'recording'} />\n <Text caption1 style={{ lineHeight: undefined, marginStart: 6 }} color={uiColors.textTime}>\n {millsToMMSS(isRecorderState ? state.recordingTime.currentTime : remainingTime)}\n </Text>\n </Box>\n }\n />\n\n <Box height={34} alignItems={'center'} justifyContent={'center'}>\n {/** Cancel / Send **/}\n <Box flexDirection={'row'}>\n <CancelButton label={STRINGS.LABELS.VOICE_MESSAGE_INPUT_CANCEL} onPress={onPressCancel} />\n <Box flex={1} />\n <SendButton disabled={state.status === 'idle' || lessThanMinimumDuration} onPress={onPressSend} />\n </Box>\n\n {/** Record / Stop / Play / Pause **/}\n <Box style={{ position: 'absolute' }} alignItems={'center'} justifyContent={'center'}>\n <PressBox activeOpacity={0.5} onPress={onPressVoiceMessageAction}>\n <Box\n width={34}\n height={34}\n borderRadius={17}\n alignItems={'center'}\n justifyContent={'center'}\n backgroundColor={uiColors.actionIconBackground}\n >\n {renderActionIcon()}\n </Box>\n </PressBox>\n </Box>\n </Box>\n </Box>\n );\n};\n\nconst RecordingLight = (props: { visible: boolean }) => {\n const { colors } = useUIKitTheme();\n\n const value = useRef(new Animated.Value(0)).current;\n const animation = useRef(\n Animated.loop(\n Animated.sequence([\n Animated.timing(value, { toValue: 1, duration: 500, useNativeDriver: true }),\n Animated.timing(value, { toValue: 0, duration: 500, useNativeDriver: true }),\n ]),\n ),\n ).current;\n\n useEffect(() => {\n if (props.visible) animation.start();\n return () => {\n animation.reset();\n };\n }, [props.visible]);\n\n if (!props.visible) return null;\n return (\n <Animated.View\n style={{\n width: 12,\n height: 12,\n borderRadius: 6,\n opacity: value,\n backgroundColor: colors.ui.voiceMessageInput.default.active.recording,\n }}\n />\n );\n};\n\nconst CancelButton = (props: { onPress: () => void; label: string }) => {\n const { colors } = useUIKitTheme();\n\n return (\n <PressBox activeOpacity={0.8} onPress={props.onPress}>\n <Box paddingHorizontal={12} height={'100%'} alignItems={'center'} justifyContent={'center'}>\n <Text button color={colors.ui.voiceMessageInput.default.active.textCancel} numberOfLines={1}>\n {props.label}\n </Text>\n </Box>\n </PressBox>\n );\n};\n\nconst SendButton = (props: { onPress: () => void; disabled: boolean }) => {\n const { colors } = useUIKitTheme();\n\n const uiColors = colors.ui.voiceMessageInput.default[props.disabled ? 'inactive' : 'active'];\n\n return (\n <PressBox disabled={props.disabled} activeOpacity={0.8} onPress={props.onPress}>\n <Box backgroundColor={uiColors.sendIconBackground} padding={7} borderRadius={40}>\n <Icon icon={'send'} size={20} color={uiColors.sendIcon} />\n </Box>\n </PressBox>\n );\n};\n\nconst styles = createStyleSheet({\n container: {\n borderTopStartRadius: 8,\n borderTopEndRadius: 8,\n },\n progressBar: {\n height: 36,\n marginBottom: 16,\n borderRadius: 18,\n },\n});\n\nexport default VoiceMessageInput;\n"],"mappings":"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","ignoreList":[]}
@@ -24,10 +24,8 @@ const AUTO_FOCUS = _reactNative.Platform.select({
24
24
  android: true,
25
25
  default: false
26
26
  });
27
- const isAndroidApi35Plus = _reactNative.Platform.OS === 'android' && _reactNative.Platform.Version >= 35;
28
27
  const KEYBOARD_AVOID_VIEW_BEHAVIOR = _reactNative.Platform.select({
29
28
  ios: 'padding',
30
- android: isAndroidApi35Plus ? 'padding' : undefined,
31
29
  default: undefined
32
30
  });
33
31
 
@@ -47,15 +45,6 @@ const ChannelInput = props => {
47
45
  setMessageToEdit
48
46
  } = props;
49
47
  const safeArea = (0, _uikitUtils.useSafeAreaPadding)(['top', 'left', 'right', 'bottom']);
50
-
51
- // Android API 35+ keyboard avoidance handling
52
- /**
53
- * Android API 35+ introduced edge-to-edge layouts, which changed how keyboard avoidance should be handled.
54
- * For API 35+, the system manages insets automatically, so we use the provided keyboardAvoidOffset directly.
55
- * For older Android versions, we manually subtract the safe area bottom padding to avoid overlapping with system UI.
56
- * See: https://developer.android.com/develop/ui/views/layout/edge-to-edge
57
- */
58
- const keyboardVerticalOffset = isAndroidApi35Plus ? keyboardAvoidOffset : -safeArea.paddingBottom + keyboardAvoidOffset;
59
48
  const {
60
49
  colors,
61
50
  typography
@@ -105,25 +94,13 @@ const ChannelInput = props => {
105
94
  range
106
95
  });
107
96
  };
108
- const [keyboardShown, setKeyboardShown] = (0, _react.useState)(false);
109
- (0, _react.useEffect)(() => {
110
- const keyboardDidShow = () => setKeyboardShown(true);
111
- const keyboardDidHide = () => setKeyboardShown(false);
112
- const showSubscription = _reactNative.Keyboard.addListener('keyboardDidShow', keyboardDidShow);
113
- const hideSubscription = _reactNative.Keyboard.addListener('keyboardDidHide', keyboardDidHide);
114
- return () => {
115
- showSubscription.remove();
116
- hideSubscription.remove();
117
- };
118
- }, []);
119
- const shouldShowSafeAreaBottom = !isAndroidApi35Plus || isAndroidApi35Plus && !keyboardShown;
120
97
  if (!props.shouldRenderInput) {
121
98
  return /*#__PURE__*/_react.default.createElement(SafeAreaBottom, {
122
99
  height: safeArea.paddingBottom
123
100
  });
124
101
  }
125
102
  return /*#__PURE__*/_react.default.createElement(_react.default.Fragment, null, /*#__PURE__*/_react.default.createElement(_reactNative.KeyboardAvoidingView, {
126
- keyboardVerticalOffset: keyboardVerticalOffset,
103
+ keyboardVerticalOffset: -safeArea.paddingBottom + keyboardAvoidOffset,
127
104
  behavior: KEYBOARD_AVOID_VIEW_BEHAVIOR
128
105
  }, /*#__PURE__*/_react.default.createElement(_reactNative.View, {
129
106
  style: {
@@ -156,7 +133,7 @@ const ChannelInput = props => {
156
133
  messageToEdit: messageToEdit,
157
134
  setMessageToEdit: setMessageToEdit,
158
135
  style: textInputStyle
159
- }))), shouldShowSafeAreaBottom && /*#__PURE__*/_react.default.createElement(SafeAreaBottom, {
136
+ }))), /*#__PURE__*/_react.default.createElement(SafeAreaBottom, {
160
137
  height: safeArea.paddingBottom
161
138
  }))), mentionAvailable && props.SuggestedMentionList && /*#__PURE__*/_react.default.createElement(props.SuggestedMentionList, {
162
139
  text: text,
@@ -1 +1 @@
1
- {"version":3,"names":["_react","_interopRequireWildcard","require","_reactNative","_uikitReactNativeFoundation","_uikitUtils","_useContext","_useMentionTextInput","_interopRequireDefault","_AttachmentsButton","_EditInput","_MessageToReplyPreview","_SendInput","_VoiceMessageInput","e","__esModule","default","_getRequireWildcardCache","WeakMap","r","t","has","get","n","__proto__","a","Object","defineProperty","getOwnPropertyDescriptor","u","hasOwnProperty","call","i","set","_extends","assign","bind","arguments","length","apply","AUTO_FOCUS","Platform","select","ios","android","isAndroidApi35Plus","OS","Version","KEYBOARD_AVOID_VIEW_BEHAVIOR","undefined","ChannelInput","props","channel","keyboardAvoidOffset","messageToEdit","setMessageToEdit","safeArea","useSafeAreaPadding","keyboardVerticalOffset","paddingBottom","colors","typography","useUIKitTheme","sbOptions","mentionManager","useSendbirdChat","selection","onSelectionChange","textInputRef","text","onChangeText","mentionedUsers","useMentionTextInput","inputMode","useIIFE","isFileMessage","mentionAvailable","uikit","groupChannel","enableMention","isGroupChannel","isBroadcast","inputKeyToRemount","inputHeight","setInputHeight","useState","styles","inputDefault","height","fontStyle","useMemo","body3","fontSize","lineHeight","textAlignVertical","textInputStyle","StyleSheet","flatten","input","style","useTypingTrigger","useTextClearOnDisabled","inputDisabled","useAutoFocusOnEditMode","onPressToMention","user","searchStringRange","mentionedMessageText","asMentionedMessageText","range","start","end","replace","keyboardShown","setKeyboardShown","useEffect","keyboardDidShow","keyboardDidHide","showSubscription","Keyboard","addListener","hideSubscription","remove","shouldShowSafeAreaBottom","shouldRenderInput","createElement","SafeAreaBottom","Fragment","KeyboardAvoidingView","behavior","View","paddingStart","paddingEnd","backgroundColor","background","onLayout","nativeEvent","layout","inputContainer","key","ref","VoiceMessageInput","AttachmentsButton","MessageToReplyPreview","autoFocus","SuggestedMentionList","topInset","paddingTop","bottomInset","triggerTyping","action","endTyping","startTyping","catch","error","Logger","debug","setText","chatDisabled","isUserMessage","setTimeout","_textInputRef$current","current","focus","createStyleSheet","justifyContent","width","flex","marginEnd","borderRadius","minHeight","maxHeight","_default","exports","React","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","_interopRequireWildcard","require","_reactNative","_uikitReactNativeFoundation","_uikitUtils","_useContext","_useMentionTextInput","_interopRequireDefault","_AttachmentsButton","_EditInput","_MessageToReplyPreview","_SendInput","_VoiceMessageInput","e","__esModule","default","_getRequireWildcardCache","WeakMap","r","t","has","get","n","__proto__","a","Object","defineProperty","getOwnPropertyDescriptor","u","hasOwnProperty","call","i","set","_extends","assign","bind","arguments","length","apply","AUTO_FOCUS","Platform","select","ios","android","KEYBOARD_AVOID_VIEW_BEHAVIOR","undefined","ChannelInput","props","channel","keyboardAvoidOffset","messageToEdit","setMessageToEdit","safeArea","useSafeAreaPadding","colors","typography","useUIKitTheme","sbOptions","mentionManager","useSendbirdChat","selection","onSelectionChange","textInputRef","text","onChangeText","mentionedUsers","useMentionTextInput","inputMode","useIIFE","isFileMessage","mentionAvailable","uikit","groupChannel","enableMention","isGroupChannel","isBroadcast","inputKeyToRemount","inputHeight","setInputHeight","useState","styles","inputDefault","height","fontStyle","useMemo","body3","fontSize","lineHeight","textAlignVertical","textInputStyle","StyleSheet","flatten","input","style","useTypingTrigger","useTextClearOnDisabled","inputDisabled","useAutoFocusOnEditMode","onPressToMention","user","searchStringRange","mentionedMessageText","asMentionedMessageText","range","start","end","replace","shouldRenderInput","createElement","SafeAreaBottom","paddingBottom","Fragment","KeyboardAvoidingView","keyboardVerticalOffset","behavior","View","paddingStart","paddingEnd","backgroundColor","background","onLayout","nativeEvent","layout","inputContainer","key","ref","VoiceMessageInput","AttachmentsButton","MessageToReplyPreview","autoFocus","SuggestedMentionList","topInset","paddingTop","bottomInset","useEffect","triggerTyping","action","endTyping","startTyping","catch","error","Logger","debug","setText","chatDisabled","isUserMessage","setTimeout","_textInputRef$current","current","focus","createStyleSheet","justifyContent","width","flex","marginEnd","borderRadius","minHeight","maxHeight","_default","exports","React","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":[]}
@@ -122,8 +122,13 @@ const useVoiceMessageInput = ({
122
122
  });
123
123
  }
124
124
  } else {
125
- setVoiceMessageRecordingPath(fileService.createRecordFilePath(recorderService.options.extension));
126
- await recorderService.record(getVoiceMessageRecordingPath().recordFilePath);
125
+ const recordFilePath = fileService.createRecordFilePath(recorderService.options.extension);
126
+ const convertedRecordPath = recorderService.convertRecordPath(recordFilePath.recordFilePath);
127
+ setVoiceMessageRecordingPath({
128
+ ...recordFilePath,
129
+ recordFilePath: convertedRecordPath
130
+ });
131
+ await recorderService.record(convertedRecordPath);
127
132
  }
128
133
  }
129
134
  },
@@ -191,6 +196,9 @@ const useVoiceMessageInput = ({
191
196
  },
192
197
  async send() {
193
198
  if ((0, _uikitUtils.matchesOneOf)(status, ['recording', 'recording_completed', 'playing', 'playing_paused']) && recordingPath.current) {
199
+ if (status === 'recording') {
200
+ await recorderService.stop();
201
+ }
194
202
  const voiceFile = (0, _uikitUtils.getVoiceMessageFileObject)(recordingPath.current.uri, recorderService.options.extension);
195
203
  onSend(voiceFile, Math.floor(recordingTime.currentTime));
196
204
  await clear();
@@ -1 +1 @@
1
- {"version":3,"names":["_react","require","_uikitReactNativeFoundation","_uikitUtils","_SBUUtils","_interopRequireDefault","_useContext","e","__esModule","default","useVoiceMessageInput","onSend","onClose","alert","useAlert","STRINGS","useLocalization","recorderService","playerService","fileService","usePlatformService","status","setStatus","useState","recordingTime","setRecordingTime","currentTime","minDuration","options","maxDuration","playingTime","setPlayingTime","duration","recordingPath","useRef","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","SBUUtils","openSettings","Logger","error","matchesOneOf","unsubscribeRecording","addRecordingListener","prev","unsubscribeState","addStateListener","isExpo","record","uri","recordFilePath","createRecordFilePath","extension","stopRecording","stop","playPlayer","PERMISSION_DEVICE_STORAGE","unsubscribePlayback","addPlaybackListener","play","pausePlayer","pause","send","voiceFile","getVoiceMessageFileObject","Math","floor","_default","exports"],"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":["_react","require","_uikitReactNativeFoundation","_uikitUtils","_SBUUtils","_interopRequireDefault","_useContext","e","__esModule","default","useVoiceMessageInput","onSend","onClose","alert","useAlert","STRINGS","useLocalization","recorderService","playerService","fileService","usePlatformService","status","setStatus","useState","recordingTime","setRecordingTime","currentTime","minDuration","options","maxDuration","playingTime","setPlayingTime","duration","recordingPath","useRef","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","SBUUtils","openSettings","Logger","error","matchesOneOf","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","getVoiceMessageFileObject","Math","floor","_default","exports"],"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":[]}
@@ -240,7 +240,7 @@ const createNativeFileService = ({
240
240
  return _reactNative.Platform.select({
241
241
  ios: {
242
242
  uri: path,
243
- recordFilePath: filename
243
+ recordFilePath: path
244
244
  },
245
245
  android: {
246
246
  uri: path.startsWith('file://') ? path : 'file://' + path,
@@ -1 +1 @@
1
- {"version":3,"names":["_reactNative","require","_uikitUtils","_SBUError","_interopRequireDefault","_nativePermissionGranted","_normalizeFile","_openDocument","e","__esModule","default","_defineProperty","r","t","_toPropertyKey","Object","defineProperty","value","enumerable","configurable","writable","i","_toPrimitive","Symbol","toPrimitive","call","TypeError","String","Number","getAndroidStoragePermissionsByAPILevel","permissionModule","Platform","OS","Version","PERMISSIONS","ANDROID","READ_EXTERNAL_STORAGE","WRITE_EXTERNAL_STORAGE","createNativeFileService","imagePickerModule","documentPickerModule","mediaLibraryModule","fsModule","requiredPermissions","select","ios","IOS","CAMERA","android","optionalPermissions","MICROPHONE","mediaLibraryPermissions","PHOTO_LIBRARY","PHOTO_LIBRARY_ADD_ONLY","NativeFileService","constructor","options","dirname","Dirs","CacheDir","DocumentDir","context","filename","fileName","extension","getFileExtension","getFileExtensionFromMime","fileType","fileUrl","getFileExtensionFromUri","normalizeFileName","path","buildDownloadPath","FileSystem","fetch","downloadedPath","file","name","type","getFileType","hasCameraPermission","status","checkMultiple","nativePermissionGranted","requestCameraPermission","requiredPermissionsStatus","requestMultiple","hasMediaLibraryPermission","requestMediaLibraryPermission","openCamera","_response$assets","hasPermission","granted","_options$onOpenFailur","onOpenFailure","SBUError","PERMISSIONS_DENIED","response","launchCamera","presentationStyle","cameraType","mediaType","didCancel","errorCode","_options$onOpenFailur2","DEVICE_UNAVAILABLE","Error","errorMessage","fileSize","size","uri","assets","normalizeFile","openMediaLibrary","selectionLimit","_options$onOpenFailur3","launchImageLibrary","_options$onOpenFailur4","Promise","all","slice","map","openDocument","save","downloadFile","mediaTypeMap","externalDirMap","externalDir","cpExternal","catch","Logger","error","createRecordFilePath","customExtension","Date","now","recordFilePath","startsWith","_default","exports"],"sources":["createFileService.native.ts"],"sourcesContent":["import type { CameraRoll } from '@react-native-camera-roll/camera-roll';\nimport { Platform } from 'react-native';\nimport type * as FileAccess from 'react-native-file-access';\nimport type * as ImagePicker from 'react-native-image-picker';\nimport type * as Permissions from 'react-native-permissions';\nimport type { Permission } from 'react-native-permissions';\n\nimport {\n Logger,\n getFileExtension,\n getFileExtensionFromMime,\n getFileExtensionFromUri,\n getFileType,\n normalizeFileName,\n} from '@sendbird/uikit-utils';\n\nimport SBUError from '../libs/SBUError';\nimport nativePermissionGranted from '../utils/nativePermissionGranted';\nimport normalizeFile from '../utils/normalizeFile';\nimport { DocumentPicker, openDocument } from './openDocument.native';\nimport type {\n FilePickerResponse,\n FileServiceInterface,\n OpenCameraOptions,\n OpenDocumentOptions,\n OpenMediaLibraryOptions,\n SaveOptions,\n} from './types';\n\nfunction getAndroidStoragePermissionsByAPILevel(permissionModule: typeof Permissions): Permission[] {\n if (Platform.OS !== 'android') return [];\n\n if (Platform.Version > 32) {\n return [];\n }\n\n if (Platform.Version > 28) {\n return [permissionModule.PERMISSIONS.ANDROID.READ_EXTERNAL_STORAGE];\n }\n\n return [\n permissionModule.PERMISSIONS.ANDROID.WRITE_EXTERNAL_STORAGE,\n permissionModule.PERMISSIONS.ANDROID.READ_EXTERNAL_STORAGE,\n ];\n}\n\nconst createNativeFileService = ({\n imagePickerModule,\n documentPickerModule,\n permissionModule,\n mediaLibraryModule,\n fsModule,\n}: {\n imagePickerModule: typeof ImagePicker;\n documentPickerModule: DocumentPicker;\n permissionModule: typeof Permissions;\n mediaLibraryModule: typeof CameraRoll;\n fsModule: typeof FileAccess;\n}): FileServiceInterface => {\n const requiredPermissions: Permission[] = Platform.select({\n ios: [permissionModule.PERMISSIONS.IOS.CAMERA],\n android: [permissionModule.PERMISSIONS.ANDROID.CAMERA],\n default: [],\n });\n const optionalPermissions: Permission[] = Platform.select({\n ios: [permissionModule.PERMISSIONS.IOS.MICROPHONE],\n android: [],\n default: [],\n });\n const mediaLibraryPermissions: Permission[] = Platform.select({\n ios: [permissionModule.PERMISSIONS.IOS.PHOTO_LIBRARY, permissionModule.PERMISSIONS.IOS.PHOTO_LIBRARY_ADD_ONLY],\n android: getAndroidStoragePermissionsByAPILevel(permissionModule),\n default: [],\n });\n\n class NativeFileService implements FileServiceInterface {\n async hasCameraPermission(): Promise<boolean> {\n const status = await permissionModule.checkMultiple(requiredPermissions);\n return nativePermissionGranted(status);\n }\n\n async requestCameraPermission(): Promise<boolean> {\n const requiredPermissionsStatus = await permissionModule.requestMultiple(requiredPermissions);\n if (!nativePermissionGranted(requiredPermissionsStatus)) return false;\n\n await permissionModule.requestMultiple(optionalPermissions);\n return true;\n }\n\n async hasMediaLibraryPermission(): Promise<boolean> {\n const status = await permissionModule.checkMultiple(mediaLibraryPermissions);\n return nativePermissionGranted(status);\n }\n\n async requestMediaLibraryPermission(): Promise<boolean> {\n const status = await permissionModule.requestMultiple(mediaLibraryPermissions);\n return nativePermissionGranted(status);\n }\n\n async openCamera(options?: OpenCameraOptions): Promise<FilePickerResponse> {\n const hasPermission = await this.hasCameraPermission();\n if (!hasPermission) {\n const granted = await this.requestCameraPermission();\n if (!granted) {\n options?.onOpenFailure?.(SBUError.PERMISSIONS_DENIED);\n return null;\n }\n }\n\n const response = await imagePickerModule.launchCamera({\n presentationStyle: 'fullScreen',\n cameraType: options?.cameraType ?? 'back',\n mediaType: (() => {\n switch (options?.mediaType) {\n case 'photo':\n return 'photo';\n case 'video':\n return 'video';\n case 'all':\n return 'mixed';\n default:\n return 'photo';\n }\n })(),\n });\n if (response.didCancel) return null;\n if (response.errorCode === 'camera_unavailable') {\n options?.onOpenFailure?.(SBUError.DEVICE_UNAVAILABLE, new Error(response.errorMessage));\n return null;\n }\n\n const { fileName: name, fileSize: size, type, uri } = response.assets?.[0] ?? {};\n return normalizeFile({ uri, size, name, type });\n }\n\n async openMediaLibrary(options?: OpenMediaLibraryOptions): Promise<FilePickerResponse[] | null> {\n /**\n * NOTE: options.selectionLimit {@link https://github.com/react-native-image-picker/react-native-image-picker#options}\n * We do not support 0 (any number of files)\n **/\n const selectionLimit = options?.selectionLimit || 1;\n const hasPermission = await this.hasMediaLibraryPermission();\n if (!hasPermission) {\n const granted = await this.requestMediaLibraryPermission();\n if (!granted) {\n options?.onOpenFailure?.(SBUError.PERMISSIONS_DENIED);\n return null;\n }\n }\n\n const response = await imagePickerModule.launchImageLibrary({\n presentationStyle: 'fullScreen',\n selectionLimit,\n mediaType: (() => {\n switch (options?.mediaType) {\n case 'photo':\n return 'photo';\n case 'video':\n return 'video';\n case 'all':\n return 'mixed';\n default:\n return 'photo';\n }\n })(),\n });\n if (response.didCancel) return null;\n if (response.errorCode === 'camera_unavailable') {\n options?.onOpenFailure?.(SBUError.DEVICE_UNAVAILABLE, new Error(response.errorMessage));\n return null;\n }\n\n return Promise.all(\n (response.assets || [])\n .slice(0, selectionLimit)\n .map(({ fileName: name, fileSize: size, type, uri }) => normalizeFile({ uri, size, name, type })),\n );\n }\n\n async openDocument(options?: OpenDocumentOptions): Promise<FilePickerResponse> {\n return await openDocument(documentPickerModule, options);\n }\n\n async save(options: SaveOptions): Promise<string> {\n const hasPermission = await this.hasMediaLibraryPermission();\n if (!hasPermission) {\n const granted = await this.requestMediaLibraryPermission();\n if (!granted) throw new Error('Permission not granted');\n }\n\n const { downloadedPath, file } = await this.downloadFile(options);\n\n if (Platform.OS === 'ios') {\n if (file.type === 'image' || file.type === 'video') {\n const mediaTypeMap = { 'image': 'photo', 'video': 'video' } as const;\n const mediaType = mediaTypeMap[file.type];\n await mediaLibraryModule.save(downloadedPath, { type: mediaType });\n }\n }\n\n if (Platform.OS === 'android') {\n const externalDirMap = { 'file': 'downloads', 'audio': 'audio', 'image': 'images', 'video': 'video' } as const;\n const externalDir = externalDirMap[file.type];\n await fsModule.FileSystem.cpExternal(downloadedPath, file.name, externalDir).catch(() => {\n Logger.error('Failed to save file to external storage. Retry saving to downloads directory instead.');\n return fsModule.FileSystem.cpExternal(downloadedPath, file.name, 'downloads');\n });\n }\n\n return downloadedPath;\n }\n\n private buildDownloadPath = async (options: SaveOptions) => {\n const dirname = Platform.select({ android: fsModule.Dirs.CacheDir, default: fsModule.Dirs.DocumentDir });\n const context = { dirname, filename: options.fileName };\n const extension =\n getFileExtension(options.fileName) ||\n getFileExtensionFromMime(options.fileType) ||\n getFileExtension(options.fileUrl) ||\n (await getFileExtensionFromUri(options.fileUrl));\n\n if (extension) context.filename = normalizeFileName(context.filename, extension);\n\n return { path: `${context.dirname}/${context.filename}`, ...context };\n };\n\n private downloadFile = async (options: SaveOptions) => {\n const { path, filename } = await this.buildDownloadPath(options);\n await fsModule.FileSystem.fetch(options.fileUrl, { path });\n return {\n downloadedPath: path,\n file: {\n name: filename,\n type: getFileType(getFileExtension(path)),\n } as const,\n };\n };\n\n createRecordFilePath(customExtension = 'm4a'): { recordFilePath: string; uri: string } {\n const filename = `record-${Date.now()}.${customExtension}`;\n const path = `${fsModule.Dirs.CacheDir}/${filename}`;\n return Platform.select({\n ios: {\n uri: path,\n recordFilePath: filename,\n },\n android: {\n uri: path.startsWith('file://') ? path : 'file://' + path,\n recordFilePath: path,\n },\n default: {\n uri: path,\n recordFilePath: path,\n },\n });\n }\n }\n\n return new NativeFileService();\n};\n\nexport default createNativeFileService;\n"],"mappings":"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","ignoreList":[]}
1
+ {"version":3,"names":["_reactNative","require","_uikitUtils","_SBUError","_interopRequireDefault","_nativePermissionGranted","_normalizeFile","_openDocument","e","__esModule","default","_defineProperty","r","t","_toPropertyKey","Object","defineProperty","value","enumerable","configurable","writable","i","_toPrimitive","Symbol","toPrimitive","call","TypeError","String","Number","getAndroidStoragePermissionsByAPILevel","permissionModule","Platform","OS","Version","PERMISSIONS","ANDROID","READ_EXTERNAL_STORAGE","WRITE_EXTERNAL_STORAGE","createNativeFileService","imagePickerModule","documentPickerModule","mediaLibraryModule","fsModule","requiredPermissions","select","ios","IOS","CAMERA","android","optionalPermissions","MICROPHONE","mediaLibraryPermissions","PHOTO_LIBRARY","PHOTO_LIBRARY_ADD_ONLY","NativeFileService","constructor","options","dirname","Dirs","CacheDir","DocumentDir","context","filename","fileName","extension","getFileExtension","getFileExtensionFromMime","fileType","fileUrl","getFileExtensionFromUri","normalizeFileName","path","buildDownloadPath","FileSystem","fetch","downloadedPath","file","name","type","getFileType","hasCameraPermission","status","checkMultiple","nativePermissionGranted","requestCameraPermission","requiredPermissionsStatus","requestMultiple","hasMediaLibraryPermission","requestMediaLibraryPermission","openCamera","_response$assets","hasPermission","granted","_options$onOpenFailur","onOpenFailure","SBUError","PERMISSIONS_DENIED","response","launchCamera","presentationStyle","cameraType","mediaType","didCancel","errorCode","_options$onOpenFailur2","DEVICE_UNAVAILABLE","Error","errorMessage","fileSize","size","uri","assets","normalizeFile","openMediaLibrary","selectionLimit","_options$onOpenFailur3","launchImageLibrary","_options$onOpenFailur4","Promise","all","slice","map","openDocument","save","downloadFile","mediaTypeMap","externalDirMap","externalDir","cpExternal","catch","Logger","error","createRecordFilePath","customExtension","Date","now","recordFilePath","startsWith","_default","exports"],"sources":["createFileService.native.ts"],"sourcesContent":["import type { CameraRoll } from '@react-native-camera-roll/camera-roll';\nimport { Platform } from 'react-native';\nimport type * as FileAccess from 'react-native-file-access';\nimport type * as ImagePicker from 'react-native-image-picker';\nimport type * as Permissions from 'react-native-permissions';\nimport type { Permission } from 'react-native-permissions';\n\nimport {\n Logger,\n getFileExtension,\n getFileExtensionFromMime,\n getFileExtensionFromUri,\n getFileType,\n normalizeFileName,\n} from '@sendbird/uikit-utils';\n\nimport SBUError from '../libs/SBUError';\nimport nativePermissionGranted from '../utils/nativePermissionGranted';\nimport normalizeFile from '../utils/normalizeFile';\nimport { DocumentPicker, openDocument } from './openDocument.native';\nimport type {\n FilePickerResponse,\n FileServiceInterface,\n OpenCameraOptions,\n OpenDocumentOptions,\n OpenMediaLibraryOptions,\n SaveOptions,\n} from './types';\n\nfunction getAndroidStoragePermissionsByAPILevel(permissionModule: typeof Permissions): Permission[] {\n if (Platform.OS !== 'android') return [];\n\n if (Platform.Version > 32) {\n return [];\n }\n\n if (Platform.Version > 28) {\n return [permissionModule.PERMISSIONS.ANDROID.READ_EXTERNAL_STORAGE];\n }\n\n return [\n permissionModule.PERMISSIONS.ANDROID.WRITE_EXTERNAL_STORAGE,\n permissionModule.PERMISSIONS.ANDROID.READ_EXTERNAL_STORAGE,\n ];\n}\n\nconst createNativeFileService = ({\n imagePickerModule,\n documentPickerModule,\n permissionModule,\n mediaLibraryModule,\n fsModule,\n}: {\n imagePickerModule: typeof ImagePicker;\n documentPickerModule: DocumentPicker;\n permissionModule: typeof Permissions;\n mediaLibraryModule: typeof CameraRoll;\n fsModule: typeof FileAccess;\n}): FileServiceInterface => {\n const requiredPermissions: Permission[] = Platform.select({\n ios: [permissionModule.PERMISSIONS.IOS.CAMERA],\n android: [permissionModule.PERMISSIONS.ANDROID.CAMERA],\n default: [],\n });\n const optionalPermissions: Permission[] = Platform.select({\n ios: [permissionModule.PERMISSIONS.IOS.MICROPHONE],\n android: [],\n default: [],\n });\n const mediaLibraryPermissions: Permission[] = Platform.select({\n ios: [permissionModule.PERMISSIONS.IOS.PHOTO_LIBRARY, permissionModule.PERMISSIONS.IOS.PHOTO_LIBRARY_ADD_ONLY],\n android: getAndroidStoragePermissionsByAPILevel(permissionModule),\n default: [],\n });\n\n class NativeFileService implements FileServiceInterface {\n async hasCameraPermission(): Promise<boolean> {\n const status = await permissionModule.checkMultiple(requiredPermissions);\n return nativePermissionGranted(status);\n }\n\n async requestCameraPermission(): Promise<boolean> {\n const requiredPermissionsStatus = await permissionModule.requestMultiple(requiredPermissions);\n if (!nativePermissionGranted(requiredPermissionsStatus)) return false;\n\n await permissionModule.requestMultiple(optionalPermissions);\n return true;\n }\n\n async hasMediaLibraryPermission(): Promise<boolean> {\n const status = await permissionModule.checkMultiple(mediaLibraryPermissions);\n return nativePermissionGranted(status);\n }\n\n async requestMediaLibraryPermission(): Promise<boolean> {\n const status = await permissionModule.requestMultiple(mediaLibraryPermissions);\n return nativePermissionGranted(status);\n }\n\n async openCamera(options?: OpenCameraOptions): Promise<FilePickerResponse> {\n const hasPermission = await this.hasCameraPermission();\n if (!hasPermission) {\n const granted = await this.requestCameraPermission();\n if (!granted) {\n options?.onOpenFailure?.(SBUError.PERMISSIONS_DENIED);\n return null;\n }\n }\n\n const response = await imagePickerModule.launchCamera({\n presentationStyle: 'fullScreen',\n cameraType: options?.cameraType ?? 'back',\n mediaType: (() => {\n switch (options?.mediaType) {\n case 'photo':\n return 'photo';\n case 'video':\n return 'video';\n case 'all':\n return 'mixed';\n default:\n return 'photo';\n }\n })(),\n });\n if (response.didCancel) return null;\n if (response.errorCode === 'camera_unavailable') {\n options?.onOpenFailure?.(SBUError.DEVICE_UNAVAILABLE, new Error(response.errorMessage));\n return null;\n }\n\n const { fileName: name, fileSize: size, type, uri } = response.assets?.[0] ?? {};\n return normalizeFile({ uri, size, name, type });\n }\n\n async openMediaLibrary(options?: OpenMediaLibraryOptions): Promise<FilePickerResponse[] | null> {\n /**\n * NOTE: options.selectionLimit {@link https://github.com/react-native-image-picker/react-native-image-picker#options}\n * We do not support 0 (any number of files)\n **/\n const selectionLimit = options?.selectionLimit || 1;\n const hasPermission = await this.hasMediaLibraryPermission();\n if (!hasPermission) {\n const granted = await this.requestMediaLibraryPermission();\n if (!granted) {\n options?.onOpenFailure?.(SBUError.PERMISSIONS_DENIED);\n return null;\n }\n }\n\n const response = await imagePickerModule.launchImageLibrary({\n presentationStyle: 'fullScreen',\n selectionLimit,\n mediaType: (() => {\n switch (options?.mediaType) {\n case 'photo':\n return 'photo';\n case 'video':\n return 'video';\n case 'all':\n return 'mixed';\n default:\n return 'photo';\n }\n })(),\n });\n if (response.didCancel) return null;\n if (response.errorCode === 'camera_unavailable') {\n options?.onOpenFailure?.(SBUError.DEVICE_UNAVAILABLE, new Error(response.errorMessage));\n return null;\n }\n\n return Promise.all(\n (response.assets || [])\n .slice(0, selectionLimit)\n .map(({ fileName: name, fileSize: size, type, uri }) => normalizeFile({ uri, size, name, type })),\n );\n }\n\n async openDocument(options?: OpenDocumentOptions): Promise<FilePickerResponse> {\n return await openDocument(documentPickerModule, options);\n }\n\n async save(options: SaveOptions): Promise<string> {\n const hasPermission = await this.hasMediaLibraryPermission();\n if (!hasPermission) {\n const granted = await this.requestMediaLibraryPermission();\n if (!granted) throw new Error('Permission not granted');\n }\n\n const { downloadedPath, file } = await this.downloadFile(options);\n\n if (Platform.OS === 'ios') {\n if (file.type === 'image' || file.type === 'video') {\n const mediaTypeMap = { 'image': 'photo', 'video': 'video' } as const;\n const mediaType = mediaTypeMap[file.type];\n await mediaLibraryModule.save(downloadedPath, { type: mediaType });\n }\n }\n\n if (Platform.OS === 'android') {\n const externalDirMap = { 'file': 'downloads', 'audio': 'audio', 'image': 'images', 'video': 'video' } as const;\n const externalDir = externalDirMap[file.type];\n await fsModule.FileSystem.cpExternal(downloadedPath, file.name, externalDir).catch(() => {\n Logger.error('Failed to save file to external storage. Retry saving to downloads directory instead.');\n return fsModule.FileSystem.cpExternal(downloadedPath, file.name, 'downloads');\n });\n }\n\n return downloadedPath;\n }\n\n private buildDownloadPath = async (options: SaveOptions) => {\n const dirname = Platform.select({ android: fsModule.Dirs.CacheDir, default: fsModule.Dirs.DocumentDir });\n const context = { dirname, filename: options.fileName };\n const extension =\n getFileExtension(options.fileName) ||\n getFileExtensionFromMime(options.fileType) ||\n getFileExtension(options.fileUrl) ||\n (await getFileExtensionFromUri(options.fileUrl));\n\n if (extension) context.filename = normalizeFileName(context.filename, extension);\n\n return { path: `${context.dirname}/${context.filename}`, ...context };\n };\n\n private downloadFile = async (options: SaveOptions) => {\n const { path, filename } = await this.buildDownloadPath(options);\n await fsModule.FileSystem.fetch(options.fileUrl, { path });\n return {\n downloadedPath: path,\n file: {\n name: filename,\n type: getFileType(getFileExtension(path)),\n } as const,\n };\n };\n\n createRecordFilePath(customExtension = 'm4a'): { recordFilePath: string; uri: string } {\n const filename = `record-${Date.now()}.${customExtension}`;\n const path = `${fsModule.Dirs.CacheDir}/${filename}`;\n return Platform.select({\n ios: {\n uri: path,\n recordFilePath: 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":[]}