@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,280 @@
1
+ import React, { useCallback, useEffect, useMemo, useState } from 'react';
2
+
3
+ import { Box, useToast } from '@sendbird/uikit-react-native-foundation';
4
+ import { useGroupChannelThreadMessages } from '@sendbird/uikit-tools';
5
+ import {
6
+ SendbirdFileMessage,
7
+ SendbirdGroupChannel,
8
+ type SendbirdMessage,
9
+ SendbirdUserMessage,
10
+ getReadableFileSize,
11
+ } from '@sendbird/uikit-utils';
12
+ import {
13
+ NOOP,
14
+ PASS,
15
+ confirmAndMarkAsRead,
16
+ messageComparator,
17
+ useFreshCallback,
18
+ useRefTracker,
19
+ } from '@sendbird/uikit-utils';
20
+
21
+ import GroupChannelMessageRenderer from '../components/GroupChannelMessageRenderer';
22
+ import StatusComposition from '../components/StatusComposition';
23
+ import createGroupChannelThreadModule from '../domain/groupChannelThread/module/createGroupChannelThreadModule';
24
+ import type {
25
+ GroupChannelThreadFragment,
26
+ GroupChannelThreadModule,
27
+ GroupChannelThreadProps,
28
+ GroupChannelThreadPubSubContextPayload,
29
+ } from '../domain/groupChannelThread/types';
30
+ import { useLocalization, usePlatformService, useSendbirdChat } from '../hooks/useContext';
31
+ import pubsub from '../utils/pubsub';
32
+
33
+ const createGroupChannelThreadFragment = (
34
+ initModule?: Partial<GroupChannelThreadModule>,
35
+ ): GroupChannelThreadFragment => {
36
+ const GroupChannelThreadModule = createGroupChannelThreadModule(initModule);
37
+
38
+ return ({
39
+ renderMessage,
40
+ enableMessageGrouping = true,
41
+ onPressHeaderLeft = NOOP,
42
+ onPressHeaderSubtitle = NOOP,
43
+ onPressMediaMessage = NOOP,
44
+ onParentMessageDeleted = NOOP,
45
+ onChannelDeleted = NOOP,
46
+ onBeforeSendUserMessage = PASS,
47
+ onBeforeSendFileMessage = PASS,
48
+ onBeforeUpdateUserMessage = PASS,
49
+ onBeforeUpdateFileMessage = PASS,
50
+ channel,
51
+ parentMessage,
52
+ startingPoint,
53
+ keyboardAvoidOffset,
54
+ sortComparator = threadMessageComparator,
55
+ flatListProps,
56
+ }) => {
57
+ const { playerService, recorderService } = usePlatformService();
58
+ const { sdk, currentUser, sbOptions, voiceMessageStatusManager, groupChannelFragmentOptions } = useSendbirdChat();
59
+
60
+ const [groupChannelThreadPubSub] = useState(() => pubsub<GroupChannelThreadPubSubContextPayload>());
61
+ const [scrolledAwayFromBottom, setScrolledAwayFromBottom] = useState(false);
62
+ const scrolledAwayFromBottomRef = useRefTracker(scrolledAwayFromBottom);
63
+
64
+ const toast = useToast();
65
+ const { STRINGS } = useLocalization();
66
+ const [_parentMessage, setParentMessage] = useState(parentMessage);
67
+
68
+ const {
69
+ loading,
70
+ messages,
71
+ newMessages,
72
+ resetNewMessages,
73
+ loadNext,
74
+ loadPrevious,
75
+ hasNext,
76
+ sendFileMessage,
77
+ sendUserMessage,
78
+ updateFileMessage,
79
+ updateUserMessage,
80
+ resendMessage,
81
+ deleteMessage,
82
+ resetWithStartingPoint,
83
+ } = useGroupChannelThreadMessages(sdk, channel, _parentMessage, {
84
+ shouldCountNewMessages: () => scrolledAwayFromBottomRef.current,
85
+ onMessagesReceived(messages) {
86
+ groupChannelThreadPubSub.publish({ type: 'MESSAGES_RECEIVED', data: { messages } });
87
+ },
88
+ onMessagesUpdated(messages) {
89
+ groupChannelThreadPubSub.publish({ type: 'MESSAGES_UPDATED', data: { messages } });
90
+ },
91
+ onParentMessageUpdated(parentMessage) {
92
+ setParentMessage(parentMessage);
93
+ },
94
+ onParentMessageDeleted: () => {
95
+ toast.show(STRINGS.TOAST.THREAD_PARENT_MESSAGE_DELETED_ERROR, 'error');
96
+ onParentMessageDeleted?.();
97
+ },
98
+ onChannelDeleted,
99
+ onCurrentUserBanned: onChannelDeleted,
100
+ sortComparator,
101
+ markAsRead: confirmAndMarkAsRead,
102
+ isReactionEnabled: sbOptions.uikit.groupChannel.channel.enableReactions,
103
+ startingPoint,
104
+ });
105
+
106
+ const onBlurFragment = () => {
107
+ return Promise.allSettled([playerService.reset(), recorderService.reset()]);
108
+ };
109
+ const _onPressHeaderLeft = useFreshCallback(async () => {
110
+ await onBlurFragment();
111
+ voiceMessageStatusManager.publishAll();
112
+ onPressHeaderLeft();
113
+ });
114
+ const _onPressHeaderSubtitle = useFreshCallback(async () => {
115
+ await onBlurFragment();
116
+ voiceMessageStatusManager.publishAll();
117
+ groupChannelFragmentOptions.pubsub.publish({
118
+ type: 'OVERRIDE_SEARCH_ITEM_STARTING_POINT',
119
+ data: { startingPoint: parentMessage.createdAt },
120
+ });
121
+ onPressHeaderSubtitle();
122
+ });
123
+ const _onPressMediaMessage: NonNullable<GroupChannelThreadProps['MessageList']['onPressMediaMessage']> =
124
+ useFreshCallback(async (message, deleteMessage, uri) => {
125
+ await onBlurFragment();
126
+ onPressMediaMessage(message, deleteMessage, uri);
127
+ });
128
+
129
+ useEffect(() => {
130
+ return () => {
131
+ onBlurFragment();
132
+ };
133
+ }, []);
134
+
135
+ const renderItem: GroupChannelThreadProps['MessageList']['renderMessage'] = useFreshCallback((props) => {
136
+ const content = renderMessage ? (
137
+ renderMessage(props)
138
+ ) : (
139
+ <GroupChannelMessageRenderer hideParentMessage {...props} />
140
+ );
141
+ return <Box>{content}</Box>;
142
+ });
143
+
144
+ const memoizedFlatListProps = useMemo(
145
+ () => ({
146
+ ListHeaderComponent: (
147
+ <GroupChannelThreadModule.ParentMessageInfo
148
+ channel={channel}
149
+ currentUserId={currentUser?.userId}
150
+ onDeleteMessage={deleteMessage}
151
+ onPressMediaMessage={_onPressMediaMessage}
152
+ />
153
+ ),
154
+ contentContainerStyle: { flexGrow: 1 },
155
+ ...flatListProps,
156
+ }),
157
+ [flatListProps],
158
+ );
159
+
160
+ const onResetMessageList = useCallback(async () => {
161
+ return await resetWithStartingPoint(Number.MAX_SAFE_INTEGER);
162
+ }, []);
163
+
164
+ const onResetMessageListWithStartingPoint = useCallback(async (startingPoint: number) => {
165
+ return await resetWithStartingPoint(startingPoint);
166
+ }, []);
167
+
168
+ const onPending = (message: SendbirdFileMessage | SendbirdUserMessage) => {
169
+ groupChannelThreadPubSub.publish({ type: 'MESSAGE_SENT_PENDING', data: { message } });
170
+ };
171
+
172
+ const onSent = (message: SendbirdFileMessage | SendbirdUserMessage) => {
173
+ groupChannelThreadPubSub.publish({ type: 'MESSAGE_SENT_SUCCESS', data: { message } });
174
+ };
175
+
176
+ const updateIfParentMessage = (message: SendbirdFileMessage | SendbirdUserMessage) => {
177
+ if (message.messageId === parentMessage.parentMessageId) {
178
+ setParentMessage(message);
179
+ }
180
+ };
181
+
182
+ const onPressSendUserMessage: GroupChannelThreadProps['Input']['onPressSendUserMessage'] = useFreshCallback(
183
+ async (params) => {
184
+ const processedParams = await onBeforeSendUserMessage(params);
185
+ const message = await sendUserMessage(processedParams, onPending);
186
+ onSent(message);
187
+ },
188
+ );
189
+ const onPressSendFileMessage: GroupChannelThreadProps['Input']['onPressSendFileMessage'] = useFreshCallback(
190
+ async (params) => {
191
+ const processedParams = await onBeforeSendFileMessage(params);
192
+ const fileSize = (processedParams.file as File)?.size ?? processedParams.fileSize;
193
+ const uploadSizeLimit = sbOptions.appInfo.uploadSizeLimit;
194
+
195
+ if (fileSize && uploadSizeLimit && fileSize > uploadSizeLimit) {
196
+ const sizeLimitString = `${getReadableFileSize(uploadSizeLimit)} MB`;
197
+ toast.show(STRINGS.TOAST.FILE_UPLOAD_SIZE_LIMIT_EXCEEDED_ERROR(sizeLimitString), 'error');
198
+ return;
199
+ } else {
200
+ const message = await sendFileMessage(processedParams, onPending);
201
+ onSent(message);
202
+ }
203
+ },
204
+ );
205
+ const onPressUpdateUserMessage: GroupChannelThreadProps['Input']['onPressUpdateUserMessage'] = useFreshCallback(
206
+ async (message, params) => {
207
+ const processedParams = await onBeforeUpdateUserMessage(params);
208
+ const updatedMessage = await updateUserMessage(message.messageId, processedParams);
209
+ updateIfParentMessage(updatedMessage);
210
+ },
211
+ );
212
+ const onPressUpdateFileMessage: GroupChannelThreadProps['Input']['onPressUpdateFileMessage'] = useFreshCallback(
213
+ async (message, params) => {
214
+ const processedParams = await onBeforeUpdateFileMessage(params);
215
+ const updatedMessage = await updateFileMessage(message.messageId, processedParams);
216
+ updateIfParentMessage(updatedMessage);
217
+ },
218
+ );
219
+ const onScrolledAwayFromBottom = useFreshCallback((value: boolean) => {
220
+ if (!value) resetNewMessages();
221
+ setScrolledAwayFromBottom(value);
222
+ });
223
+
224
+ return (
225
+ <GroupChannelThreadModule.Provider
226
+ channel={channel}
227
+ parentMessage={_parentMessage}
228
+ groupChannelThreadPubSub={groupChannelThreadPubSub}
229
+ keyboardAvoidOffset={keyboardAvoidOffset}
230
+ threadedMessages={messages}
231
+ >
232
+ <GroupChannelThreadModule.Header onPressLeft={_onPressHeaderLeft} onPressSubtitle={_onPressHeaderSubtitle} />
233
+ <StatusComposition loading={loading} LoadingComponent={<GroupChannelThreadModule.StatusLoading />}>
234
+ <GroupChannelThreadModule.MessageList
235
+ channel={channel}
236
+ onResetMessageList={onResetMessageList}
237
+ onResetMessageListWithStartingPoint={onResetMessageListWithStartingPoint}
238
+ enableMessageGrouping={enableMessageGrouping}
239
+ currentUserId={currentUser?.userId}
240
+ renderMessage={renderItem}
241
+ messages={messages}
242
+ newMessages={newMessages}
243
+ onTopReached={loadPrevious}
244
+ onBottomReached={loadNext}
245
+ hasNext={hasNext}
246
+ scrolledAwayFromBottom={scrolledAwayFromBottom}
247
+ onScrolledAwayFromBottom={onScrolledAwayFromBottom}
248
+ onResendFailedMessage={resendMessage}
249
+ onDeleteMessage={deleteMessage}
250
+ onPressMediaMessage={_onPressMediaMessage}
251
+ flatListProps={memoizedFlatListProps}
252
+ startingPoint={startingPoint}
253
+ />
254
+ <GroupChannelThreadModule.Input
255
+ SuggestedMentionList={GroupChannelThreadModule.SuggestedMentionList}
256
+ shouldRenderInput={shouldRenderInput(channel)}
257
+ onPressSendUserMessage={onPressSendUserMessage}
258
+ onPressSendFileMessage={onPressSendFileMessage}
259
+ onPressUpdateUserMessage={onPressUpdateUserMessage}
260
+ onPressUpdateFileMessage={onPressUpdateFileMessage}
261
+ />
262
+ </StatusComposition>
263
+ </GroupChannelThreadModule.Provider>
264
+ );
265
+ };
266
+ };
267
+
268
+ function shouldRenderInput(channel: SendbirdGroupChannel) {
269
+ if (channel.isBroadcast) {
270
+ return channel.myRole === 'operator';
271
+ }
272
+
273
+ return true;
274
+ }
275
+
276
+ export function threadMessageComparator(a: SendbirdMessage, b: SendbirdMessage) {
277
+ return messageComparator(a, b) * -1;
278
+ }
279
+
280
+ export default createGroupChannelThreadFragment;
@@ -88,15 +88,19 @@ const useMentionSuggestion = (params: {
88
88
  .then((members) => members.filter((member) => member.userId !== currentUser?.userId))
89
89
  .then((members) => members.slice(0, mentionManager.config.suggestionLimit));
90
90
  } else {
91
- return freshChannel.members
92
- .sort((a, b) => a.nickname?.localeCompare(b.nickname))
93
- .filter(
94
- (member) =>
95
- member.nickname?.toLowerCase().startsWith(searchString.toLowerCase()) &&
96
- member.userId !== currentUser?.userId &&
97
- member.isActive,
98
- )
99
- .slice(0, mentionManager.config.suggestionLimit);
91
+ return (
92
+ freshChannel.members
93
+ // NOTE: When using 'org.webkit:android-jsc', there is a problem with sorting lists that include words starting with uppercase and lowercase letters.
94
+ // To ensure consistent sorting regardless of the JSC, we compare the words in lowercase.
95
+ .sort((a, b) => a.nickname?.toLowerCase().localeCompare(b.nickname.toLowerCase()))
96
+ .filter(
97
+ (member) =>
98
+ member.nickname?.toLowerCase().startsWith(searchString.toLowerCase()) &&
99
+ member.userId !== currentUser?.userId &&
100
+ member.isActive,
101
+ )
102
+ .slice(0, mentionManager.config.suggestionLimit)
103
+ );
100
104
  }
101
105
  };
102
106
 
package/src/index.ts CHANGED
@@ -36,6 +36,7 @@ export { default as createGroupChannelRegisterOperatorFragment } from './fragmen
36
36
  export { default as createGroupChannelMutedMembersFragment } from './fragments/createGroupChannelMutedMembersFragment';
37
37
  export { default as createGroupChannelBannedUsersFragment } from './fragments/createGroupChannelBannedUsersFragment';
38
38
  export { default as createGroupChannelNotificationsFragment } from './fragments/createGroupChannelNotificationsFragment';
39
+ export { default as createGroupChannelThreadFragment } from './fragments/createGroupChannelThreadFragment';
39
40
  export { default as createMessageSearchFragment } from './fragments/createMessageSearchFragment';
40
41
 
41
42
  /** Fragments - open channels **/
@@ -102,6 +103,9 @@ export * from './domain/groupChannelUserList/types';
102
103
 
103
104
  export * from './domain/messageSearch/types';
104
105
 
106
+ export * from './domain/groupChannelThread';
107
+ export * from './domain/groupChannelThread/types';
108
+
105
109
  /** Feature - open channels **/
106
110
  export * from './domain/openChannel';
107
111
  export * from './domain/openChannel/types';
@@ -0,0 +1,56 @@
1
+ interface VoiceMessageStatus {
2
+ currentTime: number;
3
+ subscribers?: Set<(currentTime: number) => void>;
4
+ }
5
+
6
+ class VoiceMessageStatusManager {
7
+ private statusMap: Map<string, VoiceMessageStatus> = new Map();
8
+
9
+ private generateKey = (channelUrl: string, messageId: number): string => {
10
+ return `${channelUrl}-${messageId}`;
11
+ };
12
+
13
+ subscribe = (channelUrl: string, messageId: number, subscriber: (currentTime: number) => void) => {
14
+ const key = this.generateKey(channelUrl, messageId);
15
+ if (!this.statusMap.has(key)) {
16
+ this.statusMap.set(key, { currentTime: 0, subscribers: new Set() });
17
+ }
18
+ this.statusMap.get(key)!.subscribers?.add(subscriber);
19
+ };
20
+
21
+ unsubscribe = (channelUrl: string, messageId: number, subscriber: (currentTime: number) => void) => {
22
+ const key = this.generateKey(channelUrl, messageId);
23
+ this.statusMap.get(key)?.subscribers?.delete(subscriber);
24
+ };
25
+
26
+ publishAll = (): void => {
27
+ this.statusMap.forEach((status) => {
28
+ status.subscribers?.forEach((subscriber) => {
29
+ subscriber(status.currentTime);
30
+ });
31
+ });
32
+ };
33
+
34
+ getCurrentTime = (channelUrl: string, messageId: number): number => {
35
+ const key = this.generateKey(channelUrl, messageId);
36
+ return this.statusMap.get(key)?.currentTime || 0;
37
+ };
38
+
39
+ setCurrentTime = (channelUrl: string, messageId: number, currentTime: number): void => {
40
+ const key = this.generateKey(channelUrl, messageId);
41
+ if (!this.statusMap.has(key)) {
42
+ this.statusMap.set(key, { currentTime });
43
+ } else {
44
+ this.statusMap.get(key)!.currentTime = currentTime;
45
+ }
46
+ };
47
+
48
+ clear = (): void => {
49
+ this.statusMap.forEach((status) => {
50
+ status.subscribers?.clear();
51
+ });
52
+ this.statusMap.clear();
53
+ };
54
+ }
55
+
56
+ export default VoiceMessageStatusManager;
@@ -127,6 +127,28 @@ export interface StringSet {
127
127
  /** GroupChannel > Suggested mention list */
128
128
  MENTION_LIMITED: (mentionLimit: number) => string;
129
129
  };
130
+ GROUP_CHANNEL_THREAD: {
131
+ /** GroupChannelThread > Header */
132
+ HEADER_TITLE: string;
133
+ HEADER_SUBTITLE: (currentUserId: string, channel: SendbirdGroupChannel) => string;
134
+
135
+ /** GroupChannelThread > List */
136
+ LIST_DATE_SEPARATOR: (date: Date, locale?: Locale) => string;
137
+ LIST_BUTTON_NEW_MSG: (newMessages: SendbirdMessage[]) => string;
138
+
139
+ /** GroupChannelThread > Message bubble */
140
+ MESSAGE_BUBBLE_TIME: (message: SendbirdMessage, locale?: Locale) => string;
141
+ MESSAGE_BUBBLE_FILE_TITLE: (message: SendbirdFileMessage) => string;
142
+ MESSAGE_BUBBLE_EDITED_POSTFIX: string;
143
+ MESSAGE_BUBBLE_UNKNOWN_TITLE: (message: SendbirdMessage) => string;
144
+ MESSAGE_BUBBLE_UNKNOWN_DESC: (message: SendbirdMessage) => string;
145
+
146
+ PARENT_MESSAGE_TIME: (message: SendbirdMessage, locale?: Locale) => string;
147
+ REPLY_COUNT: (replyCount: number, maxReplyCount?: number) => string;
148
+
149
+ /** GroupChannelThread > Suggested mention list */
150
+ MENTION_LIMITED: (mentionLimit: number) => string;
151
+ };
130
152
  GROUP_CHANNEL_SETTINGS: {
131
153
  /** GroupChannelSettings > Header */
132
154
  HEADER_TITLE: string;
@@ -270,6 +292,8 @@ export interface StringSet {
270
292
  CHANNEL_INPUT_PLACEHOLDER_DISABLED: string;
271
293
  CHANNEL_INPUT_PLACEHOLDER_MUTED: string;
272
294
  CHANNEL_INPUT_PLACEHOLDER_REPLY: string;
295
+ CHANNEL_INPUT_PLACEHOLDER_REPLY_IN_THREAD: string;
296
+ CHANNEL_INPUT_PLACEHOLDER_REPLY_TO_THREAD: string;
273
297
  CHANNEL_INPUT_EDIT_OK: string;
274
298
  CHANNEL_INPUT_EDIT_CANCEL: string;
275
299
  /** ChannelInput > Attachments **/
@@ -286,6 +310,7 @@ export interface StringSet {
286
310
  CHANNEL_MESSAGE_SAVE: string;
287
311
  CHANNEL_MESSAGE_DELETE: string;
288
312
  CHANNEL_MESSAGE_REPLY: string;
313
+ CHANNEL_MESSAGE_THREAD: string;
289
314
  /** Channel > Message > Delete confirm **/
290
315
  CHANNEL_MESSAGE_DELETE_CONFIRM_TITLE: string;
291
316
  CHANNEL_MESSAGE_DELETE_CONFIRM_OK: string;
@@ -346,6 +371,8 @@ export interface StringSet {
346
371
  UNKNOWN_ERROR: string;
347
372
  GET_CHANNEL_ERROR: string;
348
373
  FIND_PARENT_MSG_ERROR: string;
374
+ THREAD_PARENT_MESSAGE_DELETED_ERROR: string;
375
+ FILE_UPLOAD_SIZE_LIMIT_EXCEEDED_ERROR: (uploadSizeLimit: string) => string;
349
376
  };
350
377
  PROFILE_CARD: {
351
378
  BUTTON_MESSAGE: string;
@@ -1,6 +1,6 @@
1
1
  import type { Locale } from 'date-fns';
2
2
 
3
- import type { PartialDeep } from '@sendbird/uikit-utils';
3
+ import { PartialDeep, SendbirdMessage, getThreadParentMessageTimeFormat } from '@sendbird/uikit-utils';
4
4
  import {
5
5
  getDateSeparatorFormat,
6
6
  getGroupChannelPreviewTime,
@@ -12,6 +12,7 @@ import {
12
12
  getMessageType,
13
13
  getOpenChannelParticipants,
14
14
  getOpenChannelTitle,
15
+ getReplyCountFormat,
15
16
  isVoiceMessage,
16
17
  } from '@sendbird/uikit-utils';
17
18
 
@@ -127,6 +128,25 @@ export const createBaseStringSet = ({ dateLocale, overrides }: StringSetCreateOp
127
128
  MENTION_LIMITED: (mentionLimit) => `You can have up to ${mentionLimit} mentions per message.`,
128
129
  ...overrides?.GROUP_CHANNEL,
129
130
  },
131
+ GROUP_CHANNEL_THREAD: {
132
+ HEADER_TITLE: 'Thread',
133
+ HEADER_SUBTITLE: (uid, channel) => getGroupChannelTitle(uid, channel, USER_NO_NAME, CHANNEL_NO_MEMBERS),
134
+ LIST_DATE_SEPARATOR: (date, locale) => getDateSeparatorFormat(date, locale ?? dateLocale),
135
+ LIST_BUTTON_NEW_MSG: (newMessages) => `${newMessages.length} new messages`,
136
+
137
+ MESSAGE_BUBBLE_TIME: (message, locale) => getMessageTimeFormat(new Date(message.createdAt), locale ?? dateLocale),
138
+ MESSAGE_BUBBLE_FILE_TITLE: (message) => message.name,
139
+ MESSAGE_BUBBLE_EDITED_POSTFIX: ' (edited)',
140
+ MESSAGE_BUBBLE_UNKNOWN_TITLE: () => '(Unknown message type)',
141
+ MESSAGE_BUBBLE_UNKNOWN_DESC: () => 'Cannot read this message.',
142
+
143
+ PARENT_MESSAGE_TIME: (message: SendbirdMessage, locale?: Locale) =>
144
+ getThreadParentMessageTimeFormat(new Date(message.createdAt), locale ?? dateLocale),
145
+ REPLY_COUNT: (replyCount: number, maxReplyCount?: number) => getReplyCountFormat(replyCount, maxReplyCount),
146
+
147
+ MENTION_LIMITED: (mentionLimit) => `You can have up to ${mentionLimit} mentions per message.`,
148
+ ...overrides?.GROUP_CHANNEL_THREAD,
149
+ },
130
150
  GROUP_CHANNEL_SETTINGS: {
131
151
  HEADER_TITLE: 'Channel information',
132
152
  HEADER_RIGHT: 'Edit',
@@ -260,9 +280,11 @@ export const createBaseStringSet = ({ dateLocale, overrides }: StringSetCreateOp
260
280
  return 'Several people are typing...';
261
281
  },
262
282
  REPLY_FROM_SENDER_TO_RECEIVER: (reply, parent, currentUserId = UNKNOWN_USER_ID) => {
263
- const senderNickname = reply.sender.nickname || USER_NO_NAME;
264
- const receiverNickname = parent.sender.nickname || USER_NO_NAME;
265
- return `${reply.sender.userId !== currentUserId ? senderNickname : 'You'} replied to ${receiverNickname}`;
283
+ const replySenderNickname =
284
+ reply.sender.userId === currentUserId ? 'You' : reply.sender.nickname || USER_NO_NAME;
285
+ const parentSenderNickname =
286
+ parent.sender.userId === currentUserId ? 'You' : parent.sender.nickname || USER_NO_NAME;
287
+ return `${replySenderNickname} replied to ${parentSenderNickname}`;
266
288
  },
267
289
  MESSAGE_UNAVAILABLE: 'Message unavailable',
268
290
 
@@ -280,6 +302,7 @@ export const createBaseStringSet = ({ dateLocale, overrides }: StringSetCreateOp
280
302
  CHANNEL_MESSAGE_SAVE: 'Save',
281
303
  CHANNEL_MESSAGE_DELETE: 'Delete',
282
304
  CHANNEL_MESSAGE_REPLY: 'Reply',
305
+ CHANNEL_MESSAGE_THREAD: 'Reply in thread',
283
306
  CHANNEL_MESSAGE_DELETE_CONFIRM_TITLE: 'Delete message?',
284
307
  CHANNEL_MESSAGE_DELETE_CONFIRM_OK: 'Delete',
285
308
  CHANNEL_MESSAGE_DELETE_CONFIRM_CANCEL: 'Cancel',
@@ -293,6 +316,8 @@ export const createBaseStringSet = ({ dateLocale, overrides }: StringSetCreateOp
293
316
  CHANNEL_INPUT_PLACEHOLDER_DISABLED: 'Chat not available in this channel.',
294
317
  CHANNEL_INPUT_PLACEHOLDER_MUTED: "You're muted by the operator.",
295
318
  CHANNEL_INPUT_PLACEHOLDER_REPLY: 'Reply to message',
319
+ CHANNEL_INPUT_PLACEHOLDER_REPLY_IN_THREAD: 'Reply in thread',
320
+ CHANNEL_INPUT_PLACEHOLDER_REPLY_TO_THREAD: 'Reply to thread',
296
321
  CHANNEL_INPUT_EDIT_OK: 'Save',
297
322
  CHANNEL_INPUT_EDIT_CANCEL: 'Cancel',
298
323
  CHANNEL_INPUT_REPLY_PREVIEW_TITLE: (user) => `Reply to ${user.nickname || USER_NO_NAME}`,
@@ -371,6 +396,10 @@ export const createBaseStringSet = ({ dateLocale, overrides }: StringSetCreateOp
371
396
  UNKNOWN_ERROR: 'Something went wrong.',
372
397
  GET_CHANNEL_ERROR: "Couldn't retrieve channel.",
373
398
  FIND_PARENT_MSG_ERROR: "Couldn't find the original message for this reply.",
399
+ THREAD_PARENT_MESSAGE_DELETED_ERROR: "The thread doesn't exist because the parent message was deleted.",
400
+ FILE_UPLOAD_SIZE_LIMIT_EXCEEDED_ERROR: (uploadSizeLimit: string) => {
401
+ return `The maximum size per file is ${uploadSizeLimit}.`;
402
+ },
374
403
  ...overrides?.TOAST,
375
404
  },
376
405
  PROFILE_CARD: {
package/src/version.ts CHANGED
@@ -1,2 +1,2 @@
1
- const VERSION = '3.5.3';
1
+ const VERSION = '3.6.0';
2
2
  export default VERSION;