@sendbird/uikit-react-native 3.5.3 → 3.6.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 (234) hide show
  1. package/lib/commonjs/components/ChannelInput/SendInput.js +23 -6
  2. package/lib/commonjs/components/ChannelInput/SendInput.js.map +1 -1
  3. package/lib/commonjs/components/ChannelInput/index.js.map +1 -1
  4. package/lib/commonjs/components/ChannelMessageList/index.js +22 -4
  5. package/lib/commonjs/components/ChannelMessageList/index.js.map +1 -1
  6. package/lib/commonjs/components/ChannelThreadMessageList/index.js +349 -0
  7. package/lib/commonjs/components/ChannelThreadMessageList/index.js.map +1 -0
  8. package/lib/commonjs/components/GroupChannelMessageRenderer/GroupChannelMessageParentMessage.js +2 -2
  9. package/lib/commonjs/components/GroupChannelMessageRenderer/GroupChannelMessageParentMessage.js.map +1 -1
  10. package/lib/commonjs/components/GroupChannelMessageRenderer/GroupChannelMessageReplyInfo.js +100 -0
  11. package/lib/commonjs/components/GroupChannelMessageRenderer/GroupChannelMessageReplyInfo.js.map +1 -0
  12. package/lib/commonjs/components/GroupChannelMessageRenderer/index.js +24 -6
  13. package/lib/commonjs/components/GroupChannelMessageRenderer/index.js.map +1 -1
  14. package/lib/commonjs/components/ReactionAddons/MessageReactionAddon.js +23 -6
  15. package/lib/commonjs/components/ReactionAddons/MessageReactionAddon.js.map +1 -1
  16. package/lib/commonjs/components/ThreadChatFlatList/index.js +76 -0
  17. package/lib/commonjs/components/ThreadChatFlatList/index.js.map +1 -0
  18. package/lib/commonjs/components/ThreadParentMessageRenderer/ThreadParentMessage.file.image.js +41 -0
  19. package/lib/commonjs/components/ThreadParentMessageRenderer/ThreadParentMessage.file.image.js.map +1 -0
  20. package/lib/commonjs/components/ThreadParentMessageRenderer/ThreadParentMessage.file.js +74 -0
  21. package/lib/commonjs/components/ThreadParentMessageRenderer/ThreadParentMessage.file.js.map +1 -0
  22. package/lib/commonjs/components/ThreadParentMessageRenderer/ThreadParentMessage.file.video.js +42 -0
  23. package/lib/commonjs/components/ThreadParentMessageRenderer/ThreadParentMessage.file.video.js.map +1 -0
  24. package/lib/commonjs/components/ThreadParentMessageRenderer/ThreadParentMessage.file.voice.js +94 -0
  25. package/lib/commonjs/components/ThreadParentMessageRenderer/ThreadParentMessage.file.voice.js.map +1 -0
  26. package/lib/commonjs/components/ThreadParentMessageRenderer/ThreadParentMessage.user.js +61 -0
  27. package/lib/commonjs/components/ThreadParentMessageRenderer/ThreadParentMessage.user.js.map +1 -0
  28. package/lib/commonjs/components/ThreadParentMessageRenderer/ThreadParentMessage.user.og.js +127 -0
  29. package/lib/commonjs/components/ThreadParentMessageRenderer/ThreadParentMessage.user.og.js.map +1 -0
  30. package/lib/commonjs/components/ThreadParentMessageRenderer/index.js +206 -0
  31. package/lib/commonjs/components/ThreadParentMessageRenderer/index.js.map +1 -0
  32. package/lib/commonjs/containers/SendbirdUIKitContainer.js +7 -1
  33. package/lib/commonjs/containers/SendbirdUIKitContainer.js.map +1 -1
  34. package/lib/commonjs/contexts/SendbirdChatCtx.js +7 -0
  35. package/lib/commonjs/contexts/SendbirdChatCtx.js.map +1 -1
  36. package/lib/commonjs/domain/groupChannel/component/GroupChannelMessageList.js +28 -5
  37. package/lib/commonjs/domain/groupChannel/component/GroupChannelMessageList.js.map +1 -1
  38. package/lib/commonjs/domain/groupChannel/module/moduleContext.js +14 -4
  39. package/lib/commonjs/domain/groupChannel/module/moduleContext.js.map +1 -1
  40. package/lib/commonjs/domain/groupChannel/types.js.map +1 -1
  41. package/lib/commonjs/domain/groupChannelThread/component/GroupChannelThreadHeader.js +82 -0
  42. package/lib/commonjs/domain/groupChannelThread/component/GroupChannelThreadHeader.js.map +1 -0
  43. package/lib/commonjs/domain/groupChannelThread/component/GroupChannelThreadInput.js +44 -0
  44. package/lib/commonjs/domain/groupChannelThread/component/GroupChannelThreadInput.js.map +1 -0
  45. package/lib/commonjs/domain/groupChannelThread/component/GroupChannelThreadMessageList.js +127 -0
  46. package/lib/commonjs/domain/groupChannelThread/component/GroupChannelThreadMessageList.js.map +1 -0
  47. package/lib/commonjs/domain/groupChannelThread/component/GroupChannelThreadParentMessageInfo.js +315 -0
  48. package/lib/commonjs/domain/groupChannelThread/component/GroupChannelThreadParentMessageInfo.js.map +1 -0
  49. package/lib/commonjs/domain/groupChannelThread/component/GroupChannelThreadStatusEmpty.js +27 -0
  50. package/lib/commonjs/domain/groupChannelThread/component/GroupChannelThreadStatusEmpty.js.map +1 -0
  51. package/lib/commonjs/domain/groupChannelThread/component/GroupChannelThreadStatusLoading.js +27 -0
  52. package/lib/commonjs/domain/groupChannelThread/component/GroupChannelThreadStatusLoading.js.map +1 -0
  53. package/lib/commonjs/domain/groupChannelThread/component/GroupChannelThreadSuggestedMentionList.js +195 -0
  54. package/lib/commonjs/domain/groupChannelThread/component/GroupChannelThreadSuggestedMentionList.js.map +1 -0
  55. package/lib/commonjs/domain/groupChannelThread/index.js +69 -0
  56. package/lib/commonjs/domain/groupChannelThread/index.js.map +1 -0
  57. package/lib/commonjs/domain/groupChannelThread/module/createGroupChannelThreadModule.js +42 -0
  58. package/lib/commonjs/domain/groupChannelThread/module/createGroupChannelThreadModule.js.map +1 -0
  59. package/lib/commonjs/domain/groupChannelThread/module/moduleContext.js +148 -0
  60. package/lib/commonjs/domain/groupChannelThread/module/moduleContext.js.map +1 -0
  61. package/lib/commonjs/domain/groupChannelThread/types.js +6 -0
  62. package/lib/commonjs/domain/groupChannelThread/types.js.map +1 -0
  63. package/lib/commonjs/fragments/createGroupChannelFragment.js +30 -5
  64. package/lib/commonjs/fragments/createGroupChannelFragment.js.map +1 -1
  65. package/lib/commonjs/fragments/createGroupChannelThreadFragment.js +267 -0
  66. package/lib/commonjs/fragments/createGroupChannelThreadFragment.js.map +1 -0
  67. package/lib/commonjs/hooks/useMentionSuggestion.js +5 -2
  68. package/lib/commonjs/hooks/useMentionSuggestion.js.map +1 -1
  69. package/lib/commonjs/index.js +72 -40
  70. package/lib/commonjs/index.js.map +1 -1
  71. package/lib/commonjs/libs/VoiceMessageStatusManager.js +66 -0
  72. package/lib/commonjs/libs/VoiceMessageStatusManager.js.map +1 -0
  73. package/lib/commonjs/localization/StringSet.type.js.map +1 -1
  74. package/lib/commonjs/localization/createBaseStringSet.js +25 -3
  75. package/lib/commonjs/localization/createBaseStringSet.js.map +1 -1
  76. package/lib/commonjs/version.js +1 -1
  77. package/lib/commonjs/version.js.map +1 -1
  78. package/lib/module/components/ChannelInput/SendInput.js +23 -6
  79. package/lib/module/components/ChannelInput/SendInput.js.map +1 -1
  80. package/lib/module/components/ChannelInput/index.js.map +1 -1
  81. package/lib/module/components/ChannelMessageList/index.js +22 -4
  82. package/lib/module/components/ChannelMessageList/index.js.map +1 -1
  83. package/lib/module/components/ChannelThreadMessageList/index.js +341 -0
  84. package/lib/module/components/ChannelThreadMessageList/index.js.map +1 -0
  85. package/lib/module/components/GroupChannelMessageRenderer/GroupChannelMessageParentMessage.js +2 -2
  86. package/lib/module/components/GroupChannelMessageRenderer/GroupChannelMessageParentMessage.js.map +1 -1
  87. package/lib/module/components/GroupChannelMessageRenderer/GroupChannelMessageReplyInfo.js +92 -0
  88. package/lib/module/components/GroupChannelMessageRenderer/GroupChannelMessageReplyInfo.js.map +1 -0
  89. package/lib/module/components/GroupChannelMessageRenderer/index.js +24 -6
  90. package/lib/module/components/GroupChannelMessageRenderer/index.js.map +1 -1
  91. package/lib/module/components/ReactionAddons/MessageReactionAddon.js +23 -6
  92. package/lib/module/components/ReactionAddons/MessageReactionAddon.js.map +1 -1
  93. package/lib/module/components/ThreadChatFlatList/index.js +66 -0
  94. package/lib/module/components/ThreadChatFlatList/index.js.map +1 -0
  95. package/lib/module/components/ThreadParentMessageRenderer/ThreadParentMessage.file.image.js +34 -0
  96. package/lib/module/components/ThreadParentMessageRenderer/ThreadParentMessage.file.image.js.map +1 -0
  97. package/lib/module/components/ThreadParentMessageRenderer/ThreadParentMessage.file.js +67 -0
  98. package/lib/module/components/ThreadParentMessageRenderer/ThreadParentMessage.file.js.map +1 -0
  99. package/lib/module/components/ThreadParentMessageRenderer/ThreadParentMessage.file.video.js +34 -0
  100. package/lib/module/components/ThreadParentMessageRenderer/ThreadParentMessage.file.video.js.map +1 -0
  101. package/lib/module/components/ThreadParentMessageRenderer/ThreadParentMessage.file.voice.js +87 -0
  102. package/lib/module/components/ThreadParentMessageRenderer/ThreadParentMessage.file.voice.js.map +1 -0
  103. package/lib/module/components/ThreadParentMessageRenderer/ThreadParentMessage.user.js +54 -0
  104. package/lib/module/components/ThreadParentMessageRenderer/ThreadParentMessage.user.js.map +1 -0
  105. package/lib/module/components/ThreadParentMessageRenderer/ThreadParentMessage.user.og.js +119 -0
  106. package/lib/module/components/ThreadParentMessageRenderer/ThreadParentMessage.user.og.js.map +1 -0
  107. package/lib/module/components/ThreadParentMessageRenderer/index.js +196 -0
  108. package/lib/module/components/ThreadParentMessageRenderer/index.js.map +1 -0
  109. package/lib/module/containers/SendbirdUIKitContainer.js +7 -1
  110. package/lib/module/containers/SendbirdUIKitContainer.js.map +1 -1
  111. package/lib/module/contexts/SendbirdChatCtx.js +6 -0
  112. package/lib/module/contexts/SendbirdChatCtx.js.map +1 -1
  113. package/lib/module/domain/groupChannel/component/GroupChannelMessageList.js +30 -6
  114. package/lib/module/domain/groupChannel/component/GroupChannelMessageList.js.map +1 -1
  115. package/lib/module/domain/groupChannel/module/moduleContext.js +14 -4
  116. package/lib/module/domain/groupChannel/module/moduleContext.js.map +1 -1
  117. package/lib/module/domain/groupChannel/types.js.map +1 -1
  118. package/lib/module/domain/groupChannelThread/component/GroupChannelThreadHeader.js +73 -0
  119. package/lib/module/domain/groupChannelThread/component/GroupChannelThreadHeader.js.map +1 -0
  120. package/lib/module/domain/groupChannelThread/component/GroupChannelThreadInput.js +34 -0
  121. package/lib/module/domain/groupChannelThread/component/GroupChannelThreadInput.js.map +1 -0
  122. package/lib/module/domain/groupChannelThread/component/GroupChannelThreadMessageList.js +117 -0
  123. package/lib/module/domain/groupChannelThread/component/GroupChannelThreadMessageList.js.map +1 -0
  124. package/lib/module/domain/groupChannelThread/component/GroupChannelThreadParentMessageInfo.js +305 -0
  125. package/lib/module/domain/groupChannelThread/component/GroupChannelThreadParentMessageInfo.js.map +1 -0
  126. package/lib/module/domain/groupChannelThread/component/GroupChannelThreadStatusEmpty.js +19 -0
  127. package/lib/module/domain/groupChannelThread/component/GroupChannelThreadStatusEmpty.js.map +1 -0
  128. package/lib/module/domain/groupChannelThread/component/GroupChannelThreadStatusLoading.js +19 -0
  129. package/lib/module/domain/groupChannelThread/component/GroupChannelThreadStatusLoading.js.map +1 -0
  130. package/lib/module/domain/groupChannelThread/component/GroupChannelThreadSuggestedMentionList.js +185 -0
  131. package/lib/module/domain/groupChannelThread/component/GroupChannelThreadSuggestedMentionList.js.map +1 -0
  132. package/lib/module/domain/groupChannelThread/index.js +9 -0
  133. package/lib/module/domain/groupChannelThread/index.js.map +1 -0
  134. package/lib/module/domain/groupChannelThread/module/createGroupChannelThreadModule.js +34 -0
  135. package/lib/module/domain/groupChannelThread/module/createGroupChannelThreadModule.js.map +1 -0
  136. package/lib/module/domain/groupChannelThread/module/moduleContext.js +137 -0
  137. package/lib/module/domain/groupChannelThread/module/moduleContext.js.map +1 -0
  138. package/lib/module/domain/groupChannelThread/types.js +2 -0
  139. package/lib/module/domain/groupChannelThread/types.js.map +1 -0
  140. package/lib/module/fragments/createGroupChannelFragment.js +33 -7
  141. package/lib/module/fragments/createGroupChannelFragment.js.map +1 -1
  142. package/lib/module/fragments/createGroupChannelThreadFragment.js +257 -0
  143. package/lib/module/fragments/createGroupChannelThreadFragment.js.map +1 -0
  144. package/lib/module/hooks/useMentionSuggestion.js +5 -2
  145. package/lib/module/hooks/useMentionSuggestion.js.map +1 -1
  146. package/lib/module/index.js +3 -0
  147. package/lib/module/index.js.map +1 -1
  148. package/lib/module/libs/VoiceMessageStatusManager.js +59 -0
  149. package/lib/module/libs/VoiceMessageStatusManager.js.map +1 -0
  150. package/lib/module/localization/StringSet.type.js.map +1 -1
  151. package/lib/module/localization/createBaseStringSet.js +27 -4
  152. package/lib/module/localization/createBaseStringSet.js.map +1 -1
  153. package/lib/module/version.js +1 -1
  154. package/lib/module/version.js.map +1 -1
  155. package/lib/typescript/src/components/ChannelInput/index.d.ts +1 -0
  156. package/lib/typescript/src/components/ChannelMessageList/index.d.ts +5 -2
  157. package/lib/typescript/src/components/ChannelThreadMessageList/index.d.ts +55 -0
  158. package/lib/typescript/src/components/GroupChannelMessageRenderer/GroupChannelMessageParentMessage.d.ts +1 -1
  159. package/lib/typescript/src/components/GroupChannelMessageRenderer/GroupChannelMessageReplyInfo.d.ts +9 -0
  160. package/lib/typescript/src/components/GroupChannelMessageRenderer/index.d.ts +3 -1
  161. package/lib/typescript/src/components/OpenChannelMessageRenderer/index.d.ts +3 -1
  162. package/lib/typescript/src/components/ReactionAddons/MessageReactionAddon.d.ts +3 -1
  163. package/lib/typescript/src/components/ReactionAddons/index.d.ts +2 -1
  164. package/lib/typescript/src/components/ThreadChatFlatList/index.d.ts +9 -0
  165. package/lib/typescript/src/components/ThreadParentMessageRenderer/ThreadParentMessage.file.d.ts +4 -0
  166. package/lib/typescript/src/components/ThreadParentMessageRenderer/ThreadParentMessage.file.image.d.ts +4 -0
  167. package/lib/typescript/src/components/ThreadParentMessageRenderer/ThreadParentMessage.file.video.d.ts +9 -0
  168. package/lib/typescript/src/components/ThreadParentMessageRenderer/ThreadParentMessage.file.voice.d.ts +13 -0
  169. package/lib/typescript/src/components/ThreadParentMessageRenderer/ThreadParentMessage.user.d.ts +10 -0
  170. package/lib/typescript/src/components/ThreadParentMessageRenderer/ThreadParentMessage.user.og.d.ts +10 -0
  171. package/lib/typescript/src/components/ThreadParentMessageRenderer/index.d.ts +20 -0
  172. package/lib/typescript/src/containers/SendbirdUIKitContainer.d.ts +6 -4
  173. package/lib/typescript/src/contexts/SendbirdChatCtx.d.ts +15 -1
  174. package/lib/typescript/src/domain/groupChannel/types.d.ts +4 -1
  175. package/lib/typescript/src/domain/groupChannelThread/component/GroupChannelThreadHeader.d.ts +4 -0
  176. package/lib/typescript/src/domain/groupChannelThread/component/GroupChannelThreadInput.d.ts +3 -0
  177. package/lib/typescript/src/domain/groupChannelThread/component/GroupChannelThreadMessageList.d.ts +7 -0
  178. package/lib/typescript/src/domain/groupChannelThread/component/GroupChannelThreadParentMessageInfo.d.ts +8 -0
  179. package/lib/typescript/src/domain/groupChannelThread/component/GroupChannelThreadStatusEmpty.d.ts +3 -0
  180. package/lib/typescript/src/domain/groupChannelThread/component/GroupChannelThreadStatusLoading.d.ts +3 -0
  181. package/lib/typescript/src/domain/groupChannelThread/component/GroupChannelThreadSuggestedMentionList.d.ts +4 -0
  182. package/lib/typescript/src/domain/groupChannelThread/index.d.ts +8 -0
  183. package/lib/typescript/src/domain/groupChannelThread/module/createGroupChannelThreadModule.d.ts +3 -0
  184. package/lib/typescript/src/domain/groupChannelThread/module/moduleContext.d.ts +3 -0
  185. package/lib/typescript/src/domain/groupChannelThread/types.d.ts +136 -0
  186. package/lib/typescript/src/domain/openChannel/component/OpenChannelHeader.d.ts +1 -1
  187. package/lib/typescript/src/fragments/createGroupChannelThreadFragment.d.ts +5 -0
  188. package/lib/typescript/src/hooks/useChannelInputItems.d.ts +1 -1
  189. package/lib/typescript/src/index.d.ts +3 -0
  190. package/lib/typescript/src/libs/VoiceMessageStatusManager.d.ts +11 -0
  191. package/lib/typescript/src/localization/StringSet.type.d.ts +23 -0
  192. package/lib/typescript/src/localization/createBaseStringSet.d.ts +1 -1
  193. package/lib/typescript/src/version.d.ts +1 -1
  194. package/package.json +6 -6
  195. package/src/components/ChannelInput/SendInput.tsx +24 -5
  196. package/src/components/ChannelInput/index.tsx +1 -0
  197. package/src/components/ChannelMessageList/index.tsx +27 -5
  198. package/src/components/ChannelThreadMessageList/index.tsx +406 -0
  199. package/src/components/GroupChannelMessageRenderer/GroupChannelMessageParentMessage.tsx +3 -3
  200. package/src/components/GroupChannelMessageRenderer/GroupChannelMessageReplyInfo.tsx +96 -0
  201. package/src/components/GroupChannelMessageRenderer/index.tsx +21 -5
  202. package/src/components/ReactionAddons/MessageReactionAddon.tsx +38 -5
  203. package/src/components/ThreadChatFlatList/index.tsx +63 -0
  204. package/src/components/ThreadParentMessageRenderer/ThreadParentMessage.file.image.tsx +36 -0
  205. package/src/components/ThreadParentMessageRenderer/ThreadParentMessage.file.tsx +61 -0
  206. package/src/components/ThreadParentMessageRenderer/ThreadParentMessage.file.video.tsx +45 -0
  207. package/src/components/ThreadParentMessageRenderer/ThreadParentMessage.file.voice.tsx +107 -0
  208. package/src/components/ThreadParentMessageRenderer/ThreadParentMessage.user.og.tsx +133 -0
  209. package/src/components/ThreadParentMessageRenderer/ThreadParentMessage.user.tsx +65 -0
  210. package/src/components/ThreadParentMessageRenderer/index.tsx +194 -0
  211. package/src/containers/SendbirdUIKitContainer.tsx +9 -4
  212. package/src/contexts/SendbirdChatCtx.tsx +20 -0
  213. package/src/domain/groupChannel/component/GroupChannelMessageList.tsx +37 -8
  214. package/src/domain/groupChannel/module/moduleContext.tsx +12 -2
  215. package/src/domain/groupChannel/types.ts +5 -0
  216. package/src/domain/groupChannelThread/component/GroupChannelThreadHeader.tsx +63 -0
  217. package/src/domain/groupChannelThread/component/GroupChannelThreadInput.tsx +38 -0
  218. package/src/domain/groupChannelThread/component/GroupChannelThreadMessageList.tsx +105 -0
  219. package/src/domain/groupChannelThread/component/GroupChannelThreadParentMessageInfo.tsx +326 -0
  220. package/src/domain/groupChannelThread/component/GroupChannelThreadStatusEmpty.tsx +18 -0
  221. package/src/domain/groupChannelThread/component/GroupChannelThreadStatusLoading.tsx +18 -0
  222. package/src/domain/groupChannelThread/component/GroupChannelThreadSuggestedMentionList.tsx +174 -0
  223. package/src/domain/groupChannelThread/index.ts +8 -0
  224. package/src/domain/groupChannelThread/module/createGroupChannelThreadModule.tsx +35 -0
  225. package/src/domain/groupChannelThread/module/moduleContext.tsx +165 -0
  226. package/src/domain/groupChannelThread/types.ts +184 -0
  227. package/src/fragments/createGroupChannelFragment.tsx +38 -8
  228. package/src/fragments/createGroupChannelThreadFragment.tsx +280 -0
  229. package/src/hooks/useMentionSuggestion.ts +13 -9
  230. package/src/index.ts +4 -0
  231. package/src/libs/VoiceMessageStatusManager.ts +56 -0
  232. package/src/localization/StringSet.type.ts +27 -0
  233. package/src/localization/createBaseStringSet.ts +33 -4
  234. package/src/version.ts +1 -1
@@ -0,0 +1,105 @@
1
+ import React, { useContext, useEffect, useLayoutEffect, useRef } from 'react';
2
+
3
+ import { useChannelHandler } from '@sendbird/uikit-chat-hooks';
4
+ import { isDifferentChannel, useFreshCallback, useUniqHandlerId } from '@sendbird/uikit-utils';
5
+
6
+ import ChannelThreadMessageList from '../../../components/ChannelThreadMessageList';
7
+ import { useSendbirdChat } from '../../../hooks/useContext';
8
+ import { GroupChannelThreadContexts } from '../module/moduleContext';
9
+ import type { GroupChannelThreadProps } from '../types';
10
+
11
+ const GroupChannelThreadMessageList = (props: GroupChannelThreadProps['MessageList']) => {
12
+ const { sdk } = useSendbirdChat();
13
+ const { setMessageToEdit } = useContext(GroupChannelThreadContexts.Fragment);
14
+ const { subscribe } = useContext(GroupChannelThreadContexts.PubSub);
15
+ const { flatListRef, lazyScrollToBottom, lazyScrollToIndex } = useContext(GroupChannelThreadContexts.MessageList);
16
+
17
+ const id = useUniqHandlerId('GroupChannelThreadMessageList');
18
+ const ignorePropReached = useRef(false);
19
+
20
+ const _onTopReached = () => {
21
+ if (!ignorePropReached.current) {
22
+ props.onTopReached();
23
+ }
24
+ };
25
+
26
+ const _onBottomReached = () => {
27
+ if (!ignorePropReached.current) {
28
+ props.onBottomReached();
29
+ }
30
+ };
31
+
32
+ const scrollToBottom = useFreshCallback(async (animated = false) => {
33
+ if (props.hasNext()) {
34
+ props.onScrolledAwayFromBottom(false);
35
+
36
+ await props.onResetMessageList();
37
+ props.onScrolledAwayFromBottom(false);
38
+ lazyScrollToBottom({ animated });
39
+ } else {
40
+ lazyScrollToBottom({ animated });
41
+ }
42
+ });
43
+
44
+ useLayoutEffect(() => {
45
+ if (props.startingPoint) {
46
+ const foundMessageIndex = props.messages.findIndex((it) => it.createdAt === props.startingPoint);
47
+ const isIncludedInList = foundMessageIndex > -1;
48
+ if (isIncludedInList) {
49
+ ignorePropReached.current = true;
50
+ const timeout = 300;
51
+ lazyScrollToIndex({ index: foundMessageIndex, animated: true, timeout: timeout });
52
+ setTimeout(() => {
53
+ ignorePropReached.current = false;
54
+ }, timeout + 50);
55
+ }
56
+ }
57
+ }, [props.startingPoint]);
58
+
59
+ useChannelHandler(sdk, id, {
60
+ onReactionUpdated(channel, event) {
61
+ if (isDifferentChannel(channel, props.channel)) return;
62
+ const recentMessage = props.messages[0];
63
+ const isRecentMessage = recentMessage && recentMessage.messageId === event.messageId;
64
+ const scrollReachedBottomAndCanScroll = !props.scrolledAwayFromBottom && !props.hasNext();
65
+ if (isRecentMessage && scrollReachedBottomAndCanScroll) {
66
+ lazyScrollToBottom({ animated: true, timeout: 250 });
67
+ }
68
+ },
69
+ });
70
+
71
+ useEffect(() => {
72
+ return subscribe(({ type }) => {
73
+ switch (type) {
74
+ case 'TYPING_BUBBLE_RENDERED':
75
+ case 'MESSAGES_RECEIVED': {
76
+ if (!props.scrolledAwayFromBottom) {
77
+ scrollToBottom(true);
78
+ }
79
+ break;
80
+ }
81
+ case 'MESSAGE_SENT_SUCCESS':
82
+ case 'MESSAGE_SENT_PENDING': {
83
+ scrollToBottom(false);
84
+ break;
85
+ }
86
+ }
87
+ });
88
+ }, [props.scrolledAwayFromBottom]);
89
+
90
+ return (
91
+ <ChannelThreadMessageList
92
+ {...props}
93
+ ref={flatListRef}
94
+ onTopReached={_onTopReached}
95
+ onBottomReached={_onBottomReached}
96
+ onEditMessage={setMessageToEdit}
97
+ onPressNewMessagesButton={scrollToBottom}
98
+ onPressScrollToBottomButton={scrollToBottom}
99
+ renderNewMessagesButton={null}
100
+ renderScrollToBottomButton={null}
101
+ />
102
+ );
103
+ };
104
+
105
+ export default React.memo(GroupChannelThreadMessageList);
@@ -0,0 +1,326 @@
1
+ import React, { useContext } from 'react';
2
+ import { TouchableOpacity, View } from 'react-native';
3
+
4
+ import {
5
+ Avatar,
6
+ BottomSheetItem,
7
+ Divider,
8
+ Icon,
9
+ Text,
10
+ createStyleSheet,
11
+ useAlert,
12
+ useBottomSheet,
13
+ useToast,
14
+ useUIKitTheme,
15
+ } from '@sendbird/uikit-react-native-foundation';
16
+ import {
17
+ Logger,
18
+ SendbirdFileMessage,
19
+ SendbirdMessage,
20
+ SendbirdUserMessage,
21
+ getAvailableUriFromFileMessage,
22
+ getFileExtension,
23
+ getFileType,
24
+ isMyMessage,
25
+ isVoiceMessage,
26
+ shouldRenderReaction,
27
+ toMegabyte,
28
+ } from '@sendbird/uikit-utils';
29
+
30
+ import ThreadParentMessageRenderer, {
31
+ ThreadParentMessageRendererProps,
32
+ } from '../../../components/ThreadParentMessageRenderer';
33
+ import { useLocalization, usePlatformService, useSendbirdChat } from '../../../hooks/useContext';
34
+ import SBUUtils from '../../../libs/SBUUtils';
35
+ import { GroupChannelThreadContexts } from '../module/moduleContext';
36
+ import type { GroupChannelThreadProps } from '../types';
37
+ import { ReactionAddons } from './../../../components/ReactionAddons';
38
+
39
+ type PressActions = { onPress?: () => void; onLongPress?: () => void; bottomSheetItem?: BottomSheetItem };
40
+ type HandleableMessage = SendbirdUserMessage | SendbirdFileMessage;
41
+ type CreateMessagePressActions = (params: { message: SendbirdMessage }) => PressActions;
42
+
43
+ const GroupChannelThreadParentMessageInfo = (props: GroupChannelThreadProps['ParentMessageInfo']) => {
44
+ const { channel, parentMessage, setMessageToEdit } = useContext(GroupChannelThreadContexts.Fragment);
45
+ const { STRINGS } = useLocalization();
46
+ const { colors } = useUIKitTheme();
47
+ const { sbOptions } = useSendbirdChat();
48
+
49
+ const nickName = parentMessage.sender?.nickname || STRINGS.LABELS.USER_NO_NAME;
50
+ const messageTimestamp = STRINGS.GROUP_CHANNEL_THREAD.PARENT_MESSAGE_TIME(parentMessage);
51
+ const replyCountText = STRINGS.GROUP_CHANNEL_THREAD.REPLY_COUNT(parentMessage.threadInfo?.replyCount || 0);
52
+ const createMessagePressActions = useCreateMessagePressActions({
53
+ channel: props.channel,
54
+ currentUserId: props.currentUserId,
55
+ onDeleteMessage: props.onDeleteMessage,
56
+ onPressMediaMessage: props.onPressMediaMessage,
57
+ onEditMessage: setMessageToEdit,
58
+ });
59
+ const { onPress, onLongPress, bottomSheetItem } = createMessagePressActions({ message: parentMessage });
60
+
61
+ const renderMessageInfoAndMenu = () => {
62
+ return (
63
+ <View style={styles.infoAndMenuContainer}>
64
+ <Avatar size={34} uri={parentMessage.sender?.profileUrl} />
65
+ <View style={styles.userNickAndTimeContainer}>
66
+ <Text h2 color={colors.onBackground01} numberOfLines={1} style={styles.userNickname}>
67
+ {nickName}
68
+ </Text>
69
+ <Text caption2 color={colors.onBackground03} style={styles.messageTime}>
70
+ {messageTimestamp}
71
+ </Text>
72
+ </View>
73
+ <TouchableOpacity activeOpacity={0.7} onPress={bottomSheetItem ? onLongPress : undefined}>
74
+ <Icon icon={'more'} color={colors.onBackground02} />
75
+ </TouchableOpacity>
76
+ </View>
77
+ );
78
+ };
79
+
80
+ const renderReplyCount = (replyCountText: string) => {
81
+ if (replyCountText) {
82
+ return (
83
+ <View style={styles.replyContainer}>
84
+ <Text caption3 color={colors.onBackground03} style={styles.replyText}>
85
+ {replyCountText}
86
+ </Text>
87
+ <Divider />
88
+ </View>
89
+ );
90
+ } else {
91
+ return null;
92
+ }
93
+ };
94
+
95
+ const renderReactionAddons = () => {
96
+ const configs = sbOptions.uikitWithAppInfo.groupChannel.channel;
97
+ if (shouldRenderReaction(channel, channel.isSuper ? configs.enableReactionsSupergroup : configs.enableReactions)) {
98
+ return (
99
+ <View style={styles.reactionButtonContainer}>
100
+ <ReactionAddons.Message
101
+ channel={props.channel}
102
+ message={parentMessage}
103
+ reactionAddonType={'thread_parent_message'}
104
+ />
105
+ </View>
106
+ );
107
+ } else {
108
+ return null;
109
+ }
110
+ };
111
+
112
+ const messageProps: ThreadParentMessageRendererProps = {
113
+ parentMessage,
114
+ onPress,
115
+ onLongPress,
116
+ };
117
+
118
+ return (
119
+ <View>
120
+ <View style={styles.container}>{renderMessageInfoAndMenu()}</View>
121
+ <View style={styles.messageContainer}>
122
+ <ThreadParentMessageRenderer {...messageProps}></ThreadParentMessageRenderer>
123
+ </View>
124
+ {renderReactionAddons()}
125
+ <Divider />
126
+ {renderReplyCount(replyCountText)}
127
+ </View>
128
+ );
129
+ };
130
+
131
+ const styles = createStyleSheet({
132
+ container: {
133
+ flexDirection: 'column',
134
+ },
135
+ infoAndMenuContainer: {
136
+ flexDirection: 'row',
137
+ height: 50,
138
+ padding: 16,
139
+ paddingBottom: 0,
140
+ },
141
+ userNickAndTimeContainer: {
142
+ flexDirection: 'column',
143
+ flex: 1,
144
+ marginLeft: 8,
145
+ },
146
+ userNickname: {
147
+ marginBottom: 2,
148
+ },
149
+ messageTime: {
150
+ marginTop: 2,
151
+ },
152
+ contextMenuButton: {
153
+ width: 34,
154
+ height: 34,
155
+ justifyContent: 'flex-end',
156
+ },
157
+ messageContainer: {
158
+ paddingHorizontal: 16,
159
+ paddingVertical: 8,
160
+ },
161
+ reactionButtonContainer: {
162
+ paddingLeft: 16,
163
+ marginBottom: 16,
164
+ },
165
+ replyContainer: {
166
+ flexDirection: 'column',
167
+ },
168
+ replyText: {
169
+ justifyContent: 'center',
170
+ paddingHorizontal: 16,
171
+ paddingVertical: 12,
172
+ },
173
+ });
174
+
175
+ const useCreateMessagePressActions = ({
176
+ channel,
177
+ currentUserId,
178
+ onDeleteMessage,
179
+ onPressMediaMessage,
180
+ onEditMessage,
181
+ }: Pick<
182
+ GroupChannelThreadProps['ParentMessageInfo'],
183
+ 'channel' | 'currentUserId' | 'onDeleteMessage' | 'onPressMediaMessage'
184
+ > & { onEditMessage: (message: HandleableMessage) => void }): CreateMessagePressActions => {
185
+ const { STRINGS } = useLocalization();
186
+ const toast = useToast();
187
+ const { openSheet } = useBottomSheet();
188
+ const { alert } = useAlert();
189
+ const { clipboardService, fileService } = usePlatformService();
190
+ const { sbOptions } = useSendbirdChat();
191
+
192
+ const onDeleteFailure = (error: Error) => {
193
+ toast.show(STRINGS.TOAST.DELETE_MSG_ERROR, 'error');
194
+ Logger.error(STRINGS.TOAST.DELETE_MSG_ERROR, error);
195
+ };
196
+
197
+ const onCopyText = (message: HandleableMessage) => {
198
+ if (message.isUserMessage()) {
199
+ clipboardService.setString(message.message || '');
200
+ toast.show(STRINGS.TOAST.COPY_OK, 'success');
201
+ }
202
+ };
203
+
204
+ const onDownloadFile = (message: HandleableMessage) => {
205
+ if (message.isFileMessage()) {
206
+ if (toMegabyte(message.size) > 4) {
207
+ toast.show(STRINGS.TOAST.DOWNLOAD_START, 'success');
208
+ }
209
+
210
+ fileService
211
+ .save({ fileUrl: message.url, fileName: message.name, fileType: message.type })
212
+ .then((response) => {
213
+ toast.show(STRINGS.TOAST.DOWNLOAD_OK, 'success');
214
+ Logger.log('File saved to', response);
215
+ })
216
+ .catch((err) => {
217
+ toast.show(STRINGS.TOAST.DOWNLOAD_ERROR, 'error');
218
+ Logger.log('File save failure', err);
219
+ });
220
+ }
221
+ };
222
+
223
+ const onOpenFile = (message: HandleableMessage) => {
224
+ if (message.isFileMessage()) {
225
+ const fileType = getFileType(message.type || getFileExtension(message.name));
226
+ if (['image', 'video', 'audio'].includes(fileType)) {
227
+ onPressMediaMessage?.(message, () => onDeleteMessage?.(message), getAvailableUriFromFileMessage(message));
228
+ } else {
229
+ SBUUtils.openURL(message.url);
230
+ }
231
+ }
232
+ };
233
+
234
+ const alertForMessageDelete = (message: HandleableMessage) => {
235
+ alert({
236
+ title: STRINGS.LABELS.CHANNEL_MESSAGE_DELETE_CONFIRM_TITLE,
237
+ buttons: [
238
+ { text: STRINGS.LABELS.CHANNEL_MESSAGE_DELETE_CONFIRM_CANCEL },
239
+ {
240
+ text: STRINGS.LABELS.CHANNEL_MESSAGE_DELETE_CONFIRM_OK,
241
+ style: 'destructive',
242
+ onPress: () => {
243
+ onDeleteMessage?.(message).catch(onDeleteFailure);
244
+ },
245
+ },
246
+ ],
247
+ });
248
+ };
249
+
250
+ return ({ message }) => {
251
+ if (!message.isUserMessage() && !message.isFileMessage()) return {};
252
+
253
+ const sheetItems: BottomSheetItem['sheetItems'] = [];
254
+ const menu = {
255
+ copy: (message: HandleableMessage) => ({
256
+ icon: 'copy' as const,
257
+ title: STRINGS.LABELS.CHANNEL_MESSAGE_COPY,
258
+ onPress: () => onCopyText(message),
259
+ }),
260
+ edit: (message: HandleableMessage) => ({
261
+ icon: 'edit' as const,
262
+ title: STRINGS.LABELS.CHANNEL_MESSAGE_EDIT,
263
+ onPress: () => onEditMessage?.(message),
264
+ }),
265
+ delete: (message: HandleableMessage) => ({
266
+ disabled: message.threadInfo ? message.threadInfo.replyCount > 0 : undefined,
267
+ icon: 'delete' as const,
268
+ title: STRINGS.LABELS.CHANNEL_MESSAGE_DELETE,
269
+ onPress: () => alertForMessageDelete(message),
270
+ }),
271
+ download: (message: HandleableMessage) => ({
272
+ icon: 'download' as const,
273
+ title: STRINGS.LABELS.CHANNEL_MESSAGE_SAVE,
274
+ onPress: () => onDownloadFile(message),
275
+ }),
276
+ };
277
+
278
+ if (message.isUserMessage()) {
279
+ sheetItems.push(menu.copy(message));
280
+ if (!channel.isEphemeral) {
281
+ if (isMyMessage(message, currentUserId) && message.sendingStatus === 'succeeded') {
282
+ sheetItems.push(menu.edit(message));
283
+ sheetItems.push(menu.delete(message));
284
+ }
285
+ }
286
+ }
287
+
288
+ if (message.isFileMessage()) {
289
+ if (!isVoiceMessage(message)) {
290
+ sheetItems.push(menu.download(message));
291
+ }
292
+ if (!channel.isEphemeral) {
293
+ if (isMyMessage(message, currentUserId) && message.sendingStatus === 'succeeded') {
294
+ sheetItems.push(menu.delete(message));
295
+ }
296
+ }
297
+ }
298
+
299
+ const configs = sbOptions.uikitWithAppInfo.groupChannel.channel;
300
+ const bottomSheetItem: BottomSheetItem = {
301
+ sheetItems,
302
+ HeaderComponent: shouldRenderReaction(
303
+ channel,
304
+ channel.isGroupChannel() && (channel.isSuper ? configs.enableReactionsSupergroup : configs.enableReactions),
305
+ )
306
+ ? ({ onClose }) => <ReactionAddons.BottomSheet message={message} channel={channel} onClose={onClose} />
307
+ : undefined,
308
+ };
309
+
310
+ if (message.isFileMessage()) {
311
+ return {
312
+ onPress: () => onOpenFile(message),
313
+ onLongPress: () => openSheet(bottomSheetItem),
314
+ bottomSheetItem,
315
+ };
316
+ } else {
317
+ return {
318
+ onPress: undefined,
319
+ onLongPress: () => openSheet(bottomSheetItem),
320
+ bottomSheetItem,
321
+ };
322
+ }
323
+ };
324
+ };
325
+
326
+ export default React.memo(GroupChannelThreadParentMessageInfo);
@@ -0,0 +1,18 @@
1
+ import React from 'react';
2
+ import { StyleSheet, View } from 'react-native';
3
+
4
+ import TypedPlaceholder from '../../../components/TypedPlaceholder';
5
+
6
+ const GroupChannelThreadStatusEmpty = () => {
7
+ return (
8
+ <View style={styles.container}>
9
+ <TypedPlaceholder type={'no-messages'} />
10
+ </View>
11
+ );
12
+ };
13
+
14
+ const styles = StyleSheet.create({
15
+ container: { flex: 1, justifyContent: 'center', alignItems: 'center' },
16
+ });
17
+
18
+ export default GroupChannelThreadStatusEmpty;
@@ -0,0 +1,18 @@
1
+ import React from 'react';
2
+ import { StyleSheet, View } from 'react-native';
3
+
4
+ import TypedPlaceholder from '../../../components/TypedPlaceholder';
5
+
6
+ const GroupChannelThreadStatusLoading = () => {
7
+ return (
8
+ <View style={styles.container}>
9
+ <TypedPlaceholder type={'loading'} />
10
+ </View>
11
+ );
12
+ };
13
+
14
+ const styles = StyleSheet.create({
15
+ container: { flex: 1, justifyContent: 'center', alignItems: 'center' },
16
+ });
17
+
18
+ export default GroupChannelThreadStatusLoading;
@@ -0,0 +1,174 @@
1
+ import React, { useContext } from 'react';
2
+ import { Pressable, ScrollView, View, useWindowDimensions } from 'react-native';
3
+ import { useSafeAreaInsets } from 'react-native-safe-area-context';
4
+
5
+ import {
6
+ Avatar,
7
+ Divider,
8
+ Icon,
9
+ Text,
10
+ createStyleSheet,
11
+ useHeaderStyle,
12
+ useUIKitTheme,
13
+ } from '@sendbird/uikit-react-native-foundation';
14
+ import { conditionChaining } from '@sendbird/uikit-utils';
15
+
16
+ import { useLocalization, useSendbirdChat } from '../../../hooks/useContext';
17
+ import useKeyboardStatus from '../../../hooks/useKeyboardStatus';
18
+ import useMentionSuggestion from '../../../hooks/useMentionSuggestion';
19
+ import { GroupChannelThreadContexts } from '../module/moduleContext';
20
+ import type { GroupChannelThreadProps } from '../types';
21
+
22
+ const GroupChannelThreadSuggestedMentionList = ({
23
+ text,
24
+ selection,
25
+ inputHeight,
26
+ bottomInset,
27
+ onPressToMention,
28
+ mentionedUsers,
29
+ }: GroupChannelThreadProps['SuggestedMentionList']) => {
30
+ const { width: screenWidth, height: screenHeight } = useWindowDimensions();
31
+ const { channel } = useContext(GroupChannelThreadContexts.Fragment);
32
+ const { sdk, mentionManager } = useSendbirdChat();
33
+ const { STRINGS } = useLocalization();
34
+ const { colors } = useUIKitTheme();
35
+ const { topInset } = useHeaderStyle();
36
+ const { left, right } = useSafeAreaInsets();
37
+
38
+ const keyboard = useKeyboardStatus();
39
+
40
+ const { members, reset, searchStringRange, searchLimited } = useMentionSuggestion({
41
+ sdk,
42
+ text,
43
+ selection,
44
+ channel,
45
+ mentionedUsers,
46
+ });
47
+
48
+ const isLandscape = screenWidth > screenHeight;
49
+ const isShortened = isLandscape && keyboard.visible;
50
+ const canRenderMembers = members.length > 0;
51
+ const maxHeight = isShortened ? screenHeight - (topInset + inputHeight + keyboard.height) : styles.suggestion.height;
52
+
53
+ const renderLimitGuide = () => {
54
+ return (
55
+ <View style={[styles.searchLimited, { borderTopColor: colors.onBackground04 }]}>
56
+ <Icon icon={'info'} size={20} containerStyle={{ marginRight: 4 }} color={colors.onBackground02} />
57
+ <Text body3 color={colors.onBackground02}>
58
+ {STRINGS.GROUP_CHANNEL_THREAD.MENTION_LIMITED(mentionManager.config.mentionLimit)}
59
+ </Text>
60
+ </View>
61
+ );
62
+ };
63
+
64
+ const renderMembers = () => {
65
+ return (
66
+ <View>
67
+ {members.map((member) => {
68
+ return (
69
+ <Pressable
70
+ onPress={() => {
71
+ onPressToMention(member, searchStringRange);
72
+ reset();
73
+ }}
74
+ key={member.userId}
75
+ style={styles.userContainer}
76
+ >
77
+ <Avatar size={28} uri={member.profileUrl} containerStyle={styles.userAvatar} />
78
+ <View style={styles.userInfo}>
79
+ <Text body2 color={colors.onBackground01} numberOfLines={1} style={styles.userNickname}>
80
+ {member.nickname || STRINGS.LABELS.USER_NO_NAME}
81
+ </Text>
82
+ <Text body3 color={colors.onBackground03} numberOfLines={1} style={styles.userId}>
83
+ {member.userId}
84
+ </Text>
85
+ <Divider style={{ position: 'absolute', bottom: 0 }} />
86
+ </View>
87
+ </Pressable>
88
+ );
89
+ })}
90
+ </View>
91
+ );
92
+ };
93
+
94
+ return (
95
+ <Pressable
96
+ onPress={reset}
97
+ pointerEvents={canRenderMembers ? 'auto' : 'none'}
98
+ style={[styles.container, { bottom: inputHeight + bottomInset }]}
99
+ >
100
+ <ScrollView
101
+ bounces={false}
102
+ keyboardDismissMode={'none'}
103
+ keyboardShouldPersistTaps={'always'}
104
+ style={[
105
+ styles.scrollView,
106
+ {
107
+ maxHeight,
108
+ backgroundColor: colors.background,
109
+ bottom: keyboard.bottomSpace,
110
+ },
111
+ canRenderMembers && {
112
+ borderTopWidth: 1,
113
+ borderTopColor: colors.onBackground04,
114
+ },
115
+ ]}
116
+ contentContainerStyle={{ paddingLeft: left, paddingRight: right }}
117
+ >
118
+ {conditionChaining([searchLimited, canRenderMembers], [renderLimitGuide(), renderMembers(), null])}
119
+ </ScrollView>
120
+ </Pressable>
121
+ );
122
+ };
123
+
124
+ const styles = createStyleSheet({
125
+ suggestion: {
126
+ height: 196,
127
+ },
128
+ container: {
129
+ position: 'absolute',
130
+ top: 0,
131
+ right: 0,
132
+ left: 0,
133
+ },
134
+ scrollView: {
135
+ position: 'absolute',
136
+ left: 0,
137
+ right: 0,
138
+ },
139
+ userContainer: {
140
+ paddingLeft: 16,
141
+ flexDirection: 'row',
142
+ height: 44,
143
+ alignItems: 'center',
144
+ justifyContent: 'center',
145
+ },
146
+ userAvatar: {
147
+ marginRight: 16,
148
+ },
149
+ userInfo: {
150
+ flexDirection: 'row',
151
+ flex: 1,
152
+ },
153
+ userNickname: {
154
+ flexShrink: 1,
155
+ lineHeight: 44,
156
+ textAlignVertical: 'center',
157
+ marginRight: 6,
158
+ },
159
+ userId: {
160
+ lineHeight: 44,
161
+ textAlignVertical: 'center',
162
+ minWidth: 32,
163
+ flexShrink: 1,
164
+ marginRight: 16,
165
+ },
166
+ searchLimited: {
167
+ borderTopWidth: 1,
168
+ paddingHorizontal: 16,
169
+ height: 44,
170
+ flexDirection: 'row',
171
+ alignItems: 'center',
172
+ },
173
+ });
174
+ export default GroupChannelThreadSuggestedMentionList;
@@ -0,0 +1,8 @@
1
+ export { default as GroupChannelThreadHeader } from './component/GroupChannelThreadHeader';
2
+ export { default as GroupChannelThreadMessageList } from './component/GroupChannelThreadMessageList';
3
+ export { default as GroupChannelThreadInput } from './component/GroupChannelThreadInput';
4
+ export { default as GroupChannelThreadSuggestedMentionList } from './component/GroupChannelThreadSuggestedMentionList';
5
+ export { default as GroupChannelThreadStatusEmpty } from './component/GroupChannelThreadStatusEmpty';
6
+ export { default as GroupChannelThreadStatusLoading } from './component/GroupChannelThreadStatusLoading';
7
+ export { default as createGroupChannelThreadModule } from './module/createGroupChannelThreadModule';
8
+ export { GroupChannelThreadContextsProvider, GroupChannelThreadContexts } from './module/moduleContext';
@@ -0,0 +1,35 @@
1
+ import GroupChannelThreadHeader from '../component/GroupChannelThreadHeader';
2
+ import GroupChannelThreadInput from '../component/GroupChannelThreadInput';
3
+ import GroupChannelThreadMessageList from '../component/GroupChannelThreadMessageList';
4
+ import GroupChannelThreadParentMessageInfo from '../component/GroupChannelThreadParentMessageInfo';
5
+ import GroupChannelThreadStatusEmpty from '../component/GroupChannelThreadStatusEmpty';
6
+ import GroupChannelThreadStatusLoading from '../component/GroupChannelThreadStatusLoading';
7
+ import GroupChannelThreadSuggestedMentionList from '../component/GroupChannelThreadSuggestedMentionList';
8
+ import type { GroupChannelThreadModule } from '../types';
9
+ import { GroupChannelThreadContextsProvider } from './moduleContext';
10
+
11
+ const createGroupChannelThreadModule = ({
12
+ Header = GroupChannelThreadHeader,
13
+ ParentMessageInfo = GroupChannelThreadParentMessageInfo,
14
+ MessageList = GroupChannelThreadMessageList,
15
+ Input = GroupChannelThreadInput,
16
+ SuggestedMentionList = GroupChannelThreadSuggestedMentionList,
17
+ StatusLoading = GroupChannelThreadStatusLoading,
18
+ StatusEmpty = GroupChannelThreadStatusEmpty,
19
+ Provider = GroupChannelThreadContextsProvider,
20
+ ...module
21
+ }: Partial<GroupChannelThreadModule> = {}): GroupChannelThreadModule => {
22
+ return {
23
+ Header,
24
+ ParentMessageInfo,
25
+ MessageList,
26
+ Input,
27
+ SuggestedMentionList,
28
+ StatusEmpty,
29
+ StatusLoading,
30
+ Provider,
31
+ ...module,
32
+ };
33
+ };
34
+
35
+ export default createGroupChannelThreadModule;