@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.
Files changed (209) hide show
  1. package/lib/commonjs/components/ChannelMessageList/index.js +319 -0
  2. package/lib/commonjs/components/ChannelMessageList/index.js.map +1 -0
  3. package/lib/commonjs/components/ChatFlatList.js +30 -50
  4. package/lib/commonjs/components/ChatFlatList.js.map +1 -1
  5. package/lib/commonjs/components/MessageSearchResultItem.js +132 -0
  6. package/lib/commonjs/components/MessageSearchResultItem.js.map +1 -0
  7. package/lib/commonjs/components/ScrollToBottomButton.js +1 -1
  8. package/lib/commonjs/components/ScrollToBottomButton.js.map +1 -1
  9. package/lib/commonjs/constants.js +6 -2
  10. package/lib/commonjs/constants.js.map +1 -1
  11. package/lib/commonjs/containers/GroupChannelPreviewContainer.js +2 -2
  12. package/lib/commonjs/containers/GroupChannelPreviewContainer.js.map +1 -1
  13. package/lib/commonjs/containers/SendbirdUIKitContainer.js +4 -2
  14. package/lib/commonjs/containers/SendbirdUIKitContainer.js.map +1 -1
  15. package/lib/commonjs/contexts/SendbirdChatCtx.js +4 -2
  16. package/lib/commonjs/contexts/SendbirdChatCtx.js.map +1 -1
  17. package/lib/commonjs/domain/groupChannel/component/GroupChannelHeader.js +4 -2
  18. package/lib/commonjs/domain/groupChannel/component/GroupChannelHeader.js.map +1 -1
  19. package/lib/commonjs/domain/groupChannel/component/GroupChannelMessageList.js +84 -301
  20. package/lib/commonjs/domain/groupChannel/component/GroupChannelMessageList.js.map +1 -1
  21. package/lib/commonjs/domain/groupChannel/component/GroupChannelSuggestedMentionList.js +2 -0
  22. package/lib/commonjs/domain/groupChannel/component/GroupChannelSuggestedMentionList.js.map +1 -1
  23. package/lib/commonjs/domain/groupChannel/module/moduleContext.js +9 -2
  24. package/lib/commonjs/domain/groupChannel/module/moduleContext.js.map +1 -1
  25. package/lib/commonjs/domain/groupChannel/types.js.map +1 -1
  26. package/lib/commonjs/domain/groupChannelSettings/component/GroupChannelSettingsMenu.js +18 -4
  27. package/lib/commonjs/domain/groupChannelSettings/component/GroupChannelSettingsMenu.js.map +1 -1
  28. package/lib/commonjs/domain/groupChannelSettings/types.js.map +1 -1
  29. package/lib/commonjs/domain/messageSearch/component/MessageSearchHeader.js +105 -0
  30. package/lib/commonjs/domain/messageSearch/component/MessageSearchHeader.js.map +1 -0
  31. package/lib/commonjs/domain/messageSearch/component/MessageSearchList.js +40 -0
  32. package/lib/commonjs/domain/messageSearch/component/MessageSearchList.js.map +1 -0
  33. package/lib/commonjs/domain/messageSearch/component/MessageSearchStatusEmpty.js +22 -0
  34. package/lib/commonjs/domain/messageSearch/component/MessageSearchStatusEmpty.js.map +1 -0
  35. package/lib/commonjs/domain/messageSearch/component/MessageSearchStatusError.js +26 -0
  36. package/lib/commonjs/domain/messageSearch/component/MessageSearchStatusError.js.map +1 -0
  37. package/lib/commonjs/domain/messageSearch/component/MessageSearchStatusLoading.js +22 -0
  38. package/lib/commonjs/domain/messageSearch/component/MessageSearchStatusLoading.js.map +1 -0
  39. package/lib/commonjs/domain/messageSearch/index.js +62 -0
  40. package/lib/commonjs/domain/messageSearch/index.js.map +1 -0
  41. package/lib/commonjs/domain/messageSearch/module/createMessageSearchModule.js +36 -0
  42. package/lib/commonjs/domain/messageSearch/module/createMessageSearchModule.js.map +1 -0
  43. package/lib/commonjs/domain/messageSearch/module/moduleContext.js +25 -0
  44. package/lib/commonjs/domain/messageSearch/module/moduleContext.js.map +1 -0
  45. package/lib/commonjs/domain/messageSearch/types.js +6 -0
  46. package/lib/commonjs/domain/messageSearch/types.js.map +1 -0
  47. package/lib/commonjs/domain/openChannel/component/OpenChannelMessageList.js +38 -279
  48. package/lib/commonjs/domain/openChannel/component/OpenChannelMessageList.js.map +1 -1
  49. package/lib/commonjs/domain/openChannel/module/moduleContext.js +9 -2
  50. package/lib/commonjs/domain/openChannel/module/moduleContext.js.map +1 -1
  51. package/lib/commonjs/domain/openChannel/types.js.map +1 -1
  52. package/lib/commonjs/fragments/createGroupChannelFragment.js +107 -15
  53. package/lib/commonjs/fragments/createGroupChannelFragment.js.map +1 -1
  54. package/lib/commonjs/fragments/createGroupChannelSettingsFragment.js +2 -0
  55. package/lib/commonjs/fragments/createGroupChannelSettingsFragment.js.map +1 -1
  56. package/lib/commonjs/fragments/createMessageSearchFragment.js +145 -0
  57. package/lib/commonjs/fragments/createMessageSearchFragment.js.map +1 -0
  58. package/lib/commonjs/fragments/createOpenChannelFragment.js +40 -8
  59. package/lib/commonjs/fragments/createOpenChannelFragment.js.map +1 -1
  60. package/lib/commonjs/hooks/useMentionSuggestion.js +17 -0
  61. package/lib/commonjs/hooks/useMentionSuggestion.js.map +1 -1
  62. package/lib/commonjs/index.js +60 -40
  63. package/lib/commonjs/index.js.map +1 -1
  64. package/lib/commonjs/localization/StringSet.type.js.map +1 -1
  65. package/lib/commonjs/localization/createBaseStringSet.js +33 -20
  66. package/lib/commonjs/localization/createBaseStringSet.js.map +1 -1
  67. package/lib/commonjs/utils/pubsub.js +21 -0
  68. package/lib/commonjs/utils/pubsub.js.map +1 -0
  69. package/lib/commonjs/version.js +1 -1
  70. package/lib/commonjs/version.js.map +1 -1
  71. package/lib/module/components/ChannelMessageList/index.js +311 -0
  72. package/lib/module/components/ChannelMessageList/index.js.map +1 -0
  73. package/lib/module/components/ChatFlatList.js +32 -52
  74. package/lib/module/components/ChatFlatList.js.map +1 -1
  75. package/lib/module/components/MessageSearchResultItem.js +124 -0
  76. package/lib/module/components/MessageSearchResultItem.js.map +1 -0
  77. package/lib/module/components/ScrollToBottomButton.js +1 -1
  78. package/lib/module/components/ScrollToBottomButton.js.map +1 -1
  79. package/lib/module/constants.js +3 -1
  80. package/lib/module/constants.js.map +1 -1
  81. package/lib/module/containers/GroupChannelPreviewContainer.js +2 -2
  82. package/lib/module/containers/GroupChannelPreviewContainer.js.map +1 -1
  83. package/lib/module/containers/SendbirdUIKitContainer.js +4 -2
  84. package/lib/module/containers/SendbirdUIKitContainer.js.map +1 -1
  85. package/lib/module/contexts/SendbirdChatCtx.js +4 -2
  86. package/lib/module/contexts/SendbirdChatCtx.js.map +1 -1
  87. package/lib/module/domain/groupChannel/component/GroupChannelHeader.js +4 -2
  88. package/lib/module/domain/groupChannel/component/GroupChannelHeader.js.map +1 -1
  89. package/lib/module/domain/groupChannel/component/GroupChannelMessageList.js +88 -305
  90. package/lib/module/domain/groupChannel/component/GroupChannelMessageList.js.map +1 -1
  91. package/lib/module/domain/groupChannel/component/GroupChannelSuggestedMentionList.js +2 -0
  92. package/lib/module/domain/groupChannel/component/GroupChannelSuggestedMentionList.js.map +1 -1
  93. package/lib/module/domain/groupChannel/module/moduleContext.js +9 -2
  94. package/lib/module/domain/groupChannel/module/moduleContext.js.map +1 -1
  95. package/lib/module/domain/groupChannel/types.js.map +1 -1
  96. package/lib/module/domain/groupChannelSettings/component/GroupChannelSettingsMenu.js +18 -4
  97. package/lib/module/domain/groupChannelSettings/component/GroupChannelSettingsMenu.js.map +1 -1
  98. package/lib/module/domain/groupChannelSettings/types.js.map +1 -1
  99. package/lib/module/domain/messageSearch/component/MessageSearchHeader.js +96 -0
  100. package/lib/module/domain/messageSearch/component/MessageSearchHeader.js.map +1 -0
  101. package/lib/module/domain/messageSearch/component/MessageSearchList.js +32 -0
  102. package/lib/module/domain/messageSearch/component/MessageSearchList.js.map +1 -0
  103. package/lib/module/domain/messageSearch/component/MessageSearchStatusEmpty.js +14 -0
  104. package/lib/module/domain/messageSearch/component/MessageSearchStatusEmpty.js.map +1 -0
  105. package/lib/module/domain/messageSearch/component/MessageSearchStatusError.js +18 -0
  106. package/lib/module/domain/messageSearch/component/MessageSearchStatusError.js.map +1 -0
  107. package/lib/module/domain/messageSearch/component/MessageSearchStatusLoading.js +14 -0
  108. package/lib/module/domain/messageSearch/component/MessageSearchStatusLoading.js.map +1 -0
  109. package/lib/module/domain/messageSearch/index.js +8 -0
  110. package/lib/module/domain/messageSearch/index.js.map +1 -0
  111. package/lib/module/domain/messageSearch/module/createMessageSearchModule.js +28 -0
  112. package/lib/module/domain/messageSearch/module/createMessageSearchModule.js.map +1 -0
  113. package/lib/module/domain/messageSearch/module/moduleContext.js +14 -0
  114. package/lib/module/domain/messageSearch/module/moduleContext.js.map +1 -0
  115. package/lib/module/domain/messageSearch/types.js +2 -0
  116. package/lib/module/domain/messageSearch/types.js.map +1 -0
  117. package/lib/module/domain/openChannel/component/OpenChannelMessageList.js +40 -281
  118. package/lib/module/domain/openChannel/component/OpenChannelMessageList.js.map +1 -1
  119. package/lib/module/domain/openChannel/module/moduleContext.js +9 -2
  120. package/lib/module/domain/openChannel/module/moduleContext.js.map +1 -1
  121. package/lib/module/domain/openChannel/types.js.map +1 -1
  122. package/lib/module/fragments/createGroupChannelFragment.js +109 -17
  123. package/lib/module/fragments/createGroupChannelFragment.js.map +1 -1
  124. package/lib/module/fragments/createGroupChannelSettingsFragment.js +2 -0
  125. package/lib/module/fragments/createGroupChannelSettingsFragment.js.map +1 -1
  126. package/lib/module/fragments/createMessageSearchFragment.js +135 -0
  127. package/lib/module/fragments/createMessageSearchFragment.js.map +1 -0
  128. package/lib/module/fragments/createOpenChannelFragment.js +41 -9
  129. package/lib/module/fragments/createOpenChannelFragment.js.map +1 -1
  130. package/lib/module/hooks/useMentionSuggestion.js +18 -1
  131. package/lib/module/hooks/useMentionSuggestion.js.map +1 -1
  132. package/lib/module/index.js +2 -0
  133. package/lib/module/index.js.map +1 -1
  134. package/lib/module/localization/StringSet.type.js.map +1 -1
  135. package/lib/module/localization/createBaseStringSet.js +34 -21
  136. package/lib/module/localization/createBaseStringSet.js.map +1 -1
  137. package/lib/module/utils/pubsub.js +14 -0
  138. package/lib/module/utils/pubsub.js.map +1 -0
  139. package/lib/module/version.js +1 -1
  140. package/lib/module/version.js.map +1 -1
  141. package/lib/typescript/src/components/ChannelMessageList/index.d.ts +55 -0
  142. package/lib/typescript/src/components/ChatFlatList.d.ts +7 -8
  143. package/lib/typescript/src/components/MessageRenderer/index.d.ts +4 -0
  144. package/lib/typescript/src/components/MessageSearchResultItem.d.ts +2 -0
  145. package/lib/typescript/src/components/OpenChannelMessageRenderer/index.d.ts +1 -0
  146. package/lib/typescript/src/components/ScrollToBottomButton.d.ts +1 -1
  147. package/lib/typescript/src/constants.d.ts +3 -1
  148. package/lib/typescript/src/containers/SendbirdUIKitContainer.d.ts +2 -1
  149. package/lib/typescript/src/contexts/SendbirdChatCtx.d.ts +3 -1
  150. package/lib/typescript/src/domain/groupChannel/component/GroupChannelHeader.d.ts +1 -1
  151. package/lib/typescript/src/domain/groupChannel/component/GroupChannelMessageList.d.ts +3 -32
  152. package/lib/typescript/src/domain/groupChannel/types.d.ts +23 -35
  153. package/lib/typescript/src/domain/groupChannelSettings/component/GroupChannelSettingsMenu.d.ts +1 -1
  154. package/lib/typescript/src/domain/groupChannelSettings/types.d.ts +2 -0
  155. package/lib/typescript/src/domain/messageSearch/component/MessageSearchHeader.d.ts +3 -0
  156. package/lib/typescript/src/domain/messageSearch/component/MessageSearchList.d.ts +3 -0
  157. package/lib/typescript/src/domain/messageSearch/component/MessageSearchStatusEmpty.d.ts +2 -0
  158. package/lib/typescript/src/domain/messageSearch/component/MessageSearchStatusError.d.ts +3 -0
  159. package/lib/typescript/src/domain/messageSearch/component/MessageSearchStatusLoading.d.ts +2 -0
  160. package/lib/typescript/src/domain/messageSearch/index.d.ts +7 -0
  161. package/lib/typescript/src/domain/messageSearch/module/createMessageSearchModule.d.ts +3 -0
  162. package/lib/typescript/src/domain/messageSearch/module/moduleContext.d.ts +3 -0
  163. package/lib/typescript/src/domain/messageSearch/types.d.ts +53 -0
  164. package/lib/typescript/src/domain/openChannel/component/OpenChannelMessageList.d.ts +1 -37
  165. package/lib/typescript/src/domain/openChannel/types.d.ts +17 -36
  166. package/lib/typescript/src/fragments/createMessageSearchFragment.d.ts +3 -0
  167. package/lib/typescript/src/hooks/useMentionSuggestion.d.ts +3 -2
  168. package/lib/typescript/src/index.d.ts +2 -0
  169. package/lib/typescript/src/localization/StringSet.type.d.ts +17 -3
  170. package/lib/typescript/src/utils/pubsub.d.ts +6 -0
  171. package/lib/typescript/src/version.d.ts +1 -1
  172. package/package.json +8 -7
  173. package/src/components/ChannelMessageList/index.tsx +392 -0
  174. package/src/components/ChatFlatList.tsx +33 -51
  175. package/src/components/MessageSearchResultItem.tsx +125 -0
  176. package/src/components/ScrollToBottomButton.tsx +3 -4
  177. package/src/constants.ts +3 -1
  178. package/src/containers/GroupChannelPreviewContainer.tsx +2 -2
  179. package/src/containers/SendbirdUIKitContainer.tsx +2 -0
  180. package/src/contexts/SendbirdChatCtx.tsx +7 -1
  181. package/src/domain/groupChannel/component/GroupChannelHeader.tsx +9 -3
  182. package/src/domain/groupChannel/component/GroupChannelMessageList.tsx +73 -316
  183. package/src/domain/groupChannel/component/GroupChannelSuggestedMentionList.tsx +2 -1
  184. package/src/domain/groupChannel/module/moduleContext.tsx +10 -2
  185. package/src/domain/groupChannel/types.ts +49 -38
  186. package/src/domain/groupChannelSettings/component/GroupChannelSettingsMenu.tsx +29 -13
  187. package/src/domain/groupChannelSettings/types.ts +2 -0
  188. package/src/domain/messageSearch/component/MessageSearchHeader.tsx +98 -0
  189. package/src/domain/messageSearch/component/MessageSearchList.tsx +26 -0
  190. package/src/domain/messageSearch/component/MessageSearchStatusEmpty.tsx +15 -0
  191. package/src/domain/messageSearch/component/MessageSearchStatusError.tsx +16 -0
  192. package/src/domain/messageSearch/component/MessageSearchStatusLoading.tsx +15 -0
  193. package/src/domain/messageSearch/index.ts +7 -0
  194. package/src/domain/messageSearch/module/createMessageSearchModule.tsx +21 -0
  195. package/src/domain/messageSearch/module/moduleContext.tsx +16 -0
  196. package/src/domain/messageSearch/types.ts +55 -0
  197. package/src/domain/openChannel/component/OpenChannelMessageList.tsx +35 -303
  198. package/src/domain/openChannel/module/moduleContext.tsx +8 -2
  199. package/src/domain/openChannel/types.ts +40 -38
  200. package/src/fragments/createGroupChannelFragment.tsx +114 -17
  201. package/src/fragments/createGroupChannelSettingsFragment.tsx +2 -0
  202. package/src/fragments/createMessageSearchFragment.tsx +159 -0
  203. package/src/fragments/createOpenChannelFragment.tsx +48 -12
  204. package/src/hooks/useMentionSuggestion.ts +23 -3
  205. package/src/index.ts +3 -0
  206. package/src/localization/StringSet.type.ts +20 -2
  207. package/src/localization/createBaseStringSet.ts +22 -2
  208. package/src/utils/pubsub.ts +20 -0
  209. package/src/version.ts +0 -2
@@ -1,16 +1,20 @@
1
- import React, { useMemo } from 'react';
1
+ import React, { useCallback, useEffect, useMemo, useRef, useState } from 'react';
2
+ import { Animated, Easing } from 'react-native';
2
3
  import { useGroupChannelMessages } from '@sendbird/uikit-chat-hooks';
3
- import { NOOP, PASS, messageComparator, useFreshCallback } from '@sendbird/uikit-utils';
4
+ import { NOOP, PASS, messageComparator, useFreshCallback, useRefTracker } from '@sendbird/uikit-utils';
4
5
  import MessageRenderer from '../components/MessageRenderer';
5
6
  import NewMessagesButton from '../components/NewMessagesButton';
6
7
  import ScrollToBottomButton from '../components/ScrollToBottomButton';
7
8
  import StatusComposition from '../components/StatusComposition';
9
+ import { MESSAGE_FOCUS_ANIMATION_DELAY, MESSAGE_SEARCH_SAFE_SCROLL_DELAY } from '../constants';
8
10
  import createGroupChannelModule from '../domain/groupChannel/module/createGroupChannelModule';
9
11
  import { useSendbirdChat } from '../hooks/useContext';
12
+ import pubsub from '../utils/pubsub';
10
13
  const createGroupChannelFragment = initModule => {
11
14
  const GroupChannelModule = createGroupChannelModule(initModule);
12
15
  return _ref => {
13
16
  let {
17
+ searchItem,
14
18
  renderNewMessagesButton = props => /*#__PURE__*/React.createElement(NewMessagesButton, props),
15
19
  renderScrollToBottomButton = props => /*#__PURE__*/React.createElement(ScrollToBottomButton, props),
16
20
  renderMessage,
@@ -36,29 +40,46 @@ const createGroupChannelFragment = initModule => {
36
40
  sdk,
37
41
  currentUser
38
42
  } = useSendbirdChat();
43
+ const [internalSearchItem, setInternalSearchItem] = useState(searchItem);
44
+ const navigateFromMessageSearch = useCallback(() => Boolean(searchItem), []);
45
+ const [groupChannelPubSub] = useState(() => pubsub());
46
+ const [scrolledAwayFromBottom, setScrolledAwayFromBottom] = useState(false);
47
+ const scrolledAwayFromBottomRef = useRefTracker(scrolledAwayFromBottom);
39
48
  const {
49
+ loading,
40
50
  messages,
41
- nextMessages,
42
- newMessagesFromMembers,
51
+ newMessages,
52
+ resetNewMessages,
43
53
  next,
44
54
  prev,
55
+ hasNext,
45
56
  sendFileMessage,
46
57
  sendUserMessage,
47
58
  updateFileMessage,
48
59
  updateUserMessage,
49
60
  resendMessage,
50
61
  deleteMessage,
51
- loading
62
+ resetWithStartingPoint
52
63
  } = useGroupChannelMessages(sdk, channel, currentUser === null || currentUser === void 0 ? void 0 : currentUser.userId, {
53
64
  collectionCreator,
54
65
  queryCreator,
55
66
  sortComparator,
56
67
  onChannelDeleted,
57
- enableCollectionWithoutLocalCache: !queryCreator
68
+ enableCollectionWithoutLocalCache: !queryCreator,
69
+ shouldCountNewMessages: () => scrolledAwayFromBottomRef.current,
70
+ onMessagesReceived(messages) {
71
+ groupChannelPubSub.publish({
72
+ type: 'MESSAGES_RECEIVED',
73
+ data: {
74
+ messages
75
+ }
76
+ });
77
+ },
78
+ startingPoint: internalSearchItem === null || internalSearchItem === void 0 ? void 0 : internalSearchItem.startingPoint
58
79
  });
80
+ const MessageComponent = useCallback(withFocusingAnimation(renderMessage ? props => /*#__PURE__*/React.createElement(React.Fragment, null, renderMessage(props)) : MessageRenderer), [renderMessage]);
59
81
  const _renderMessage = useFreshCallback(props => {
60
- if (renderMessage) return renderMessage(props);
61
- return /*#__PURE__*/React.createElement(MessageRenderer, props);
82
+ return /*#__PURE__*/React.createElement(MessageComponent, props);
62
83
  });
63
84
  const memoizedFlatListProps = useMemo(() => ({
64
85
  ListEmptyComponent: /*#__PURE__*/React.createElement(GroupChannelModule.StatusEmpty, null),
@@ -66,14 +87,36 @@ const createGroupChannelFragment = initModule => {
66
87
  flexGrow: 1
67
88
  },
68
89
  ...flatListProps
69
- }), [loading, flatListProps]);
90
+ }), [flatListProps]);
91
+ const onResetMessageList = useCallback(callback => {
92
+ resetWithStartingPoint(Number.MAX_SAFE_INTEGER, callback);
93
+ setInternalSearchItem(undefined);
94
+ }, []);
95
+ const onPending = message => {
96
+ groupChannelPubSub.publish({
97
+ type: 'MESSAGE_SENT_PENDING',
98
+ data: {
99
+ message
100
+ }
101
+ });
102
+ };
103
+ const onSent = message => {
104
+ groupChannelPubSub.publish({
105
+ type: 'MESSAGE_SENT_SUCCESS',
106
+ data: {
107
+ message
108
+ }
109
+ });
110
+ };
70
111
  const onPressSendUserMessage = useFreshCallback(async params => {
71
112
  const processedParams = await onBeforeSendUserMessage(params);
72
- await sendUserMessage(processedParams);
113
+ const message = await sendUserMessage(processedParams, onPending);
114
+ onSent(message);
73
115
  });
74
116
  const onPressSendFileMessage = useFreshCallback(async params => {
75
117
  const processedParams = await onBeforeSendFileMessage(params);
76
- await sendFileMessage(processedParams);
118
+ const message = await sendFileMessage(processedParams, onPending);
119
+ onSent(message);
77
120
  });
78
121
  const onPressUpdateUserMessage = useFreshCallback(async (message, params) => {
79
122
  const processedParams = await onBeforeUpdateUserMessage(params);
@@ -83,13 +126,18 @@ const createGroupChannelFragment = initModule => {
83
126
  const processedParams = await onBeforeUpdateFileMessage(params);
84
127
  await updateFileMessage(message.messageId, processedParams);
85
128
  });
129
+ const onScrolledAwayFromBottom = useFreshCallback(value => {
130
+ if (!value) resetNewMessages();
131
+ setScrolledAwayFromBottom(value);
132
+ });
86
133
 
87
134
  /** @deprecated **/
88
135
  const onSendFileMessage = useFreshCallback(async file => {
89
136
  const processedParams = await onBeforeSendFileMessage({
90
137
  file
91
138
  });
92
- await sendFileMessage(processedParams);
139
+ const message = await sendFileMessage(processedParams, onPending);
140
+ onSent(message);
93
141
  });
94
142
  /** @deprecated **/
95
143
  const onSendUserMessage = useFreshCallback(async (text, mention) => {
@@ -99,7 +147,8 @@ const createGroupChannelFragment = initModule => {
99
147
  mentionedMessageTemplate: mention === null || mention === void 0 ? void 0 : mention.messageTemplate,
100
148
  mentionType: mention === null || mention === void 0 ? void 0 : mention.type
101
149
  });
102
- await sendUserMessage(processedParams);
150
+ const message = await sendUserMessage(processedParams, onPending);
151
+ onSent(message);
103
152
  });
104
153
  /** @deprecated **/
105
154
  const onUpdateFileMessage = useFreshCallback(async (editedFile, message) => {
@@ -120,9 +169,11 @@ const createGroupChannelFragment = initModule => {
120
169
  });
121
170
  return /*#__PURE__*/React.createElement(GroupChannelModule.Provider, {
122
171
  channel: channel,
172
+ groupChannelPubSub: groupChannelPubSub,
123
173
  enableTypingIndicator: enableTypingIndicator,
124
174
  keyboardAvoidOffset: keyboardAvoidOffset
125
175
  }, /*#__PURE__*/React.createElement(GroupChannelModule.Header, {
176
+ shouldHideRight: navigateFromMessageSearch,
126
177
  onPressHeaderLeft: onPressHeaderLeft,
127
178
  onPressHeaderRight: onPressHeaderRight
128
179
  }), /*#__PURE__*/React.createElement(StatusComposition, {
@@ -130,21 +181,27 @@ const createGroupChannelFragment = initModule => {
130
181
  LoadingComponent: /*#__PURE__*/React.createElement(GroupChannelModule.StatusLoading, null)
131
182
  }, /*#__PURE__*/React.createElement(GroupChannelModule.MessageList, {
132
183
  channel: channel,
184
+ searchItem: internalSearchItem,
185
+ onResetMessageList: onResetMessageList,
133
186
  enableMessageGrouping: enableMessageGrouping,
134
187
  currentUserId: currentUser === null || currentUser === void 0 ? void 0 : currentUser.userId,
135
188
  renderMessage: _renderMessage,
136
189
  messages: messages,
137
- nextMessages: nextMessages,
138
- newMessagesFromMembers: newMessagesFromMembers,
190
+ newMessages: newMessages,
139
191
  onTopReached: prev,
140
192
  onBottomReached: next,
193
+ hasNext: hasNext,
194
+ scrolledAwayFromBottom: scrolledAwayFromBottom,
195
+ onScrolledAwayFromBottom: onScrolledAwayFromBottom,
141
196
  renderNewMessagesButton: renderNewMessagesButton,
142
197
  renderScrollToBottomButton: renderScrollToBottomButton,
143
198
  onResendFailedMessage: resendMessage,
144
199
  onDeleteMessage: deleteMessage,
145
- onPressImageMessage: onPressImageMessage,
146
200
  onPressMediaMessage: onPressMediaMessage,
147
- flatListProps: memoizedFlatListProps
201
+ flatListProps: memoizedFlatListProps,
202
+ nextMessages: newMessages,
203
+ newMessagesFromMembers: newMessages,
204
+ onPressImageMessage: onPressImageMessage
148
205
  }), /*#__PURE__*/React.createElement(GroupChannelModule.Input, {
149
206
  SuggestedMentionList: GroupChannelModule.SuggestedMentionList,
150
207
  shouldRenderInput: shouldRenderInput(channel),
@@ -165,5 +222,40 @@ function shouldRenderInput(channel) {
165
222
  }
166
223
  return true;
167
224
  }
225
+ function withFocusingAnimation(Component) {
226
+ return /*#__PURE__*/React.memo(props => {
227
+ const translateY = useRef(new Animated.Value(0)).current;
228
+ useEffect(() => {
229
+ if (props.focused) {
230
+ setTimeout(() => {
231
+ Animated.sequence([{
232
+ toValue: -10,
233
+ duration: 500
234
+ }, {
235
+ toValue: 0,
236
+ duration: 100
237
+ }, {
238
+ toValue: -10,
239
+ duration: 200
240
+ }, {
241
+ toValue: 0,
242
+ duration: 100
243
+ }].map(value => Animated.timing(translateY, {
244
+ ...value,
245
+ useNativeDriver: true,
246
+ easing: Easing.inOut(Easing.ease)
247
+ }))).start();
248
+ }, MESSAGE_SEARCH_SAFE_SCROLL_DELAY + MESSAGE_FOCUS_ANIMATION_DELAY);
249
+ }
250
+ }, [props.focused]);
251
+ return /*#__PURE__*/React.createElement(Animated.View, {
252
+ style: {
253
+ transform: [{
254
+ translateY
255
+ }]
256
+ }
257
+ }, /*#__PURE__*/React.createElement(Component, props));
258
+ });
259
+ }
168
260
  export default createGroupChannelFragment;
169
261
  //# sourceMappingURL=createGroupChannelFragment.js.map
@@ -1 +1 @@
1
- {"version":3,"names":["React","useMemo","useGroupChannelMessages","NOOP","PASS","messageComparator","useFreshCallback","MessageRenderer","NewMessagesButton","ScrollToBottomButton","StatusComposition","createGroupChannelModule","useSendbirdChat","createGroupChannelFragment","initModule","GroupChannelModule","_ref","renderNewMessagesButton","props","createElement","renderScrollToBottomButton","renderMessage","enableMessageGrouping","enableTypingIndicator","onPressHeaderLeft","onPressHeaderRight","onPressMediaMessage","onChannelDeleted","onBeforeSendUserMessage","onBeforeSendFileMessage","onBeforeUpdateUserMessage","onBeforeUpdateFileMessage","channel","keyboardAvoidOffset","queryCreator","collectionCreator","sortComparator","flatListProps","onPressImageMessage","sdk","currentUser","messages","nextMessages","newMessagesFromMembers","next","prev","sendFileMessage","sendUserMessage","updateFileMessage","updateUserMessage","resendMessage","deleteMessage","loading","userId","enableCollectionWithoutLocalCache","_renderMessage","memoizedFlatListProps","ListEmptyComponent","StatusEmpty","contentContainerStyle","flexGrow","onPressSendUserMessage","params","processedParams","onPressSendFileMessage","onPressUpdateUserMessage","message","messageId","onPressUpdateFileMessage","onSendFileMessage","file","onSendUserMessage","text","mention","mentionedUserIds","userIds","mentionedMessageTemplate","messageTemplate","mentionType","type","onUpdateFileMessage","editedFile","onUpdateUserMessage","editedText","Provider","Header","LoadingComponent","StatusLoading","MessageList","currentUserId","onTopReached","onBottomReached","onResendFailedMessage","onDeleteMessage","Input","SuggestedMentionList","shouldRenderInput","isBroadcast","myRole"],"sources":["createGroupChannelFragment.tsx"],"sourcesContent":["import React, { useMemo } from 'react';\n\nimport { useGroupChannelMessages } from '@sendbird/uikit-chat-hooks';\nimport { NOOP, PASS, SendbirdGroupChannel, messageComparator, useFreshCallback } from '@sendbird/uikit-utils';\n\nimport MessageRenderer from '../components/MessageRenderer';\nimport NewMessagesButton from '../components/NewMessagesButton';\nimport ScrollToBottomButton from '../components/ScrollToBottomButton';\nimport StatusComposition from '../components/StatusComposition';\nimport createGroupChannelModule from '../domain/groupChannel/module/createGroupChannelModule';\nimport type { GroupChannelFragment, GroupChannelModule, GroupChannelProps } from '../domain/groupChannel/types';\nimport { useSendbirdChat } from '../hooks/useContext';\n\nconst createGroupChannelFragment = (initModule?: Partial<GroupChannelModule>): GroupChannelFragment => {\n const GroupChannelModule = createGroupChannelModule(initModule);\n\n return ({\n renderNewMessagesButton = (props) => <NewMessagesButton {...props} />,\n renderScrollToBottomButton = (props) => <ScrollToBottomButton {...props} />,\n renderMessage,\n enableMessageGrouping = true,\n enableTypingIndicator = true,\n onPressHeaderLeft = NOOP,\n onPressHeaderRight = NOOP,\n onPressMediaMessage = NOOP,\n onChannelDeleted = NOOP,\n onBeforeSendUserMessage = PASS,\n onBeforeSendFileMessage = PASS,\n onBeforeUpdateUserMessage = PASS,\n onBeforeUpdateFileMessage = PASS,\n channel,\n keyboardAvoidOffset,\n queryCreator,\n collectionCreator,\n sortComparator = messageComparator,\n flatListProps,\n onPressImageMessage,\n }) => {\n const { sdk, currentUser } = useSendbirdChat();\n\n const {\n messages,\n nextMessages,\n newMessagesFromMembers,\n next,\n prev,\n sendFileMessage,\n sendUserMessage,\n updateFileMessage,\n updateUserMessage,\n resendMessage,\n deleteMessage,\n loading,\n } = useGroupChannelMessages(sdk, channel, currentUser?.userId, {\n collectionCreator,\n queryCreator,\n sortComparator,\n onChannelDeleted,\n enableCollectionWithoutLocalCache: !queryCreator,\n });\n\n const _renderMessage: GroupChannelProps['MessageList']['renderMessage'] = useFreshCallback((props) => {\n if (renderMessage) return renderMessage(props);\n return <MessageRenderer {...props} />;\n });\n\n const memoizedFlatListProps = useMemo(\n () => ({\n ListEmptyComponent: <GroupChannelModule.StatusEmpty />,\n contentContainerStyle: { flexGrow: 1 },\n ...flatListProps,\n }),\n [loading, flatListProps],\n );\n\n const onPressSendUserMessage: GroupChannelProps['Input']['onPressSendUserMessage'] = useFreshCallback(\n async (params) => {\n const processedParams = await onBeforeSendUserMessage(params);\n await sendUserMessage(processedParams);\n },\n );\n const onPressSendFileMessage: GroupChannelProps['Input']['onPressSendFileMessage'] = useFreshCallback(\n async (params) => {\n const processedParams = await onBeforeSendFileMessage(params);\n await sendFileMessage(processedParams);\n },\n );\n const onPressUpdateUserMessage: GroupChannelProps['Input']['onPressUpdateUserMessage'] = useFreshCallback(\n async (message, params) => {\n const processedParams = await onBeforeUpdateUserMessage(params);\n await updateUserMessage(message.messageId, processedParams);\n },\n );\n const onPressUpdateFileMessage: GroupChannelProps['Input']['onPressUpdateFileMessage'] = useFreshCallback(\n async (message, params) => {\n const processedParams = await onBeforeUpdateFileMessage(params);\n await updateFileMessage(message.messageId, processedParams);\n },\n );\n\n /** @deprecated **/\n const onSendFileMessage: GroupChannelProps['Input']['onSendFileMessage'] = useFreshCallback(async (file) => {\n const processedParams = await onBeforeSendFileMessage({ file });\n await sendFileMessage(processedParams);\n });\n /** @deprecated **/\n const onSendUserMessage: GroupChannelProps['Input']['onSendUserMessage'] = useFreshCallback(\n async (text, mention) => {\n const processedParams = await onBeforeSendUserMessage({\n message: text,\n mentionedUserIds: mention?.userIds,\n mentionedMessageTemplate: mention?.messageTemplate,\n mentionType: mention?.type,\n });\n await sendUserMessage(processedParams);\n },\n );\n /** @deprecated **/\n const onUpdateFileMessage: GroupChannelProps['Input']['onUpdateFileMessage'] = useFreshCallback(\n async (editedFile, message) => {\n const processedParams = await onBeforeSendFileMessage({ file: editedFile });\n await updateFileMessage(message.messageId, processedParams);\n },\n );\n /** @deprecated **/\n const onUpdateUserMessage: GroupChannelProps['Input']['onUpdateUserMessage'] = useFreshCallback(\n async (editedText, message, mention) => {\n const processedParams = await onBeforeSendUserMessage({\n message: editedText,\n mentionedUserIds: mention?.userIds,\n mentionedMessageTemplate: mention?.messageTemplate,\n mentionType: mention?.type,\n });\n await updateUserMessage(message.messageId, processedParams);\n },\n );\n\n return (\n <GroupChannelModule.Provider\n channel={channel}\n enableTypingIndicator={enableTypingIndicator}\n keyboardAvoidOffset={keyboardAvoidOffset}\n >\n <GroupChannelModule.Header onPressHeaderLeft={onPressHeaderLeft} onPressHeaderRight={onPressHeaderRight} />\n <StatusComposition loading={loading} LoadingComponent={<GroupChannelModule.StatusLoading />}>\n <GroupChannelModule.MessageList\n channel={channel}\n enableMessageGrouping={enableMessageGrouping}\n currentUserId={currentUser?.userId}\n renderMessage={_renderMessage}\n messages={messages}\n nextMessages={nextMessages}\n newMessagesFromMembers={newMessagesFromMembers}\n onTopReached={prev}\n onBottomReached={next}\n renderNewMessagesButton={renderNewMessagesButton}\n renderScrollToBottomButton={renderScrollToBottomButton}\n onResendFailedMessage={resendMessage}\n onDeleteMessage={deleteMessage}\n onPressImageMessage={onPressImageMessage}\n onPressMediaMessage={onPressMediaMessage}\n flatListProps={memoizedFlatListProps}\n />\n <GroupChannelModule.Input\n SuggestedMentionList={GroupChannelModule.SuggestedMentionList}\n shouldRenderInput={shouldRenderInput(channel)}\n onPressSendUserMessage={onPressSendUserMessage}\n onPressSendFileMessage={onPressSendFileMessage}\n onPressUpdateUserMessage={onPressUpdateUserMessage}\n onPressUpdateFileMessage={onPressUpdateFileMessage}\n onSendFileMessage={onSendFileMessage}\n onSendUserMessage={onSendUserMessage}\n onUpdateFileMessage={onUpdateFileMessage}\n onUpdateUserMessage={onUpdateUserMessage}\n />\n </StatusComposition>\n </GroupChannelModule.Provider>\n );\n };\n};\n\nfunction shouldRenderInput(channel: SendbirdGroupChannel) {\n if (channel.isBroadcast) {\n return channel.myRole === 'operator';\n }\n\n return true;\n}\n\nexport default createGroupChannelFragment;\n"],"mappings":"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"}
1
+ {"version":3,"names":["React","useCallback","useEffect","useMemo","useRef","useState","Animated","Easing","useGroupChannelMessages","NOOP","PASS","messageComparator","useFreshCallback","useRefTracker","MessageRenderer","NewMessagesButton","ScrollToBottomButton","StatusComposition","MESSAGE_FOCUS_ANIMATION_DELAY","MESSAGE_SEARCH_SAFE_SCROLL_DELAY","createGroupChannelModule","useSendbirdChat","pubsub","createGroupChannelFragment","initModule","GroupChannelModule","_ref","searchItem","renderNewMessagesButton","props","createElement","renderScrollToBottomButton","renderMessage","enableMessageGrouping","enableTypingIndicator","onPressHeaderLeft","onPressHeaderRight","onPressMediaMessage","onChannelDeleted","onBeforeSendUserMessage","onBeforeSendFileMessage","onBeforeUpdateUserMessage","onBeforeUpdateFileMessage","channel","keyboardAvoidOffset","queryCreator","collectionCreator","sortComparator","flatListProps","onPressImageMessage","sdk","currentUser","internalSearchItem","setInternalSearchItem","navigateFromMessageSearch","Boolean","groupChannelPubSub","scrolledAwayFromBottom","setScrolledAwayFromBottom","scrolledAwayFromBottomRef","loading","messages","newMessages","resetNewMessages","next","prev","hasNext","sendFileMessage","sendUserMessage","updateFileMessage","updateUserMessage","resendMessage","deleteMessage","resetWithStartingPoint","userId","enableCollectionWithoutLocalCache","shouldCountNewMessages","current","onMessagesReceived","publish","type","data","startingPoint","MessageComponent","withFocusingAnimation","Fragment","_renderMessage","memoizedFlatListProps","ListEmptyComponent","StatusEmpty","contentContainerStyle","flexGrow","onResetMessageList","callback","Number","MAX_SAFE_INTEGER","undefined","onPending","message","onSent","onPressSendUserMessage","params","processedParams","onPressSendFileMessage","onPressUpdateUserMessage","messageId","onPressUpdateFileMessage","onScrolledAwayFromBottom","value","onSendFileMessage","file","onSendUserMessage","text","mention","mentionedUserIds","userIds","mentionedMessageTemplate","messageTemplate","mentionType","onUpdateFileMessage","editedFile","onUpdateUserMessage","editedText","Provider","Header","shouldHideRight","LoadingComponent","StatusLoading","MessageList","currentUserId","onTopReached","onBottomReached","onResendFailedMessage","onDeleteMessage","nextMessages","newMessagesFromMembers","Input","SuggestedMentionList","shouldRenderInput","isBroadcast","myRole","Component","memo","translateY","Value","focused","setTimeout","sequence","toValue","duration","map","timing","useNativeDriver","easing","inOut","ease","start","View","style","transform"],"sources":["createGroupChannelFragment.tsx"],"sourcesContent":["import React, { useCallback, useEffect, useMemo, useRef, useState } from 'react';\nimport { Animated, Easing } from 'react-native';\n\nimport { useGroupChannelMessages } from '@sendbird/uikit-chat-hooks';\nimport {\n NOOP,\n PASS,\n SendbirdFileMessage,\n SendbirdGroupChannel,\n SendbirdUserMessage,\n messageComparator,\n useFreshCallback,\n useRefTracker,\n} from '@sendbird/uikit-utils';\n\nimport MessageRenderer from '../components/MessageRenderer';\nimport NewMessagesButton from '../components/NewMessagesButton';\nimport ScrollToBottomButton from '../components/ScrollToBottomButton';\nimport StatusComposition from '../components/StatusComposition';\nimport { MESSAGE_FOCUS_ANIMATION_DELAY, MESSAGE_SEARCH_SAFE_SCROLL_DELAY } from '../constants';\nimport createGroupChannelModule from '../domain/groupChannel/module/createGroupChannelModule';\nimport type {\n GroupChannelFragment,\n GroupChannelModule,\n GroupChannelProps,\n GroupChannelPubSubContextPayload,\n} from '../domain/groupChannel/types';\nimport { useSendbirdChat } from '../hooks/useContext';\nimport pubsub from '../utils/pubsub';\n\nconst createGroupChannelFragment = (initModule?: Partial<GroupChannelModule>): GroupChannelFragment => {\n const GroupChannelModule = createGroupChannelModule(initModule);\n\n return ({\n searchItem,\n renderNewMessagesButton = (props) => <NewMessagesButton {...props} />,\n renderScrollToBottomButton = (props) => <ScrollToBottomButton {...props} />,\n renderMessage,\n enableMessageGrouping = true,\n enableTypingIndicator = true,\n onPressHeaderLeft = NOOP,\n onPressHeaderRight = NOOP,\n onPressMediaMessage = NOOP,\n onChannelDeleted = NOOP,\n onBeforeSendUserMessage = PASS,\n onBeforeSendFileMessage = PASS,\n onBeforeUpdateUserMessage = PASS,\n onBeforeUpdateFileMessage = PASS,\n channel,\n keyboardAvoidOffset,\n queryCreator,\n collectionCreator,\n sortComparator = messageComparator,\n flatListProps,\n onPressImageMessage,\n }) => {\n const { sdk, currentUser } = useSendbirdChat();\n\n const [internalSearchItem, setInternalSearchItem] = useState(searchItem);\n const navigateFromMessageSearch = useCallback(() => Boolean(searchItem), []);\n\n const [groupChannelPubSub] = useState(() => pubsub<GroupChannelPubSubContextPayload>());\n const [scrolledAwayFromBottom, setScrolledAwayFromBottom] = useState(false);\n const scrolledAwayFromBottomRef = useRefTracker(scrolledAwayFromBottom);\n\n const {\n loading,\n messages,\n newMessages,\n resetNewMessages,\n next,\n prev,\n hasNext,\n sendFileMessage,\n sendUserMessage,\n updateFileMessage,\n updateUserMessage,\n resendMessage,\n deleteMessage,\n resetWithStartingPoint,\n } = useGroupChannelMessages(sdk, channel, currentUser?.userId, {\n collectionCreator,\n queryCreator,\n sortComparator,\n onChannelDeleted,\n enableCollectionWithoutLocalCache: !queryCreator,\n shouldCountNewMessages: () => scrolledAwayFromBottomRef.current,\n onMessagesReceived(messages) {\n groupChannelPubSub.publish({ type: 'MESSAGES_RECEIVED', data: { messages } });\n },\n startingPoint: internalSearchItem?.startingPoint,\n });\n\n const MessageComponent: GroupChannelProps['MessageList']['renderMessage'] = useCallback(\n withFocusingAnimation(renderMessage ? (props) => <>{renderMessage(props)}</> : MessageRenderer),\n [renderMessage],\n );\n\n const _renderMessage: GroupChannelProps['MessageList']['renderMessage'] = useFreshCallback((props) => {\n return <MessageComponent {...props} />;\n });\n\n const memoizedFlatListProps = useMemo(\n () => ({\n ListEmptyComponent: <GroupChannelModule.StatusEmpty />,\n contentContainerStyle: { flexGrow: 1 },\n ...flatListProps,\n }),\n [flatListProps],\n );\n\n const onResetMessageList = useCallback((callback?: () => void) => {\n resetWithStartingPoint(Number.MAX_SAFE_INTEGER, callback);\n setInternalSearchItem(undefined);\n }, []);\n\n const onPending = (message: SendbirdFileMessage | SendbirdUserMessage) => {\n groupChannelPubSub.publish({ type: 'MESSAGE_SENT_PENDING', data: { message } });\n };\n\n const onSent = (message: SendbirdFileMessage | SendbirdUserMessage) => {\n groupChannelPubSub.publish({ type: 'MESSAGE_SENT_SUCCESS', data: { message } });\n };\n\n const onPressSendUserMessage: GroupChannelProps['Input']['onPressSendUserMessage'] = useFreshCallback(\n async (params) => {\n const processedParams = await onBeforeSendUserMessage(params);\n const message = await sendUserMessage(processedParams, onPending);\n onSent(message);\n },\n );\n const onPressSendFileMessage: GroupChannelProps['Input']['onPressSendFileMessage'] = useFreshCallback(\n async (params) => {\n const processedParams = await onBeforeSendFileMessage(params);\n const message = await sendFileMessage(processedParams, onPending);\n onSent(message);\n },\n );\n const onPressUpdateUserMessage: GroupChannelProps['Input']['onPressUpdateUserMessage'] = useFreshCallback(\n async (message, params) => {\n const processedParams = await onBeforeUpdateUserMessage(params);\n await updateUserMessage(message.messageId, processedParams);\n },\n );\n const onPressUpdateFileMessage: GroupChannelProps['Input']['onPressUpdateFileMessage'] = useFreshCallback(\n async (message, params) => {\n const processedParams = await onBeforeUpdateFileMessage(params);\n await updateFileMessage(message.messageId, processedParams);\n },\n );\n const onScrolledAwayFromBottom = useFreshCallback((value: boolean) => {\n if (!value) resetNewMessages();\n setScrolledAwayFromBottom(value);\n });\n\n /** @deprecated **/\n const onSendFileMessage: GroupChannelProps['Input']['onSendFileMessage'] = useFreshCallback(async (file) => {\n const processedParams = await onBeforeSendFileMessage({ file });\n const message = await sendFileMessage(processedParams, onPending);\n onSent(message);\n });\n /** @deprecated **/\n const onSendUserMessage: GroupChannelProps['Input']['onSendUserMessage'] = useFreshCallback(\n async (text, mention) => {\n const processedParams = await onBeforeSendUserMessage({\n message: text,\n mentionedUserIds: mention?.userIds,\n mentionedMessageTemplate: mention?.messageTemplate,\n mentionType: mention?.type,\n });\n const message = await sendUserMessage(processedParams, onPending);\n onSent(message);\n },\n );\n /** @deprecated **/\n const onUpdateFileMessage: GroupChannelProps['Input']['onUpdateFileMessage'] = useFreshCallback(\n async (editedFile, message) => {\n const processedParams = await onBeforeSendFileMessage({ file: editedFile });\n await updateFileMessage(message.messageId, processedParams);\n },\n );\n /** @deprecated **/\n const onUpdateUserMessage: GroupChannelProps['Input']['onUpdateUserMessage'] = useFreshCallback(\n async (editedText, message, mention) => {\n const processedParams = await onBeforeSendUserMessage({\n message: editedText,\n mentionedUserIds: mention?.userIds,\n mentionedMessageTemplate: mention?.messageTemplate,\n mentionType: mention?.type,\n });\n await updateUserMessage(message.messageId, processedParams);\n },\n );\n\n return (\n <GroupChannelModule.Provider\n channel={channel}\n groupChannelPubSub={groupChannelPubSub}\n enableTypingIndicator={enableTypingIndicator}\n keyboardAvoidOffset={keyboardAvoidOffset}\n >\n <GroupChannelModule.Header\n shouldHideRight={navigateFromMessageSearch}\n onPressHeaderLeft={onPressHeaderLeft}\n onPressHeaderRight={onPressHeaderRight}\n />\n <StatusComposition loading={loading} LoadingComponent={<GroupChannelModule.StatusLoading />}>\n <GroupChannelModule.MessageList\n channel={channel}\n searchItem={internalSearchItem}\n onResetMessageList={onResetMessageList}\n enableMessageGrouping={enableMessageGrouping}\n currentUserId={currentUser?.userId}\n renderMessage={_renderMessage}\n messages={messages}\n newMessages={newMessages}\n onTopReached={prev}\n onBottomReached={next}\n hasNext={hasNext}\n scrolledAwayFromBottom={scrolledAwayFromBottom}\n onScrolledAwayFromBottom={onScrolledAwayFromBottom}\n renderNewMessagesButton={renderNewMessagesButton}\n renderScrollToBottomButton={renderScrollToBottomButton}\n onResendFailedMessage={resendMessage}\n onDeleteMessage={deleteMessage}\n onPressMediaMessage={onPressMediaMessage}\n flatListProps={memoizedFlatListProps}\n nextMessages={newMessages}\n newMessagesFromMembers={newMessages}\n onPressImageMessage={onPressImageMessage}\n />\n <GroupChannelModule.Input\n SuggestedMentionList={GroupChannelModule.SuggestedMentionList}\n shouldRenderInput={shouldRenderInput(channel)}\n onPressSendUserMessage={onPressSendUserMessage}\n onPressSendFileMessage={onPressSendFileMessage}\n onPressUpdateUserMessage={onPressUpdateUserMessage}\n onPressUpdateFileMessage={onPressUpdateFileMessage}\n onSendFileMessage={onSendFileMessage}\n onSendUserMessage={onSendUserMessage}\n onUpdateFileMessage={onUpdateFileMessage}\n onUpdateUserMessage={onUpdateUserMessage}\n />\n </StatusComposition>\n </GroupChannelModule.Provider>\n );\n };\n};\n\nfunction shouldRenderInput(channel: SendbirdGroupChannel) {\n if (channel.isBroadcast) {\n return channel.myRole === 'operator';\n }\n\n return true;\n}\n\nfunction withFocusingAnimation<P extends unknown & { focused: boolean }>(Component: React.ComponentType<P>) {\n return React.memo<P>((props) => {\n const translateY = useRef(new Animated.Value(0)).current;\n\n useEffect(() => {\n if (props.focused) {\n setTimeout(() => {\n Animated.sequence(\n [\n { toValue: -10, duration: 500 },\n { toValue: 0, duration: 100 },\n { toValue: -10, duration: 200 },\n { toValue: 0, duration: 100 },\n ].map((value) =>\n Animated.timing(translateY, { ...value, useNativeDriver: true, easing: Easing.inOut(Easing.ease) }),\n ),\n ).start();\n }, MESSAGE_SEARCH_SAFE_SCROLL_DELAY + MESSAGE_FOCUS_ANIMATION_DELAY);\n }\n }, [props.focused]);\n\n return (\n <Animated.View style={{ transform: [{ translateY }] }}>\n <Component {...props} />\n </Animated.View>\n );\n });\n}\n\nexport default createGroupChannelFragment;\n"],"mappings":"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"}
@@ -12,6 +12,7 @@ const createGroupChannelSettingsFragment = initModule => {
12
12
  channel,
13
13
  onPressMenuModeration,
14
14
  onPressMenuMembers,
15
+ onPressMenuSearchInChannel,
15
16
  onPressMenuLeaveChannel,
16
17
  onPressMenuNotification,
17
18
  menuItemsCreator
@@ -39,6 +40,7 @@ const createGroupChannelSettingsFragment = initModule => {
39
40
  menuItemsCreator: menuItemsCreator,
40
41
  onPressMenuModeration: onPressMenuModeration,
41
42
  onPressMenuMembers: onPressMenuMembers,
43
+ onPressMenuSearchInChannel: onPressMenuSearchInChannel,
42
44
  onPressMenuLeaveChannel: onPressMenuLeaveChannel,
43
45
  onPressMenuNotification: onPressMenuNotification
44
46
  })));
@@ -1 +1 @@
1
- {"version":3,"names":["React","ScrollView","useSafeAreaInsets","createStyleSheet","useUIKitTheme","NOOP","createGroupChannelSettingsModule","createGroupChannelSettingsFragment","initModule","GroupChannelSettingsModule","_ref","onPressHeaderLeft","channel","onPressMenuModeration","onPressMenuMembers","onPressMenuLeaveChannel","onPressMenuNotification","menuItemsCreator","colors","left","right","createElement","Provider","Header","style","backgroundColor","background","contentContainerStyle","paddingLeft","styles","viewContainer","paddingHorizontal","paddingRight","Info","Menu"],"sources":["createGroupChannelSettingsFragment.tsx"],"sourcesContent":["import React from 'react';\nimport { ScrollView } from 'react-native';\nimport { useSafeAreaInsets } from 'react-native-safe-area-context';\n\nimport { createStyleSheet, useUIKitTheme } from '@sendbird/uikit-react-native-foundation';\nimport { NOOP } from '@sendbird/uikit-utils';\n\nimport createGroupChannelSettingsModule from '../domain/groupChannelSettings/module/createGroupChannelSettingsModule';\nimport type { GroupChannelSettingsFragment, GroupChannelSettingsModule } from '../domain/groupChannelSettings/types';\n\nconst createGroupChannelSettingsFragment = (\n initModule?: Partial<GroupChannelSettingsModule>,\n): GroupChannelSettingsFragment => {\n const GroupChannelSettingsModule = createGroupChannelSettingsModule(initModule);\n\n return ({\n onPressHeaderLeft = NOOP,\n channel,\n onPressMenuModeration,\n onPressMenuMembers,\n onPressMenuLeaveChannel,\n onPressMenuNotification,\n menuItemsCreator,\n }) => {\n const { colors } = useUIKitTheme();\n const { left, right } = useSafeAreaInsets();\n\n return (\n <GroupChannelSettingsModule.Provider channel={channel}>\n <GroupChannelSettingsModule.Header onPressHeaderLeft={onPressHeaderLeft} />\n <ScrollView\n style={{ backgroundColor: colors.background }}\n contentContainerStyle={{\n paddingLeft: left + styles.viewContainer.paddingHorizontal,\n paddingRight: right + styles.viewContainer.paddingHorizontal,\n }}\n >\n <GroupChannelSettingsModule.Info />\n <GroupChannelSettingsModule.Menu\n menuItemsCreator={menuItemsCreator}\n onPressMenuModeration={onPressMenuModeration}\n onPressMenuMembers={onPressMenuMembers}\n onPressMenuLeaveChannel={onPressMenuLeaveChannel}\n onPressMenuNotification={onPressMenuNotification}\n />\n </ScrollView>\n </GroupChannelSettingsModule.Provider>\n );\n };\n};\n\nconst styles = createStyleSheet({\n viewContainer: {\n paddingHorizontal: 16,\n },\n});\n\nexport default createGroupChannelSettingsFragment;\n"],"mappings":"AAAA,OAAOA,KAAK,MAAM,OAAO;AACzB,SAASC,UAAU,QAAQ,cAAc;AACzC,SAASC,iBAAiB,QAAQ,gCAAgC;AAElE,SAASC,gBAAgB,EAAEC,aAAa,QAAQ,yCAAyC;AACzF,SAASC,IAAI,QAAQ,uBAAuB;AAE5C,OAAOC,gCAAgC,MAAM,wEAAwE;AAGrH,MAAMC,kCAAkC,GACtCC,UAAgD,IACf;EACjC,MAAMC,0BAA0B,GAAGH,gCAAgC,CAACE,UAAU,CAAC;EAE/E,OAAOE,IAAA,IAQD;IAAA,IARE;MACNC,iBAAiB,GAAGN,IAAI;MACxBO,OAAO;MACPC,qBAAqB;MACrBC,kBAAkB;MAClBC,uBAAuB;MACvBC,uBAAuB;MACvBC;IACF,CAAC,GAAAP,IAAA;IACC,MAAM;MAAEQ;IAAO,CAAC,GAAGd,aAAa,EAAE;IAClC,MAAM;MAAEe,IAAI;MAAEC;IAAM,CAAC,GAAGlB,iBAAiB,EAAE;IAE3C,oBACEF,KAAA,CAAAqB,aAAA,CAACZ,0BAA0B,CAACa,QAAQ;MAACV,OAAO,EAAEA;IAAQ,gBACpDZ,KAAA,CAAAqB,aAAA,CAACZ,0BAA0B,CAACc,MAAM;MAACZ,iBAAiB,EAAEA;IAAkB,EAAG,eAC3EX,KAAA,CAAAqB,aAAA,CAACpB,UAAU;MACTuB,KAAK,EAAE;QAAEC,eAAe,EAAEP,MAAM,CAACQ;MAAW,CAAE;MAC9CC,qBAAqB,EAAE;QACrBC,WAAW,EAAET,IAAI,GAAGU,MAAM,CAACC,aAAa,CAACC,iBAAiB;QAC1DC,YAAY,EAAEZ,KAAK,GAAGS,MAAM,CAACC,aAAa,CAACC;MAC7C;IAAE,gBAEF/B,KAAA,CAAAqB,aAAA,CAACZ,0BAA0B,CAACwB,IAAI,OAAG,eACnCjC,KAAA,CAAAqB,aAAA,CAACZ,0BAA0B,CAACyB,IAAI;MAC9BjB,gBAAgB,EAAEA,gBAAiB;MACnCJ,qBAAqB,EAAEA,qBAAsB;MAC7CC,kBAAkB,EAAEA,kBAAmB;MACvCC,uBAAuB,EAAEA,uBAAwB;MACjDC,uBAAuB,EAAEA;IAAwB,EACjD,CACS,CACuB;EAE1C,CAAC;AACH,CAAC;AAED,MAAMa,MAAM,GAAG1B,gBAAgB,CAAC;EAC9B2B,aAAa,EAAE;IACbC,iBAAiB,EAAE;EACrB;AACF,CAAC,CAAC;AAEF,eAAexB,kCAAkC"}
1
+ {"version":3,"names":["React","ScrollView","useSafeAreaInsets","createStyleSheet","useUIKitTheme","NOOP","createGroupChannelSettingsModule","createGroupChannelSettingsFragment","initModule","GroupChannelSettingsModule","_ref","onPressHeaderLeft","channel","onPressMenuModeration","onPressMenuMembers","onPressMenuSearchInChannel","onPressMenuLeaveChannel","onPressMenuNotification","menuItemsCreator","colors","left","right","createElement","Provider","Header","style","backgroundColor","background","contentContainerStyle","paddingLeft","styles","viewContainer","paddingHorizontal","paddingRight","Info","Menu"],"sources":["createGroupChannelSettingsFragment.tsx"],"sourcesContent":["import React from 'react';\nimport { ScrollView } from 'react-native';\nimport { useSafeAreaInsets } from 'react-native-safe-area-context';\n\nimport { createStyleSheet, useUIKitTheme } from '@sendbird/uikit-react-native-foundation';\nimport { NOOP } from '@sendbird/uikit-utils';\n\nimport createGroupChannelSettingsModule from '../domain/groupChannelSettings/module/createGroupChannelSettingsModule';\nimport type { GroupChannelSettingsFragment, GroupChannelSettingsModule } from '../domain/groupChannelSettings/types';\n\nconst createGroupChannelSettingsFragment = (\n initModule?: Partial<GroupChannelSettingsModule>,\n): GroupChannelSettingsFragment => {\n const GroupChannelSettingsModule = createGroupChannelSettingsModule(initModule);\n\n return ({\n onPressHeaderLeft = NOOP,\n channel,\n onPressMenuModeration,\n onPressMenuMembers,\n onPressMenuSearchInChannel,\n onPressMenuLeaveChannel,\n onPressMenuNotification,\n menuItemsCreator,\n }) => {\n const { colors } = useUIKitTheme();\n const { left, right } = useSafeAreaInsets();\n\n return (\n <GroupChannelSettingsModule.Provider channel={channel}>\n <GroupChannelSettingsModule.Header onPressHeaderLeft={onPressHeaderLeft} />\n <ScrollView\n style={{ backgroundColor: colors.background }}\n contentContainerStyle={{\n paddingLeft: left + styles.viewContainer.paddingHorizontal,\n paddingRight: right + styles.viewContainer.paddingHorizontal,\n }}\n >\n <GroupChannelSettingsModule.Info />\n <GroupChannelSettingsModule.Menu\n menuItemsCreator={menuItemsCreator}\n onPressMenuModeration={onPressMenuModeration}\n onPressMenuMembers={onPressMenuMembers}\n onPressMenuSearchInChannel={onPressMenuSearchInChannel}\n onPressMenuLeaveChannel={onPressMenuLeaveChannel}\n onPressMenuNotification={onPressMenuNotification}\n />\n </ScrollView>\n </GroupChannelSettingsModule.Provider>\n );\n };\n};\n\nconst styles = createStyleSheet({\n viewContainer: {\n paddingHorizontal: 16,\n },\n});\n\nexport default createGroupChannelSettingsFragment;\n"],"mappings":"AAAA,OAAOA,KAAK,MAAM,OAAO;AACzB,SAASC,UAAU,QAAQ,cAAc;AACzC,SAASC,iBAAiB,QAAQ,gCAAgC;AAElE,SAASC,gBAAgB,EAAEC,aAAa,QAAQ,yCAAyC;AACzF,SAASC,IAAI,QAAQ,uBAAuB;AAE5C,OAAOC,gCAAgC,MAAM,wEAAwE;AAGrH,MAAMC,kCAAkC,GACtCC,UAAgD,IACf;EACjC,MAAMC,0BAA0B,GAAGH,gCAAgC,CAACE,UAAU,CAAC;EAE/E,OAAOE,IAAA,IASD;IAAA,IATE;MACNC,iBAAiB,GAAGN,IAAI;MACxBO,OAAO;MACPC,qBAAqB;MACrBC,kBAAkB;MAClBC,0BAA0B;MAC1BC,uBAAuB;MACvBC,uBAAuB;MACvBC;IACF,CAAC,GAAAR,IAAA;IACC,MAAM;MAAES;IAAO,CAAC,GAAGf,aAAa,EAAE;IAClC,MAAM;MAAEgB,IAAI;MAAEC;IAAM,CAAC,GAAGnB,iBAAiB,EAAE;IAE3C,oBACEF,KAAA,CAAAsB,aAAA,CAACb,0BAA0B,CAACc,QAAQ;MAACX,OAAO,EAAEA;IAAQ,gBACpDZ,KAAA,CAAAsB,aAAA,CAACb,0BAA0B,CAACe,MAAM;MAACb,iBAAiB,EAAEA;IAAkB,EAAG,eAC3EX,KAAA,CAAAsB,aAAA,CAACrB,UAAU;MACTwB,KAAK,EAAE;QAAEC,eAAe,EAAEP,MAAM,CAACQ;MAAW,CAAE;MAC9CC,qBAAqB,EAAE;QACrBC,WAAW,EAAET,IAAI,GAAGU,MAAM,CAACC,aAAa,CAACC,iBAAiB;QAC1DC,YAAY,EAAEZ,KAAK,GAAGS,MAAM,CAACC,aAAa,CAACC;MAC7C;IAAE,gBAEFhC,KAAA,CAAAsB,aAAA,CAACb,0BAA0B,CAACyB,IAAI,OAAG,eACnClC,KAAA,CAAAsB,aAAA,CAACb,0BAA0B,CAAC0B,IAAI;MAC9BjB,gBAAgB,EAAEA,gBAAiB;MACnCL,qBAAqB,EAAEA,qBAAsB;MAC7CC,kBAAkB,EAAEA,kBAAmB;MACvCC,0BAA0B,EAAEA,0BAA2B;MACvDC,uBAAuB,EAAEA,uBAAwB;MACjDC,uBAAuB,EAAEA;IAAwB,EACjD,CACS,CACuB;EAE1C,CAAC;AACH,CAAC;AAED,MAAMa,MAAM,GAAG3B,gBAAgB,CAAC;EAC9B4B,aAAa,EAAE;IACbC,iBAAiB,EAAE;EACrB;AACF,CAAC,CAAC;AAEF,eAAezB,kCAAkC"}
@@ -0,0 +1,135 @@
1
+ import React, { useRef, useState } from 'react';
2
+ import { MessageSearchOrder } from '@sendbird/chat/message';
3
+ import { Logger, NOOP, useFreshCallback, useSafeAreaPadding } from '@sendbird/uikit-utils';
4
+ import { MessageSearchResultItem } from '../components/MessageSearchResultItem';
5
+ import StatusComposition from '../components/StatusComposition';
6
+ import { createMessageSearchModule } from '../domain/messageSearch';
7
+ import { useSendbirdChat } from '../hooks/useContext';
8
+ function getMessageSearchQuery(sdk, options) {
9
+ if (options.queryCreator) return options.queryCreator(options);
10
+ return sdk.createMessageSearchQuery(options);
11
+ }
12
+ const createMessageSearchFragment = initModule => {
13
+ const MessageSearchModule = createMessageSearchModule(initModule);
14
+ return _ref => {
15
+ let {
16
+ onPressHeaderLeft = NOOP,
17
+ channel,
18
+ queryCreator,
19
+ renderSearchResultItem,
20
+ onPressSearchResultItem
21
+ } = _ref;
22
+ const padding = useSafeAreaPadding(['left', 'right', 'bottom']);
23
+ const {
24
+ sdk
25
+ } = useSendbirdChat();
26
+ const {
27
+ keyword,
28
+ setKeyword,
29
+ search,
30
+ searchResults,
31
+ loading,
32
+ next,
33
+ error,
34
+ query
35
+ } = useMessageSearch(sdk, {
36
+ channel,
37
+ queryCreator
38
+ });
39
+ const renderItem = useFreshCallback(props => {
40
+ if (renderSearchResultItem) return renderSearchResultItem(props);
41
+ return /*#__PURE__*/React.createElement(MessageSearchResultItem, props);
42
+ });
43
+ return /*#__PURE__*/React.createElement(MessageSearchModule.Provider, null, /*#__PURE__*/React.createElement(MessageSearchModule.Header, {
44
+ keyword: keyword,
45
+ onChangeKeyword: setKeyword,
46
+ onPressHeaderLeft: onPressHeaderLeft,
47
+ onPressHeaderRight: search
48
+ }), /*#__PURE__*/React.createElement(StatusComposition, {
49
+ loading: loading,
50
+ LoadingComponent: /*#__PURE__*/React.createElement(MessageSearchModule.StatusLoading, null),
51
+ error: Boolean(error),
52
+ ErrorComponent: /*#__PURE__*/React.createElement(MessageSearchModule.StatusError, {
53
+ onPressRetry: search
54
+ })
55
+ }, query && /*#__PURE__*/React.createElement(MessageSearchModule.List, {
56
+ channel: channel,
57
+ onPressSearchResultItem: onPressSearchResultItem,
58
+ messages: searchResults,
59
+ renderSearchResultItem: renderItem,
60
+ flatListProps: {
61
+ keyboardDismissMode: 'on-drag',
62
+ keyboardShouldPersistTaps: 'handled',
63
+ onEndReached: next,
64
+ ListEmptyComponent: MessageSearchModule.StatusEmpty,
65
+ contentContainerStyle: {
66
+ flexGrow: 1,
67
+ ...padding
68
+ }
69
+ }
70
+ })));
71
+ };
72
+ };
73
+ const useMessageSearch = (sdk, _ref2) => {
74
+ let {
75
+ channel,
76
+ queryCreator
77
+ } = _ref2;
78
+ const [query, setQuery] = useState();
79
+ const [keyword, setKeyword] = useState('');
80
+ const [loading, setLoading] = useState(false);
81
+ const [error, setError] = useState(null);
82
+ const [searchResults, setSearchResults] = useState([]);
83
+ const queryInProgress = useRef(false);
84
+ const search = useFreshCallback(async () => {
85
+ if (keyword.length <= 0) return;
86
+ if (queryInProgress.current) return;
87
+ const query = getMessageSearchQuery(sdk, {
88
+ keyword,
89
+ channelUrl: channel.url,
90
+ messageTimestampFrom: Math.max(channel.joinedAt, channel.invitedAt),
91
+ order: MessageSearchOrder.TIMESTAMP,
92
+ queryCreator
93
+ });
94
+ setQuery(query);
95
+ setLoading(true);
96
+ setError(null);
97
+ try {
98
+ queryInProgress.current = true;
99
+ const result = await query.next();
100
+ setSearchResults(result);
101
+ } catch (err) {
102
+ Logger.warn('[MessageSearchFragment] search failure', err);
103
+ setError(err);
104
+ } finally {
105
+ queryInProgress.current = false;
106
+ setLoading(false);
107
+ }
108
+ });
109
+ const next = useFreshCallback(async () => {
110
+ if (!(query !== null && query !== void 0 && query.hasNext)) return;
111
+ if (queryInProgress.current) return;
112
+ try {
113
+ queryInProgress.current = true;
114
+ const result = await query.next();
115
+ setSearchResults(prev => [...prev, ...result]);
116
+ } catch (err) {
117
+ Logger.warn('[MessageSearchFragment] next failure', err);
118
+ setError(err);
119
+ } finally {
120
+ queryInProgress.current = false;
121
+ }
122
+ });
123
+ return {
124
+ keyword,
125
+ setKeyword,
126
+ query,
127
+ loading,
128
+ error,
129
+ searchResults,
130
+ search,
131
+ next
132
+ };
133
+ };
134
+ export default createMessageSearchFragment;
135
+ //# sourceMappingURL=createMessageSearchFragment.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"names":["React","useRef","useState","MessageSearchOrder","Logger","NOOP","useFreshCallback","useSafeAreaPadding","MessageSearchResultItem","StatusComposition","createMessageSearchModule","useSendbirdChat","getMessageSearchQuery","sdk","options","queryCreator","createMessageSearchQuery","createMessageSearchFragment","initModule","MessageSearchModule","_ref","onPressHeaderLeft","channel","renderSearchResultItem","onPressSearchResultItem","padding","keyword","setKeyword","search","searchResults","loading","next","error","query","useMessageSearch","renderItem","props","createElement","Provider","Header","onChangeKeyword","onPressHeaderRight","LoadingComponent","StatusLoading","Boolean","ErrorComponent","StatusError","onPressRetry","List","messages","flatListProps","keyboardDismissMode","keyboardShouldPersistTaps","onEndReached","ListEmptyComponent","StatusEmpty","contentContainerStyle","flexGrow","_ref2","setQuery","setLoading","setError","setSearchResults","queryInProgress","length","current","channelUrl","url","messageTimestampFrom","Math","max","joinedAt","invitedAt","order","TIMESTAMP","result","err","warn","hasNext","prev"],"sources":["createMessageSearchFragment.tsx"],"sourcesContent":["import React, { useRef, useState } from 'react';\n\nimport { MessageSearchOrder } from '@sendbird/chat/message';\nimport {\n Logger,\n NOOP,\n SendbirdBaseMessage,\n SendbirdChatSDK,\n SendbirdGroupChannel,\n SendbirdMessageSearchQuery,\n useFreshCallback,\n useSafeAreaPadding,\n} from '@sendbird/uikit-utils';\n\nimport { MessageSearchResultItem } from '../components/MessageSearchResultItem';\nimport StatusComposition from '../components/StatusComposition';\nimport { createMessageSearchModule } from '../domain/messageSearch';\nimport type { MessageSearchFragment, MessageSearchModule, MessageSearchProps } from '../domain/messageSearch/types';\nimport { useSendbirdChat } from '../hooks/useContext';\n\ntype DefaultMessageSearchQueryParams = {\n keyword: string;\n channelUrl: string;\n messageTimestampFrom: number;\n order: MessageSearchOrder;\n};\n\ntype SearchQueryOptions = DefaultMessageSearchQueryParams & {\n queryCreator?: (params: DefaultMessageSearchQueryParams) => SendbirdMessageSearchQuery;\n};\n\nfunction getMessageSearchQuery(sdk: SendbirdChatSDK, options: SearchQueryOptions) {\n if (options.queryCreator) return options.queryCreator(options);\n return sdk.createMessageSearchQuery(options);\n}\n\nconst createMessageSearchFragment = (initModule?: Partial<MessageSearchModule>): MessageSearchFragment => {\n const MessageSearchModule = createMessageSearchModule(initModule);\n\n return ({ onPressHeaderLeft = NOOP, channel, queryCreator, renderSearchResultItem, onPressSearchResultItem }) => {\n const padding = useSafeAreaPadding(['left', 'right', 'bottom']);\n\n const { sdk } = useSendbirdChat();\n const { keyword, setKeyword, search, searchResults, loading, next, error, query } = useMessageSearch(sdk, {\n channel,\n queryCreator,\n });\n\n const renderItem: MessageSearchProps['List']['renderSearchResultItem'] = useFreshCallback((props) => {\n if (renderSearchResultItem) return renderSearchResultItem(props);\n return <MessageSearchResultItem {...props} />;\n });\n\n return (\n <MessageSearchModule.Provider>\n <MessageSearchModule.Header\n keyword={keyword}\n onChangeKeyword={setKeyword}\n onPressHeaderLeft={onPressHeaderLeft}\n onPressHeaderRight={search}\n />\n <StatusComposition\n loading={loading}\n LoadingComponent={<MessageSearchModule.StatusLoading />}\n error={Boolean(error)}\n ErrorComponent={<MessageSearchModule.StatusError onPressRetry={search} />}\n >\n {query && (\n <MessageSearchModule.List\n channel={channel}\n onPressSearchResultItem={onPressSearchResultItem}\n messages={searchResults}\n renderSearchResultItem={renderItem}\n flatListProps={{\n keyboardDismissMode: 'on-drag',\n keyboardShouldPersistTaps: 'handled',\n onEndReached: next,\n ListEmptyComponent: MessageSearchModule.StatusEmpty,\n contentContainerStyle: { flexGrow: 1, ...padding },\n }}\n />\n )}\n </StatusComposition>\n </MessageSearchModule.Provider>\n );\n };\n};\n\nconst useMessageSearch = (\n sdk: SendbirdChatSDK,\n { channel, queryCreator }: { channel: SendbirdGroupChannel; queryCreator: SearchQueryOptions['queryCreator'] },\n) => {\n const [query, setQuery] = useState<SendbirdMessageSearchQuery>();\n const [keyword, setKeyword] = useState('');\n const [loading, setLoading] = useState(false);\n const [error, setError] = useState<unknown>(null);\n const [searchResults, setSearchResults] = useState<SendbirdBaseMessage[]>([]);\n const queryInProgress = useRef(false);\n\n const search = useFreshCallback(async () => {\n if (keyword.length <= 0) return;\n if (queryInProgress.current) return;\n\n const query = getMessageSearchQuery(sdk, {\n keyword,\n channelUrl: channel.url,\n messageTimestampFrom: Math.max(channel.joinedAt, channel.invitedAt),\n order: MessageSearchOrder.TIMESTAMP,\n queryCreator,\n });\n\n setQuery(query);\n setLoading(true);\n setError(null);\n\n try {\n queryInProgress.current = true;\n const result = await query.next();\n setSearchResults(result);\n } catch (err) {\n Logger.warn('[MessageSearchFragment] search failure', err);\n setError(err);\n } finally {\n queryInProgress.current = false;\n setLoading(false);\n }\n });\n\n const next = useFreshCallback(async () => {\n if (!query?.hasNext) return;\n if (queryInProgress.current) return;\n\n try {\n queryInProgress.current = true;\n const result = await query.next();\n setSearchResults((prev) => [...prev, ...result]);\n } catch (err) {\n Logger.warn('[MessageSearchFragment] next failure', err);\n setError(err);\n } finally {\n queryInProgress.current = false;\n }\n });\n\n return {\n keyword,\n setKeyword,\n\n query,\n loading,\n error,\n searchResults,\n\n search,\n next,\n };\n};\n\nexport default createMessageSearchFragment;\n"],"mappings":"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"}
@@ -1,5 +1,5 @@
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, { useMemo } from 'react';
2
+ import React, { useMemo, useState } from 'react';
3
3
  import { SendbirdError } from '@sendbird/chat';
4
4
  import { useOpenChannelMessages } from '@sendbird/uikit-chat-hooks';
5
5
  import { useToast } from '@sendbird/uikit-react-native-foundation';
@@ -10,6 +10,7 @@ import StatusComposition from '../components/StatusComposition';
10
10
  import { UNKNOWN_USER_ID } from '../constants';
11
11
  import { createOpenChannelModule } from '../domain/openChannel';
12
12
  import { useLocalization, useSendbirdChat, useUserProfile } from '../hooks/useContext';
13
+ import pubsub from '../utils/pubsub';
13
14
  const createOpenChannelFragment = initModule => {
14
15
  const OpenChannelModule = createOpenChannelModule(initModule);
15
16
  return _ref => {
@@ -46,12 +47,13 @@ const createOpenChannelFragment = initModule => {
46
47
  const {
47
48
  show: showUserProfile
48
49
  } = useUserProfile();
50
+ const [openChannelPubSub] = useState(() => pubsub());
49
51
  const {
50
52
  messages,
51
- nextMessages,
52
- newMessagesFromMembers,
53
+ newMessages,
53
54
  next,
54
55
  prev,
56
+ hasNext,
55
57
  sendFileMessage,
56
58
  sendUserMessage,
57
59
  updateFileMessage,
@@ -66,14 +68,23 @@ const createOpenChannelFragment = initModule => {
66
68
  onError(error) {
67
69
  if (error instanceof SendbirdError) {
68
70
  switch (error.code) {
69
- case SBErrorCode.CHANNEL_NOT_FOUND_SDK:
70
- case SBErrorCode.CHANNEL_NOT_FOUND_SERVER:
71
+ case SBErrorCode.RESOURCE_NOT_FOUND:
72
+ case SBErrorCode.CHANNEL_NOT_FOUND:
73
+ case SBErrorCode.BANNED_USER_SEND_MESSAGE_NOT_ALLOWED:
71
74
  {
72
75
  return showToast(STRINGS.TOAST.GET_CHANNEL_ERROR, 'error');
73
76
  }
74
77
  }
75
78
  }
76
79
  showToast(STRINGS.TOAST.UNKNOWN_ERROR, 'error');
80
+ },
81
+ onMessagesReceived(messages) {
82
+ openChannelPubSub.publish({
83
+ type: 'MESSAGES_RECEIVED',
84
+ data: {
85
+ messages
86
+ }
87
+ });
77
88
  }
78
89
  });
79
90
  const isOperator = channel.isOperator((currentUser === null || currentUser === void 0 ? void 0 : currentUser.userId) ?? UNKNOWN_USER_ID);
@@ -90,13 +101,31 @@ const createOpenChannelFragment = initModule => {
90
101
  },
91
102
  ...flatListProps
92
103
  }), [loading, flatListProps]);
104
+ const onPending = message => {
105
+ openChannelPubSub.publish({
106
+ type: 'MESSAGE_SENT_PENDING',
107
+ data: {
108
+ message
109
+ }
110
+ });
111
+ };
112
+ const onSent = message => {
113
+ openChannelPubSub.publish({
114
+ type: 'MESSAGE_SENT_SUCCESS',
115
+ data: {
116
+ message
117
+ }
118
+ });
119
+ };
93
120
  const onPressSendUserMessage = useFreshCallback(async params => {
94
121
  const processedParams = await onBeforeSendUserMessage(params);
95
- await sendUserMessage(processedParams);
122
+ const message = await sendUserMessage(processedParams, onPending);
123
+ onSent(message);
96
124
  });
97
125
  const onPressSendFileMessage = useFreshCallback(async params => {
98
126
  const processedParams = await onBeforeSendFileMessage(params);
99
- await sendFileMessage(processedParams);
127
+ const message = await sendFileMessage(processedParams, onPending);
128
+ onSent(message);
100
129
  });
101
130
  const onPressUpdateUserMessage = useFreshCallback(async (message, params) => {
102
131
  const processedParams = await onBeforeUpdateUserMessage(params);
@@ -107,6 +136,7 @@ const createOpenChannelFragment = initModule => {
107
136
  await updateFileMessage(message.messageId, processedParams);
108
137
  });
109
138
  return /*#__PURE__*/React.createElement(OpenChannelModule.Provider, {
139
+ openChannelPubSub: openChannelPubSub,
110
140
  channel: channel,
111
141
  keyboardAvoidOffset: keyboardAvoidOffset
112
142
  }, /*#__PURE__*/React.createElement(OpenChannelModule.Header, {
@@ -118,14 +148,16 @@ const createOpenChannelFragment = initModule => {
118
148
  LoadingComponent: /*#__PURE__*/React.createElement(OpenChannelModule.StatusLoading, null)
119
149
  }, /*#__PURE__*/React.createElement(OpenChannelModule.MessageList, {
120
150
  channel: channel,
151
+ hasNext: hasNext,
121
152
  enableMessageGrouping: enableMessageGrouping,
122
153
  currentUserId: currentUser === null || currentUser === void 0 ? void 0 : currentUser.userId,
123
154
  renderMessage: _renderMessage,
124
155
  messages: messages,
125
- nextMessages: nextMessages,
126
- newMessagesFromMembers: newMessagesFromMembers,
156
+ newMessages: newMessages,
127
157
  onTopReached: prev,
128
158
  onBottomReached: next,
159
+ scrolledAwayFromBottom: false,
160
+ onScrolledAwayFromBottom: NOOP,
129
161
  renderNewMessagesButton: renderNewMessagesButton,
130
162
  renderScrollToBottomButton: renderScrollToBottomButton,
131
163
  onResendFailedMessage: resendMessage,