@sendbird/uikit-react-native 3.10.3 → 3.11.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +9 -7
- 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/createMediaService.expo.js +83 -12
- package/lib/commonjs/platform/createMediaService.expo.js.map +1 -1
- package/lib/commonjs/platform/createPlayerService.expo.js +214 -113
- package/lib/commonjs/platform/createPlayerService.expo.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 +248 -127
- 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/utils/expoBackwardUtils.js +23 -0
- package/lib/commonjs/utils/expoBackwardUtils.js.map +1 -1
- package/lib/commonjs/utils/expoPermissionGranted.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/createMediaService.expo.js +82 -13
- package/lib/module/platform/createMediaService.expo.js.map +1 -1
- package/lib/module/platform/createPlayerService.expo.js +214 -113
- package/lib/module/platform/createPlayerService.expo.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 +249 -128
- 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/utils/expoBackwardUtils.js +23 -0
- package/lib/module/utils/expoBackwardUtils.js.map +1 -1
- package/lib/module/utils/expoPermissionGranted.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/createMediaService.expo.d.ts +2 -2
- package/lib/typescript/src/platform/createPlayerService.expo.d.ts +2 -2
- package/lib/typescript/src/platform/createPlayerService.native.d.ts +5 -3
- package/lib/typescript/src/platform/createRecorderService.expo.d.ts +2 -2
- 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/utils/expoBackwardUtils.d.ts +10 -0
- package/lib/typescript/src/utils/expoPermissionGranted.d.ts +1 -1
- package/lib/typescript/src/version.d.ts +1 -1
- package/package.json +29 -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/createMediaService.expo.tsx +87 -9
- package/src/platform/createPlayerService.expo.tsx +242 -109
- package/src/platform/createPlayerService.native.tsx +237 -113
- package/src/platform/createRecorderService.expo.tsx +268 -107
- package/src/platform/createRecorderService.native.tsx +240 -118
- package/src/platform/types.ts +5 -0
- package/src/utils/expoBackwardUtils.ts +29 -0
- package/src/utils/expoPermissionGranted.ts +3 -1
- package/src/version.ts +1 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["React","useEffect","useRef","Animated","Box","Icon","PressBox","ProgressBar","Text","createStyleSheet","useUIKitTheme","Logger","conditionChaining","millsToMMSS","useLocalization","useVoiceMessageInput","VoiceMessageInput","onClose","onSend","STRINGS","colors","actions","state","file","duration","uiColors","ui","voiceMessageInput","default","status","onPressCancel","cancel","catch","error","warn","finally","onPressSend","send","onPressVoiceMessageAction","startRecording","lessThanMinimumDuration","stopRecording","playPlayer","pausePlayer","renderActionIcon","createElement","icon","size","color","recording","actionIcon","isRecorderState","recordingTime","currentTime","minDuration","remainingTime","playingTime","backgroundColor","background","paddingVertical","paddingHorizontal","style","styles","container","progressBar","current","total","maxDuration","trackColor","progressTrack","overlay","flex","flexDirection","alignItems","justifyContent","paddingEnd","RecordingLight","visible","caption1","lineHeight","undefined","marginStart","textTime","height","CancelButton","label","LABELS","VOICE_MESSAGE_INPUT_CANCEL","onPress","SendButton","disabled","position","activeOpacity","width","borderRadius","actionIconBackground","props","value","Value","animation","loop","sequence","timing","toValue","useNativeDriver","start","reset","View","opacity","active","button","textCancel","numberOfLines","sendIconBackground","padding","sendIcon","borderTopStartRadius","borderTopEndRadius","marginBottom"],"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","useEffect","useRef","Animated","Box","Icon","PressBox","ProgressBar","Text","createStyleSheet","useUIKitTheme","Logger","conditionChaining","millsToMMSS","useLocalization","useVoiceMessageInput","VoiceMessageInput","onClose","onSend","STRINGS","colors","actions","state","file","duration","uiColors","ui","voiceMessageInput","default","status","onPressCancel","cancel","catch","error","warn","finally","onPressSend","send","onPressVoiceMessageAction","startRecording","lessThanMinimumDuration","stopRecording","playPlayer","pausePlayer","renderActionIcon","createElement","icon","size","color","recording","actionIcon","isRecorderState","recordingTime","currentTime","minDuration","remainingTime","playingTime","backgroundColor","background","paddingVertical","paddingHorizontal","style","styles","container","progressBar","current","total","maxDuration","trackColor","progressTrack","overlay","flex","flexDirection","alignItems","justifyContent","paddingEnd","RecordingLight","visible","caption1","lineHeight","undefined","marginStart","textTime","height","CancelButton","label","LABELS","VOICE_MESSAGE_INPUT_CANCEL","onPress","SendButton","disabled","position","activeOpacity","width","borderRadius","actionIconBackground","props","value","Value","animation","loop","sequence","timing","toValue","useNativeDriver","start","reset","View","opacity","active","button","textCancel","numberOfLines","sendIconBackground","padding","sendIcon","borderTopStartRadius","borderTopEndRadius","marginBottom"],"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":[]}
|
|
@@ -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":";;;AACA,SAASA,QAAQ,QAAQ,cAAc;AAMvC,SACEC,MAAM,EACNC,gBAAgB,EAChBC,wBAAwB,EACxBC,uBAAuB,EACvBC,WAAW,EACXC,iBAAiB,QACZ,uBAAuB;AAE9B,OAAOC,QAAQ,MAAM,kBAAkB;AACvC,OAAOC,uBAAuB,MAAM,kCAAkC;AACtE,OAAOC,aAAa,MAAM,wBAAwB;AAClD,SAAyBC,YAAY,QAAQ,uBAAuB;AAUpE,SAASC,sCAAsCA,CAACC,gBAAoC,EAAgB;EAClG,IAAIZ,QAAQ,CAACa,EAAE,KAAK,SAAS,EAAE,OAAO,EAAE;EAExC,IAAIb,QAAQ,CAACc,OAAO,GAAG,EAAE,EAAE;IACzB,OAAO,EAAE;EACX;EAEA,IAAId,QAAQ,CAACc,OAAO,GAAG,EAAE,EAAE;IACzB,OAAO,CAACF,gBAAgB,CAACG,WAAW,CAACC,OAAO,CAACC,qBAAqB,CAAC;EACrE;EAEA,OAAO,CACLL,gBAAgB,CAACG,WAAW,CAACC,OAAO,CAACE,sBAAsB,EAC3DN,gBAAgB,CAACG,WAAW,CAACC,OAAO,CAACC,qBAAqB,CAC3D;AACH;AAEA,MAAME,uBAAuB,GAAGA,CAAC;EAC/BC,iBAAiB;EACjBC,oBAAoB;EACpBT,gBAAgB;EAChBU,kBAAkB;EAClBC;AAOF,CAAC,KAA2B;EAC1B,MAAMC,mBAAiC,GAAGxB,QAAQ,CAACyB,MAAM,CAAC;IACxDC,GAAG,EAAE,CAACd,gBAAgB,CAACG,WAAW,CAACY,GAAG,CAACC,MAAM,CAAC;IAC9CC,OAAO,EAAE,CAACjB,gBAAgB,CAACG,WAAW,CAACC,OAAO,CAACY,MAAM,CAAC;IACtDE,OAAO,EAAE;EACX,CAAC,CAAC;EACF,MAAMC,mBAAiC,GAAG/B,QAAQ,CAACyB,MAAM,CAAC;IACxDC,GAAG,EAAE,CAACd,gBAAgB,CAACG,WAAW,CAACY,GAAG,CAACK,UAAU,CAAC;IAClDH,OAAO,EAAE,EAAE;IACXC,OAAO,EAAE;EACX,CAAC,CAAC;EACF,MAAMG,uBAAqC,GAAGjC,QAAQ,CAACyB,MAAM,CAAC;IAC5DC,GAAG,EAAE,CAACd,gBAAgB,CAACG,WAAW,CAACY,GAAG,CAACO,aAAa,EAAEtB,gBAAgB,CAACG,WAAW,CAACY,GAAG,CAACQ,sBAAsB,CAAC;IAC9GN,OAAO,EAAElB,sCAAsC,CAACC,gBAAgB,CAAC;IACjEkB,OAAO,EAAE;EACX,CAAC,CAAC;EAEF,MAAMM,iBAAiB,CAAiC;IAAAC,YAAA;MAAAC,eAAA,4BAyI1B,MAAOC,OAAoB,IAAK;QAC1D,MAAMC,OAAO,GAAGxC,QAAQ,CAACyB,MAAM,CAAC;UAAEI,OAAO,EAAEN,QAAQ,CAACkB,IAAI,CAACC,QAAQ;UAAEZ,OAAO,EAAEP,QAAQ,CAACkB,IAAI,CAACE;QAAY,CAAC,CAAC;QACxG,MAAMC,OAAO,GAAG;UAAEJ,OAAO;UAAEK,QAAQ,EAAEN,OAAO,CAACO;QAAS,CAAC;QACvD,MAAMC,SAAS,GACb7C,gBAAgB,CAACqC,OAAO,CAACO,QAAQ,CAAC,IAClC3C,wBAAwB,CAACoC,OAAO,CAACS,QAAQ,CAAC,IAC1C9C,gBAAgB,CAACqC,OAAO,CAACU,OAAO,CAAC,KAChC,MAAM7C,uBAAuB,CAACmC,OAAO,CAACU,OAAO,CAAC,CAAC;QAElD,IAAIF,SAAS,EAAEH,OAAO,CAACC,QAAQ,GAAGvC,iBAAiB,CAACsC,OAAO,CAACC,QAAQ,EAAEE,SAAS,CAAC;QAEhF,OAAO;UAAEG,IAAI,EAAE,GAAGN,OAAO,CAACJ,OAAO,IAAII,OAAO,CAACC,QAAQ,EAAE;UAAE,GAAGD;QAAQ,CAAC;MACvE,CAAC;MAAAN,eAAA,uBAEsB,MAAOC,OAAoB,IAAK;QACrD,MAAM;UAAEW,IAAI;UAAEL;QAAS,CAAC,GAAG,MAAM,IAAI,CAACM,iBAAiB,CAACZ,OAAO,CAAC;QAChE,MAAMhB,QAAQ,CAAC6B,UAAU,CAACC,KAAK,CAACd,OAAO,CAACU,OAAO,EAAE;UAAEC;QAAK,CAAC,CAAC;QAC1D,OAAO;UACLI,cAAc,EAAEJ,IAAI;UACpBK,IAAI,EAAE;YACJC,IAAI,EAAEX,QAAQ;YACdY,IAAI,EAAEpD,WAAW,CAACH,gBAAgB,CAACgD,IAAI,CAAC;UAC1C;QACF,CAAC;MACH,CAAC;IAAA;IAhKD,MAAMQ,mBAAmBA,CAAA,EAAqB;MAC5C,MAAMC,MAAM,GAAG,MAAM/C,gBAAgB,CAACgD,aAAa,CAACpC,mBAAmB,CAAC;MACxE,OAAOhB,uBAAuB,CAACmD,MAAM,CAAC;IACxC;IAEA,MAAME,uBAAuBA,CAAA,EAAqB;MAChD,MAAMC,yBAAyB,GAAG,MAAMlD,gBAAgB,CAACmD,eAAe,CAACvC,mBAAmB,CAAC;MAC7F,IAAI,CAAChB,uBAAuB,CAACsD,yBAAyB,CAAC,EAAE,OAAO,KAAK;MAErE,MAAMlD,gBAAgB,CAACmD,eAAe,CAAChC,mBAAmB,CAAC;MAC3D,OAAO,IAAI;IACb;IAEA,MAAMiC,yBAAyBA,CAAA,EAAqB;MAClD,MAAML,MAAM,GAAG,MAAM/C,gBAAgB,CAACgD,aAAa,CAAC3B,uBAAuB,CAAC;MAC5E,OAAOzB,uBAAuB,CAACmD,MAAM,CAAC;IACxC;IAEA,MAAMM,6BAA6BA,CAAA,EAAqB;MACtD,MAAMN,MAAM,GAAG,MAAM/C,gBAAgB,CAACmD,eAAe,CAAC9B,uBAAuB,CAAC;MAC9E,OAAOzB,uBAAuB,CAACmD,MAAM,CAAC;IACxC;IAEA,MAAMO,UAAUA,CAAC3B,OAA2B,EAA+B;MAAA,IAAA4B,gBAAA;MACzE,MAAMC,aAAa,GAAG,MAAM,IAAI,CAACV,mBAAmB,CAAC,CAAC;MACtD,IAAI,CAACU,aAAa,EAAE;QAClB,MAAMC,OAAO,GAAG,MAAM,IAAI,CAACR,uBAAuB,CAAC,CAAC;QACpD,IAAI,CAACQ,OAAO,EAAE;UAAA,IAAAC,qBAAA;UACZ/B,OAAO,aAAPA,OAAO,gBAAA+B,qBAAA,GAAP/B,OAAO,CAAEgC,aAAa,cAAAD,qBAAA,eAAtBA,qBAAA,CAAAE,IAAA,CAAAjC,OAAO,EAAkBhC,QAAQ,CAACkE,kBAAkB,CAAC;UACrD,OAAO,IAAI;QACb;MACF;MAEA,MAAMC,QAAQ,GAAG,MAAMtD,iBAAiB,CAACuD,YAAY,CAAC;QACpDC,iBAAiB,EAAE,YAAY;QAC/BC,UAAU,EAAE,CAAAtC,OAAO,aAAPA,OAAO,uBAAPA,OAAO,CAAEsC,UAAU,KAAI,MAAM;QACzCC,SAAS,EAAE,CAAC,MAAM;UAChB,QAAQvC,OAAO,aAAPA,OAAO,uBAAPA,OAAO,CAAEuC,SAAS;YACxB,KAAK,OAAO;cACV,OAAO,OAAO;YAChB,KAAK,OAAO;cACV,OAAO,OAAO;YAChB,KAAK,KAAK;cACR,OAAO,OAAO;YAChB;cACE,OAAO,OAAO;UAClB;QACF,CAAC,EAAE;MACL,CAAC,CAAC;MACF,IAAIJ,QAAQ,CAACK,SAAS,EAAE,OAAO,IAAI;MACnC,IAAIL,QAAQ,CAACM,SAAS,KAAK,oBAAoB,EAAE;QAAA,IAAAC,sBAAA;QAC/C1C,OAAO,aAAPA,OAAO,gBAAA0C,sBAAA,GAAP1C,OAAO,CAAEgC,aAAa,cAAAU,sBAAA,eAAtBA,sBAAA,CAAAT,IAAA,CAAAjC,OAAO,EAAkBhC,QAAQ,CAAC2E,kBAAkB,EAAE,IAAIC,KAAK,CAACT,QAAQ,CAACU,YAAY,CAAC,CAAC;QACvF,OAAO,IAAI;MACb;MAEA,MAAM;QAAEtC,QAAQ,EAAEU,IAAI;QAAE6B,QAAQ,EAAEC,IAAI;QAAE7B,IAAI;QAAE8B;MAAI,CAAC,GAAG,EAAApB,gBAAA,GAAAO,QAAQ,CAACc,MAAM,cAAArB,gBAAA,uBAAfA,gBAAA,CAAkB,CAAC,CAAC,KAAI,CAAC,CAAC;MAChF,OAAO1D,aAAa,CAAC;QAAE8E,GAAG;QAAED,IAAI;QAAE9B,IAAI;QAAEC;MAAK,CAAC,CAAC;IACjD;IAEA,MAAMgC,gBAAgBA,CAAClD,OAAiC,EAAwC;MAC9F;AACN;AACA;AACA;MACM,MAAMmD,cAAc,GAAG,CAAAnD,OAAO,aAAPA,OAAO,uBAAPA,OAAO,CAAEmD,cAAc,KAAI,CAAC;MACnD,MAAMtB,aAAa,GAAG,MAAM,IAAI,CAACJ,yBAAyB,CAAC,CAAC;MAC5D,IAAI,CAACI,aAAa,EAAE;QAClB,MAAMC,OAAO,GAAG,MAAM,IAAI,CAACJ,6BAA6B,CAAC,CAAC;QAC1D,IAAI,CAACI,OAAO,EAAE;UAAA,IAAAsB,sBAAA;UACZpD,OAAO,aAAPA,OAAO,gBAAAoD,sBAAA,GAAPpD,OAAO,CAAEgC,aAAa,cAAAoB,sBAAA,eAAtBA,sBAAA,CAAAnB,IAAA,CAAAjC,OAAO,EAAkBhC,QAAQ,CAACkE,kBAAkB,CAAC;UACrD,OAAO,IAAI;QACb;MACF;MAEA,MAAMC,QAAQ,GAAG,MAAMtD,iBAAiB,CAACwE,kBAAkB,CAAC;QAC1DhB,iBAAiB,EAAE,YAAY;QAC/Bc,cAAc;QACdZ,SAAS,EAAE,CAAC,MAAM;UAChB,QAAQvC,OAAO,aAAPA,OAAO,uBAAPA,OAAO,CAAEuC,SAAS;YACxB,KAAK,OAAO;cACV,OAAO,OAAO;YAChB,KAAK,OAAO;cACV,OAAO,OAAO;YAChB,KAAK,KAAK;cACR,OAAO,OAAO;YAChB;cACE,OAAO,OAAO;UAClB;QACF,CAAC,EAAE;MACL,CAAC,CAAC;MACF,IAAIJ,QAAQ,CAACK,SAAS,EAAE,OAAO,IAAI;MACnC,IAAIL,QAAQ,CAACM,SAAS,KAAK,oBAAoB,EAAE;QAAA,IAAAa,sBAAA;QAC/CtD,OAAO,aAAPA,OAAO,gBAAAsD,sBAAA,GAAPtD,OAAO,CAAEgC,aAAa,cAAAsB,sBAAA,eAAtBA,sBAAA,CAAArB,IAAA,CAAAjC,OAAO,EAAkBhC,QAAQ,CAAC2E,kBAAkB,EAAE,IAAIC,KAAK,CAACT,QAAQ,CAACU,YAAY,CAAC,CAAC;QACvF,OAAO,IAAI;MACb;MAEA,OAAOU,OAAO,CAACC,GAAG,CAChB,CAACrB,QAAQ,CAACc,MAAM,IAAI,EAAE,EACnBQ,KAAK,CAAC,CAAC,EAAEN,cAAc,CAAC,CACxBO,GAAG,CAAC,CAAC;QAAEnD,QAAQ,EAAEU,IAAI;QAAE6B,QAAQ,EAAEC,IAAI;QAAE7B,IAAI;QAAE8B;MAAI,CAAC,KAAK9E,aAAa,CAAC;QAAE8E,GAAG;QAAED,IAAI;QAAE9B,IAAI;QAAEC;MAAK,CAAC,CAAC,CACpG,CAAC;IACH;IAEA,MAAM/C,YAAYA,CAAC6B,OAA6B,EAA+B;MAC7E,OAAO,MAAM7B,YAAY,CAACW,oBAAoB,EAAEkB,OAAO,CAAC;IAC1D;IAEA,MAAM2D,IAAIA,CAAC3D,OAAoB,EAAmB;MAChD,MAAM6B,aAAa,GAAG,MAAM,IAAI,CAACJ,yBAAyB,CAAC,CAAC;MAC5D,IAAI,CAACI,aAAa,EAAE;QAClB,MAAMC,OAAO,GAAG,MAAM,IAAI,CAACJ,6BAA6B,CAAC,CAAC;QAC1D,IAAI,CAACI,OAAO,EAAE,MAAM,IAAIc,KAAK,CAAC,wBAAwB,CAAC;MACzD;MAEA,MAAM;QAAE7B,cAAc;QAAEC;MAAK,CAAC,GAAG,MAAM,IAAI,CAAC4C,YAAY,CAAC5D,OAAO,CAAC;MAEjE,IAAIvC,QAAQ,CAACa,EAAE,KAAK,KAAK,EAAE;QACzB,IAAI0C,IAAI,CAACE,IAAI,KAAK,OAAO,IAAIF,IAAI,CAACE,IAAI,KAAK,OAAO,EAAE;UAClD,MAAM2C,YAAY,GAAG;YAAE,OAAO,EAAE,OAAO;YAAE,OAAO,EAAE;UAAQ,CAAU;UACpE,MAAMtB,SAAS,GAAGsB,YAAY,CAAC7C,IAAI,CAACE,IAAI,CAAC;UACzC,MAAMnC,kBAAkB,CAAC4E,IAAI,CAAC5C,cAAc,EAAE;YAAEG,IAAI,EAAEqB;UAAU,CAAC,CAAC;QACpE;MACF;MAEA,IAAI9E,QAAQ,CAACa,EAAE,KAAK,SAAS,EAAE;QAC7B,MAAMwF,cAAc,GAAG;UAAE,MAAM,EAAE,WAAW;UAAE,OAAO,EAAE,OAAO;UAAE,OAAO,EAAE,QAAQ;UAAE,OAAO,EAAE;QAAQ,CAAU;QAC9G,MAAMC,WAAW,GAAGD,cAAc,CAAC9C,IAAI,CAACE,IAAI,CAAC;QAC7C,MAAMlC,QAAQ,CAAC6B,UAAU,CAACmD,UAAU,CAACjD,cAAc,EAAEC,IAAI,CAACC,IAAI,EAAE8C,WAAW,CAAC,CAACE,KAAK,CAAC,MAAM;UACvFvG,MAAM,CAACwG,KAAK,CAAC,uFAAuF,CAAC;UACrG,OAAOlF,QAAQ,CAAC6B,UAAU,CAACmD,UAAU,CAACjD,cAAc,EAAEC,IAAI,CAACC,IAAI,EAAE,WAAW,CAAC;QAC/E,CAAC,CAAC;MACJ;MAEA,OAAOF,cAAc;IACvB;IA4BAoD,oBAAoBA,CAACC,eAAe,GAAG,KAAK,EAA2C;MACrF,MAAM9D,QAAQ,GAAG,UAAU+D,IAAI,CAACC,GAAG,CAAC,CAAC,IAAIF,eAAe,EAAE;MAC1D,MAAMzD,IAAI,GAAG,GAAG3B,QAAQ,CAACkB,IAAI,CAACC,QAAQ,IAAIG,QAAQ,EAAE;MACpD,OAAO7C,QAAQ,CAACyB,MAAM,CAAC;QACrBC,GAAG,EAAE;UACH6D,GAAG,EAAErC,IAAI;UACT4D,cAAc,EAAE5D;QAClB,CAAC;QACDrB,OAAO,EAAE;UACP0D,GAAG,EAAErC,IAAI,CAAC6D,UAAU,CAAC,SAAS,CAAC,GAAG7D,IAAI,GAAG,SAAS,GAAGA,IAAI;UACzD4D,cAAc,EAAE5D;QAClB,CAAC;QACDpB,OAAO,EAAE;UACPyD,GAAG,EAAErC,IAAI;UACT4D,cAAc,EAAE5D;QAClB;MACF,CAAC,CAAC;IACJ;EACF;EAEA,OAAO,IAAId,iBAAiB,CAAC,CAAC;AAChC,CAAC;AAED,eAAejB,uBAAuB","ignoreList":[]}
|
|
@@ -1,30 +1,99 @@
|
|
|
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
|
-
|
|
3
|
-
|
|
2
|
+
function _defineProperty(e, r, t) { return (r = _toPropertyKey(r)) in e ? Object.defineProperty(e, r, { value: t, enumerable: !0, configurable: !0, writable: !0 }) : e[r] = t, e; }
|
|
3
|
+
function _toPropertyKey(t) { var i = _toPrimitive(t, "string"); return "symbol" == typeof i ? i : i + ""; }
|
|
4
|
+
function _toPrimitive(t, r) { if ("object" != typeof t || !t) return t; var e = t[Symbol.toPrimitive]; if (void 0 !== e) { var i = e.call(t, r || "default"); if ("object" != typeof i) return i; throw new TypeError("@@toPrimitive must return a primitive value."); } return ("string" === r ? String : Number)(t); }
|
|
5
|
+
import React, { useEffect } from 'react';
|
|
6
|
+
import { Logger, getDownscaleSize } from '@sendbird/uikit-utils';
|
|
4
7
|
import SBUUtils from '../libs/SBUUtils';
|
|
5
8
|
import expoBackwardUtils from '../utils/expoBackwardUtils';
|
|
6
|
-
|
|
7
|
-
avModule
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
fsModule
|
|
11
|
-
}) => {
|
|
12
|
-
return {
|
|
13
|
-
VideoComponent({
|
|
9
|
+
class LegacyExpoAVVideoAdapter {
|
|
10
|
+
constructor(avModule) {
|
|
11
|
+
_defineProperty(this, "avModule", void 0);
|
|
12
|
+
_defineProperty(this, "VideoComponent", ({
|
|
14
13
|
source,
|
|
15
14
|
resizeMode,
|
|
16
15
|
onLoad,
|
|
17
16
|
...props
|
|
18
|
-
}) {
|
|
17
|
+
}) => {
|
|
19
18
|
// FIXME: type error https://github.com/expo/expo/issues/17101
|
|
20
19
|
// @ts-ignore
|
|
21
|
-
return /*#__PURE__*/React.createElement(avModule.Video, _extends({}, props, {
|
|
20
|
+
return /*#__PURE__*/React.createElement(this.avModule.Video, _extends({}, props, {
|
|
22
21
|
source: source,
|
|
23
22
|
resizeMode: resizeMode,
|
|
24
23
|
onLoad: onLoad,
|
|
25
24
|
useNativeControls: true
|
|
26
25
|
}));
|
|
27
|
-
}
|
|
26
|
+
});
|
|
27
|
+
this.avModule = avModule;
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
class ExpoVideoAdapter {
|
|
31
|
+
constructor(_videoModule) {
|
|
32
|
+
this._videoModule = _videoModule;
|
|
33
|
+
_defineProperty(this, "VideoComponent", ({
|
|
34
|
+
source,
|
|
35
|
+
resizeMode,
|
|
36
|
+
onLoad,
|
|
37
|
+
...props
|
|
38
|
+
}) => {
|
|
39
|
+
const player = this._videoModule.useVideoPlayer(source);
|
|
40
|
+
useEffect(() => {
|
|
41
|
+
if (onLoad && player) {
|
|
42
|
+
let subscription = null;
|
|
43
|
+
try {
|
|
44
|
+
subscription = player.addListener('statusChange', eventData => {
|
|
45
|
+
const {
|
|
46
|
+
status,
|
|
47
|
+
error
|
|
48
|
+
} = eventData;
|
|
49
|
+
if (status === 'readyToPlay' && !error) {
|
|
50
|
+
onLoad();
|
|
51
|
+
}
|
|
52
|
+
});
|
|
53
|
+
} catch (error) {
|
|
54
|
+
const timeout = setTimeout(() => onLoad(), 300);
|
|
55
|
+
return () => clearTimeout(timeout);
|
|
56
|
+
}
|
|
57
|
+
return () => {
|
|
58
|
+
if (subscription) {
|
|
59
|
+
subscription.remove();
|
|
60
|
+
}
|
|
61
|
+
};
|
|
62
|
+
}
|
|
63
|
+
return undefined;
|
|
64
|
+
}, [onLoad, player]);
|
|
65
|
+
const getContentFit = mode => {
|
|
66
|
+
switch (mode) {
|
|
67
|
+
case 'cover':
|
|
68
|
+
return 'cover';
|
|
69
|
+
case 'contain':
|
|
70
|
+
return 'contain';
|
|
71
|
+
case 'stretch':
|
|
72
|
+
return 'fill';
|
|
73
|
+
default:
|
|
74
|
+
return 'contain';
|
|
75
|
+
}
|
|
76
|
+
};
|
|
77
|
+
return /*#__PURE__*/React.createElement(this._videoModule.VideoView, {
|
|
78
|
+
...props,
|
|
79
|
+
player,
|
|
80
|
+
contentFit: getContentFit(resizeMode)
|
|
81
|
+
});
|
|
82
|
+
});
|
|
83
|
+
}
|
|
84
|
+
}
|
|
85
|
+
const createExpoMediaService = ({
|
|
86
|
+
avModule,
|
|
87
|
+
thumbnailModule,
|
|
88
|
+
imageManipulator,
|
|
89
|
+
fsModule
|
|
90
|
+
}) => {
|
|
91
|
+
if (expoBackwardUtils.expoAV.isLegacyAVModule(avModule)) {
|
|
92
|
+
Logger.warn('[MediaService.Expo] expo-av is deprecated and will be removed in Expo 54. Please migrate to expo-video.');
|
|
93
|
+
}
|
|
94
|
+
const videoAdapter = expoBackwardUtils.expoAV.isVideoModule(avModule) ? new ExpoVideoAdapter(avModule) : new LegacyExpoAVVideoAdapter(avModule);
|
|
95
|
+
return {
|
|
96
|
+
VideoComponent: videoAdapter.VideoComponent,
|
|
28
97
|
async getVideoThumbnail({
|
|
29
98
|
url,
|
|
30
99
|
quality,
|