@sendbird/uikit-react-native 2.4.2 → 2.5.0-rc.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/ChannelMessageList/index.js +319 -0
- package/lib/commonjs/components/ChannelMessageList/index.js.map +1 -0
- package/lib/commonjs/components/ChatFlatList.js +30 -50
- package/lib/commonjs/components/ChatFlatList.js.map +1 -1
- package/lib/commonjs/components/MessageSearchResultItem.js +132 -0
- package/lib/commonjs/components/MessageSearchResultItem.js.map +1 -0
- package/lib/commonjs/components/ScrollToBottomButton.js +1 -1
- package/lib/commonjs/components/ScrollToBottomButton.js.map +1 -1
- package/lib/commonjs/constants.js +6 -2
- package/lib/commonjs/constants.js.map +1 -1
- package/lib/commonjs/containers/GroupChannelPreviewContainer.js +2 -2
- package/lib/commonjs/containers/GroupChannelPreviewContainer.js.map +1 -1
- package/lib/commonjs/containers/SendbirdUIKitContainer.js +4 -2
- package/lib/commonjs/containers/SendbirdUIKitContainer.js.map +1 -1
- package/lib/commonjs/contexts/SendbirdChatCtx.js +4 -2
- package/lib/commonjs/contexts/SendbirdChatCtx.js.map +1 -1
- package/lib/commonjs/domain/groupChannel/component/GroupChannelHeader.js +4 -2
- package/lib/commonjs/domain/groupChannel/component/GroupChannelHeader.js.map +1 -1
- package/lib/commonjs/domain/groupChannel/component/GroupChannelMessageList.js +84 -301
- package/lib/commonjs/domain/groupChannel/component/GroupChannelMessageList.js.map +1 -1
- package/lib/commonjs/domain/groupChannel/component/GroupChannelSuggestedMentionList.js +2 -0
- package/lib/commonjs/domain/groupChannel/component/GroupChannelSuggestedMentionList.js.map +1 -1
- package/lib/commonjs/domain/groupChannel/module/moduleContext.js +9 -2
- package/lib/commonjs/domain/groupChannel/module/moduleContext.js.map +1 -1
- package/lib/commonjs/domain/groupChannel/types.js.map +1 -1
- package/lib/commonjs/domain/groupChannelSettings/component/GroupChannelSettingsMenu.js +18 -4
- package/lib/commonjs/domain/groupChannelSettings/component/GroupChannelSettingsMenu.js.map +1 -1
- package/lib/commonjs/domain/groupChannelSettings/types.js.map +1 -1
- package/lib/commonjs/domain/messageSearch/component/MessageSearchHeader.js +105 -0
- package/lib/commonjs/domain/messageSearch/component/MessageSearchHeader.js.map +1 -0
- package/lib/commonjs/domain/messageSearch/component/MessageSearchList.js +40 -0
- package/lib/commonjs/domain/messageSearch/component/MessageSearchList.js.map +1 -0
- package/lib/commonjs/domain/messageSearch/component/MessageSearchStatusEmpty.js +22 -0
- package/lib/commonjs/domain/messageSearch/component/MessageSearchStatusEmpty.js.map +1 -0
- package/lib/commonjs/domain/messageSearch/component/MessageSearchStatusError.js +26 -0
- package/lib/commonjs/domain/messageSearch/component/MessageSearchStatusError.js.map +1 -0
- package/lib/commonjs/domain/messageSearch/component/MessageSearchStatusLoading.js +22 -0
- package/lib/commonjs/domain/messageSearch/component/MessageSearchStatusLoading.js.map +1 -0
- package/lib/commonjs/domain/messageSearch/index.js +62 -0
- package/lib/commonjs/domain/messageSearch/index.js.map +1 -0
- package/lib/commonjs/domain/messageSearch/module/createMessageSearchModule.js +36 -0
- package/lib/commonjs/domain/messageSearch/module/createMessageSearchModule.js.map +1 -0
- package/lib/commonjs/domain/messageSearch/module/moduleContext.js +25 -0
- package/lib/commonjs/domain/messageSearch/module/moduleContext.js.map +1 -0
- package/lib/commonjs/domain/messageSearch/types.js +6 -0
- package/lib/commonjs/domain/messageSearch/types.js.map +1 -0
- package/lib/commonjs/domain/openChannel/component/OpenChannelMessageList.js +38 -279
- package/lib/commonjs/domain/openChannel/component/OpenChannelMessageList.js.map +1 -1
- package/lib/commonjs/domain/openChannel/module/moduleContext.js +9 -2
- package/lib/commonjs/domain/openChannel/module/moduleContext.js.map +1 -1
- package/lib/commonjs/domain/openChannel/types.js.map +1 -1
- package/lib/commonjs/fragments/createGroupChannelFragment.js +107 -15
- package/lib/commonjs/fragments/createGroupChannelFragment.js.map +1 -1
- package/lib/commonjs/fragments/createGroupChannelSettingsFragment.js +2 -0
- package/lib/commonjs/fragments/createGroupChannelSettingsFragment.js.map +1 -1
- package/lib/commonjs/fragments/createMessageSearchFragment.js +145 -0
- package/lib/commonjs/fragments/createMessageSearchFragment.js.map +1 -0
- package/lib/commonjs/fragments/createOpenChannelFragment.js +40 -8
- package/lib/commonjs/fragments/createOpenChannelFragment.js.map +1 -1
- package/lib/commonjs/hooks/useMentionSuggestion.js +17 -0
- package/lib/commonjs/hooks/useMentionSuggestion.js.map +1 -1
- package/lib/commonjs/index.js +60 -40
- package/lib/commonjs/index.js.map +1 -1
- package/lib/commonjs/localization/StringSet.type.js.map +1 -1
- package/lib/commonjs/localization/createBaseStringSet.js +33 -20
- package/lib/commonjs/localization/createBaseStringSet.js.map +1 -1
- package/lib/commonjs/utils/pubsub.js +21 -0
- package/lib/commonjs/utils/pubsub.js.map +1 -0
- package/lib/commonjs/version.js +1 -1
- package/lib/commonjs/version.js.map +1 -1
- package/lib/module/components/ChannelMessageList/index.js +311 -0
- package/lib/module/components/ChannelMessageList/index.js.map +1 -0
- package/lib/module/components/ChatFlatList.js +32 -52
- package/lib/module/components/ChatFlatList.js.map +1 -1
- package/lib/module/components/MessageSearchResultItem.js +124 -0
- package/lib/module/components/MessageSearchResultItem.js.map +1 -0
- package/lib/module/components/ScrollToBottomButton.js +1 -1
- package/lib/module/components/ScrollToBottomButton.js.map +1 -1
- package/lib/module/constants.js +3 -1
- package/lib/module/constants.js.map +1 -1
- package/lib/module/containers/GroupChannelPreviewContainer.js +2 -2
- package/lib/module/containers/GroupChannelPreviewContainer.js.map +1 -1
- package/lib/module/containers/SendbirdUIKitContainer.js +4 -2
- package/lib/module/containers/SendbirdUIKitContainer.js.map +1 -1
- package/lib/module/contexts/SendbirdChatCtx.js +4 -2
- package/lib/module/contexts/SendbirdChatCtx.js.map +1 -1
- package/lib/module/domain/groupChannel/component/GroupChannelHeader.js +4 -2
- package/lib/module/domain/groupChannel/component/GroupChannelHeader.js.map +1 -1
- package/lib/module/domain/groupChannel/component/GroupChannelMessageList.js +88 -305
- package/lib/module/domain/groupChannel/component/GroupChannelMessageList.js.map +1 -1
- package/lib/module/domain/groupChannel/component/GroupChannelSuggestedMentionList.js +2 -0
- package/lib/module/domain/groupChannel/component/GroupChannelSuggestedMentionList.js.map +1 -1
- package/lib/module/domain/groupChannel/module/moduleContext.js +9 -2
- package/lib/module/domain/groupChannel/module/moduleContext.js.map +1 -1
- package/lib/module/domain/groupChannel/types.js.map +1 -1
- package/lib/module/domain/groupChannelSettings/component/GroupChannelSettingsMenu.js +18 -4
- package/lib/module/domain/groupChannelSettings/component/GroupChannelSettingsMenu.js.map +1 -1
- package/lib/module/domain/groupChannelSettings/types.js.map +1 -1
- package/lib/module/domain/messageSearch/component/MessageSearchHeader.js +96 -0
- package/lib/module/domain/messageSearch/component/MessageSearchHeader.js.map +1 -0
- package/lib/module/domain/messageSearch/component/MessageSearchList.js +32 -0
- package/lib/module/domain/messageSearch/component/MessageSearchList.js.map +1 -0
- package/lib/module/domain/messageSearch/component/MessageSearchStatusEmpty.js +14 -0
- package/lib/module/domain/messageSearch/component/MessageSearchStatusEmpty.js.map +1 -0
- package/lib/module/domain/messageSearch/component/MessageSearchStatusError.js +18 -0
- package/lib/module/domain/messageSearch/component/MessageSearchStatusError.js.map +1 -0
- package/lib/module/domain/messageSearch/component/MessageSearchStatusLoading.js +14 -0
- package/lib/module/domain/messageSearch/component/MessageSearchStatusLoading.js.map +1 -0
- package/lib/module/domain/messageSearch/index.js +8 -0
- package/lib/module/domain/messageSearch/index.js.map +1 -0
- package/lib/module/domain/messageSearch/module/createMessageSearchModule.js +28 -0
- package/lib/module/domain/messageSearch/module/createMessageSearchModule.js.map +1 -0
- package/lib/module/domain/messageSearch/module/moduleContext.js +14 -0
- package/lib/module/domain/messageSearch/module/moduleContext.js.map +1 -0
- package/lib/module/domain/messageSearch/types.js +2 -0
- package/lib/module/domain/messageSearch/types.js.map +1 -0
- package/lib/module/domain/openChannel/component/OpenChannelMessageList.js +40 -281
- package/lib/module/domain/openChannel/component/OpenChannelMessageList.js.map +1 -1
- package/lib/module/domain/openChannel/module/moduleContext.js +9 -2
- package/lib/module/domain/openChannel/module/moduleContext.js.map +1 -1
- package/lib/module/domain/openChannel/types.js.map +1 -1
- package/lib/module/fragments/createGroupChannelFragment.js +109 -17
- package/lib/module/fragments/createGroupChannelFragment.js.map +1 -1
- package/lib/module/fragments/createGroupChannelSettingsFragment.js +2 -0
- package/lib/module/fragments/createGroupChannelSettingsFragment.js.map +1 -1
- package/lib/module/fragments/createMessageSearchFragment.js +135 -0
- package/lib/module/fragments/createMessageSearchFragment.js.map +1 -0
- package/lib/module/fragments/createOpenChannelFragment.js +41 -9
- package/lib/module/fragments/createOpenChannelFragment.js.map +1 -1
- package/lib/module/hooks/useMentionSuggestion.js +18 -1
- package/lib/module/hooks/useMentionSuggestion.js.map +1 -1
- package/lib/module/index.js +2 -0
- package/lib/module/index.js.map +1 -1
- package/lib/module/localization/StringSet.type.js.map +1 -1
- package/lib/module/localization/createBaseStringSet.js +34 -21
- package/lib/module/localization/createBaseStringSet.js.map +1 -1
- package/lib/module/utils/pubsub.js +14 -0
- package/lib/module/utils/pubsub.js.map +1 -0
- package/lib/module/version.js +1 -1
- package/lib/module/version.js.map +1 -1
- package/lib/typescript/src/components/ChannelMessageList/index.d.ts +55 -0
- package/lib/typescript/src/components/ChatFlatList.d.ts +7 -8
- package/lib/typescript/src/components/MessageRenderer/index.d.ts +4 -0
- package/lib/typescript/src/components/MessageSearchResultItem.d.ts +2 -0
- package/lib/typescript/src/components/OpenChannelMessageRenderer/index.d.ts +1 -0
- package/lib/typescript/src/components/ScrollToBottomButton.d.ts +1 -1
- package/lib/typescript/src/constants.d.ts +3 -1
- package/lib/typescript/src/containers/SendbirdUIKitContainer.d.ts +2 -1
- package/lib/typescript/src/contexts/SendbirdChatCtx.d.ts +3 -1
- package/lib/typescript/src/domain/groupChannel/component/GroupChannelHeader.d.ts +1 -1
- package/lib/typescript/src/domain/groupChannel/component/GroupChannelMessageList.d.ts +3 -32
- package/lib/typescript/src/domain/groupChannel/types.d.ts +23 -35
- package/lib/typescript/src/domain/groupChannelSettings/component/GroupChannelSettingsMenu.d.ts +1 -1
- package/lib/typescript/src/domain/groupChannelSettings/types.d.ts +2 -0
- package/lib/typescript/src/domain/messageSearch/component/MessageSearchHeader.d.ts +3 -0
- package/lib/typescript/src/domain/messageSearch/component/MessageSearchList.d.ts +3 -0
- package/lib/typescript/src/domain/messageSearch/component/MessageSearchStatusEmpty.d.ts +2 -0
- package/lib/typescript/src/domain/messageSearch/component/MessageSearchStatusError.d.ts +3 -0
- package/lib/typescript/src/domain/messageSearch/component/MessageSearchStatusLoading.d.ts +2 -0
- package/lib/typescript/src/domain/messageSearch/index.d.ts +7 -0
- package/lib/typescript/src/domain/messageSearch/module/createMessageSearchModule.d.ts +3 -0
- package/lib/typescript/src/domain/messageSearch/module/moduleContext.d.ts +3 -0
- package/lib/typescript/src/domain/messageSearch/types.d.ts +53 -0
- package/lib/typescript/src/domain/openChannel/component/OpenChannelMessageList.d.ts +1 -37
- package/lib/typescript/src/domain/openChannel/types.d.ts +17 -36
- package/lib/typescript/src/fragments/createMessageSearchFragment.d.ts +3 -0
- package/lib/typescript/src/hooks/useMentionSuggestion.d.ts +3 -2
- package/lib/typescript/src/index.d.ts +2 -0
- package/lib/typescript/src/localization/StringSet.type.d.ts +17 -3
- package/lib/typescript/src/utils/pubsub.d.ts +6 -0
- package/lib/typescript/src/version.d.ts +1 -1
- package/package.json +8 -7
- package/src/components/ChannelMessageList/index.tsx +392 -0
- package/src/components/ChatFlatList.tsx +33 -51
- package/src/components/MessageSearchResultItem.tsx +125 -0
- package/src/components/ScrollToBottomButton.tsx +3 -4
- package/src/constants.ts +3 -1
- package/src/containers/GroupChannelPreviewContainer.tsx +2 -2
- package/src/containers/SendbirdUIKitContainer.tsx +2 -0
- package/src/contexts/SendbirdChatCtx.tsx +7 -1
- package/src/domain/groupChannel/component/GroupChannelHeader.tsx +9 -3
- package/src/domain/groupChannel/component/GroupChannelMessageList.tsx +73 -316
- package/src/domain/groupChannel/component/GroupChannelSuggestedMentionList.tsx +2 -1
- package/src/domain/groupChannel/module/moduleContext.tsx +10 -2
- package/src/domain/groupChannel/types.ts +49 -38
- package/src/domain/groupChannelSettings/component/GroupChannelSettingsMenu.tsx +29 -13
- package/src/domain/groupChannelSettings/types.ts +2 -0
- package/src/domain/messageSearch/component/MessageSearchHeader.tsx +98 -0
- package/src/domain/messageSearch/component/MessageSearchList.tsx +26 -0
- package/src/domain/messageSearch/component/MessageSearchStatusEmpty.tsx +15 -0
- package/src/domain/messageSearch/component/MessageSearchStatusError.tsx +16 -0
- package/src/domain/messageSearch/component/MessageSearchStatusLoading.tsx +15 -0
- package/src/domain/messageSearch/index.ts +7 -0
- package/src/domain/messageSearch/module/createMessageSearchModule.tsx +21 -0
- package/src/domain/messageSearch/module/moduleContext.tsx +16 -0
- package/src/domain/messageSearch/types.ts +55 -0
- package/src/domain/openChannel/component/OpenChannelMessageList.tsx +35 -303
- package/src/domain/openChannel/module/moduleContext.tsx +8 -2
- package/src/domain/openChannel/types.ts +40 -38
- package/src/fragments/createGroupChannelFragment.tsx +114 -17
- package/src/fragments/createGroupChannelSettingsFragment.tsx +2 -0
- package/src/fragments/createMessageSearchFragment.tsx +159 -0
- package/src/fragments/createOpenChannelFragment.tsx +48 -12
- package/src/hooks/useMentionSuggestion.ts +23 -3
- package/src/index.ts +3 -0
- package/src/localization/StringSet.type.ts +20 -2
- package/src/localization/createBaseStringSet.ts +22 -2
- package/src/utils/pubsub.ts +20 -0
- package/src/version.ts +0 -2
|
@@ -0,0 +1,311 @@
|
|
|
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 from 'react';
|
|
3
|
+
import { View } from 'react-native';
|
|
4
|
+
import { useSafeAreaInsets } from 'react-native-safe-area-context';
|
|
5
|
+
import { ChannelFrozenBanner, createStyleSheet, useAlert, useBottomSheet, useToast, useUIKitTheme } from '@sendbird/uikit-react-native-foundation';
|
|
6
|
+
import { Logger, getAvailableUriFromFileMessage, getFileExtension, getFileType, isMyMessage, messageKeyExtractor, shouldRenderReaction, toMegabyte, useFreshCallback } from '@sendbird/uikit-utils';
|
|
7
|
+
import { DEPRECATION_WARNING } from '../../constants';
|
|
8
|
+
import { useLocalization, usePlatformService, useSendbirdChat } from '../../hooks/useContext';
|
|
9
|
+
import SBUUtils from '../../libs/SBUUtils';
|
|
10
|
+
import ChatFlatList from '../ChatFlatList';
|
|
11
|
+
import { ReactionAddons } from '../ReactionAddons';
|
|
12
|
+
const ChannelMessageList = (_ref, ref) => {
|
|
13
|
+
let {
|
|
14
|
+
searchItem,
|
|
15
|
+
hasNext,
|
|
16
|
+
channel,
|
|
17
|
+
onEditMessage,
|
|
18
|
+
onDeleteMessage,
|
|
19
|
+
onResendFailedMessage,
|
|
20
|
+
onPressMediaMessage,
|
|
21
|
+
currentUserId,
|
|
22
|
+
renderNewMessagesButton,
|
|
23
|
+
renderScrollToBottomButton,
|
|
24
|
+
renderMessage,
|
|
25
|
+
messages,
|
|
26
|
+
newMessages,
|
|
27
|
+
enableMessageGrouping,
|
|
28
|
+
onScrolledAwayFromBottom,
|
|
29
|
+
scrolledAwayFromBottom,
|
|
30
|
+
onBottomReached,
|
|
31
|
+
onTopReached,
|
|
32
|
+
flatListProps,
|
|
33
|
+
onPressNewMessagesButton,
|
|
34
|
+
onPressScrollToBottomButton,
|
|
35
|
+
onPressImageMessage
|
|
36
|
+
} = _ref;
|
|
37
|
+
const {
|
|
38
|
+
STRINGS
|
|
39
|
+
} = useLocalization();
|
|
40
|
+
const {
|
|
41
|
+
colors
|
|
42
|
+
} = useUIKitTheme();
|
|
43
|
+
const {
|
|
44
|
+
left,
|
|
45
|
+
right
|
|
46
|
+
} = useSafeAreaInsets();
|
|
47
|
+
const getMessagePressActions = useGetMessagePressActions({
|
|
48
|
+
channel,
|
|
49
|
+
currentUserId,
|
|
50
|
+
onEditMessage,
|
|
51
|
+
onDeleteMessage,
|
|
52
|
+
onResendFailedMessage,
|
|
53
|
+
onPressImageMessage,
|
|
54
|
+
onPressMediaMessage
|
|
55
|
+
});
|
|
56
|
+
const safeAreaLayout = {
|
|
57
|
+
paddingLeft: left,
|
|
58
|
+
paddingRight: right
|
|
59
|
+
};
|
|
60
|
+
const renderItem = useFreshCallback(_ref2 => {
|
|
61
|
+
let {
|
|
62
|
+
item,
|
|
63
|
+
index
|
|
64
|
+
} = _ref2;
|
|
65
|
+
const {
|
|
66
|
+
onPress,
|
|
67
|
+
onLongPress
|
|
68
|
+
} = getMessagePressActions(item);
|
|
69
|
+
return renderMessage({
|
|
70
|
+
message: item,
|
|
71
|
+
prevMessage: messages[index + 1],
|
|
72
|
+
nextMessage: messages[index - 1],
|
|
73
|
+
onPress,
|
|
74
|
+
onLongPress,
|
|
75
|
+
enableMessageGrouping,
|
|
76
|
+
channel,
|
|
77
|
+
currentUserId,
|
|
78
|
+
focused: ((searchItem === null || searchItem === void 0 ? void 0 : searchItem.startingPoint) ?? -1) === item.createdAt
|
|
79
|
+
});
|
|
80
|
+
});
|
|
81
|
+
return /*#__PURE__*/React.createElement(View, {
|
|
82
|
+
style: [{
|
|
83
|
+
flex: 1,
|
|
84
|
+
backgroundColor: colors.background
|
|
85
|
+
}, safeAreaLayout]
|
|
86
|
+
}, channel.isFrozen && /*#__PURE__*/React.createElement(ChannelFrozenBanner, {
|
|
87
|
+
style: styles.frozenBanner,
|
|
88
|
+
text: STRINGS.LABELS.CHANNEL_MESSAGE_LIST_FROZEN
|
|
89
|
+
}), /*#__PURE__*/React.createElement(ChatFlatList, _extends({}, flatListProps, {
|
|
90
|
+
onTopReached: onTopReached,
|
|
91
|
+
onBottomReached: onBottomReached,
|
|
92
|
+
onScrolledAwayFromBottom: onScrolledAwayFromBottom,
|
|
93
|
+
ref: ref,
|
|
94
|
+
data: messages,
|
|
95
|
+
renderItem: renderItem,
|
|
96
|
+
keyExtractor: messageKeyExtractor,
|
|
97
|
+
contentContainerStyle: [
|
|
98
|
+
// { minHeight: '100%', justifyContent: 'flex-end' },
|
|
99
|
+
channel.isFrozen && styles.frozenListPadding, flatListProps === null || flatListProps === void 0 ? void 0 : flatListProps.contentContainerStyle]
|
|
100
|
+
})), renderNewMessagesButton && /*#__PURE__*/React.createElement(View, {
|
|
101
|
+
style: [styles.newMsgButton, safeAreaLayout]
|
|
102
|
+
}, renderNewMessagesButton({
|
|
103
|
+
visible: newMessages.length > 0 && (hasNext() || scrolledAwayFromBottom),
|
|
104
|
+
onPress: () => onPressNewMessagesButton(),
|
|
105
|
+
newMessages
|
|
106
|
+
})), renderScrollToBottomButton && /*#__PURE__*/React.createElement(View, {
|
|
107
|
+
style: [styles.scrollButton, safeAreaLayout]
|
|
108
|
+
}, renderScrollToBottomButton({
|
|
109
|
+
visible: hasNext() || scrolledAwayFromBottom,
|
|
110
|
+
onPress: () => onPressScrollToBottomButton()
|
|
111
|
+
})));
|
|
112
|
+
};
|
|
113
|
+
const useGetMessagePressActions = _ref3 => {
|
|
114
|
+
let {
|
|
115
|
+
channel,
|
|
116
|
+
currentUserId,
|
|
117
|
+
onResendFailedMessage,
|
|
118
|
+
onEditMessage,
|
|
119
|
+
onDeleteMessage,
|
|
120
|
+
onPressImageMessage,
|
|
121
|
+
onPressMediaMessage
|
|
122
|
+
} = _ref3;
|
|
123
|
+
const {
|
|
124
|
+
colors
|
|
125
|
+
} = useUIKitTheme();
|
|
126
|
+
const {
|
|
127
|
+
STRINGS
|
|
128
|
+
} = useLocalization();
|
|
129
|
+
const toast = useToast();
|
|
130
|
+
const {
|
|
131
|
+
openSheet
|
|
132
|
+
} = useBottomSheet();
|
|
133
|
+
const {
|
|
134
|
+
alert
|
|
135
|
+
} = useAlert();
|
|
136
|
+
const {
|
|
137
|
+
clipboardService,
|
|
138
|
+
fileService
|
|
139
|
+
} = usePlatformService();
|
|
140
|
+
const {
|
|
141
|
+
features
|
|
142
|
+
} = useSendbirdChat();
|
|
143
|
+
const handleFailedMessage = message => {
|
|
144
|
+
openSheet({
|
|
145
|
+
sheetItems: [{
|
|
146
|
+
title: STRINGS.LABELS.CHANNEL_MESSAGE_FAILED_RETRY,
|
|
147
|
+
onPress: () => {
|
|
148
|
+
onResendFailedMessage(message).catch(() => toast.show(STRINGS.TOAST.RESEND_MSG_ERROR, 'error'));
|
|
149
|
+
}
|
|
150
|
+
}, {
|
|
151
|
+
title: STRINGS.LABELS.CHANNEL_MESSAGE_FAILED_REMOVE,
|
|
152
|
+
titleColor: colors.ui.dialog.default.none.destructive,
|
|
153
|
+
onPress: () => confirmDelete(message)
|
|
154
|
+
}]
|
|
155
|
+
});
|
|
156
|
+
};
|
|
157
|
+
const confirmDelete = message => {
|
|
158
|
+
alert({
|
|
159
|
+
title: STRINGS.LABELS.CHANNEL_MESSAGE_DELETE_CONFIRM_TITLE,
|
|
160
|
+
buttons: [{
|
|
161
|
+
text: STRINGS.LABELS.CHANNEL_MESSAGE_DELETE_CONFIRM_CANCEL
|
|
162
|
+
}, {
|
|
163
|
+
text: STRINGS.LABELS.CHANNEL_MESSAGE_DELETE_CONFIRM_OK,
|
|
164
|
+
style: 'destructive',
|
|
165
|
+
onPress: () => {
|
|
166
|
+
onDeleteMessage(message).catch(() => toast.show(STRINGS.TOAST.DELETE_MSG_ERROR, 'error'));
|
|
167
|
+
}
|
|
168
|
+
}]
|
|
169
|
+
});
|
|
170
|
+
};
|
|
171
|
+
return msg => {
|
|
172
|
+
if (!msg.isUserMessage() && !msg.isFileMessage()) {
|
|
173
|
+
return {
|
|
174
|
+
onPress: undefined,
|
|
175
|
+
onLongPress: undefined
|
|
176
|
+
};
|
|
177
|
+
}
|
|
178
|
+
const sheetItems = [];
|
|
179
|
+
const response = {
|
|
180
|
+
onPress: undefined,
|
|
181
|
+
onLongPress: undefined
|
|
182
|
+
};
|
|
183
|
+
if (msg.isUserMessage()) {
|
|
184
|
+
sheetItems.push({
|
|
185
|
+
icon: 'copy',
|
|
186
|
+
title: STRINGS.LABELS.CHANNEL_MESSAGE_COPY,
|
|
187
|
+
onPress: () => {
|
|
188
|
+
clipboardService.setString(msg.message || '');
|
|
189
|
+
toast.show(STRINGS.TOAST.COPY_OK, 'success');
|
|
190
|
+
}
|
|
191
|
+
});
|
|
192
|
+
if (isMyMessage(msg, currentUserId) && msg.sendingStatus === 'succeeded') {
|
|
193
|
+
sheetItems.push({
|
|
194
|
+
icon: 'edit',
|
|
195
|
+
title: STRINGS.LABELS.CHANNEL_MESSAGE_EDIT,
|
|
196
|
+
onPress: () => onEditMessage(msg)
|
|
197
|
+
}, {
|
|
198
|
+
icon: 'delete',
|
|
199
|
+
title: STRINGS.LABELS.CHANNEL_MESSAGE_DELETE,
|
|
200
|
+
onPress: () => confirmDelete(msg)
|
|
201
|
+
});
|
|
202
|
+
}
|
|
203
|
+
}
|
|
204
|
+
if (msg.isFileMessage()) {
|
|
205
|
+
sheetItems.push({
|
|
206
|
+
icon: 'download',
|
|
207
|
+
title: STRINGS.LABELS.CHANNEL_MESSAGE_SAVE,
|
|
208
|
+
onPress: async () => {
|
|
209
|
+
if (toMegabyte(msg.size) > 4) {
|
|
210
|
+
toast.show(STRINGS.TOAST.DOWNLOAD_START, 'success');
|
|
211
|
+
}
|
|
212
|
+
fileService.save({
|
|
213
|
+
fileUrl: msg.url,
|
|
214
|
+
fileName: msg.name,
|
|
215
|
+
fileType: msg.type
|
|
216
|
+
}).then(response => {
|
|
217
|
+
toast.show(STRINGS.TOAST.DOWNLOAD_OK, 'success');
|
|
218
|
+
Logger.log('File saved to', response);
|
|
219
|
+
}).catch(err => {
|
|
220
|
+
toast.show(STRINGS.TOAST.DOWNLOAD_ERROR, 'error');
|
|
221
|
+
Logger.log('File save failure', err);
|
|
222
|
+
});
|
|
223
|
+
}
|
|
224
|
+
});
|
|
225
|
+
if (isMyMessage(msg, currentUserId) && msg.sendingStatus === 'succeeded') {
|
|
226
|
+
sheetItems.push({
|
|
227
|
+
icon: 'delete',
|
|
228
|
+
title: STRINGS.LABELS.CHANNEL_MESSAGE_DELETE,
|
|
229
|
+
onPress: () => confirmDelete(msg)
|
|
230
|
+
});
|
|
231
|
+
}
|
|
232
|
+
const fileType = getFileType(msg.type || getFileExtension(msg.name));
|
|
233
|
+
switch (fileType) {
|
|
234
|
+
case 'image':
|
|
235
|
+
case 'video':
|
|
236
|
+
case 'audio':
|
|
237
|
+
{
|
|
238
|
+
response.onPress = () => {
|
|
239
|
+
if (onPressImageMessage && fileType === 'image') {
|
|
240
|
+
Logger.warn(DEPRECATION_WARNING.CHANNEL.ON_PRESS_IMAGE_MESSAGE);
|
|
241
|
+
onPressImageMessage(msg, getAvailableUriFromFileMessage(msg));
|
|
242
|
+
}
|
|
243
|
+
onPressMediaMessage === null || onPressMediaMessage === void 0 ? void 0 : onPressMediaMessage(msg, () => onDeleteMessage(msg), getAvailableUriFromFileMessage(msg));
|
|
244
|
+
};
|
|
245
|
+
break;
|
|
246
|
+
}
|
|
247
|
+
default:
|
|
248
|
+
{
|
|
249
|
+
response.onPress = () => SBUUtils.openURL(msg.url);
|
|
250
|
+
break;
|
|
251
|
+
}
|
|
252
|
+
}
|
|
253
|
+
}
|
|
254
|
+
if (sheetItems.length > 0) {
|
|
255
|
+
response.onLongPress = () => {
|
|
256
|
+
openSheet({
|
|
257
|
+
sheetItems,
|
|
258
|
+
HeaderComponent: shouldRenderReaction(channel, features.reactionEnabled) ? _ref4 => {
|
|
259
|
+
let {
|
|
260
|
+
onClose
|
|
261
|
+
} = _ref4;
|
|
262
|
+
return /*#__PURE__*/React.createElement(ReactionAddons.BottomSheet, {
|
|
263
|
+
message: msg,
|
|
264
|
+
channel: channel,
|
|
265
|
+
onClose: onClose
|
|
266
|
+
});
|
|
267
|
+
} : undefined
|
|
268
|
+
});
|
|
269
|
+
};
|
|
270
|
+
}
|
|
271
|
+
if (msg.sendingStatus === 'failed') {
|
|
272
|
+
response.onLongPress = () => handleFailedMessage(msg);
|
|
273
|
+
response.onPress = () => {
|
|
274
|
+
onResendFailedMessage(msg).catch(() => toast.show(STRINGS.TOAST.RESEND_MSG_ERROR, 'error'));
|
|
275
|
+
};
|
|
276
|
+
}
|
|
277
|
+
if (msg.sendingStatus === 'pending') {
|
|
278
|
+
response.onLongPress = undefined;
|
|
279
|
+
response.onPress = undefined;
|
|
280
|
+
}
|
|
281
|
+
return response;
|
|
282
|
+
};
|
|
283
|
+
};
|
|
284
|
+
const styles = createStyleSheet({
|
|
285
|
+
frozenBanner: {
|
|
286
|
+
position: 'absolute',
|
|
287
|
+
zIndex: 999,
|
|
288
|
+
top: 8,
|
|
289
|
+
left: 8,
|
|
290
|
+
right: 8
|
|
291
|
+
},
|
|
292
|
+
frozenListPadding: {
|
|
293
|
+
paddingBottom: 32
|
|
294
|
+
},
|
|
295
|
+
newMsgButton: {
|
|
296
|
+
position: 'absolute',
|
|
297
|
+
zIndex: 999,
|
|
298
|
+
bottom: 10,
|
|
299
|
+
alignSelf: 'center'
|
|
300
|
+
},
|
|
301
|
+
scrollButton: {
|
|
302
|
+
position: 'absolute',
|
|
303
|
+
zIndex: 998,
|
|
304
|
+
bottom: 10,
|
|
305
|
+
right: 16
|
|
306
|
+
}
|
|
307
|
+
});
|
|
308
|
+
|
|
309
|
+
// NOTE: Due to Generic inference is not working on forwardRef, we need to cast it as typeof ChannelMessageList and implicit `ref` prop
|
|
310
|
+
export default /*#__PURE__*/React.forwardRef(ChannelMessageList);
|
|
311
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"names":["React","View","useSafeAreaInsets","ChannelFrozenBanner","createStyleSheet","useAlert","useBottomSheet","useToast","useUIKitTheme","Logger","getAvailableUriFromFileMessage","getFileExtension","getFileType","isMyMessage","messageKeyExtractor","shouldRenderReaction","toMegabyte","useFreshCallback","DEPRECATION_WARNING","useLocalization","usePlatformService","useSendbirdChat","SBUUtils","ChatFlatList","ReactionAddons","ChannelMessageList","_ref","ref","searchItem","hasNext","channel","onEditMessage","onDeleteMessage","onResendFailedMessage","onPressMediaMessage","currentUserId","renderNewMessagesButton","renderScrollToBottomButton","renderMessage","messages","newMessages","enableMessageGrouping","onScrolledAwayFromBottom","scrolledAwayFromBottom","onBottomReached","onTopReached","flatListProps","onPressNewMessagesButton","onPressScrollToBottomButton","onPressImageMessage","STRINGS","colors","left","right","getMessagePressActions","useGetMessagePressActions","safeAreaLayout","paddingLeft","paddingRight","renderItem","_ref2","item","index","onPress","onLongPress","message","prevMessage","nextMessage","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","features","handleFailedMessage","sheetItems","title","CHANNEL_MESSAGE_FAILED_RETRY","catch","show","TOAST","RESEND_MSG_ERROR","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","sendingStatus","CHANNEL_MESSAGE_EDIT","CHANNEL_MESSAGE_DELETE","CHANNEL_MESSAGE_SAVE","size","DOWNLOAD_START","save","fileUrl","url","fileName","name","fileType","type","then","DOWNLOAD_OK","log","err","DOWNLOAD_ERROR","warn","CHANNEL","ON_PRESS_IMAGE_MESSAGE","openURL","HeaderComponent","reactionEnabled","_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 messageKeyExtractor,\n shouldRenderReaction,\n toMegabyte,\n useFreshCallback,\n} from '@sendbird/uikit-utils';\n\nimport { DEPRECATION_WARNING } from '../../constants';\nimport type { UserProfileContextType } from '../../contexts/UserProfileCtx';\nimport { useLocalization, usePlatformService, useSendbirdChat } 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 onDeleteMessage: (message: HandleableMessage) => Promise<void>;\n onResendFailedMessage: (failedMessage: HandleableMessage) => Promise<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 onPressAvatar?: 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 /** @deprecated Please use `onPressMediaMessage` instead **/\n onPressImageMessage?: (message: SendbirdFileMessage, uri: string) => void;\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 onDeleteMessage,\n onResendFailedMessage,\n onPressMediaMessage,\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 onPressImageMessage,\n }: ChannelMessageListProps<T>,\n ref: React.ForwardedRef<FlatList<SendbirdMessage>>,\n) => {\n const { STRINGS } = useLocalization();\n const { colors } = useUIKitTheme();\n const { left, right } = useSafeAreaInsets();\n const getMessagePressActions = useGetMessagePressActions({\n channel,\n currentUserId,\n onEditMessage,\n onDeleteMessage,\n onResendFailedMessage,\n onPressImageMessage,\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 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 onDeleteMessage,\n onPressImageMessage,\n onPressMediaMessage,\n}: Pick<\n ChannelMessageListProps<T>,\n | 'channel'\n | 'currentUserId'\n | 'onEditMessage'\n | 'onDeleteMessage'\n | 'onResendFailedMessage'\n | 'onPressImageMessage'\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 { features } = useSendbirdChat();\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(() => toast.show(STRINGS.TOAST.RESEND_MSG_ERROR, 'error'));\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 (isMyMessage(msg, currentUserId) && msg.sendingStatus === 'succeeded') {\n sheetItems.push(\n {\n icon: 'edit',\n title: STRINGS.LABELS.CHANNEL_MESSAGE_EDIT,\n onPress: () => onEditMessage(msg),\n },\n {\n icon: 'delete',\n title: STRINGS.LABELS.CHANNEL_MESSAGE_DELETE,\n onPress: () => confirmDelete(msg),\n },\n );\n }\n }\n\n if (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 if (isMyMessage(msg, currentUserId) && msg.sendingStatus === 'succeeded') {\n sheetItems.push({\n icon: 'delete',\n title: STRINGS.LABELS.CHANNEL_MESSAGE_DELETE,\n onPress: () => confirmDelete(msg),\n });\n }\n\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 if (onPressImageMessage && fileType === 'image') {\n Logger.warn(DEPRECATION_WARNING.CHANNEL.ON_PRESS_IMAGE_MESSAGE);\n onPressImageMessage(msg, getAvailableUriFromFileMessage(msg));\n }\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(channel, features.reactionEnabled)\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(() => toast.show(STRINGS.TOAST.RESEND_MSG_ERROR, 'error'));\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":"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"}
|
|
@@ -1,69 +1,43 @@
|
|
|
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, { forwardRef,
|
|
3
|
-
import {
|
|
2
|
+
import React, { forwardRef, useRef } from 'react';
|
|
3
|
+
import { Platform, StyleSheet } from 'react-native';
|
|
4
|
+
import { FlatList } from '@sendbird/react-native-scrollview-enhancer';
|
|
4
5
|
import { useUIKitTheme } from '@sendbird/uikit-react-native-foundation';
|
|
5
|
-
import { getMessageUniqId,
|
|
6
|
+
import { NOOP, getMessageUniqId, useFreshCallback } from '@sendbird/uikit-utils';
|
|
6
7
|
let ANDROID_BUG_ALERT_SHOWED = Platform.OS !== 'android';
|
|
7
8
|
const BOTTOM_DETECT_THRESHOLD = 25;
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
function hasReachedToBottom(yPos) {
|
|
11
|
-
let thresholdPx = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 0;
|
|
12
|
-
return thresholdPx >= yPos;
|
|
13
|
-
}
|
|
9
|
+
const UNREACHABLE_THRESHOLD = Number.MIN_SAFE_INTEGER;
|
|
14
10
|
// FIXME: Inverted FlatList performance issue on Android {@link https://github.com/facebook/react-native/issues/30034}
|
|
15
11
|
const ChatFlatList = /*#__PURE__*/forwardRef(function CustomFlatList(_ref, ref) {
|
|
16
12
|
var _props$data;
|
|
17
13
|
let {
|
|
18
14
|
onTopReached,
|
|
19
|
-
nextMessages,
|
|
20
15
|
onBottomReached,
|
|
16
|
+
onScrolledAwayFromBottom,
|
|
21
17
|
onLeaveScrollBottom,
|
|
22
18
|
onScroll,
|
|
23
|
-
currentUserId,
|
|
24
19
|
...props
|
|
25
20
|
} = _ref;
|
|
26
21
|
const {
|
|
27
22
|
select
|
|
28
23
|
} = useUIKitTheme();
|
|
29
|
-
const
|
|
30
|
-
const
|
|
31
|
-
|
|
32
|
-
scrollToBottom: function () {
|
|
33
|
-
var _scrollRef$current;
|
|
34
|
-
let animated = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : true;
|
|
35
|
-
return (_scrollRef$current = scrollRef.current) === null || _scrollRef$current === void 0 ? void 0 : _scrollRef$current.scrollToOffset({
|
|
36
|
-
animated,
|
|
37
|
-
offset: 0
|
|
38
|
-
});
|
|
39
|
-
}
|
|
40
|
-
}), []);
|
|
41
|
-
useEffect(() => {
|
|
42
|
-
const latestMessage = nextMessages[nextMessages.length - 1];
|
|
43
|
-
if (!latestMessage) return;
|
|
44
|
-
if (hasReachedToBottom(yPos.current)) {
|
|
45
|
-
onBottomReached();
|
|
46
|
-
} else if (isMyMessage(latestMessage, currentUserId)) {
|
|
47
|
-
var _scrollRef$current2;
|
|
48
|
-
(_scrollRef$current2 = scrollRef.current) === null || _scrollRef$current2 === void 0 ? void 0 : _scrollRef$current2.scrollToOffset({
|
|
49
|
-
animated: false,
|
|
50
|
-
offset: 0
|
|
51
|
-
});
|
|
52
|
-
}
|
|
53
|
-
}, [onBottomReached, nextMessages, currentUserId]);
|
|
54
|
-
const _onScroll = useCallback(event => {
|
|
24
|
+
const contentOffsetY = useRef(0);
|
|
25
|
+
const _onScroll = useFreshCallback(event => {
|
|
26
|
+
onScroll === null || onScroll === void 0 ? void 0 : onScroll(event);
|
|
55
27
|
const {
|
|
56
28
|
contentOffset
|
|
57
29
|
} = event.nativeEvent;
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
30
|
+
const prevOffsetY = contentOffsetY.current;
|
|
31
|
+
const currOffsetY = contentOffset.y;
|
|
32
|
+
if (BOTTOM_DETECT_THRESHOLD < prevOffsetY && currOffsetY <= BOTTOM_DETECT_THRESHOLD) {
|
|
33
|
+
onScrolledAwayFromBottom(false);
|
|
34
|
+
onLeaveScrollBottom === null || onLeaveScrollBottom === void 0 ? void 0 : onLeaveScrollBottom(false);
|
|
35
|
+
} else if (BOTTOM_DETECT_THRESHOLD < currOffsetY && prevOffsetY <= BOTTOM_DETECT_THRESHOLD) {
|
|
36
|
+
onScrolledAwayFromBottom(true);
|
|
37
|
+
onLeaveScrollBottom === null || onLeaveScrollBottom === void 0 ? void 0 : onLeaveScrollBottom(true);
|
|
62
38
|
}
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
if (hasReachedToBottom(yPos.current)) onBottomReached();
|
|
66
|
-
}, [onScroll, onBottomReached]);
|
|
39
|
+
contentOffsetY.current = contentOffset.y;
|
|
40
|
+
});
|
|
67
41
|
if (__DEV__ && !ANDROID_BUG_ALERT_SHOWED) {
|
|
68
42
|
ANDROID_BUG_ALERT_SHOWED = true;
|
|
69
43
|
// eslint-disable-next-line no-console
|
|
@@ -80,16 +54,22 @@ const ChatFlatList = /*#__PURE__*/forwardRef(function CustomFlatList(_ref, ref)
|
|
|
80
54
|
})
|
|
81
55
|
}, props, {
|
|
82
56
|
// FIXME: inverted list of ListEmptyComponent is reversed {@link https://github.com/facebook/react-native/issues/21196#issuecomment-836937743}
|
|
83
|
-
inverted: Boolean((_props$data = props.data) === null || _props$data === void 0 ? void 0 : _props$data.length)
|
|
84
|
-
|
|
85
|
-
// maintainVisibleContentPosition={{ minIndexForVisible: 1, autoscrollToTopThreshold: AUTO_SCROLL_TO_TOP_THRESHOLD }}
|
|
86
|
-
,
|
|
87
|
-
ref: scrollRef,
|
|
88
|
-
onEndReachedThreshold: 0.5,
|
|
57
|
+
inverted: Boolean((_props$data = props.data) === null || _props$data === void 0 ? void 0 : _props$data.length),
|
|
58
|
+
ref: ref,
|
|
89
59
|
onEndReached: onTopReached,
|
|
60
|
+
onScrollToIndexFailed: NOOP,
|
|
61
|
+
onStartReached: onBottomReached,
|
|
90
62
|
scrollEventThrottle: 16,
|
|
91
63
|
onScroll: _onScroll,
|
|
92
|
-
keyExtractor: getMessageUniqId
|
|
64
|
+
keyExtractor: getMessageUniqId,
|
|
65
|
+
style: {
|
|
66
|
+
flex: 1,
|
|
67
|
+
...StyleSheet.flatten(props.style)
|
|
68
|
+
},
|
|
69
|
+
maintainVisibleContentPosition: {
|
|
70
|
+
minIndexForVisible: 0,
|
|
71
|
+
autoscrollToTopThreshold: UNREACHABLE_THRESHOLD
|
|
72
|
+
}
|
|
93
73
|
}));
|
|
94
74
|
});
|
|
95
75
|
export default ChatFlatList;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["React","forwardRef","
|
|
1
|
+
{"version":3,"names":["React","forwardRef","useRef","Platform","StyleSheet","FlatList","useUIKitTheme","NOOP","getMessageUniqId","useFreshCallback","ANDROID_BUG_ALERT_SHOWED","OS","BOTTOM_DETECT_THRESHOLD","UNREACHABLE_THRESHOLD","Number","MIN_SAFE_INTEGER","ChatFlatList","CustomFlatList","_ref","ref","_props$data","onTopReached","onBottomReached","onScrolledAwayFromBottom","onLeaveScrollBottom","onScroll","props","select","contentOffsetY","_onScroll","event","contentOffset","nativeEvent","prevOffsetY","current","currOffsetY","y","__DEV__","console","warn","createElement","_extends","bounces","removeClippedSubviews","keyboardDismissMode","keyboardShouldPersistTaps","indicatorStyle","light","dark","inverted","Boolean","data","length","onEndReached","onScrollToIndexFailed","onStartReached","scrollEventThrottle","keyExtractor","style","flex","flatten","maintainVisibleContentPosition","minIndexForVisible","autoscrollToTopThreshold"],"sources":["ChatFlatList.tsx"],"sourcesContent":["import React, { forwardRef, useRef } from 'react';\nimport { FlatListProps, Platform, FlatList as RNFlatList, StyleSheet } from 'react-native';\n\nimport { FlatList } from '@sendbird/react-native-scrollview-enhancer';\nimport { useUIKitTheme } from '@sendbird/uikit-react-native-foundation';\nimport { NOOP, SendbirdMessage, getMessageUniqId, useFreshCallback } from '@sendbird/uikit-utils';\n\nlet ANDROID_BUG_ALERT_SHOWED = Platform.OS !== 'android';\nconst BOTTOM_DETECT_THRESHOLD = 25;\nconst UNREACHABLE_THRESHOLD = Number.MIN_SAFE_INTEGER;\n\ntype Props = Omit<FlatListProps<SendbirdMessage>, 'onEndReached'> & {\n onBottomReached: () => void;\n onTopReached: () => void;\n onScrolledAwayFromBottom: (value: boolean) => void;\n\n /** @deprecated Please use `onScrolledAwayFromBottom` **/\n onLeaveScrollBottom?: (value: boolean) => void;\n /** @deprecated Not used anymore **/\n nextMessages?: unknown;\n};\n// FIXME: Inverted FlatList performance issue on Android {@link https://github.com/facebook/react-native/issues/30034}\nconst ChatFlatList = forwardRef<RNFlatList<SendbirdMessage>, Props>(function CustomFlatList(\n { onTopReached, onBottomReached, onScrolledAwayFromBottom, onLeaveScrollBottom, onScroll, ...props },\n ref,\n) {\n const { select } = useUIKitTheme();\n const contentOffsetY = useRef(0);\n\n const _onScroll = useFreshCallback<NonNullable<Props['onScroll']>>((event) => {\n onScroll?.(event);\n\n const { contentOffset } = event.nativeEvent;\n\n const prevOffsetY = contentOffsetY.current;\n const currOffsetY = contentOffset.y;\n\n if (BOTTOM_DETECT_THRESHOLD < prevOffsetY && currOffsetY <= BOTTOM_DETECT_THRESHOLD) {\n onScrolledAwayFromBottom(false);\n onLeaveScrollBottom?.(false);\n } else if (BOTTOM_DETECT_THRESHOLD < currOffsetY && prevOffsetY <= BOTTOM_DETECT_THRESHOLD) {\n onScrolledAwayFromBottom(true);\n onLeaveScrollBottom?.(true);\n }\n\n contentOffsetY.current = contentOffset.y;\n });\n\n if (__DEV__ && !ANDROID_BUG_ALERT_SHOWED) {\n ANDROID_BUG_ALERT_SHOWED = true;\n // eslint-disable-next-line no-console\n console.warn(\n 'UIKit Warning: Inverted FlatList has a performance issue on Android, Maybe this is a bug please refer link\\nhttps://github.com/facebook/react-native/issues/30034',\n );\n }\n\n return (\n <FlatList\n bounces={false}\n removeClippedSubviews\n keyboardDismissMode={'on-drag'}\n keyboardShouldPersistTaps={'handled'}\n indicatorStyle={select({ light: 'black', dark: 'white' })}\n {...props}\n // FIXME: inverted list of ListEmptyComponent is reversed {@link https://github.com/facebook/react-native/issues/21196#issuecomment-836937743}\n inverted={Boolean(props.data?.length)}\n ref={ref}\n onEndReached={onTopReached}\n onScrollToIndexFailed={NOOP}\n onStartReached={onBottomReached}\n scrollEventThrottle={16}\n onScroll={_onScroll}\n keyExtractor={getMessageUniqId}\n style={{ flex: 1, ...StyleSheet.flatten(props.style) }}\n maintainVisibleContentPosition={{ minIndexForVisible: 0, autoscrollToTopThreshold: UNREACHABLE_THRESHOLD }}\n />\n );\n});\n\nexport default ChatFlatList;\n"],"mappings":"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"}
|
|
@@ -0,0 +1,124 @@
|
|
|
1
|
+
import React from 'react';
|
|
2
|
+
import { Avatar, Box, Icon, PressBox, Text, createStyleSheet, useUIKitTheme } from '@sendbird/uikit-react-native-foundation';
|
|
3
|
+
import { getFileExtension, getFileType, useIIFE } from '@sendbird/uikit-utils';
|
|
4
|
+
import { useLocalization } from '../hooks/useContext';
|
|
5
|
+
const iconMapper = {
|
|
6
|
+
audio: 'file-audio',
|
|
7
|
+
image: 'photo',
|
|
8
|
+
video: 'play',
|
|
9
|
+
file: 'file-document'
|
|
10
|
+
};
|
|
11
|
+
export const MessageSearchResultItem = _ref => {
|
|
12
|
+
let {
|
|
13
|
+
onPress,
|
|
14
|
+
message
|
|
15
|
+
} = _ref;
|
|
16
|
+
const {
|
|
17
|
+
colors,
|
|
18
|
+
select,
|
|
19
|
+
palette
|
|
20
|
+
} = useUIKitTheme();
|
|
21
|
+
const {
|
|
22
|
+
STRINGS
|
|
23
|
+
} = useLocalization();
|
|
24
|
+
const fileIcon = useIIFE(() => {
|
|
25
|
+
if (!(message !== null && message !== void 0 && message.isFileMessage())) return undefined;
|
|
26
|
+
return iconMapper[getFileType(message.type || getFileExtension(message.name))];
|
|
27
|
+
});
|
|
28
|
+
return /*#__PURE__*/React.createElement(PressBox, {
|
|
29
|
+
onPress: onPress
|
|
30
|
+
}, /*#__PURE__*/React.createElement(Box, {
|
|
31
|
+
style: styles.container
|
|
32
|
+
}, /*#__PURE__*/React.createElement(Avatar, {
|
|
33
|
+
size: styles.avatarSize.width,
|
|
34
|
+
uri: getSenderProfile(message),
|
|
35
|
+
containerStyle: styles.avatar
|
|
36
|
+
}), /*#__PURE__*/React.createElement(Box, {
|
|
37
|
+
flex: 1,
|
|
38
|
+
paddingRight: 16
|
|
39
|
+
}, /*#__PURE__*/React.createElement(Box, {
|
|
40
|
+
style: styles.titleLine
|
|
41
|
+
}, /*#__PURE__*/React.createElement(Box, {
|
|
42
|
+
flex: 1,
|
|
43
|
+
marginRight: 4,
|
|
44
|
+
justifyContent: 'center'
|
|
45
|
+
}, /*#__PURE__*/React.createElement(Text, {
|
|
46
|
+
subtitle2: true,
|
|
47
|
+
color: colors.onBackground01,
|
|
48
|
+
numberOfLines: 1
|
|
49
|
+
}, STRINGS.MESSAGE_SEARCH.SEARCH_RESULT_ITEM_TITLE(message))), /*#__PURE__*/React.createElement(Box, {
|
|
50
|
+
paddingTop: 2
|
|
51
|
+
}, /*#__PURE__*/React.createElement(Text, {
|
|
52
|
+
caption2: true,
|
|
53
|
+
color: colors.onBackground02
|
|
54
|
+
}, STRINGS.MESSAGE_SEARCH.SEARCH_RESULT_ITEM_TITLE_CAPTION(message)))), /*#__PURE__*/React.createElement(Box, {
|
|
55
|
+
flex: 1
|
|
56
|
+
}, /*#__PURE__*/React.createElement(Box, {
|
|
57
|
+
alignItems: 'center',
|
|
58
|
+
flexDirection: 'row'
|
|
59
|
+
}, fileIcon && /*#__PURE__*/React.createElement(Icon, {
|
|
60
|
+
size: 18,
|
|
61
|
+
icon: fileIcon,
|
|
62
|
+
color: colors.onBackground02,
|
|
63
|
+
containerStyle: [styles.bodyIcon, {
|
|
64
|
+
backgroundColor: select({
|
|
65
|
+
light: palette.background100,
|
|
66
|
+
dark: palette.background500
|
|
67
|
+
})
|
|
68
|
+
}]
|
|
69
|
+
}), /*#__PURE__*/React.createElement(Text, {
|
|
70
|
+
body3: true,
|
|
71
|
+
numberOfLines: fileIcon ? 1 : 2,
|
|
72
|
+
ellipsizeMode: fileIcon ? 'middle' : 'tail',
|
|
73
|
+
style: styles.bodyText,
|
|
74
|
+
color: colors.onBackground03
|
|
75
|
+
}, STRINGS.MESSAGE_SEARCH.SEARCH_RESULT_ITEM_BODY(message)))), /*#__PURE__*/React.createElement(Box, {
|
|
76
|
+
style: styles.separator,
|
|
77
|
+
backgroundColor: colors.onBackground04
|
|
78
|
+
}))));
|
|
79
|
+
};
|
|
80
|
+
function getSenderProfile(message) {
|
|
81
|
+
if (message.isUserMessage() || message.isFileMessage()) {
|
|
82
|
+
return message.sender.profileUrl;
|
|
83
|
+
} else {
|
|
84
|
+
return undefined;
|
|
85
|
+
}
|
|
86
|
+
}
|
|
87
|
+
const styles = createStyleSheet({
|
|
88
|
+
container: {
|
|
89
|
+
height: 76,
|
|
90
|
+
width: '100%',
|
|
91
|
+
flexDirection: 'row',
|
|
92
|
+
alignItems: 'center',
|
|
93
|
+
justifyContent: 'center'
|
|
94
|
+
},
|
|
95
|
+
avatar: {
|
|
96
|
+
marginHorizontal: 16
|
|
97
|
+
},
|
|
98
|
+
avatarSize: {
|
|
99
|
+
width: 56
|
|
100
|
+
},
|
|
101
|
+
titleLine: {
|
|
102
|
+
flexDirection: 'row',
|
|
103
|
+
marginTop: 10,
|
|
104
|
+
marginBottom: 4
|
|
105
|
+
},
|
|
106
|
+
bodyIcon: {
|
|
107
|
+
borderRadius: 8,
|
|
108
|
+
width: 26,
|
|
109
|
+
height: 26,
|
|
110
|
+
marginRight: 4
|
|
111
|
+
},
|
|
112
|
+
bodyText: {
|
|
113
|
+
flex: 1,
|
|
114
|
+
lineHeight: 16
|
|
115
|
+
},
|
|
116
|
+
separator: {
|
|
117
|
+
position: 'absolute',
|
|
118
|
+
left: 0,
|
|
119
|
+
right: -16,
|
|
120
|
+
bottom: 0,
|
|
121
|
+
height: 1
|
|
122
|
+
}
|
|
123
|
+
});
|
|
124
|
+
//# sourceMappingURL=MessageSearchResultItem.js.map
|