@sendbird/uikit-react-native 3.2.0 → 3.3.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/lib/commonjs/components/ChannelInput/EditInput.js +2 -11
- package/lib/commonjs/components/ChannelInput/EditInput.js.map +1 -1
- package/lib/commonjs/components/ChannelInput/SendInput.js +2 -11
- package/lib/commonjs/components/ChannelInput/SendInput.js.map +1 -1
- package/lib/commonjs/components/ChannelInput/index.js +30 -3
- package/lib/commonjs/components/ChannelInput/index.js.map +1 -1
- package/lib/commonjs/components/ChannelMessageList/index.js +148 -116
- package/lib/commonjs/components/ChannelMessageList/index.js.map +1 -1
- package/lib/commonjs/components/GroupChannelMessageRenderer/index.js +34 -1
- package/lib/commonjs/components/GroupChannelMessageRenderer/index.js.map +1 -1
- package/lib/commonjs/domain/groupChannel/component/GroupChannelHeader.js +14 -4
- package/lib/commonjs/domain/groupChannel/component/GroupChannelHeader.js.map +1 -1
- package/lib/commonjs/domain/groupChannel/component/GroupChannelMessageList.js +1 -0
- package/lib/commonjs/domain/groupChannel/component/GroupChannelMessageList.js.map +1 -1
- package/lib/commonjs/domain/groupChannel/types.js.map +1 -1
- package/lib/commonjs/fragments/createGroupChannelFragment.js +4 -3
- package/lib/commonjs/fragments/createGroupChannelFragment.js.map +1 -1
- package/lib/commonjs/index.js +4 -0
- package/lib/commonjs/index.js.map +1 -1
- package/lib/commonjs/types.js +7 -0
- package/lib/commonjs/types.js.map +1 -1
- package/lib/commonjs/utils/promise.js +138 -0
- package/lib/commonjs/utils/promise.js.map +1 -0
- package/lib/commonjs/version.js +1 -1
- package/lib/commonjs/version.js.map +1 -1
- package/lib/module/components/ChannelInput/EditInput.js +3 -12
- package/lib/module/components/ChannelInput/EditInput.js.map +1 -1
- package/lib/module/components/ChannelInput/SendInput.js +3 -12
- package/lib/module/components/ChannelInput/SendInput.js.map +1 -1
- package/lib/module/components/ChannelInput/index.js +32 -5
- package/lib/module/components/ChannelInput/index.js.map +1 -1
- package/lib/module/components/ChannelMessageList/index.js +148 -116
- package/lib/module/components/ChannelMessageList/index.js.map +1 -1
- package/lib/module/components/GroupChannelMessageRenderer/index.js +34 -2
- package/lib/module/components/GroupChannelMessageRenderer/index.js.map +1 -1
- package/lib/module/domain/groupChannel/component/GroupChannelHeader.js +15 -5
- package/lib/module/domain/groupChannel/component/GroupChannelHeader.js.map +1 -1
- package/lib/module/domain/groupChannel/component/GroupChannelMessageList.js +1 -0
- package/lib/module/domain/groupChannel/component/GroupChannelMessageList.js.map +1 -1
- package/lib/module/domain/groupChannel/types.js.map +1 -1
- package/lib/module/fragments/createGroupChannelFragment.js +4 -3
- package/lib/module/fragments/createGroupChannelFragment.js.map +1 -1
- package/lib/module/index.js +4 -0
- package/lib/module/index.js.map +1 -1
- package/lib/module/types.js +5 -1
- package/lib/module/types.js.map +1 -1
- package/lib/module/utils/promise.js +132 -0
- package/lib/module/utils/promise.js.map +1 -0
- package/lib/module/version.js +1 -1
- package/lib/module/version.js.map +1 -1
- package/lib/typescript/src/components/ChannelInput/index.d.ts +2 -0
- package/lib/typescript/src/components/ChannelMessageList/index.d.ts +3 -0
- package/lib/typescript/src/components/GroupChannelMessageRenderer/index.d.ts +3 -0
- package/lib/typescript/src/components/OpenChannelMessageRenderer/index.d.ts +2 -0
- package/lib/typescript/src/containers/SendbirdUIKitContainer.d.ts +1 -1
- package/lib/typescript/src/domain/groupChannel/types.d.ts +3 -0
- package/lib/typescript/src/types.d.ts +4 -0
- package/lib/typescript/src/utils/promise.d.ts +7 -0
- package/lib/typescript/src/version.d.ts +1 -1
- package/package.json +6 -6
- package/src/components/ChannelInput/EditInput.tsx +3 -15
- package/src/components/ChannelInput/SendInput.tsx +2 -9
- package/src/components/ChannelInput/index.tsx +27 -4
- package/src/components/ChannelMessageList/index.tsx +144 -114
- package/src/components/GroupChannelMessageRenderer/index.tsx +34 -2
- package/src/domain/groupChannel/component/GroupChannelHeader.tsx +14 -3
- package/src/domain/groupChannel/component/GroupChannelMessageList.tsx +1 -0
- package/src/domain/groupChannel/types.ts +4 -0
- package/src/fragments/createGroupChannelFragment.tsx +11 -3
- package/src/index.ts +5 -1
- package/src/types.ts +5 -0
- package/src/utils/promise.ts +139 -0
- package/src/version.ts +1 -1
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
function _extends() { _extends = Object.assign ? Object.assign.bind() : function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; }; return _extends.apply(this, arguments); }
|
|
2
|
-
import React, { useEffect, useState } from 'react';
|
|
3
|
-
import { KeyboardAvoidingView, Platform, View } from 'react-native';
|
|
2
|
+
import React, { useEffect, useMemo, useState } from 'react';
|
|
3
|
+
import { KeyboardAvoidingView, Platform, StyleSheet, View } from 'react-native';
|
|
4
4
|
import { useSafeAreaInsets } from 'react-native-safe-area-context';
|
|
5
5
|
import { createStyleSheet, useUIKitTheme } from '@sendbird/uikit-react-native-foundation';
|
|
6
6
|
import { replace, useIIFE } from '@sendbird/uikit-utils';
|
|
@@ -41,7 +41,8 @@ const ChannelInput = props => {
|
|
|
41
41
|
bottom
|
|
42
42
|
} = useSafeAreaInsets();
|
|
43
43
|
const {
|
|
44
|
-
colors
|
|
44
|
+
colors,
|
|
45
|
+
typography
|
|
45
46
|
} = useUIKitTheme();
|
|
46
47
|
const {
|
|
47
48
|
sbOptions,
|
|
@@ -63,6 +64,16 @@ const ChannelInput = props => {
|
|
|
63
64
|
const mentionAvailable = sbOptions.uikit.groupChannel.channel.enableMention && channel.isGroupChannel() && !channel.isBroadcast;
|
|
64
65
|
const inputKeyToRemount = GET_INPUT_KEY(mentionAvailable ? mentionedUsers.length === 0 : false);
|
|
65
66
|
const [inputHeight, setInputHeight] = useState(styles.inputDefault.height);
|
|
67
|
+
const fontStyle = useMemo(() => {
|
|
68
|
+
if (!typography.body3.fontSize) return typography.body3;
|
|
69
|
+
// NOTE: iOS does not support textAlignVertical, so we should adjust lineHeight to center the text in multiline TextInput.
|
|
70
|
+
return {
|
|
71
|
+
...typography.body3,
|
|
72
|
+
lineHeight: typography.body3.fontSize * 1.275,
|
|
73
|
+
textAlignVertical: 'center'
|
|
74
|
+
};
|
|
75
|
+
}, [typography.body3.fontSize]);
|
|
76
|
+
const textInputStyle = StyleSheet.flatten([styles.input, fontStyle, props.style]);
|
|
66
77
|
useTypingTrigger(text, channel);
|
|
67
78
|
useTextClearOnDisabled(onChangeText, props.inputDisabled);
|
|
68
79
|
useAutoFocusOnEditMode(textInputRef, messageToEdit);
|
|
@@ -103,7 +114,8 @@ const ChannelInput = props => {
|
|
|
103
114
|
mentionedUsers: mentionedUsers,
|
|
104
115
|
VoiceMessageInput: props.VoiceMessageInput ?? VoiceMessageInput,
|
|
105
116
|
AttachmentsButton: props.AttachmentsButton ?? AttachmentsButton,
|
|
106
|
-
MessageToReplyPreview: props.MessageToReplyPreview ?? MessageToReplyPreview
|
|
117
|
+
MessageToReplyPreview: props.MessageToReplyPreview ?? MessageToReplyPreview,
|
|
118
|
+
style: textInputStyle
|
|
107
119
|
})), inputMode === 'edit' && messageToEdit && /*#__PURE__*/React.createElement(EditInput, _extends({}, props, {
|
|
108
120
|
key: inputKeyToRemount,
|
|
109
121
|
ref: textInputRef,
|
|
@@ -113,7 +125,8 @@ const ChannelInput = props => {
|
|
|
113
125
|
onSelectionChange: onSelectionChange,
|
|
114
126
|
mentionedUsers: mentionedUsers,
|
|
115
127
|
messageToEdit: messageToEdit,
|
|
116
|
-
setMessageToEdit: setMessageToEdit
|
|
128
|
+
setMessageToEdit: setMessageToEdit,
|
|
129
|
+
style: textInputStyle
|
|
117
130
|
}))), /*#__PURE__*/React.createElement(SafeAreaBottom, {
|
|
118
131
|
height: bottom
|
|
119
132
|
}))), mentionAvailable && props.SuggestedMentionList && /*#__PURE__*/React.createElement(props.SuggestedMentionList, {
|
|
@@ -165,6 +178,20 @@ const styles = createStyleSheet({
|
|
|
165
178
|
},
|
|
166
179
|
inputDefault: {
|
|
167
180
|
height: 56
|
|
181
|
+
},
|
|
182
|
+
input: {
|
|
183
|
+
flex: 1,
|
|
184
|
+
marginRight: 4,
|
|
185
|
+
borderRadius: 20,
|
|
186
|
+
paddingTop: 8,
|
|
187
|
+
paddingBottom: 8,
|
|
188
|
+
minHeight: 36,
|
|
189
|
+
// Android - padding area is hidden
|
|
190
|
+
// iOS - padding area is visible
|
|
191
|
+
maxHeight: Platform.select({
|
|
192
|
+
ios: 36 * 2 + 16,
|
|
193
|
+
android: 36 * 2
|
|
194
|
+
})
|
|
168
195
|
}
|
|
169
196
|
});
|
|
170
197
|
export default /*#__PURE__*/React.memo(ChannelInput);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["React","useEffect","useState","KeyboardAvoidingView","Platform","View","useSafeAreaInsets","createStyleSheet","useUIKitTheme","replace","useIIFE","useSendbirdChat","useMentionTextInput","AttachmentsButton","EditInput","MessageToReplyPreview","SendInput","VoiceMessageInput","AUTO_FOCUS","select","ios","android","default","KEYBOARD_AVOID_VIEW_BEHAVIOR","undefined","GET_INPUT_KEY","shouldReset","ChannelInput","props","channel","keyboardAvoidOffset","messageToEdit","setMessageToEdit","top","left","right","bottom","colors","sbOptions","mentionManager","selection","onSelectionChange","textInputRef","text","onChangeText","mentionedUsers","inputMode","isFileMessage","mentionAvailable","uikit","groupChannel","enableMention","isGroupChannel","isBroadcast","inputKeyToRemount","length","inputHeight","setInputHeight","styles","inputDefault","height","useTypingTrigger","useTextClearOnDisabled","inputDisabled","useAutoFocusOnEditMode","onPressToMention","user","searchStringRange","mentionedMessageText","asMentionedMessageText","range","start","end","shouldRenderInput","createElement","SafeAreaBottom","Fragment","keyboardVerticalOffset","behavior","style","paddingLeft","paddingRight","backgroundColor","background","onLayout","e","nativeEvent","layout","inputContainer","_extends","key","ref","autoFocus","SuggestedMentionList","topInset","bottomInset","endTyping","startTyping","setText","chatDisabled","isUserMessage","setTimeout","_textInputRef$current","current","focus","_ref","justifyContent","width","memo"],"sources":["index.tsx"],"sourcesContent":["import React, { useEffect, useState } from 'react';\nimport { KeyboardAvoidingView, Platform, TextInput, View } from 'react-native';\nimport { useSafeAreaInsets } from 'react-native-safe-area-context';\n\nimport { createStyleSheet, useUIKitTheme } from '@sendbird/uikit-react-native-foundation';\nimport {\n SendbirdBaseChannel,\n SendbirdBaseMessage,\n SendbirdFileMessage,\n SendbirdFileMessageCreateParams,\n SendbirdFileMessageUpdateParams,\n SendbirdMember,\n SendbirdUserMessage,\n SendbirdUserMessageCreateParams,\n SendbirdUserMessageUpdateParams,\n replace,\n useIIFE,\n} from '@sendbird/uikit-utils';\n\nimport { useSendbirdChat } from '../../hooks/useContext';\nimport useMentionTextInput from '../../hooks/useMentionTextInput';\nimport type { 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\nexport type ChannelInputProps = {\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\n // mention\n SuggestedMentionList?: (props: SuggestedMentionListProps) => React.ReactNode | null;\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\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.\nconst GET_INPUT_KEY = (shouldReset: boolean) => (shouldReset ? 'uikit-input-clear' : 'uikit-input');\n\n// TODO: Refactor 'Edit' mode to clearly\nconst ChannelInput = (props: ChannelInputProps) => {\n const { channel, keyboardAvoidOffset, messageToEdit, setMessageToEdit } = props;\n\n const { top, left, right, bottom } = useSafeAreaInsets();\n const { colors } = 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\n const inputKeyToRemount = GET_INPUT_KEY(mentionAvailable ? mentionedUsers.length === 0 : false);\n\n const [inputHeight, setInputHeight] = useState(styles.inputDefault.height);\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={bottom} />;\n }\n\n return (\n <>\n <KeyboardAvoidingView\n keyboardVerticalOffset={-bottom + keyboardAvoidOffset}\n behavior={KEYBOARD_AVOID_VIEW_BEHAVIOR}\n >\n <View style={{ paddingLeft: left, paddingRight: right, backgroundColor: colors.background }}>\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 />\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 />\n )}\n </View>\n <SafeAreaBottom height={bottom} />\n </View>\n </KeyboardAvoidingView>\n {mentionAvailable && props.SuggestedMentionList && (\n <props.SuggestedMentionList\n text={text}\n selection={selection}\n inputHeight={inputHeight}\n topInset={top}\n bottomInset={bottom}\n onPressToMention={onPressToMention}\n mentionedUsers={mentionedUsers}\n />\n )}\n </>\n );\n};\n\nconst useTypingTrigger = (text: string, channel: SendbirdBaseChannel) => {\n if (channel.isGroupChannel()) {\n useEffect(() => {\n if (text.length === 0) channel.endTyping();\n else channel.startTyping();\n }, [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});\n\nexport default React.memo(ChannelInput);\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"names":["React","useEffect","useMemo","useState","KeyboardAvoidingView","Platform","StyleSheet","View","useSafeAreaInsets","createStyleSheet","useUIKitTheme","replace","useIIFE","useSendbirdChat","useMentionTextInput","AttachmentsButton","EditInput","MessageToReplyPreview","SendInput","VoiceMessageInput","AUTO_FOCUS","select","ios","android","default","KEYBOARD_AVOID_VIEW_BEHAVIOR","undefined","GET_INPUT_KEY","shouldReset","ChannelInput","props","channel","keyboardAvoidOffset","messageToEdit","setMessageToEdit","top","left","right","bottom","colors","typography","sbOptions","mentionManager","selection","onSelectionChange","textInputRef","text","onChangeText","mentionedUsers","inputMode","isFileMessage","mentionAvailable","uikit","groupChannel","enableMention","isGroupChannel","isBroadcast","inputKeyToRemount","length","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","shouldRenderInput","createElement","SafeAreaBottom","Fragment","keyboardVerticalOffset","behavior","paddingLeft","paddingRight","backgroundColor","background","onLayout","e","nativeEvent","layout","inputContainer","_extends","key","ref","autoFocus","SuggestedMentionList","topInset","bottomInset","endTyping","startTyping","setText","chatDisabled","isUserMessage","setTimeout","_textInputRef$current","current","focus","_ref","justifyContent","width","flex","marginRight","borderRadius","paddingTop","paddingBottom","minHeight","maxHeight","memo"],"sources":["index.tsx"],"sourcesContent":["import React, { useEffect, useMemo, useState } from 'react';\nimport { KeyboardAvoidingView, Platform, StyleProp, StyleSheet, TextInput, TextStyle, View } from 'react-native';\nimport { useSafeAreaInsets } from 'react-native-safe-area-context';\n\nimport { createStyleSheet, useUIKitTheme } from '@sendbird/uikit-react-native-foundation';\nimport {\n SendbirdBaseChannel,\n SendbirdBaseMessage,\n SendbirdFileMessage,\n SendbirdFileMessageCreateParams,\n SendbirdFileMessageUpdateParams,\n SendbirdMember,\n SendbirdUserMessage,\n SendbirdUserMessageCreateParams,\n SendbirdUserMessageUpdateParams,\n replace,\n useIIFE,\n} from '@sendbird/uikit-utils';\n\nimport { useSendbirdChat } from '../../hooks/useContext';\nimport useMentionTextInput from '../../hooks/useMentionTextInput';\nimport type { 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\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\n // mention\n SuggestedMentionList?: (props: SuggestedMentionListProps) => React.ReactNode | null;\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\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.\nconst GET_INPUT_KEY = (shouldReset: boolean) => (shouldReset ? 'uikit-input-clear' : 'uikit-input');\n\n// TODO: Refactor 'Edit' mode to clearly\nconst ChannelInput = (props: ChannelInputProps) => {\n const { channel, keyboardAvoidOffset, messageToEdit, setMessageToEdit } = props;\n\n const { top, left, right, bottom } = useSafeAreaInsets();\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 = 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={bottom} />;\n }\n\n return (\n <>\n <KeyboardAvoidingView\n keyboardVerticalOffset={-bottom + keyboardAvoidOffset}\n behavior={KEYBOARD_AVOID_VIEW_BEHAVIOR}\n >\n <View style={{ paddingLeft: left, paddingRight: right, backgroundColor: colors.background }}>\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={bottom} />\n </View>\n </KeyboardAvoidingView>\n {mentionAvailable && props.SuggestedMentionList && (\n <props.SuggestedMentionList\n text={text}\n selection={selection}\n inputHeight={inputHeight}\n topInset={top}\n bottomInset={bottom}\n onPressToMention={onPressToMention}\n mentionedUsers={mentionedUsers}\n />\n )}\n </>\n );\n};\n\nconst useTypingTrigger = (text: string, channel: SendbirdBaseChannel) => {\n if (channel.isGroupChannel()) {\n useEffect(() => {\n if (text.length === 0) channel.endTyping();\n else channel.startTyping();\n }, [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 marginRight: 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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"}
|
|
@@ -47,7 +47,7 @@ const ChannelMessageList = (_ref, ref) => {
|
|
|
47
47
|
left,
|
|
48
48
|
right
|
|
49
49
|
} = useSafeAreaInsets();
|
|
50
|
-
const
|
|
50
|
+
const createMessagePressActions = useCreateMessagePressActions({
|
|
51
51
|
channel,
|
|
52
52
|
currentUserId,
|
|
53
53
|
onEditMessage,
|
|
@@ -67,8 +67,11 @@ const ChannelMessageList = (_ref, ref) => {
|
|
|
67
67
|
} = _ref2;
|
|
68
68
|
const {
|
|
69
69
|
onPress,
|
|
70
|
-
onLongPress
|
|
71
|
-
|
|
70
|
+
onLongPress,
|
|
71
|
+
bottomSheetItem
|
|
72
|
+
} = createMessagePressActions({
|
|
73
|
+
message: item
|
|
74
|
+
});
|
|
72
75
|
return renderMessage({
|
|
73
76
|
message: item,
|
|
74
77
|
prevMessage: messages[index + 1],
|
|
@@ -80,7 +83,9 @@ const ChannelMessageList = (_ref, ref) => {
|
|
|
80
83
|
enableMessageGrouping,
|
|
81
84
|
channel,
|
|
82
85
|
currentUserId,
|
|
83
|
-
focused: ((searchItem === null || searchItem === void 0 ? void 0 : searchItem.startingPoint) ?? -1) === item.createdAt
|
|
86
|
+
focused: ((searchItem === null || searchItem === void 0 ? void 0 : searchItem.startingPoint) ?? -1) === item.createdAt,
|
|
87
|
+
bottomSheetItem,
|
|
88
|
+
isFirstItem: index === 0
|
|
84
89
|
});
|
|
85
90
|
});
|
|
86
91
|
return /*#__PURE__*/React.createElement(View, {
|
|
@@ -115,7 +120,7 @@ const ChannelMessageList = (_ref, ref) => {
|
|
|
115
120
|
onPress: () => onPressScrollToBottomButton()
|
|
116
121
|
})));
|
|
117
122
|
};
|
|
118
|
-
const
|
|
123
|
+
const useCreateMessagePressActions = _ref3 => {
|
|
119
124
|
let {
|
|
120
125
|
channel,
|
|
121
126
|
currentUserId,
|
|
@@ -145,25 +150,61 @@ const useGetMessagePressActions = _ref3 => {
|
|
|
145
150
|
const {
|
|
146
151
|
sbOptions
|
|
147
152
|
} = useSendbirdChat();
|
|
148
|
-
const
|
|
153
|
+
const onResendFailure = error => {
|
|
149
154
|
toast.show(STRINGS.TOAST.RESEND_MSG_ERROR, 'error');
|
|
150
155
|
Logger.error(STRINGS.TOAST.RESEND_MSG_ERROR, error);
|
|
151
156
|
};
|
|
152
|
-
const
|
|
157
|
+
const onDeleteFailure = error => {
|
|
158
|
+
toast.show(STRINGS.TOAST.DELETE_MSG_ERROR, 'error');
|
|
159
|
+
Logger.error(STRINGS.TOAST.DELETE_MSG_ERROR, error);
|
|
160
|
+
};
|
|
161
|
+
const onCopyText = message => {
|
|
162
|
+
if (message.isUserMessage()) {
|
|
163
|
+
clipboardService.setString(message.message || '');
|
|
164
|
+
toast.show(STRINGS.TOAST.COPY_OK, 'success');
|
|
165
|
+
}
|
|
166
|
+
};
|
|
167
|
+
const onDownloadFile = message => {
|
|
168
|
+
if (message.isFileMessage()) {
|
|
169
|
+
if (toMegabyte(message.size) > 4) {
|
|
170
|
+
toast.show(STRINGS.TOAST.DOWNLOAD_START, 'success');
|
|
171
|
+
}
|
|
172
|
+
fileService.save({
|
|
173
|
+
fileUrl: message.url,
|
|
174
|
+
fileName: message.name,
|
|
175
|
+
fileType: message.type
|
|
176
|
+
}).then(response => {
|
|
177
|
+
toast.show(STRINGS.TOAST.DOWNLOAD_OK, 'success');
|
|
178
|
+
Logger.log('File saved to', response);
|
|
179
|
+
}).catch(err => {
|
|
180
|
+
toast.show(STRINGS.TOAST.DOWNLOAD_ERROR, 'error');
|
|
181
|
+
Logger.log('File save failure', err);
|
|
182
|
+
});
|
|
183
|
+
}
|
|
184
|
+
};
|
|
185
|
+
const onOpenFile = message => {
|
|
186
|
+
if (message.isFileMessage()) {
|
|
187
|
+
const fileType = getFileType(message.type || getFileExtension(message.name));
|
|
188
|
+
if (['image', 'video', 'audio'].includes(fileType)) {
|
|
189
|
+
onPressMediaMessage === null || onPressMediaMessage === void 0 ? void 0 : onPressMediaMessage(message, () => onDeleteMessage(message), getAvailableUriFromFileMessage(message));
|
|
190
|
+
} else {
|
|
191
|
+
SBUUtils.openURL(message.url);
|
|
192
|
+
}
|
|
193
|
+
}
|
|
194
|
+
};
|
|
195
|
+
const openSheetForFailedMessage = message => {
|
|
153
196
|
openSheet({
|
|
154
197
|
sheetItems: [{
|
|
155
198
|
title: STRINGS.LABELS.CHANNEL_MESSAGE_FAILED_RETRY,
|
|
156
|
-
onPress: () =>
|
|
157
|
-
onResendFailedMessage(message).catch(onFailureToReSend);
|
|
158
|
-
}
|
|
199
|
+
onPress: () => onResendFailedMessage(message).catch(onResendFailure)
|
|
159
200
|
}, {
|
|
160
201
|
title: STRINGS.LABELS.CHANNEL_MESSAGE_FAILED_REMOVE,
|
|
161
202
|
titleColor: colors.ui.dialog.default.none.destructive,
|
|
162
|
-
onPress: () =>
|
|
203
|
+
onPress: () => alertForMessageDelete(message)
|
|
163
204
|
}]
|
|
164
205
|
});
|
|
165
206
|
};
|
|
166
|
-
const
|
|
207
|
+
const alertForMessageDelete = message => {
|
|
167
208
|
alert({
|
|
168
209
|
title: STRINGS.LABELS.CHANNEL_MESSAGE_DELETE_CONFIRM_TITLE,
|
|
169
210
|
buttons: [{
|
|
@@ -172,127 +213,118 @@ const useGetMessagePressActions = _ref3 => {
|
|
|
172
213
|
text: STRINGS.LABELS.CHANNEL_MESSAGE_DELETE_CONFIRM_OK,
|
|
173
214
|
style: 'destructive',
|
|
174
215
|
onPress: () => {
|
|
175
|
-
onDeleteMessage(message).catch(
|
|
216
|
+
onDeleteMessage(message).catch(onDeleteFailure);
|
|
176
217
|
}
|
|
177
218
|
}]
|
|
178
219
|
});
|
|
179
220
|
};
|
|
180
|
-
return
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
};
|
|
186
|
-
}
|
|
221
|
+
return _ref4 => {
|
|
222
|
+
let {
|
|
223
|
+
message
|
|
224
|
+
} = _ref4;
|
|
225
|
+
if (!message.isUserMessage() && !message.isFileMessage()) return {};
|
|
187
226
|
const sheetItems = [];
|
|
188
|
-
const
|
|
189
|
-
|
|
190
|
-
onLongPress: undefined
|
|
191
|
-
};
|
|
192
|
-
if (msg.isUserMessage()) {
|
|
193
|
-
sheetItems.push({
|
|
227
|
+
const menu = {
|
|
228
|
+
copy: message => ({
|
|
194
229
|
icon: 'copy',
|
|
195
230
|
title: STRINGS.LABELS.CHANNEL_MESSAGE_COPY,
|
|
196
|
-
onPress: () =>
|
|
197
|
-
|
|
198
|
-
|
|
199
|
-
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
|
|
231
|
+
onPress: () => onCopyText(message)
|
|
232
|
+
}),
|
|
233
|
+
edit: message => ({
|
|
234
|
+
icon: 'edit',
|
|
235
|
+
title: STRINGS.LABELS.CHANNEL_MESSAGE_EDIT,
|
|
236
|
+
onPress: () => onEditMessage(message)
|
|
237
|
+
}),
|
|
238
|
+
delete: message => ({
|
|
239
|
+
disabled: message.threadInfo ? message.threadInfo.replyCount > 0 : undefined,
|
|
240
|
+
icon: 'delete',
|
|
241
|
+
title: STRINGS.LABELS.CHANNEL_MESSAGE_DELETE,
|
|
242
|
+
onPress: () => alertForMessageDelete(message)
|
|
243
|
+
}),
|
|
244
|
+
reply: message => ({
|
|
245
|
+
disabled: Boolean(message.parentMessageId),
|
|
246
|
+
icon: 'reply',
|
|
247
|
+
title: STRINGS.LABELS.CHANNEL_MESSAGE_REPLY,
|
|
248
|
+
onPress: () => onReplyMessage === null || onReplyMessage === void 0 ? void 0 : onReplyMessage(message)
|
|
249
|
+
}),
|
|
250
|
+
download: message => ({
|
|
204
251
|
icon: 'download',
|
|
205
252
|
title: STRINGS.LABELS.CHANNEL_MESSAGE_SAVE,
|
|
206
|
-
onPress:
|
|
207
|
-
|
|
208
|
-
|
|
209
|
-
|
|
210
|
-
|
|
211
|
-
|
|
212
|
-
|
|
213
|
-
|
|
214
|
-
|
|
215
|
-
toast.show(STRINGS.TOAST.DOWNLOAD_OK, 'success');
|
|
216
|
-
Logger.log('File saved to', response);
|
|
217
|
-
}).catch(err => {
|
|
218
|
-
toast.show(STRINGS.TOAST.DOWNLOAD_ERROR, 'error');
|
|
219
|
-
Logger.log('File save failure', err);
|
|
220
|
-
});
|
|
253
|
+
onPress: () => onDownloadFile(message)
|
|
254
|
+
})
|
|
255
|
+
};
|
|
256
|
+
if (message.isUserMessage()) {
|
|
257
|
+
sheetItems.push(menu.copy(message));
|
|
258
|
+
if (!channel.isEphemeral) {
|
|
259
|
+
if (isMyMessage(message, currentUserId) && message.sendingStatus === 'succeeded') {
|
|
260
|
+
sheetItems.push(menu.edit(message));
|
|
261
|
+
sheetItems.push(menu.delete(message));
|
|
221
262
|
}
|
|
222
|
-
|
|
223
|
-
|
|
224
|
-
if (!channel.isEphemeral) {
|
|
225
|
-
if (isMyMessage(msg, currentUserId) && msg.sendingStatus === 'succeeded') {
|
|
226
|
-
if (msg.isUserMessage()) {
|
|
227
|
-
sheetItems.push({
|
|
228
|
-
icon: 'edit',
|
|
229
|
-
title: STRINGS.LABELS.CHANNEL_MESSAGE_EDIT,
|
|
230
|
-
onPress: () => onEditMessage(msg)
|
|
231
|
-
});
|
|
263
|
+
if (channel.isGroupChannel() && sbOptions.uikit.groupChannel.channel.replyType === 'quote_reply') {
|
|
264
|
+
sheetItems.push(menu.reply(message));
|
|
232
265
|
}
|
|
233
|
-
sheetItems.push({
|
|
234
|
-
disabled: msg.threadInfo ? msg.threadInfo.replyCount > 0 : undefined,
|
|
235
|
-
icon: 'delete',
|
|
236
|
-
title: STRINGS.LABELS.CHANNEL_MESSAGE_DELETE,
|
|
237
|
-
onPress: () => confirmDelete(msg)
|
|
238
|
-
});
|
|
239
|
-
}
|
|
240
|
-
if (channel.isGroupChannel() && sbOptions.uikit.groupChannel.channel.replyType === 'quote_reply') {
|
|
241
|
-
sheetItems.push({
|
|
242
|
-
disabled: Boolean(msg.parentMessageId),
|
|
243
|
-
icon: 'reply',
|
|
244
|
-
title: STRINGS.LABELS.CHANNEL_MESSAGE_REPLY,
|
|
245
|
-
onPress: () => onReplyMessage === null || onReplyMessage === void 0 ? void 0 : onReplyMessage(msg)
|
|
246
|
-
});
|
|
247
266
|
}
|
|
248
267
|
}
|
|
249
|
-
if (
|
|
250
|
-
|
|
251
|
-
|
|
252
|
-
|
|
253
|
-
|
|
254
|
-
|
|
255
|
-
|
|
256
|
-
|
|
257
|
-
|
|
258
|
-
|
|
259
|
-
|
|
260
|
-
}
|
|
261
|
-
default:
|
|
262
|
-
{
|
|
263
|
-
response.onPress = () => SBUUtils.openURL(msg.url);
|
|
264
|
-
break;
|
|
265
|
-
}
|
|
268
|
+
if (message.isFileMessage()) {
|
|
269
|
+
if (!isVoiceMessage(message)) {
|
|
270
|
+
sheetItems.push(menu.download(message));
|
|
271
|
+
}
|
|
272
|
+
if (!channel.isEphemeral) {
|
|
273
|
+
if (isMyMessage(message, currentUserId) && message.sendingStatus === 'succeeded') {
|
|
274
|
+
sheetItems.push(menu.delete(message));
|
|
275
|
+
}
|
|
276
|
+
if (channel.isGroupChannel() && sbOptions.uikit.groupChannel.channel.replyType === 'quote_reply') {
|
|
277
|
+
sheetItems.push(menu.reply(message));
|
|
278
|
+
}
|
|
266
279
|
}
|
|
267
280
|
}
|
|
268
|
-
|
|
269
|
-
|
|
270
|
-
|
|
271
|
-
|
|
272
|
-
|
|
273
|
-
|
|
274
|
-
|
|
275
|
-
|
|
276
|
-
|
|
277
|
-
|
|
278
|
-
channel: channel,
|
|
279
|
-
onClose: onClose
|
|
280
|
-
});
|
|
281
|
-
} : undefined
|
|
281
|
+
const bottomSheetItem = {
|
|
282
|
+
sheetItems,
|
|
283
|
+
HeaderComponent: shouldRenderReaction(channel, sbOptions.uikitWithAppInfo.groupChannel.channel.enableReactions) ? _ref5 => {
|
|
284
|
+
let {
|
|
285
|
+
onClose
|
|
286
|
+
} = _ref5;
|
|
287
|
+
return /*#__PURE__*/React.createElement(ReactionAddons.BottomSheet, {
|
|
288
|
+
message: message,
|
|
289
|
+
channel: channel,
|
|
290
|
+
onClose: onClose
|
|
282
291
|
});
|
|
283
|
-
}
|
|
284
|
-
}
|
|
285
|
-
|
|
286
|
-
|
|
287
|
-
|
|
288
|
-
|
|
289
|
-
|
|
290
|
-
|
|
291
|
-
|
|
292
|
-
|
|
293
|
-
|
|
292
|
+
} : undefined
|
|
293
|
+
};
|
|
294
|
+
switch (true) {
|
|
295
|
+
case message.sendingStatus === 'pending':
|
|
296
|
+
{
|
|
297
|
+
return {
|
|
298
|
+
onPress: undefined,
|
|
299
|
+
onLongPress: undefined,
|
|
300
|
+
bottomSheetItem: undefined
|
|
301
|
+
};
|
|
302
|
+
}
|
|
303
|
+
case message.sendingStatus === 'failed':
|
|
304
|
+
{
|
|
305
|
+
return {
|
|
306
|
+
onPress: () => onResendFailedMessage(message).catch(onResendFailure),
|
|
307
|
+
onLongPress: () => openSheetForFailedMessage(message),
|
|
308
|
+
bottomSheetItem
|
|
309
|
+
};
|
|
310
|
+
}
|
|
311
|
+
case message.isFileMessage():
|
|
312
|
+
{
|
|
313
|
+
return {
|
|
314
|
+
onPress: () => onOpenFile(message),
|
|
315
|
+
onLongPress: () => openSheet(bottomSheetItem),
|
|
316
|
+
bottomSheetItem
|
|
317
|
+
};
|
|
318
|
+
}
|
|
319
|
+
default:
|
|
320
|
+
{
|
|
321
|
+
return {
|
|
322
|
+
onPress: undefined,
|
|
323
|
+
onLongPress: () => openSheet(bottomSheetItem),
|
|
324
|
+
bottomSheetItem
|
|
325
|
+
};
|
|
326
|
+
}
|
|
294
327
|
}
|
|
295
|
-
return response;
|
|
296
328
|
};
|
|
297
329
|
};
|
|
298
330
|
const styles = createStyleSheet({
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["React","View","useSafeAreaInsets","ChannelFrozenBanner","createStyleSheet","useAlert","useBottomSheet","useToast","useUIKitTheme","Logger","getAvailableUriFromFileMessage","getFileExtension","getFileType","isMyMessage","isVoiceMessage","messageKeyExtractor","shouldRenderReaction","toMegabyte","useFreshCallback","useLocalization","usePlatformService","useSendbirdChat","useUserProfile","SBUUtils","ChatFlatList","ReactionAddons","ChannelMessageList","_ref","ref","searchItem","hasNext","channel","onEditMessage","onReplyMessage","onDeleteMessage","onResendFailedMessage","onPressMediaMessage","onPressParentMessage","currentUserId","renderNewMessagesButton","renderScrollToBottomButton","renderMessage","messages","newMessages","enableMessageGrouping","onScrolledAwayFromBottom","scrolledAwayFromBottom","onBottomReached","onTopReached","flatListProps","onPressNewMessagesButton","onPressScrollToBottomButton","STRINGS","colors","show","left","right","getMessagePressActions","useGetMessagePressActions","safeAreaLayout","paddingLeft","paddingRight","renderItem","_ref2","item","index","onPress","onLongPress","message","prevMessage","nextMessage","onShowUserProfile","focused","startingPoint","createdAt","createElement","style","flex","backgroundColor","background","isFrozen","styles","frozenBanner","text","LABELS","CHANNEL_MESSAGE_LIST_FROZEN","_extends","data","keyExtractor","contentContainerStyle","frozenListPadding","newMsgButton","visible","length","scrollButton","_ref3","toast","openSheet","alert","clipboardService","fileService","sbOptions","onFailureToReSend","error","TOAST","RESEND_MSG_ERROR","handleFailedMessage","sheetItems","title","CHANNEL_MESSAGE_FAILED_RETRY","catch","CHANNEL_MESSAGE_FAILED_REMOVE","titleColor","ui","dialog","default","none","destructive","confirmDelete","CHANNEL_MESSAGE_DELETE_CONFIRM_TITLE","buttons","CHANNEL_MESSAGE_DELETE_CONFIRM_CANCEL","CHANNEL_MESSAGE_DELETE_CONFIRM_OK","DELETE_MSG_ERROR","msg","isUserMessage","isFileMessage","undefined","response","push","icon","CHANNEL_MESSAGE_COPY","setString","COPY_OK","CHANNEL_MESSAGE_SAVE","size","DOWNLOAD_START","save","fileUrl","url","fileName","name","fileType","type","then","DOWNLOAD_OK","log","err","DOWNLOAD_ERROR","isEphemeral","sendingStatus","CHANNEL_MESSAGE_EDIT","disabled","threadInfo","replyCount","CHANNEL_MESSAGE_DELETE","isGroupChannel","uikit","groupChannel","replyType","Boolean","parentMessageId","CHANNEL_MESSAGE_REPLY","openURL","HeaderComponent","uikitWithAppInfo","enableReactions","_ref4","onClose","BottomSheet","position","zIndex","top","paddingBottom","bottom","alignSelf","forwardRef"],"sources":["index.tsx"],"sourcesContent":["import React, { Ref } from 'react';\nimport { FlatList, FlatListProps, ListRenderItem, View } from 'react-native';\nimport { useSafeAreaInsets } from 'react-native-safe-area-context';\n\nimport {\n BottomSheetItem,\n ChannelFrozenBanner,\n createStyleSheet,\n useAlert,\n useBottomSheet,\n useToast,\n useUIKitTheme,\n} from '@sendbird/uikit-react-native-foundation';\nimport {\n Logger,\n SendbirdFileMessage,\n SendbirdGroupChannel,\n SendbirdMessage,\n SendbirdOpenChannel,\n SendbirdUserMessage,\n getAvailableUriFromFileMessage,\n getFileExtension,\n getFileType,\n isMyMessage,\n isVoiceMessage,\n messageKeyExtractor,\n shouldRenderReaction,\n toMegabyte,\n useFreshCallback,\n} from '@sendbird/uikit-utils';\n\nimport type { UserProfileContextType } from '../../contexts/UserProfileCtx';\nimport { useLocalization, usePlatformService, useSendbirdChat, useUserProfile } from '../../hooks/useContext';\nimport SBUUtils from '../../libs/SBUUtils';\nimport type { CommonComponent } from '../../types';\nimport ChatFlatList from '../ChatFlatList';\nimport { ReactionAddons } from '../ReactionAddons';\n\ntype PressActions = { onPress?: () => void; onLongPress?: () => void };\ntype HandleableMessage = SendbirdUserMessage | SendbirdFileMessage;\nexport type ChannelMessageListProps<T extends SendbirdGroupChannel | SendbirdOpenChannel> = {\n enableMessageGrouping: boolean;\n currentUserId?: string;\n channel: T;\n messages: SendbirdMessage[];\n newMessages: SendbirdMessage[];\n searchItem?: { startingPoint: number };\n\n scrolledAwayFromBottom: boolean;\n onScrolledAwayFromBottom: (value: boolean) => void;\n onTopReached: () => void;\n onBottomReached: () => void;\n hasNext: () => boolean;\n\n onPressNewMessagesButton: (animated?: boolean) => void;\n onPressScrollToBottomButton: (animated?: boolean) => void;\n\n onEditMessage: (message: HandleableMessage) => void;\n onReplyMessage?: (message: HandleableMessage) => void; // only available on group channel\n onDeleteMessage: (message: HandleableMessage) => Promise<void>;\n onResendFailedMessage: (failedMessage: HandleableMessage) => Promise<void>;\n onPressParentMessage?: (parentMessage: SendbirdMessage) => void;\n onPressMediaMessage?: (message: SendbirdFileMessage, deleteMessage: () => Promise<void>, uri: string) => void;\n\n renderMessage: (props: {\n focused: boolean;\n message: SendbirdMessage;\n prevMessage?: SendbirdMessage;\n nextMessage?: SendbirdMessage;\n onPress?: () => void;\n onLongPress?: () => void;\n onPressParentMessage?: ChannelMessageListProps<T>['onPressParentMessage'];\n onShowUserProfile?: UserProfileContextType['show'];\n channel: T;\n currentUserId?: ChannelMessageListProps<T>['currentUserId'];\n enableMessageGrouping: ChannelMessageListProps<T>['enableMessageGrouping'];\n }) => React.ReactElement | null;\n renderNewMessagesButton: null | CommonComponent<{\n visible: boolean;\n onPress: () => void;\n newMessages: SendbirdMessage[];\n }>;\n renderScrollToBottomButton: null | CommonComponent<{\n visible: boolean;\n onPress: () => void;\n }>;\n flatListProps?: Omit<FlatListProps<SendbirdMessage>, 'data' | 'renderItem'>;\n} & {\n ref?: Ref<FlatList<SendbirdMessage>> | undefined;\n};\n\nconst ChannelMessageList = <T extends SendbirdGroupChannel | SendbirdOpenChannel>(\n {\n searchItem,\n hasNext,\n channel,\n onEditMessage,\n onReplyMessage,\n onDeleteMessage,\n onResendFailedMessage,\n onPressMediaMessage,\n onPressParentMessage,\n currentUserId,\n renderNewMessagesButton,\n renderScrollToBottomButton,\n renderMessage,\n messages,\n newMessages,\n enableMessageGrouping,\n onScrolledAwayFromBottom,\n scrolledAwayFromBottom,\n onBottomReached,\n onTopReached,\n flatListProps,\n onPressNewMessagesButton,\n onPressScrollToBottomButton,\n }: ChannelMessageListProps<T>,\n ref: React.ForwardedRef<FlatList<SendbirdMessage>>,\n) => {\n const { STRINGS } = useLocalization();\n const { colors } = useUIKitTheme();\n const { show } = useUserProfile();\n const { left, right } = useSafeAreaInsets();\n const getMessagePressActions = useGetMessagePressActions({\n channel,\n currentUserId,\n onEditMessage,\n onReplyMessage,\n onDeleteMessage,\n onResendFailedMessage,\n onPressMediaMessage,\n });\n\n const safeAreaLayout = { paddingLeft: left, paddingRight: right };\n\n const renderItem: ListRenderItem<SendbirdMessage> = useFreshCallback(({ item, index }) => {\n const { onPress, onLongPress } = getMessagePressActions(item);\n return renderMessage({\n message: item,\n prevMessage: messages[index + 1],\n nextMessage: messages[index - 1],\n onPress,\n onLongPress,\n onPressParentMessage,\n onShowUserProfile: show,\n enableMessageGrouping,\n channel,\n currentUserId,\n focused: (searchItem?.startingPoint ?? -1) === item.createdAt,\n });\n });\n\n return (\n <View style={[{ flex: 1, backgroundColor: colors.background }, safeAreaLayout]}>\n {channel.isFrozen && (\n <ChannelFrozenBanner style={styles.frozenBanner} text={STRINGS.LABELS.CHANNEL_MESSAGE_LIST_FROZEN} />\n )}\n <ChatFlatList\n {...flatListProps}\n onTopReached={onTopReached}\n onBottomReached={onBottomReached}\n onScrolledAwayFromBottom={onScrolledAwayFromBottom}\n ref={ref}\n data={messages}\n renderItem={renderItem}\n keyExtractor={messageKeyExtractor}\n contentContainerStyle={[\n // { minHeight: '100%', justifyContent: 'flex-end' },\n channel.isFrozen && styles.frozenListPadding,\n flatListProps?.contentContainerStyle,\n ]}\n />\n {renderNewMessagesButton && (\n <View style={[styles.newMsgButton, safeAreaLayout]}>\n {renderNewMessagesButton({\n visible: newMessages.length > 0 && (hasNext() || scrolledAwayFromBottom),\n onPress: () => onPressNewMessagesButton(),\n newMessages,\n })}\n </View>\n )}\n {renderScrollToBottomButton && (\n <View style={[styles.scrollButton, safeAreaLayout]}>\n {renderScrollToBottomButton({\n visible: hasNext() || scrolledAwayFromBottom,\n onPress: () => onPressScrollToBottomButton(),\n })}\n </View>\n )}\n </View>\n );\n};\n\nconst useGetMessagePressActions = <T extends SendbirdGroupChannel | SendbirdOpenChannel>({\n channel,\n currentUserId,\n onResendFailedMessage,\n onEditMessage,\n onReplyMessage,\n onDeleteMessage,\n onPressMediaMessage,\n}: Pick<\n ChannelMessageListProps<T>,\n | 'channel'\n | 'currentUserId'\n | 'onEditMessage'\n | 'onReplyMessage'\n | 'onDeleteMessage'\n | 'onResendFailedMessage'\n | 'onPressMediaMessage'\n>) => {\n const { colors } = useUIKitTheme();\n const { STRINGS } = useLocalization();\n const toast = useToast();\n const { openSheet } = useBottomSheet();\n const { alert } = useAlert();\n const { clipboardService, fileService } = usePlatformService();\n const { sbOptions } = useSendbirdChat();\n\n const onFailureToReSend = (error: Error) => {\n toast.show(STRINGS.TOAST.RESEND_MSG_ERROR, 'error');\n Logger.error(STRINGS.TOAST.RESEND_MSG_ERROR, error);\n };\n\n const handleFailedMessage = (message: HandleableMessage) => {\n openSheet({\n sheetItems: [\n {\n title: STRINGS.LABELS.CHANNEL_MESSAGE_FAILED_RETRY,\n onPress: () => {\n onResendFailedMessage(message).catch(onFailureToReSend);\n },\n },\n {\n title: STRINGS.LABELS.CHANNEL_MESSAGE_FAILED_REMOVE,\n titleColor: colors.ui.dialog.default.none.destructive,\n onPress: () => confirmDelete(message),\n },\n ],\n });\n };\n const confirmDelete = (message: HandleableMessage) => {\n alert({\n title: STRINGS.LABELS.CHANNEL_MESSAGE_DELETE_CONFIRM_TITLE,\n buttons: [\n {\n text: STRINGS.LABELS.CHANNEL_MESSAGE_DELETE_CONFIRM_CANCEL,\n },\n {\n text: STRINGS.LABELS.CHANNEL_MESSAGE_DELETE_CONFIRM_OK,\n style: 'destructive',\n onPress: () => {\n onDeleteMessage(message).catch(() => toast.show(STRINGS.TOAST.DELETE_MSG_ERROR, 'error'));\n },\n },\n ],\n });\n };\n\n return (msg: SendbirdMessage) => {\n if (!msg.isUserMessage() && !msg.isFileMessage()) {\n return { onPress: undefined, onLongPress: undefined };\n }\n\n const sheetItems: BottomSheetItem['sheetItems'] = [];\n const response: PressActions = {\n onPress: undefined,\n onLongPress: undefined,\n };\n\n if (msg.isUserMessage()) {\n sheetItems.push({\n icon: 'copy',\n title: STRINGS.LABELS.CHANNEL_MESSAGE_COPY,\n onPress: () => {\n clipboardService.setString(msg.message || '');\n toast.show(STRINGS.TOAST.COPY_OK, 'success');\n },\n });\n }\n if (!isVoiceMessage(msg) && msg.isFileMessage()) {\n sheetItems.push({\n icon: 'download',\n title: STRINGS.LABELS.CHANNEL_MESSAGE_SAVE,\n onPress: async () => {\n if (toMegabyte(msg.size) > 4) {\n toast.show(STRINGS.TOAST.DOWNLOAD_START, 'success');\n }\n\n fileService\n .save({ fileUrl: msg.url, fileName: msg.name, fileType: msg.type })\n .then((response) => {\n toast.show(STRINGS.TOAST.DOWNLOAD_OK, 'success');\n Logger.log('File saved to', response);\n })\n .catch((err) => {\n toast.show(STRINGS.TOAST.DOWNLOAD_ERROR, 'error');\n Logger.log('File save failure', err);\n });\n },\n });\n }\n\n if (!channel.isEphemeral) {\n if (isMyMessage(msg, currentUserId) && msg.sendingStatus === 'succeeded') {\n if (msg.isUserMessage()) {\n sheetItems.push({\n icon: 'edit',\n title: STRINGS.LABELS.CHANNEL_MESSAGE_EDIT,\n onPress: () => onEditMessage(msg),\n });\n }\n sheetItems.push({\n disabled: msg.threadInfo ? msg.threadInfo.replyCount > 0 : undefined,\n icon: 'delete',\n title: STRINGS.LABELS.CHANNEL_MESSAGE_DELETE,\n onPress: () => confirmDelete(msg),\n });\n }\n if (channel.isGroupChannel() && sbOptions.uikit.groupChannel.channel.replyType === 'quote_reply') {\n sheetItems.push({\n disabled: Boolean(msg.parentMessageId),\n icon: 'reply',\n title: STRINGS.LABELS.CHANNEL_MESSAGE_REPLY,\n onPress: () => onReplyMessage?.(msg),\n });\n }\n }\n\n if (msg.isFileMessage()) {\n const fileType = getFileType(msg.type || getFileExtension(msg.name));\n switch (fileType) {\n case 'image':\n case 'video':\n case 'audio': {\n response.onPress = () => {\n onPressMediaMessage?.(msg, () => onDeleteMessage(msg), getAvailableUriFromFileMessage(msg));\n };\n break;\n }\n default: {\n response.onPress = () => SBUUtils.openURL(msg.url);\n break;\n }\n }\n }\n\n if (sheetItems.length > 0) {\n response.onLongPress = () => {\n openSheet({\n sheetItems,\n HeaderComponent: shouldRenderReaction(\n channel,\n sbOptions.uikitWithAppInfo.groupChannel.channel.enableReactions,\n )\n ? ({ onClose }) => <ReactionAddons.BottomSheet message={msg} channel={channel} onClose={onClose} />\n : undefined,\n });\n };\n }\n\n if (msg.sendingStatus === 'failed') {\n response.onLongPress = () => handleFailedMessage(msg);\n response.onPress = () => {\n onResendFailedMessage(msg).catch(onFailureToReSend);\n };\n }\n\n if (msg.sendingStatus === 'pending') {\n response.onLongPress = undefined;\n response.onPress = undefined;\n }\n\n return response;\n };\n};\n\nconst styles = createStyleSheet({\n frozenBanner: {\n position: 'absolute',\n zIndex: 999,\n top: 8,\n left: 8,\n right: 8,\n },\n frozenListPadding: {\n paddingBottom: 32,\n },\n newMsgButton: {\n position: 'absolute',\n zIndex: 999,\n bottom: 10,\n alignSelf: 'center',\n },\n scrollButton: {\n position: 'absolute',\n zIndex: 998,\n bottom: 10,\n right: 16,\n },\n});\n\n// NOTE: Due to Generic inference is not working on forwardRef, we need to cast it as typeof ChannelMessageList and implicit `ref` prop\nexport default React.forwardRef(ChannelMessageList) as typeof ChannelMessageList;\n"],"mappings":";AAAA,OAAOA,KAAK,MAAe,OAAO;AAClC,SAAkDC,IAAI,QAAQ,cAAc;AAC5E,SAASC,iBAAiB,QAAQ,gCAAgC;AAElE,SAEEC,mBAAmB,EACnBC,gBAAgB,EAChBC,QAAQ,EACRC,cAAc,EACdC,QAAQ,EACRC,aAAa,QACR,yCAAyC;AAChD,SACEC,MAAM,EAMNC,8BAA8B,EAC9BC,gBAAgB,EAChBC,WAAW,EACXC,WAAW,EACXC,cAAc,EACdC,mBAAmB,EACnBC,oBAAoB,EACpBC,UAAU,EACVC,gBAAgB,QACX,uBAAuB;AAG9B,SAASC,eAAe,EAAEC,kBAAkB,EAAEC,eAAe,EAAEC,cAAc,QAAQ,wBAAwB;AAC7G,OAAOC,QAAQ,MAAM,qBAAqB;AAE1C,OAAOC,YAAY,MAAM,iBAAiB;AAC1C,SAASC,cAAc,QAAQ,mBAAmB;AAuDlD,MAAMC,kBAAkB,GAAGA,CAAAC,IAAA,EA0BzBC,GAAkD,KAC/C;EAAA,IA1BH;IACEC,UAAU;IACVC,OAAO;IACPC,OAAO;IACPC,aAAa;IACbC,cAAc;IACdC,eAAe;IACfC,qBAAqB;IACrBC,mBAAmB;IACnBC,oBAAoB;IACpBC,aAAa;IACbC,uBAAuB;IACvBC,0BAA0B;IAC1BC,aAAa;IACbC,QAAQ;IACRC,WAAW;IACXC,qBAAqB;IACrBC,wBAAwB;IACxBC,sBAAsB;IACtBC,eAAe;IACfC,YAAY;IACZC,aAAa;IACbC,wBAAwB;IACxBC;EAC0B,CAAC,GAAAxB,IAAA;EAG7B,MAAM;IAAEyB;EAAQ,CAAC,GAAGjC,eAAe,EAAE;EACrC,MAAM;IAAEkC;EAAO,CAAC,GAAG7C,aAAa,EAAE;EAClC,MAAM;IAAE8C;EAAK,CAAC,GAAGhC,cAAc,EAAE;EACjC,MAAM;IAAEiC,IAAI;IAAEC;EAAM,CAAC,GAAGtD,iBAAiB,EAAE;EAC3C,MAAMuD,sBAAsB,GAAGC,yBAAyB,CAAC;IACvD3B,OAAO;IACPO,aAAa;IACbN,aAAa;IACbC,cAAc;IACdC,eAAe;IACfC,qBAAqB;IACrBC;EACF,CAAC,CAAC;EAEF,MAAMuB,cAAc,GAAG;IAAEC,WAAW,EAAEL,IAAI;IAAEM,YAAY,EAAEL;EAAM,CAAC;EAEjE,MAAMM,UAA2C,GAAG5C,gBAAgB,CAAC6C,KAAA,IAAqB;IAAA,IAApB;MAAEC,IAAI;MAAEC;IAAM,CAAC,GAAAF,KAAA;IACnF,MAAM;MAAEG,OAAO;MAAEC;IAAY,CAAC,GAAGV,sBAAsB,CAACO,IAAI,CAAC;IAC7D,OAAOvB,aAAa,CAAC;MACnB2B,OAAO,EAAEJ,IAAI;MACbK,WAAW,EAAE3B,QAAQ,CAACuB,KAAK,GAAG,CAAC,CAAC;MAChCK,WAAW,EAAE5B,QAAQ,CAACuB,KAAK,GAAG,CAAC,CAAC;MAChCC,OAAO;MACPC,WAAW;MACX9B,oBAAoB;MACpBkC,iBAAiB,EAAEjB,IAAI;MACvBV,qBAAqB;MACrBb,OAAO;MACPO,aAAa;MACbkC,OAAO,EAAE,CAAC,CAAA3C,UAAU,aAAVA,UAAU,uBAAVA,UAAU,CAAE4C,aAAa,KAAI,CAAC,CAAC,MAAMT,IAAI,CAACU;IACtD,CAAC,CAAC;EACJ,CAAC,CAAC;EAEF,oBACE1E,KAAA,CAAA2E,aAAA,CAAC1E,IAAI;IAAC2E,KAAK,EAAE,CAAC;MAAEC,IAAI,EAAE,CAAC;MAAEC,eAAe,EAAEzB,MAAM,CAAC0B;IAAW,CAAC,EAAEpB,cAAc;EAAE,GAC5E5B,OAAO,CAACiD,QAAQ,iBACfhF,KAAA,CAAA2E,aAAA,CAACxE,mBAAmB;IAACyE,KAAK,EAAEK,MAAM,CAACC,YAAa;IAACC,IAAI,EAAE/B,OAAO,CAACgC,MAAM,CAACC;EAA4B,EACnG,eACDrF,KAAA,CAAA2E,aAAA,CAACnD,YAAY,EAAA8D,QAAA,KACPrC,aAAa;IACjBD,YAAY,EAAEA,YAAa;IAC3BD,eAAe,EAAEA,eAAgB;IACjCF,wBAAwB,EAAEA,wBAAyB;IACnDjB,GAAG,EAAEA,GAAI;IACT2D,IAAI,EAAE7C,QAAS;IACfoB,UAAU,EAAEA,UAAW;IACvB0B,YAAY,EAAEzE,mBAAoB;IAClC0E,qBAAqB,EAAE;IACrB;IACA1D,OAAO,CAACiD,QAAQ,IAAIC,MAAM,CAACS,iBAAiB,EAC5CzC,aAAa,aAAbA,aAAa,uBAAbA,aAAa,CAAEwC,qBAAqB;EACpC,GACF,EACDlD,uBAAuB,iBACtBvC,KAAA,CAAA2E,aAAA,CAAC1E,IAAI;IAAC2E,KAAK,EAAE,CAACK,MAAM,CAACU,YAAY,EAAEhC,cAAc;EAAE,GAChDpB,uBAAuB,CAAC;IACvBqD,OAAO,EAAEjD,WAAW,CAACkD,MAAM,GAAG,CAAC,KAAK/D,OAAO,EAAE,IAAIgB,sBAAsB,CAAC;IACxEoB,OAAO,EAAEA,CAAA,KAAMhB,wBAAwB,EAAE;IACzCP;EACF,CAAC,CAAC,CAEL,EACAH,0BAA0B,iBACzBxC,KAAA,CAAA2E,aAAA,CAAC1E,IAAI;IAAC2E,KAAK,EAAE,CAACK,MAAM,CAACa,YAAY,EAAEnC,cAAc;EAAE,GAChDnB,0BAA0B,CAAC;IAC1BoD,OAAO,EAAE9D,OAAO,EAAE,IAAIgB,sBAAsB;IAC5CoB,OAAO,EAAEA,CAAA,KAAMf,2BAA2B;EAC5C,CAAC,CAAC,CAEL,CACI;AAEX,CAAC;AAED,MAAMO,yBAAyB,GAAGqC,KAAA,IAiB5B;EAAA,IAjBmF;IACvFhE,OAAO;IACPO,aAAa;IACbH,qBAAqB;IACrBH,aAAa;IACbC,cAAc;IACdC,eAAe;IACfE;EAUF,CAAC,GAAA2D,KAAA;EACC,MAAM;IAAE1C;EAAO,CAAC,GAAG7C,aAAa,EAAE;EAClC,MAAM;IAAE4C;EAAQ,CAAC,GAAGjC,eAAe,EAAE;EACrC,MAAM6E,KAAK,GAAGzF,QAAQ,EAAE;EACxB,MAAM;IAAE0F;EAAU,CAAC,GAAG3F,cAAc,EAAE;EACtC,MAAM;IAAE4F;EAAM,CAAC,GAAG7F,QAAQ,EAAE;EAC5B,MAAM;IAAE8F,gBAAgB;IAAEC;EAAY,CAAC,GAAGhF,kBAAkB,EAAE;EAC9D,MAAM;IAAEiF;EAAU,CAAC,GAAGhF,eAAe,EAAE;EAEvC,MAAMiF,iBAAiB,GAAIC,KAAY,IAAK;IAC1CP,KAAK,CAAC1C,IAAI,CAACF,OAAO,CAACoD,KAAK,CAACC,gBAAgB,EAAE,OAAO,CAAC;IACnDhG,MAAM,CAAC8F,KAAK,CAACnD,OAAO,CAACoD,KAAK,CAACC,gBAAgB,EAAEF,KAAK,CAAC;EACrD,CAAC;EAED,MAAMG,mBAAmB,GAAItC,OAA0B,IAAK;IAC1D6B,SAAS,CAAC;MACRU,UAAU,EAAE,CACV;QACEC,KAAK,EAAExD,OAAO,CAACgC,MAAM,CAACyB,4BAA4B;QAClD3C,OAAO,EAAEA,CAAA,KAAM;UACb/B,qBAAqB,CAACiC,OAAO,CAAC,CAAC0C,KAAK,CAACR,iBAAiB,CAAC;QACzD;MACF,CAAC,EACD;QACEM,KAAK,EAAExD,OAAO,CAACgC,MAAM,CAAC2B,6BAA6B;QACnDC,UAAU,EAAE3D,MAAM,CAAC4D,EAAE,CAACC,MAAM,CAACC,OAAO,CAACC,IAAI,CAACC,WAAW;QACrDnD,OAAO,EAAEA,CAAA,KAAMoD,aAAa,CAAClD,OAAO;MACtC,CAAC;IAEL,CAAC,CAAC;EACJ,CAAC;EACD,MAAMkD,aAAa,GAAIlD,OAA0B,IAAK;IACpD8B,KAAK,CAAC;MACJU,KAAK,EAAExD,OAAO,CAACgC,MAAM,CAACmC,oCAAoC;MAC1DC,OAAO,EAAE,CACP;QACErC,IAAI,EAAE/B,OAAO,CAACgC,MAAM,CAACqC;MACvB,CAAC,EACD;QACEtC,IAAI,EAAE/B,OAAO,CAACgC,MAAM,CAACsC,iCAAiC;QACtD9C,KAAK,EAAE,aAAa;QACpBV,OAAO,EAAEA,CAAA,KAAM;UACbhC,eAAe,CAACkC,OAAO,CAAC,CAAC0C,KAAK,CAAC,MAAMd,KAAK,CAAC1C,IAAI,CAACF,OAAO,CAACoD,KAAK,CAACmB,gBAAgB,EAAE,OAAO,CAAC,CAAC;QAC3F;MACF,CAAC;IAEL,CAAC,CAAC;EACJ,CAAC;EAED,OAAQC,GAAoB,IAAK;IAC/B,IAAI,CAACA,GAAG,CAACC,aAAa,EAAE,IAAI,CAACD,GAAG,CAACE,aAAa,EAAE,EAAE;MAChD,OAAO;QAAE5D,OAAO,EAAE6D,SAAS;QAAE5D,WAAW,EAAE4D;MAAU,CAAC;IACvD;IAEA,MAAMpB,UAAyC,GAAG,EAAE;IACpD,MAAMqB,QAAsB,GAAG;MAC7B9D,OAAO,EAAE6D,SAAS;MAClB5D,WAAW,EAAE4D;IACf,CAAC;IAED,IAAIH,GAAG,CAACC,aAAa,EAAE,EAAE;MACvBlB,UAAU,CAACsB,IAAI,CAAC;QACdC,IAAI,EAAE,MAAM;QACZtB,KAAK,EAAExD,OAAO,CAACgC,MAAM,CAAC+C,oBAAoB;QAC1CjE,OAAO,EAAEA,CAAA,KAAM;UACbiC,gBAAgB,CAACiC,SAAS,CAACR,GAAG,CAACxD,OAAO,IAAI,EAAE,CAAC;UAC7C4B,KAAK,CAAC1C,IAAI,CAACF,OAAO,CAACoD,KAAK,CAAC6B,OAAO,EAAE,SAAS,CAAC;QAC9C;MACF,CAAC,CAAC;IACJ;IACA,IAAI,CAACvH,cAAc,CAAC8G,GAAG,CAAC,IAAIA,GAAG,CAACE,aAAa,EAAE,EAAE;MAC/CnB,UAAU,CAACsB,IAAI,CAAC;QACdC,IAAI,EAAE,UAAU;QAChBtB,KAAK,EAAExD,OAAO,CAACgC,MAAM,CAACkD,oBAAoB;QAC1CpE,OAAO,EAAE,MAAAA,CAAA,KAAY;UACnB,IAAIjD,UAAU,CAAC2G,GAAG,CAACW,IAAI,CAAC,GAAG,CAAC,EAAE;YAC5BvC,KAAK,CAAC1C,IAAI,CAACF,OAAO,CAACoD,KAAK,CAACgC,cAAc,EAAE,SAAS,CAAC;UACrD;UAEApC,WAAW,CACRqC,IAAI,CAAC;YAAEC,OAAO,EAAEd,GAAG,CAACe,GAAG;YAAEC,QAAQ,EAAEhB,GAAG,CAACiB,IAAI;YAAEC,QAAQ,EAAElB,GAAG,CAACmB;UAAK,CAAC,CAAC,CAClEC,IAAI,CAAEhB,QAAQ,IAAK;YAClBhC,KAAK,CAAC1C,IAAI,CAACF,OAAO,CAACoD,KAAK,CAACyC,WAAW,EAAE,SAAS,CAAC;YAChDxI,MAAM,CAACyI,GAAG,CAAC,eAAe,EAAElB,QAAQ,CAAC;UACvC,CAAC,CAAC,CACDlB,KAAK,CAAEqC,GAAG,IAAK;YACdnD,KAAK,CAAC1C,IAAI,CAACF,OAAO,CAACoD,KAAK,CAAC4C,cAAc,EAAE,OAAO,CAAC;YACjD3I,MAAM,CAACyI,GAAG,CAAC,mBAAmB,EAAEC,GAAG,CAAC;UACtC,CAAC,CAAC;QACN;MACF,CAAC,CAAC;IACJ;IAEA,IAAI,CAACpH,OAAO,CAACsH,WAAW,EAAE;MACxB,IAAIxI,WAAW,CAAC+G,GAAG,EAAEtF,aAAa,CAAC,IAAIsF,GAAG,CAAC0B,aAAa,KAAK,WAAW,EAAE;QACxE,IAAI1B,GAAG,CAACC,aAAa,EAAE,EAAE;UACvBlB,UAAU,CAACsB,IAAI,CAAC;YACdC,IAAI,EAAE,MAAM;YACZtB,KAAK,EAAExD,OAAO,CAACgC,MAAM,CAACmE,oBAAoB;YAC1CrF,OAAO,EAAEA,CAAA,KAAMlC,aAAa,CAAC4F,GAAG;UAClC,CAAC,CAAC;QACJ;QACAjB,UAAU,CAACsB,IAAI,CAAC;UACduB,QAAQ,EAAE5B,GAAG,CAAC6B,UAAU,GAAG7B,GAAG,CAAC6B,UAAU,CAACC,UAAU,GAAG,CAAC,GAAG3B,SAAS;UACpEG,IAAI,EAAE,QAAQ;UACdtB,KAAK,EAAExD,OAAO,CAACgC,MAAM,CAACuE,sBAAsB;UAC5CzF,OAAO,EAAEA,CAAA,KAAMoD,aAAa,CAACM,GAAG;QAClC,CAAC,CAAC;MACJ;MACA,IAAI7F,OAAO,CAAC6H,cAAc,EAAE,IAAIvD,SAAS,CAACwD,KAAK,CAACC,YAAY,CAAC/H,OAAO,CAACgI,SAAS,KAAK,aAAa,EAAE;QAChGpD,UAAU,CAACsB,IAAI,CAAC;UACduB,QAAQ,EAAEQ,OAAO,CAACpC,GAAG,CAACqC,eAAe,CAAC;UACtC/B,IAAI,EAAE,OAAO;UACbtB,KAAK,EAAExD,OAAO,CAACgC,MAAM,CAAC8E,qBAAqB;UAC3ChG,OAAO,EAAEA,CAAA,KAAMjC,cAAc,aAAdA,cAAc,uBAAdA,cAAc,CAAG2F,GAAG;QACrC,CAAC,CAAC;MACJ;IACF;IAEA,IAAIA,GAAG,CAACE,aAAa,EAAE,EAAE;MACvB,MAAMgB,QAAQ,GAAGlI,WAAW,CAACgH,GAAG,CAACmB,IAAI,IAAIpI,gBAAgB,CAACiH,GAAG,CAACiB,IAAI,CAAC,CAAC;MACpE,QAAQC,QAAQ;QACd,KAAK,OAAO;QACZ,KAAK,OAAO;QACZ,KAAK,OAAO;UAAE;YACZd,QAAQ,CAAC9D,OAAO,GAAG,MAAM;cACvB9B,mBAAmB,aAAnBA,mBAAmB,uBAAnBA,mBAAmB,CAAGwF,GAAG,EAAE,MAAM1F,eAAe,CAAC0F,GAAG,CAAC,EAAElH,8BAA8B,CAACkH,GAAG,CAAC,CAAC;YAC7F,CAAC;YACD;UACF;QACA;UAAS;YACPI,QAAQ,CAAC9D,OAAO,GAAG,MAAM3C,QAAQ,CAAC4I,OAAO,CAACvC,GAAG,CAACe,GAAG,CAAC;YAClD;UACF;MAAC;IAEL;IAEA,IAAIhC,UAAU,CAACd,MAAM,GAAG,CAAC,EAAE;MACzBmC,QAAQ,CAAC7D,WAAW,GAAG,MAAM;QAC3B8B,SAAS,CAAC;UACRU,UAAU;UACVyD,eAAe,EAAEpJ,oBAAoB,CACnCe,OAAO,EACPsE,SAAS,CAACgE,gBAAgB,CAACP,YAAY,CAAC/H,OAAO,CAACuI,eAAe,CAChE,GACGC,KAAA;YAAA,IAAC;cAAEC;YAAQ,CAAC,GAAAD,KAAA;YAAA,oBAAKvK,KAAA,CAAA2E,aAAA,CAAClD,cAAc,CAACgJ,WAAW;cAACrG,OAAO,EAAEwD,GAAI;cAAC7F,OAAO,EAAEA,OAAQ;cAACyI,OAAO,EAAEA;YAAQ,EAAG;UAAA,IACjGzC;QACN,CAAC,CAAC;MACJ,CAAC;IACH;IAEA,IAAIH,GAAG,CAAC0B,aAAa,KAAK,QAAQ,EAAE;MAClCtB,QAAQ,CAAC7D,WAAW,GAAG,MAAMuC,mBAAmB,CAACkB,GAAG,CAAC;MACrDI,QAAQ,CAAC9D,OAAO,GAAG,MAAM;QACvB/B,qBAAqB,CAACyF,GAAG,CAAC,CAACd,KAAK,CAACR,iBAAiB,CAAC;MACrD,CAAC;IACH;IAEA,IAAIsB,GAAG,CAAC0B,aAAa,KAAK,SAAS,EAAE;MACnCtB,QAAQ,CAAC7D,WAAW,GAAG4D,SAAS;MAChCC,QAAQ,CAAC9D,OAAO,GAAG6D,SAAS;IAC9B;IAEA,OAAOC,QAAQ;EACjB,CAAC;AACH,CAAC;AAED,MAAM/C,MAAM,GAAG7E,gBAAgB,CAAC;EAC9B8E,YAAY,EAAE;IACZwF,QAAQ,EAAE,UAAU;IACpBC,MAAM,EAAE,GAAG;IACXC,GAAG,EAAE,CAAC;IACNrH,IAAI,EAAE,CAAC;IACPC,KAAK,EAAE;EACT,CAAC;EACDkC,iBAAiB,EAAE;IACjBmF,aAAa,EAAE;EACjB,CAAC;EACDlF,YAAY,EAAE;IACZ+E,QAAQ,EAAE,UAAU;IACpBC,MAAM,EAAE,GAAG;IACXG,MAAM,EAAE,EAAE;IACVC,SAAS,EAAE;EACb,CAAC;EACDjF,YAAY,EAAE;IACZ4E,QAAQ,EAAE,UAAU;IACpBC,MAAM,EAAE,GAAG;IACXG,MAAM,EAAE,EAAE;IACVtH,KAAK,EAAE;EACT;AACF,CAAC,CAAC;;AAEF;AACA,4BAAexD,KAAK,CAACgL,UAAU,CAACtJ,kBAAkB,CAAC"}
|
|
1
|
+
{"version":3,"names":["React","View","useSafeAreaInsets","ChannelFrozenBanner","createStyleSheet","useAlert","useBottomSheet","useToast","useUIKitTheme","Logger","getAvailableUriFromFileMessage","getFileExtension","getFileType","isMyMessage","isVoiceMessage","messageKeyExtractor","shouldRenderReaction","toMegabyte","useFreshCallback","useLocalization","usePlatformService","useSendbirdChat","useUserProfile","SBUUtils","ChatFlatList","ReactionAddons","ChannelMessageList","_ref","ref","searchItem","hasNext","channel","onEditMessage","onReplyMessage","onDeleteMessage","onResendFailedMessage","onPressMediaMessage","onPressParentMessage","currentUserId","renderNewMessagesButton","renderScrollToBottomButton","renderMessage","messages","newMessages","enableMessageGrouping","onScrolledAwayFromBottom","scrolledAwayFromBottom","onBottomReached","onTopReached","flatListProps","onPressNewMessagesButton","onPressScrollToBottomButton","STRINGS","colors","show","left","right","createMessagePressActions","useCreateMessagePressActions","safeAreaLayout","paddingLeft","paddingRight","renderItem","_ref2","item","index","onPress","onLongPress","bottomSheetItem","message","prevMessage","nextMessage","onShowUserProfile","focused","startingPoint","createdAt","isFirstItem","createElement","style","flex","backgroundColor","background","isFrozen","styles","frozenBanner","text","LABELS","CHANNEL_MESSAGE_LIST_FROZEN","_extends","data","keyExtractor","contentContainerStyle","frozenListPadding","newMsgButton","visible","length","scrollButton","_ref3","toast","openSheet","alert","clipboardService","fileService","sbOptions","onResendFailure","error","TOAST","RESEND_MSG_ERROR","onDeleteFailure","DELETE_MSG_ERROR","onCopyText","isUserMessage","setString","COPY_OK","onDownloadFile","isFileMessage","size","DOWNLOAD_START","save","fileUrl","url","fileName","name","fileType","type","then","response","DOWNLOAD_OK","log","catch","err","DOWNLOAD_ERROR","onOpenFile","includes","openURL","openSheetForFailedMessage","sheetItems","title","CHANNEL_MESSAGE_FAILED_RETRY","CHANNEL_MESSAGE_FAILED_REMOVE","titleColor","ui","dialog","default","none","destructive","alertForMessageDelete","CHANNEL_MESSAGE_DELETE_CONFIRM_TITLE","buttons","CHANNEL_MESSAGE_DELETE_CONFIRM_CANCEL","CHANNEL_MESSAGE_DELETE_CONFIRM_OK","_ref4","menu","copy","icon","CHANNEL_MESSAGE_COPY","edit","CHANNEL_MESSAGE_EDIT","delete","disabled","threadInfo","replyCount","undefined","CHANNEL_MESSAGE_DELETE","reply","Boolean","parentMessageId","CHANNEL_MESSAGE_REPLY","download","CHANNEL_MESSAGE_SAVE","push","isEphemeral","sendingStatus","isGroupChannel","uikit","groupChannel","replyType","HeaderComponent","uikitWithAppInfo","enableReactions","_ref5","onClose","BottomSheet","position","zIndex","top","paddingBottom","bottom","alignSelf","forwardRef"],"sources":["index.tsx"],"sourcesContent":["import React, { Ref } from 'react';\nimport { FlatList, FlatListProps, ListRenderItem, View } from 'react-native';\nimport { useSafeAreaInsets } from 'react-native-safe-area-context';\n\nimport {\n BottomSheetItem,\n ChannelFrozenBanner,\n createStyleSheet,\n useAlert,\n useBottomSheet,\n useToast,\n useUIKitTheme,\n} from '@sendbird/uikit-react-native-foundation';\nimport {\n Logger,\n SendbirdFileMessage,\n SendbirdGroupChannel,\n SendbirdMessage,\n SendbirdOpenChannel,\n SendbirdUserMessage,\n getAvailableUriFromFileMessage,\n getFileExtension,\n getFileType,\n isMyMessage,\n isVoiceMessage,\n messageKeyExtractor,\n shouldRenderReaction,\n toMegabyte,\n useFreshCallback,\n} from '@sendbird/uikit-utils';\n\nimport type { UserProfileContextType } from '../../contexts/UserProfileCtx';\nimport { useLocalization, usePlatformService, useSendbirdChat, useUserProfile } from '../../hooks/useContext';\nimport SBUUtils from '../../libs/SBUUtils';\nimport type { CommonComponent } from '../../types';\nimport ChatFlatList from '../ChatFlatList';\nimport { ReactionAddons } from '../ReactionAddons';\n\ntype PressActions = { onPress?: () => void; onLongPress?: () => void; bottomSheetItem?: BottomSheetItem };\ntype HandleableMessage = SendbirdUserMessage | SendbirdFileMessage;\ntype CreateMessagePressActions = (params: { message: SendbirdMessage }) => PressActions;\nexport type ChannelMessageListProps<T extends SendbirdGroupChannel | SendbirdOpenChannel> = {\n enableMessageGrouping: boolean;\n currentUserId?: string;\n channel: T;\n messages: SendbirdMessage[];\n newMessages: SendbirdMessage[];\n searchItem?: { startingPoint: number };\n\n scrolledAwayFromBottom: boolean;\n onScrolledAwayFromBottom: (value: boolean) => void;\n onTopReached: () => void;\n onBottomReached: () => void;\n hasNext: () => boolean;\n\n onPressNewMessagesButton: (animated?: boolean) => void;\n onPressScrollToBottomButton: (animated?: boolean) => void;\n\n onEditMessage: (message: HandleableMessage) => void;\n onReplyMessage?: (message: HandleableMessage) => void; // only available on group channel\n onDeleteMessage: (message: HandleableMessage) => Promise<void>;\n onResendFailedMessage: (failedMessage: HandleableMessage) => Promise<void>;\n onPressParentMessage?: (parentMessage: SendbirdMessage) => void;\n onPressMediaMessage?: (message: SendbirdFileMessage, deleteMessage: () => Promise<void>, uri: string) => void;\n\n renderMessage: (props: {\n focused: boolean;\n message: SendbirdMessage;\n prevMessage?: SendbirdMessage;\n nextMessage?: SendbirdMessage;\n onPress?: () => void;\n onLongPress?: () => void;\n onPressParentMessage?: ChannelMessageListProps<T>['onPressParentMessage'];\n onShowUserProfile?: UserProfileContextType['show'];\n channel: T;\n currentUserId?: ChannelMessageListProps<T>['currentUserId'];\n enableMessageGrouping: ChannelMessageListProps<T>['enableMessageGrouping'];\n bottomSheetItem?: BottomSheetItem;\n isFirstItem: boolean;\n }) => React.ReactElement | null;\n renderNewMessagesButton: null | CommonComponent<{\n visible: boolean;\n onPress: () => void;\n newMessages: SendbirdMessage[];\n }>;\n renderScrollToBottomButton: null | CommonComponent<{\n visible: boolean;\n onPress: () => void;\n }>;\n flatListProps?: Omit<FlatListProps<SendbirdMessage>, 'data' | 'renderItem'>;\n} & {\n ref?: Ref<FlatList<SendbirdMessage>> | undefined;\n};\n\nconst ChannelMessageList = <T extends SendbirdGroupChannel | SendbirdOpenChannel>(\n {\n searchItem,\n hasNext,\n channel,\n onEditMessage,\n onReplyMessage,\n onDeleteMessage,\n onResendFailedMessage,\n onPressMediaMessage,\n onPressParentMessage,\n currentUserId,\n renderNewMessagesButton,\n renderScrollToBottomButton,\n renderMessage,\n messages,\n newMessages,\n enableMessageGrouping,\n onScrolledAwayFromBottom,\n scrolledAwayFromBottom,\n onBottomReached,\n onTopReached,\n flatListProps,\n onPressNewMessagesButton,\n onPressScrollToBottomButton,\n }: ChannelMessageListProps<T>,\n ref: React.ForwardedRef<FlatList<SendbirdMessage>>,\n) => {\n const { STRINGS } = useLocalization();\n const { colors } = useUIKitTheme();\n const { show } = useUserProfile();\n const { left, right } = useSafeAreaInsets();\n const createMessagePressActions = useCreateMessagePressActions({\n channel,\n currentUserId,\n onEditMessage,\n onReplyMessage,\n onDeleteMessage,\n onResendFailedMessage,\n onPressMediaMessage,\n });\n\n const safeAreaLayout = { paddingLeft: left, paddingRight: right };\n\n const renderItem: ListRenderItem<SendbirdMessage> = useFreshCallback(({ item, index }) => {\n const { onPress, onLongPress, bottomSheetItem } = createMessagePressActions({ message: item });\n return renderMessage({\n message: item,\n prevMessage: messages[index + 1],\n nextMessage: messages[index - 1],\n onPress,\n onLongPress,\n onPressParentMessage,\n onShowUserProfile: show,\n enableMessageGrouping,\n channel,\n currentUserId,\n focused: (searchItem?.startingPoint ?? -1) === item.createdAt,\n bottomSheetItem,\n isFirstItem: index === 0,\n });\n });\n\n return (\n <View style={[{ flex: 1, backgroundColor: colors.background }, safeAreaLayout]}>\n {channel.isFrozen && (\n <ChannelFrozenBanner style={styles.frozenBanner} text={STRINGS.LABELS.CHANNEL_MESSAGE_LIST_FROZEN} />\n )}\n <ChatFlatList\n {...flatListProps}\n onTopReached={onTopReached}\n onBottomReached={onBottomReached}\n onScrolledAwayFromBottom={onScrolledAwayFromBottom}\n ref={ref}\n data={messages}\n renderItem={renderItem}\n keyExtractor={messageKeyExtractor}\n contentContainerStyle={[\n // { minHeight: '100%', justifyContent: 'flex-end' },\n channel.isFrozen && styles.frozenListPadding,\n flatListProps?.contentContainerStyle,\n ]}\n />\n {renderNewMessagesButton && (\n <View style={[styles.newMsgButton, safeAreaLayout]}>\n {renderNewMessagesButton({\n visible: newMessages.length > 0 && (hasNext() || scrolledAwayFromBottom),\n onPress: () => onPressNewMessagesButton(),\n newMessages,\n })}\n </View>\n )}\n {renderScrollToBottomButton && (\n <View style={[styles.scrollButton, safeAreaLayout]}>\n {renderScrollToBottomButton({\n visible: hasNext() || scrolledAwayFromBottom,\n onPress: () => onPressScrollToBottomButton(),\n })}\n </View>\n )}\n </View>\n );\n};\n\nconst useCreateMessagePressActions = <T extends SendbirdGroupChannel | SendbirdOpenChannel>({\n channel,\n currentUserId,\n onResendFailedMessage,\n onEditMessage,\n onReplyMessage,\n onDeleteMessage,\n onPressMediaMessage,\n}: Pick<\n ChannelMessageListProps<T>,\n | 'channel'\n | 'currentUserId'\n | 'onEditMessage'\n | 'onReplyMessage'\n | 'onDeleteMessage'\n | 'onResendFailedMessage'\n | 'onPressMediaMessage'\n>): CreateMessagePressActions => {\n const { colors } = useUIKitTheme();\n const { STRINGS } = useLocalization();\n const toast = useToast();\n const { openSheet } = useBottomSheet();\n const { alert } = useAlert();\n const { clipboardService, fileService } = usePlatformService();\n const { sbOptions } = useSendbirdChat();\n\n const onResendFailure = (error: Error) => {\n toast.show(STRINGS.TOAST.RESEND_MSG_ERROR, 'error');\n Logger.error(STRINGS.TOAST.RESEND_MSG_ERROR, error);\n };\n\n const onDeleteFailure = (error: Error) => {\n toast.show(STRINGS.TOAST.DELETE_MSG_ERROR, 'error');\n Logger.error(STRINGS.TOAST.DELETE_MSG_ERROR, error);\n };\n\n const onCopyText = (message: HandleableMessage) => {\n if (message.isUserMessage()) {\n clipboardService.setString(message.message || '');\n toast.show(STRINGS.TOAST.COPY_OK, 'success');\n }\n };\n\n const onDownloadFile = (message: HandleableMessage) => {\n if (message.isFileMessage()) {\n if (toMegabyte(message.size) > 4) {\n toast.show(STRINGS.TOAST.DOWNLOAD_START, 'success');\n }\n\n fileService\n .save({ fileUrl: message.url, fileName: message.name, fileType: message.type })\n .then((response) => {\n toast.show(STRINGS.TOAST.DOWNLOAD_OK, 'success');\n Logger.log('File saved to', response);\n })\n .catch((err) => {\n toast.show(STRINGS.TOAST.DOWNLOAD_ERROR, 'error');\n Logger.log('File save failure', err);\n });\n }\n };\n\n const onOpenFile = (message: HandleableMessage) => {\n if (message.isFileMessage()) {\n const fileType = getFileType(message.type || getFileExtension(message.name));\n if (['image', 'video', 'audio'].includes(fileType)) {\n onPressMediaMessage?.(message, () => onDeleteMessage(message), getAvailableUriFromFileMessage(message));\n } else {\n SBUUtils.openURL(message.url);\n }\n }\n };\n\n const openSheetForFailedMessage = (message: HandleableMessage) => {\n openSheet({\n sheetItems: [\n {\n title: STRINGS.LABELS.CHANNEL_MESSAGE_FAILED_RETRY,\n onPress: () => onResendFailedMessage(message).catch(onResendFailure),\n },\n {\n title: STRINGS.LABELS.CHANNEL_MESSAGE_FAILED_REMOVE,\n titleColor: colors.ui.dialog.default.none.destructive,\n onPress: () => alertForMessageDelete(message),\n },\n ],\n });\n };\n\n const alertForMessageDelete = (message: HandleableMessage) => {\n alert({\n title: STRINGS.LABELS.CHANNEL_MESSAGE_DELETE_CONFIRM_TITLE,\n buttons: [\n { text: STRINGS.LABELS.CHANNEL_MESSAGE_DELETE_CONFIRM_CANCEL },\n {\n text: STRINGS.LABELS.CHANNEL_MESSAGE_DELETE_CONFIRM_OK,\n style: 'destructive',\n onPress: () => {\n onDeleteMessage(message).catch(onDeleteFailure);\n },\n },\n ],\n });\n };\n\n return ({ message }) => {\n if (!message.isUserMessage() && !message.isFileMessage()) return {};\n\n const sheetItems: BottomSheetItem['sheetItems'] = [];\n const menu = {\n copy: (message: HandleableMessage) => ({\n icon: 'copy' as const,\n title: STRINGS.LABELS.CHANNEL_MESSAGE_COPY,\n onPress: () => onCopyText(message),\n }),\n edit: (message: HandleableMessage) => ({\n icon: 'edit' as const,\n title: STRINGS.LABELS.CHANNEL_MESSAGE_EDIT,\n onPress: () => onEditMessage(message),\n }),\n delete: (message: HandleableMessage) => ({\n disabled: message.threadInfo ? message.threadInfo.replyCount > 0 : undefined,\n icon: 'delete' as const,\n title: STRINGS.LABELS.CHANNEL_MESSAGE_DELETE,\n onPress: () => alertForMessageDelete(message),\n }),\n reply: (message: HandleableMessage) => ({\n disabled: Boolean(message.parentMessageId),\n icon: 'reply' as const,\n title: STRINGS.LABELS.CHANNEL_MESSAGE_REPLY,\n onPress: () => onReplyMessage?.(message),\n }),\n download: (message: HandleableMessage) => ({\n icon: 'download' as const,\n title: STRINGS.LABELS.CHANNEL_MESSAGE_SAVE,\n onPress: () => onDownloadFile(message),\n }),\n };\n\n if (message.isUserMessage()) {\n sheetItems.push(menu.copy(message));\n if (!channel.isEphemeral) {\n if (isMyMessage(message, currentUserId) && message.sendingStatus === 'succeeded') {\n sheetItems.push(menu.edit(message));\n sheetItems.push(menu.delete(message));\n }\n if (channel.isGroupChannel() && sbOptions.uikit.groupChannel.channel.replyType === 'quote_reply') {\n sheetItems.push(menu.reply(message));\n }\n }\n }\n\n if (message.isFileMessage()) {\n if (!isVoiceMessage(message)) {\n sheetItems.push(menu.download(message));\n }\n if (!channel.isEphemeral) {\n if (isMyMessage(message, currentUserId) && message.sendingStatus === 'succeeded') {\n sheetItems.push(menu.delete(message));\n }\n if (channel.isGroupChannel() && sbOptions.uikit.groupChannel.channel.replyType === 'quote_reply') {\n sheetItems.push(menu.reply(message));\n }\n }\n }\n\n const bottomSheetItem: BottomSheetItem = {\n sheetItems,\n HeaderComponent: shouldRenderReaction(channel, sbOptions.uikitWithAppInfo.groupChannel.channel.enableReactions)\n ? ({ onClose }) => <ReactionAddons.BottomSheet message={message} channel={channel} onClose={onClose} />\n : undefined,\n };\n\n switch (true) {\n case message.sendingStatus === 'pending': {\n return {\n onPress: undefined,\n onLongPress: undefined,\n bottomSheetItem: undefined,\n };\n }\n\n case message.sendingStatus === 'failed': {\n return {\n onPress: () => onResendFailedMessage(message).catch(onResendFailure),\n onLongPress: () => openSheetForFailedMessage(message),\n bottomSheetItem,\n };\n }\n\n case message.isFileMessage(): {\n return {\n onPress: () => onOpenFile(message),\n onLongPress: () => openSheet(bottomSheetItem),\n bottomSheetItem,\n };\n }\n\n default: {\n return {\n onPress: undefined,\n onLongPress: () => openSheet(bottomSheetItem),\n bottomSheetItem,\n };\n }\n }\n };\n};\n\nconst styles = createStyleSheet({\n frozenBanner: {\n position: 'absolute',\n zIndex: 999,\n top: 8,\n left: 8,\n right: 8,\n },\n frozenListPadding: {\n paddingBottom: 32,\n },\n newMsgButton: {\n position: 'absolute',\n zIndex: 999,\n bottom: 10,\n alignSelf: 'center',\n },\n scrollButton: {\n position: 'absolute',\n zIndex: 998,\n bottom: 10,\n right: 16,\n },\n});\n\n// NOTE: Due to Generic inference is not working on forwardRef, we need to cast it as typeof ChannelMessageList and implicit `ref` prop\nexport default React.forwardRef(ChannelMessageList) as typeof ChannelMessageList;\n"],"mappings":"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"}
|