@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,165 @@
1
+ import React, { createContext, useRef, useState } from 'react';
2
+ import type { FlatList } from 'react-native';
3
+
4
+ import {
5
+ ContextValue,
6
+ Logger,
7
+ NOOP,
8
+ SendbirdFileMessage,
9
+ SendbirdGroupChannel,
10
+ SendbirdMessage,
11
+ SendbirdUserMessage,
12
+ useFreshCallback,
13
+ } from '@sendbird/uikit-utils';
14
+
15
+ import ProviderLayout from '../../../components/ProviderLayout';
16
+ import { useLocalization } from '../../../hooks/useContext';
17
+ import type { PubSub } from '../../../utils/pubsub';
18
+ import type {
19
+ GroupChannelThreadContextsType,
20
+ GroupChannelThreadModule,
21
+ GroupChannelThreadPubSubContextPayload,
22
+ } from '../types';
23
+ import { GroupChannelThreadProps } from '../types';
24
+
25
+ export const GroupChannelThreadContexts: GroupChannelThreadContextsType = {
26
+ Fragment: createContext({
27
+ headerTitle: '',
28
+ channel: {} as SendbirdGroupChannel,
29
+ parentMessage: {} as SendbirdUserMessage | SendbirdFileMessage,
30
+ setMessageToEdit: NOOP,
31
+ }),
32
+ PubSub: createContext({
33
+ publish: NOOP,
34
+ subscribe: () => NOOP,
35
+ } as PubSub<GroupChannelThreadPubSubContextPayload>),
36
+ MessageList: createContext({
37
+ flatListRef: { current: null },
38
+ scrollToMessage: () => false,
39
+ lazyScrollToBottom: () => {
40
+ // noop
41
+ },
42
+ lazyScrollToIndex: () => {
43
+ // noop
44
+ },
45
+ } as MessageListContextValue),
46
+ };
47
+
48
+ export const GroupChannelThreadContextsProvider: GroupChannelThreadModule['Provider'] = ({
49
+ children,
50
+ channel,
51
+ parentMessage,
52
+ keyboardAvoidOffset = 0,
53
+ groupChannelThreadPubSub,
54
+ threadedMessages,
55
+ }) => {
56
+ if (!channel) throw new Error('GroupChannel is not provided to GroupChannelThreadModule');
57
+
58
+ const { STRINGS } = useLocalization();
59
+ const [messageToEdit, setMessageToEdit] = useState<SendbirdUserMessage | SendbirdFileMessage>();
60
+ const { flatListRef, lazyScrollToIndex, lazyScrollToBottom, scrollToMessage } = useScrollActions({
61
+ threadedMessages: threadedMessages,
62
+ });
63
+
64
+ return (
65
+ <ProviderLayout>
66
+ <GroupChannelThreadContexts.Fragment.Provider
67
+ value={{
68
+ headerTitle: STRINGS.GROUP_CHANNEL_THREAD.HEADER_TITLE,
69
+ channel,
70
+ parentMessage,
71
+ keyboardAvoidOffset,
72
+ messageToEdit: messageToEdit,
73
+ setMessageToEdit,
74
+ }}
75
+ >
76
+ <GroupChannelThreadContexts.PubSub.Provider value={groupChannelThreadPubSub}>
77
+ <GroupChannelThreadContexts.MessageList.Provider
78
+ value={{
79
+ flatListRef,
80
+ scrollToMessage,
81
+ lazyScrollToIndex,
82
+ lazyScrollToBottom,
83
+ }}
84
+ >
85
+ {children}
86
+ </GroupChannelThreadContexts.MessageList.Provider>
87
+ </GroupChannelThreadContexts.PubSub.Provider>
88
+ </GroupChannelThreadContexts.Fragment.Provider>
89
+ </ProviderLayout>
90
+ );
91
+ };
92
+
93
+ type MessageListContextValue = ContextValue<GroupChannelThreadContextsType['MessageList']>;
94
+ const useScrollActions = (params: Pick<GroupChannelThreadProps['Provider'], 'threadedMessages'>) => {
95
+ const { threadedMessages } = params;
96
+ const flatListRef = useRef<FlatList<SendbirdMessage>>(null);
97
+
98
+ // FIXME: Workaround, should run after data has been applied to UI.
99
+ const lazyScrollToBottom = useFreshCallback<MessageListContextValue['lazyScrollToIndex']>((params) => {
100
+ if (!flatListRef.current) {
101
+ logFlatListRefWarning();
102
+ return;
103
+ }
104
+
105
+ setTimeout(() => {
106
+ if (flatListRef.current) {
107
+ flatListRef.current.scrollToEnd({ animated: params?.animated ?? false });
108
+ }
109
+ }, params?.timeout ?? 0);
110
+ });
111
+
112
+ // FIXME: Workaround, should run after data has been applied to UI.
113
+ const lazyScrollToIndex = useFreshCallback<MessageListContextValue['lazyScrollToIndex']>((params) => {
114
+ if (!flatListRef.current) {
115
+ logFlatListRefWarning();
116
+ return;
117
+ }
118
+
119
+ setTimeout(() => {
120
+ if (flatListRef.current) {
121
+ flatListRef.current.scrollToIndex({
122
+ index: params?.index ?? 0,
123
+ animated: params?.animated ?? false,
124
+ viewPosition: params?.viewPosition ?? 0.5,
125
+ });
126
+ }
127
+ }, params?.timeout ?? 0);
128
+ });
129
+
130
+ const scrollToMessage = useFreshCallback<MessageListContextValue['scrollToMessage']>((messageId, options) => {
131
+ if (!flatListRef.current) {
132
+ logFlatListRefWarning();
133
+ return false;
134
+ }
135
+
136
+ const foundMessageIndex = threadedMessages.findIndex((it) => it.messageId === messageId);
137
+ const isIncludedInList = foundMessageIndex > -1;
138
+
139
+ if (isIncludedInList) {
140
+ lazyScrollToIndex({
141
+ index: foundMessageIndex,
142
+ animated: true,
143
+ timeout: 0,
144
+ viewPosition: options?.viewPosition,
145
+ });
146
+ return true;
147
+ } else {
148
+ return false;
149
+ }
150
+ });
151
+
152
+ return {
153
+ flatListRef,
154
+ lazyScrollToIndex,
155
+ lazyScrollToBottom,
156
+ scrollToMessage,
157
+ };
158
+ };
159
+
160
+ const logFlatListRefWarning = () => {
161
+ Logger.warn(
162
+ 'Cannot find flatListRef.current, please render FlatList and pass the flatListRef' +
163
+ 'or please try again after FlatList has been rendered.',
164
+ );
165
+ };
@@ -0,0 +1,184 @@
1
+ import type React from 'react';
2
+ import type { FlatList } from 'react-native';
3
+
4
+ import type { UseGroupChannelMessagesOptions } from '@sendbird/uikit-chat-hooks';
5
+ import type {
6
+ OnBeforeHandler,
7
+ PickPartial,
8
+ SendbirdFileMessage,
9
+ SendbirdFileMessageCreateParams,
10
+ SendbirdFileMessageUpdateParams,
11
+ SendbirdGroupChannel,
12
+ SendbirdMessage,
13
+ SendbirdUserMessage,
14
+ SendbirdUserMessageCreateParams,
15
+ SendbirdUserMessageUpdateParams,
16
+ } from '@sendbird/uikit-utils';
17
+
18
+ import type { ChannelInputProps, SuggestedMentionListProps } from '../../components/ChannelInput';
19
+ import type { ChannelThreadMessageListProps } from '../../components/ChannelThreadMessageList';
20
+ import type { CommonComponent } from '../../types';
21
+ import type { PubSub } from '../../utils/pubsub';
22
+
23
+ export interface GroupChannelThreadProps {
24
+ Fragment: {
25
+ channel: SendbirdGroupChannel;
26
+ parentMessage: SendbirdUserMessage | SendbirdFileMessage;
27
+ startingPoint?: number;
28
+ onParentMessageDeleted: () => void;
29
+ onChannelDeleted: () => void;
30
+ onPressHeaderLeft: GroupChannelThreadProps['Header']['onPressLeft'];
31
+ onPressHeaderSubtitle?: GroupChannelThreadProps['Header']['onPressSubtitle'];
32
+ onPressMediaMessage?: GroupChannelThreadProps['MessageList']['onPressMediaMessage'];
33
+
34
+ onBeforeSendUserMessage?: OnBeforeHandler<SendbirdUserMessageCreateParams>;
35
+ onBeforeSendFileMessage?: OnBeforeHandler<SendbirdFileMessageCreateParams>;
36
+ onBeforeUpdateUserMessage?: OnBeforeHandler<SendbirdUserMessageUpdateParams>;
37
+ onBeforeUpdateFileMessage?: OnBeforeHandler<SendbirdFileMessageUpdateParams>;
38
+
39
+ renderMessage?: GroupChannelThreadProps['MessageList']['renderMessage'];
40
+
41
+ enableMessageGrouping?: GroupChannelThreadProps['MessageList']['enableMessageGrouping'];
42
+
43
+ keyboardAvoidOffset?: GroupChannelThreadProps['Provider']['keyboardAvoidOffset'];
44
+ flatListProps?: GroupChannelThreadProps['MessageList']['flatListProps'];
45
+ sortComparator?: UseGroupChannelMessagesOptions['sortComparator'];
46
+ };
47
+ Header: {
48
+ onPressLeft: () => void;
49
+ onPressSubtitle: () => void;
50
+ };
51
+ ParentMessageInfo: {
52
+ channel: SendbirdGroupChannel;
53
+ currentUserId?: string;
54
+ onDeleteMessage: (message: SendbirdUserMessage | SendbirdFileMessage) => Promise<void>;
55
+ onPressMediaMessage?: (message: SendbirdFileMessage, deleteMessage: () => Promise<void>, uri: string) => void;
56
+ };
57
+ MessageList: Pick<
58
+ ChannelThreadMessageListProps<SendbirdGroupChannel>,
59
+ | 'enableMessageGrouping'
60
+ | 'currentUserId'
61
+ | 'channel'
62
+ | 'messages'
63
+ | 'newMessages'
64
+ | 'scrolledAwayFromBottom'
65
+ | 'onScrolledAwayFromBottom'
66
+ | 'onTopReached'
67
+ | 'onBottomReached'
68
+ | 'onResendFailedMessage'
69
+ | 'onDeleteMessage'
70
+ | 'onPressMediaMessage'
71
+ | 'renderMessage'
72
+ | 'flatListProps'
73
+ | 'hasNext'
74
+ | 'searchItem'
75
+ > & {
76
+ onResetMessageList: () => Promise<void>;
77
+ onResetMessageListWithStartingPoint: (startingPoint: number) => Promise<void>;
78
+ startingPoint?: number;
79
+ };
80
+ Input: PickPartial<
81
+ ChannelInputProps,
82
+ | 'shouldRenderInput'
83
+ | 'onPressSendUserMessage'
84
+ | 'onPressSendFileMessage'
85
+ | 'onPressUpdateUserMessage'
86
+ | 'onPressUpdateFileMessage'
87
+ | 'SuggestedMentionList'
88
+ | 'AttachmentsButton',
89
+ 'inputDisabled'
90
+ >;
91
+
92
+ SuggestedMentionList: SuggestedMentionListProps;
93
+ Provider: {
94
+ channel: SendbirdGroupChannel;
95
+ keyboardAvoidOffset?: number;
96
+ groupChannelThreadPubSub: PubSub<GroupChannelThreadPubSubContextPayload>;
97
+ parentMessage: SendbirdUserMessage | SendbirdFileMessage;
98
+ threadedMessages: SendbirdMessage[];
99
+ };
100
+ }
101
+
102
+ /**
103
+ * Internal context for GroupChannelThread
104
+ * For example, the developer can create a custom header
105
+ * with getting data from the domain context
106
+ * */
107
+ export interface GroupChannelThreadContextsType {
108
+ Fragment: React.Context<{
109
+ headerTitle: string;
110
+ keyboardAvoidOffset?: number;
111
+ channel: SendbirdGroupChannel;
112
+ parentMessage: SendbirdUserMessage | SendbirdFileMessage;
113
+ messageToEdit?: SendbirdUserMessage | SendbirdFileMessage;
114
+ setMessageToEdit: (msg?: SendbirdUserMessage | SendbirdFileMessage) => void;
115
+ }>;
116
+ PubSub: React.Context<PubSub<GroupChannelThreadPubSubContextPayload>>;
117
+ MessageList: React.Context<{
118
+ /**
119
+ * ref object for FlatList of MessageList
120
+ * */
121
+ flatListRef: React.MutableRefObject<FlatList | null>;
122
+ /**
123
+ * Function that scrolls to a message within a group channel.
124
+ * @param messageId {number} - The id of the message to scroll.
125
+ * @param options {object} - Scroll options (optional).
126
+ * @param options.focusAnimated {boolean} - Enable a shake animation on the message component upon completion of scrolling.
127
+ * @param options.viewPosition {number} - Position information to adjust the visible area during scrolling. bottom(0) ~ top(1.0)
128
+ *
129
+ * @example
130
+ * ```
131
+ * const { scrollToMessage } = useContext(GroupChannelThreadContexts.MessageList);
132
+ * const messageIncludedInMessageList = scrollToMessage(lastMessage.messageId, { focusAnimated: true, viewPosition: 1 });
133
+ * if (!messageIncludedInMessageList) console.warn('Message not found in the message list.');
134
+ * ```
135
+ * */
136
+ scrollToMessage: (messageId: number, options?: { focusAnimated?: boolean; viewPosition?: number }) => boolean;
137
+ /**
138
+ * Call the FlatList function asynchronously to scroll to bottom lazily
139
+ * to avoid scrolling before data rendering has been committed.
140
+ * */
141
+ lazyScrollToBottom: (params?: { animated?: boolean; timeout?: number }) => void;
142
+ /**
143
+ * Call the FlatList function asynchronously to scroll to index lazily.
144
+ * to avoid scrolling before data rendering has been committed.
145
+ * */
146
+ lazyScrollToIndex: (params?: {
147
+ index?: number;
148
+ animated?: boolean;
149
+ timeout?: number;
150
+ viewPosition?: number;
151
+ }) => void;
152
+ }>;
153
+ }
154
+
155
+ export interface GroupChannelThreadModule {
156
+ Provider: CommonComponent<GroupChannelThreadProps['Provider']>;
157
+ Header: CommonComponent<GroupChannelThreadProps['Header']>;
158
+ ParentMessageInfo: CommonComponent<GroupChannelThreadProps['ParentMessageInfo']>;
159
+ MessageList: CommonComponent<GroupChannelThreadProps['MessageList']>;
160
+ Input: CommonComponent<GroupChannelThreadProps['Input']>;
161
+ SuggestedMentionList: CommonComponent<GroupChannelThreadProps['SuggestedMentionList']>;
162
+ StatusEmpty: CommonComponent;
163
+ StatusLoading: CommonComponent;
164
+ }
165
+
166
+ export type GroupChannelThreadFragment = React.FC<GroupChannelThreadProps['Fragment']>;
167
+
168
+ export type GroupChannelThreadPubSubContextPayload =
169
+ | {
170
+ type: 'MESSAGE_SENT_PENDING' | 'MESSAGE_SENT_SUCCESS';
171
+ data: {
172
+ message: SendbirdUserMessage | SendbirdFileMessage;
173
+ };
174
+ }
175
+ | {
176
+ type: 'MESSAGES_RECEIVED' | 'MESSAGES_UPDATED';
177
+ data: {
178
+ messages: SendbirdMessage[];
179
+ };
180
+ }
181
+ | {
182
+ type: 'TYPING_BUBBLE_RENDERED';
183
+ data?: undefined;
184
+ };
@@ -2,9 +2,15 @@ import React, { useCallback, useEffect, useMemo, useState } from 'react';
2
2
 
3
3
  import { MessageCollection, MessageFilter } from '@sendbird/chat/groupChannel';
4
4
  import { ReplyType } from '@sendbird/chat/message';
5
- import { Box } from '@sendbird/uikit-react-native-foundation';
5
+ import { Box, useToast } from '@sendbird/uikit-react-native-foundation';
6
6
  import { useGroupChannelMessages } from '@sendbird/uikit-tools';
7
- import type { SendbirdFileMessage, SendbirdGroupChannel, SendbirdUserMessage } from '@sendbird/uikit-utils';
7
+ import {
8
+ SendbirdFileMessage,
9
+ SendbirdGroupChannel,
10
+ SendbirdSendableMessage,
11
+ SendbirdUserMessage,
12
+ getReadableFileSize,
13
+ } from '@sendbird/uikit-utils';
8
14
  import {
9
15
  NOOP,
10
16
  PASS,
@@ -28,7 +34,8 @@ import type {
28
34
  GroupChannelProps,
29
35
  GroupChannelPubSubContextPayload,
30
36
  } from '../domain/groupChannel/types';
31
- import { usePlatformService, useSendbirdChat } from '../hooks/useContext';
37
+ import { useLocalization, usePlatformService, useSendbirdChat } from '../hooks/useContext';
38
+ import { FileType } from '../platform/types';
32
39
  import pubsub from '../utils/pubsub';
33
40
 
34
41
  const createGroupChannelFragment = (initModule?: Partial<GroupChannelModule>): GroupChannelFragment => {
@@ -45,6 +52,7 @@ const createGroupChannelFragment = (initModule?: Partial<GroupChannelModule>): G
45
52
  onPressHeaderRight = NOOP,
46
53
  onPressMediaMessage = NOOP,
47
54
  onChannelDeleted = NOOP,
55
+ onPressReplyMessageInThread = NOOP,
48
56
  onBeforeSendUserMessage = PASS,
49
57
  onBeforeSendFileMessage = PASS,
50
58
  onBeforeUpdateUserMessage = PASS,
@@ -57,7 +65,9 @@ const createGroupChannelFragment = (initModule?: Partial<GroupChannelModule>): G
57
65
  collectionCreator,
58
66
  }) => {
59
67
  const { playerService, recorderService } = usePlatformService();
60
- const { sdk, currentUser, sbOptions } = useSendbirdChat();
68
+ const { sdk, currentUser, sbOptions, voiceMessageStatusManager } = useSendbirdChat();
69
+ const toast = useToast();
70
+ const { STRINGS } = useLocalization();
61
71
 
62
72
  const [internalSearchItem, setInternalSearchItem] = useState(searchItem);
63
73
  const navigateFromMessageSearch = useCallback(() => Boolean(searchItem), []);
@@ -67,8 +77,11 @@ const createGroupChannelFragment = (initModule?: Partial<GroupChannelModule>): G
67
77
  const scrolledAwayFromBottomRef = useRefTracker(scrolledAwayFromBottom);
68
78
 
69
79
  const replyType = useIIFE(() => {
70
- if (sbOptions.uikit.groupChannel.channel.replyType === 'none') return ReplyType.NONE;
71
- else return ReplyType.ONLY_REPLY_TO_CHANNEL;
80
+ if (sbOptions.uikit.groupChannel.channel.replyType === 'none') {
81
+ return ReplyType.NONE;
82
+ } else {
83
+ return ReplyType.ONLY_REPLY_TO_CHANNEL;
84
+ }
72
85
  });
73
86
 
74
87
  const {
@@ -107,6 +120,7 @@ const createGroupChannelFragment = (initModule?: Partial<GroupChannelModule>): G
107
120
  return Promise.allSettled([playerService.reset(), recorderService.reset()]);
108
121
  };
109
122
  const _onPressHeaderLeft = useFreshCallback(async () => {
123
+ voiceMessageStatusManager.clear();
110
124
  await onBlurFragment();
111
125
  onPressHeaderLeft();
112
126
  });
@@ -120,6 +134,12 @@ const createGroupChannelFragment = (initModule?: Partial<GroupChannelModule>): G
120
134
  onPressMediaMessage(message, deleteMessage, uri);
121
135
  },
122
136
  );
137
+ const _onPressReplyMessageInThread = useFreshCallback(
138
+ async (message: SendbirdSendableMessage, startingPoint?: number) => {
139
+ await onBlurFragment();
140
+ onPressReplyMessageInThread(message, startingPoint);
141
+ },
142
+ );
123
143
 
124
144
  useEffect(() => {
125
145
  return () => {
@@ -179,8 +199,17 @@ const createGroupChannelFragment = (initModule?: Partial<GroupChannelModule>): G
179
199
  const onPressSendFileMessage: GroupChannelProps['Input']['onPressSendFileMessage'] = useFreshCallback(
180
200
  async (params) => {
181
201
  const processedParams = await onBeforeSendFileMessage(params);
182
- const message = await sendFileMessage(processedParams, onPending);
183
- onSent(message);
202
+ const fileSize = (processedParams.file as FileType)?.size ?? processedParams.fileSize;
203
+ const uploadSizeLimit = sbOptions.appInfo.uploadSizeLimit;
204
+
205
+ if (fileSize && uploadSizeLimit && fileSize > uploadSizeLimit) {
206
+ const sizeLimitString = `${getReadableFileSize(uploadSizeLimit)} MB`;
207
+ toast.show(STRINGS.TOAST.FILE_UPLOAD_SIZE_LIMIT_EXCEEDED_ERROR(sizeLimitString), 'error');
208
+ return;
209
+ } else {
210
+ const message = await sendFileMessage(processedParams, onPending);
211
+ onSent(message);
212
+ }
184
213
  },
185
214
  );
186
215
  const onPressUpdateUserMessage: GroupChannelProps['Input']['onPressUpdateUserMessage'] = useFreshCallback(
@@ -208,6 +237,7 @@ const createGroupChannelFragment = (initModule?: Partial<GroupChannelModule>): G
208
237
  keyboardAvoidOffset={keyboardAvoidOffset}
209
238
  messages={messages}
210
239
  onUpdateSearchItem={onUpdateSearchItem}
240
+ onPressReplyMessageInThread={_onPressReplyMessageInThread}
211
241
  >
212
242
  <GroupChannelModule.Header
213
243
  shouldHideRight={navigateFromMessageSearch}