@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.
- package/lib/commonjs/components/ChannelInput/SendInput.js +23 -6
- package/lib/commonjs/components/ChannelInput/SendInput.js.map +1 -1
- package/lib/commonjs/components/ChannelInput/index.js.map +1 -1
- package/lib/commonjs/components/ChannelMessageList/index.js +22 -4
- package/lib/commonjs/components/ChannelMessageList/index.js.map +1 -1
- package/lib/commonjs/components/ChannelThreadMessageList/index.js +349 -0
- package/lib/commonjs/components/ChannelThreadMessageList/index.js.map +1 -0
- package/lib/commonjs/components/GroupChannelMessageRenderer/GroupChannelMessageParentMessage.js +2 -2
- package/lib/commonjs/components/GroupChannelMessageRenderer/GroupChannelMessageParentMessage.js.map +1 -1
- package/lib/commonjs/components/GroupChannelMessageRenderer/GroupChannelMessageReplyInfo.js +100 -0
- package/lib/commonjs/components/GroupChannelMessageRenderer/GroupChannelMessageReplyInfo.js.map +1 -0
- package/lib/commonjs/components/GroupChannelMessageRenderer/index.js +24 -6
- package/lib/commonjs/components/GroupChannelMessageRenderer/index.js.map +1 -1
- package/lib/commonjs/components/ReactionAddons/MessageReactionAddon.js +23 -6
- package/lib/commonjs/components/ReactionAddons/MessageReactionAddon.js.map +1 -1
- package/lib/commonjs/components/ThreadChatFlatList/index.js +76 -0
- package/lib/commonjs/components/ThreadChatFlatList/index.js.map +1 -0
- package/lib/commonjs/components/ThreadParentMessageRenderer/ThreadParentMessage.file.image.js +41 -0
- package/lib/commonjs/components/ThreadParentMessageRenderer/ThreadParentMessage.file.image.js.map +1 -0
- package/lib/commonjs/components/ThreadParentMessageRenderer/ThreadParentMessage.file.js +74 -0
- package/lib/commonjs/components/ThreadParentMessageRenderer/ThreadParentMessage.file.js.map +1 -0
- package/lib/commonjs/components/ThreadParentMessageRenderer/ThreadParentMessage.file.video.js +42 -0
- package/lib/commonjs/components/ThreadParentMessageRenderer/ThreadParentMessage.file.video.js.map +1 -0
- package/lib/commonjs/components/ThreadParentMessageRenderer/ThreadParentMessage.file.voice.js +94 -0
- package/lib/commonjs/components/ThreadParentMessageRenderer/ThreadParentMessage.file.voice.js.map +1 -0
- package/lib/commonjs/components/ThreadParentMessageRenderer/ThreadParentMessage.user.js +61 -0
- package/lib/commonjs/components/ThreadParentMessageRenderer/ThreadParentMessage.user.js.map +1 -0
- package/lib/commonjs/components/ThreadParentMessageRenderer/ThreadParentMessage.user.og.js +127 -0
- package/lib/commonjs/components/ThreadParentMessageRenderer/ThreadParentMessage.user.og.js.map +1 -0
- package/lib/commonjs/components/ThreadParentMessageRenderer/index.js +206 -0
- package/lib/commonjs/components/ThreadParentMessageRenderer/index.js.map +1 -0
- package/lib/commonjs/containers/SendbirdUIKitContainer.js +7 -1
- package/lib/commonjs/containers/SendbirdUIKitContainer.js.map +1 -1
- package/lib/commonjs/contexts/SendbirdChatCtx.js +7 -0
- package/lib/commonjs/contexts/SendbirdChatCtx.js.map +1 -1
- package/lib/commonjs/domain/groupChannel/component/GroupChannelMessageList.js +28 -5
- package/lib/commonjs/domain/groupChannel/component/GroupChannelMessageList.js.map +1 -1
- package/lib/commonjs/domain/groupChannel/module/moduleContext.js +14 -4
- package/lib/commonjs/domain/groupChannel/module/moduleContext.js.map +1 -1
- package/lib/commonjs/domain/groupChannel/types.js.map +1 -1
- package/lib/commonjs/domain/groupChannelThread/component/GroupChannelThreadHeader.js +82 -0
- package/lib/commonjs/domain/groupChannelThread/component/GroupChannelThreadHeader.js.map +1 -0
- package/lib/commonjs/domain/groupChannelThread/component/GroupChannelThreadInput.js +44 -0
- package/lib/commonjs/domain/groupChannelThread/component/GroupChannelThreadInput.js.map +1 -0
- package/lib/commonjs/domain/groupChannelThread/component/GroupChannelThreadMessageList.js +127 -0
- package/lib/commonjs/domain/groupChannelThread/component/GroupChannelThreadMessageList.js.map +1 -0
- package/lib/commonjs/domain/groupChannelThread/component/GroupChannelThreadParentMessageInfo.js +315 -0
- package/lib/commonjs/domain/groupChannelThread/component/GroupChannelThreadParentMessageInfo.js.map +1 -0
- package/lib/commonjs/domain/groupChannelThread/component/GroupChannelThreadStatusEmpty.js +27 -0
- package/lib/commonjs/domain/groupChannelThread/component/GroupChannelThreadStatusEmpty.js.map +1 -0
- package/lib/commonjs/domain/groupChannelThread/component/GroupChannelThreadStatusLoading.js +27 -0
- package/lib/commonjs/domain/groupChannelThread/component/GroupChannelThreadStatusLoading.js.map +1 -0
- package/lib/commonjs/domain/groupChannelThread/component/GroupChannelThreadSuggestedMentionList.js +195 -0
- package/lib/commonjs/domain/groupChannelThread/component/GroupChannelThreadSuggestedMentionList.js.map +1 -0
- package/lib/commonjs/domain/groupChannelThread/index.js +69 -0
- package/lib/commonjs/domain/groupChannelThread/index.js.map +1 -0
- package/lib/commonjs/domain/groupChannelThread/module/createGroupChannelThreadModule.js +42 -0
- package/lib/commonjs/domain/groupChannelThread/module/createGroupChannelThreadModule.js.map +1 -0
- package/lib/commonjs/domain/groupChannelThread/module/moduleContext.js +148 -0
- package/lib/commonjs/domain/groupChannelThread/module/moduleContext.js.map +1 -0
- package/lib/commonjs/domain/groupChannelThread/types.js +6 -0
- package/lib/commonjs/domain/groupChannelThread/types.js.map +1 -0
- package/lib/commonjs/fragments/createGroupChannelFragment.js +30 -5
- package/lib/commonjs/fragments/createGroupChannelFragment.js.map +1 -1
- package/lib/commonjs/fragments/createGroupChannelThreadFragment.js +267 -0
- package/lib/commonjs/fragments/createGroupChannelThreadFragment.js.map +1 -0
- package/lib/commonjs/hooks/useMentionSuggestion.js +5 -2
- package/lib/commonjs/hooks/useMentionSuggestion.js.map +1 -1
- package/lib/commonjs/index.js +72 -40
- package/lib/commonjs/index.js.map +1 -1
- package/lib/commonjs/libs/VoiceMessageStatusManager.js +66 -0
- package/lib/commonjs/libs/VoiceMessageStatusManager.js.map +1 -0
- package/lib/commonjs/localization/StringSet.type.js.map +1 -1
- package/lib/commonjs/localization/createBaseStringSet.js +25 -3
- package/lib/commonjs/localization/createBaseStringSet.js.map +1 -1
- package/lib/commonjs/version.js +1 -1
- package/lib/commonjs/version.js.map +1 -1
- package/lib/module/components/ChannelInput/SendInput.js +23 -6
- package/lib/module/components/ChannelInput/SendInput.js.map +1 -1
- package/lib/module/components/ChannelInput/index.js.map +1 -1
- package/lib/module/components/ChannelMessageList/index.js +22 -4
- package/lib/module/components/ChannelMessageList/index.js.map +1 -1
- package/lib/module/components/ChannelThreadMessageList/index.js +341 -0
- package/lib/module/components/ChannelThreadMessageList/index.js.map +1 -0
- package/lib/module/components/GroupChannelMessageRenderer/GroupChannelMessageParentMessage.js +2 -2
- package/lib/module/components/GroupChannelMessageRenderer/GroupChannelMessageParentMessage.js.map +1 -1
- package/lib/module/components/GroupChannelMessageRenderer/GroupChannelMessageReplyInfo.js +92 -0
- package/lib/module/components/GroupChannelMessageRenderer/GroupChannelMessageReplyInfo.js.map +1 -0
- package/lib/module/components/GroupChannelMessageRenderer/index.js +24 -6
- package/lib/module/components/GroupChannelMessageRenderer/index.js.map +1 -1
- package/lib/module/components/ReactionAddons/MessageReactionAddon.js +23 -6
- package/lib/module/components/ReactionAddons/MessageReactionAddon.js.map +1 -1
- package/lib/module/components/ThreadChatFlatList/index.js +66 -0
- package/lib/module/components/ThreadChatFlatList/index.js.map +1 -0
- package/lib/module/components/ThreadParentMessageRenderer/ThreadParentMessage.file.image.js +34 -0
- package/lib/module/components/ThreadParentMessageRenderer/ThreadParentMessage.file.image.js.map +1 -0
- package/lib/module/components/ThreadParentMessageRenderer/ThreadParentMessage.file.js +67 -0
- package/lib/module/components/ThreadParentMessageRenderer/ThreadParentMessage.file.js.map +1 -0
- package/lib/module/components/ThreadParentMessageRenderer/ThreadParentMessage.file.video.js +34 -0
- package/lib/module/components/ThreadParentMessageRenderer/ThreadParentMessage.file.video.js.map +1 -0
- package/lib/module/components/ThreadParentMessageRenderer/ThreadParentMessage.file.voice.js +87 -0
- package/lib/module/components/ThreadParentMessageRenderer/ThreadParentMessage.file.voice.js.map +1 -0
- package/lib/module/components/ThreadParentMessageRenderer/ThreadParentMessage.user.js +54 -0
- package/lib/module/components/ThreadParentMessageRenderer/ThreadParentMessage.user.js.map +1 -0
- package/lib/module/components/ThreadParentMessageRenderer/ThreadParentMessage.user.og.js +119 -0
- package/lib/module/components/ThreadParentMessageRenderer/ThreadParentMessage.user.og.js.map +1 -0
- package/lib/module/components/ThreadParentMessageRenderer/index.js +196 -0
- package/lib/module/components/ThreadParentMessageRenderer/index.js.map +1 -0
- package/lib/module/containers/SendbirdUIKitContainer.js +7 -1
- package/lib/module/containers/SendbirdUIKitContainer.js.map +1 -1
- package/lib/module/contexts/SendbirdChatCtx.js +6 -0
- package/lib/module/contexts/SendbirdChatCtx.js.map +1 -1
- package/lib/module/domain/groupChannel/component/GroupChannelMessageList.js +30 -6
- package/lib/module/domain/groupChannel/component/GroupChannelMessageList.js.map +1 -1
- package/lib/module/domain/groupChannel/module/moduleContext.js +14 -4
- package/lib/module/domain/groupChannel/module/moduleContext.js.map +1 -1
- package/lib/module/domain/groupChannel/types.js.map +1 -1
- package/lib/module/domain/groupChannelThread/component/GroupChannelThreadHeader.js +73 -0
- package/lib/module/domain/groupChannelThread/component/GroupChannelThreadHeader.js.map +1 -0
- package/lib/module/domain/groupChannelThread/component/GroupChannelThreadInput.js +34 -0
- package/lib/module/domain/groupChannelThread/component/GroupChannelThreadInput.js.map +1 -0
- package/lib/module/domain/groupChannelThread/component/GroupChannelThreadMessageList.js +117 -0
- package/lib/module/domain/groupChannelThread/component/GroupChannelThreadMessageList.js.map +1 -0
- package/lib/module/domain/groupChannelThread/component/GroupChannelThreadParentMessageInfo.js +305 -0
- package/lib/module/domain/groupChannelThread/component/GroupChannelThreadParentMessageInfo.js.map +1 -0
- package/lib/module/domain/groupChannelThread/component/GroupChannelThreadStatusEmpty.js +19 -0
- package/lib/module/domain/groupChannelThread/component/GroupChannelThreadStatusEmpty.js.map +1 -0
- package/lib/module/domain/groupChannelThread/component/GroupChannelThreadStatusLoading.js +19 -0
- package/lib/module/domain/groupChannelThread/component/GroupChannelThreadStatusLoading.js.map +1 -0
- package/lib/module/domain/groupChannelThread/component/GroupChannelThreadSuggestedMentionList.js +185 -0
- package/lib/module/domain/groupChannelThread/component/GroupChannelThreadSuggestedMentionList.js.map +1 -0
- package/lib/module/domain/groupChannelThread/index.js +9 -0
- package/lib/module/domain/groupChannelThread/index.js.map +1 -0
- package/lib/module/domain/groupChannelThread/module/createGroupChannelThreadModule.js +34 -0
- package/lib/module/domain/groupChannelThread/module/createGroupChannelThreadModule.js.map +1 -0
- package/lib/module/domain/groupChannelThread/module/moduleContext.js +137 -0
- package/lib/module/domain/groupChannelThread/module/moduleContext.js.map +1 -0
- package/lib/module/domain/groupChannelThread/types.js +2 -0
- package/lib/module/domain/groupChannelThread/types.js.map +1 -0
- package/lib/module/fragments/createGroupChannelFragment.js +33 -7
- package/lib/module/fragments/createGroupChannelFragment.js.map +1 -1
- package/lib/module/fragments/createGroupChannelThreadFragment.js +257 -0
- package/lib/module/fragments/createGroupChannelThreadFragment.js.map +1 -0
- package/lib/module/hooks/useMentionSuggestion.js +5 -2
- package/lib/module/hooks/useMentionSuggestion.js.map +1 -1
- package/lib/module/index.js +3 -0
- package/lib/module/index.js.map +1 -1
- package/lib/module/libs/VoiceMessageStatusManager.js +59 -0
- package/lib/module/libs/VoiceMessageStatusManager.js.map +1 -0
- package/lib/module/localization/StringSet.type.js.map +1 -1
- package/lib/module/localization/createBaseStringSet.js +27 -4
- package/lib/module/localization/createBaseStringSet.js.map +1 -1
- package/lib/module/version.js +1 -1
- package/lib/module/version.js.map +1 -1
- package/lib/typescript/src/components/ChannelInput/index.d.ts +1 -0
- package/lib/typescript/src/components/ChannelMessageList/index.d.ts +5 -2
- package/lib/typescript/src/components/ChannelThreadMessageList/index.d.ts +55 -0
- package/lib/typescript/src/components/GroupChannelMessageRenderer/GroupChannelMessageParentMessage.d.ts +1 -1
- package/lib/typescript/src/components/GroupChannelMessageRenderer/GroupChannelMessageReplyInfo.d.ts +9 -0
- package/lib/typescript/src/components/GroupChannelMessageRenderer/index.d.ts +3 -1
- package/lib/typescript/src/components/OpenChannelMessageRenderer/index.d.ts +3 -1
- package/lib/typescript/src/components/ReactionAddons/MessageReactionAddon.d.ts +3 -1
- package/lib/typescript/src/components/ReactionAddons/index.d.ts +2 -1
- package/lib/typescript/src/components/ThreadChatFlatList/index.d.ts +9 -0
- package/lib/typescript/src/components/ThreadParentMessageRenderer/ThreadParentMessage.file.d.ts +4 -0
- package/lib/typescript/src/components/ThreadParentMessageRenderer/ThreadParentMessage.file.image.d.ts +4 -0
- package/lib/typescript/src/components/ThreadParentMessageRenderer/ThreadParentMessage.file.video.d.ts +9 -0
- package/lib/typescript/src/components/ThreadParentMessageRenderer/ThreadParentMessage.file.voice.d.ts +13 -0
- package/lib/typescript/src/components/ThreadParentMessageRenderer/ThreadParentMessage.user.d.ts +10 -0
- package/lib/typescript/src/components/ThreadParentMessageRenderer/ThreadParentMessage.user.og.d.ts +10 -0
- package/lib/typescript/src/components/ThreadParentMessageRenderer/index.d.ts +20 -0
- package/lib/typescript/src/containers/SendbirdUIKitContainer.d.ts +6 -4
- package/lib/typescript/src/contexts/SendbirdChatCtx.d.ts +15 -1
- package/lib/typescript/src/domain/groupChannel/types.d.ts +4 -1
- package/lib/typescript/src/domain/groupChannelThread/component/GroupChannelThreadHeader.d.ts +4 -0
- package/lib/typescript/src/domain/groupChannelThread/component/GroupChannelThreadInput.d.ts +3 -0
- package/lib/typescript/src/domain/groupChannelThread/component/GroupChannelThreadMessageList.d.ts +7 -0
- package/lib/typescript/src/domain/groupChannelThread/component/GroupChannelThreadParentMessageInfo.d.ts +8 -0
- package/lib/typescript/src/domain/groupChannelThread/component/GroupChannelThreadStatusEmpty.d.ts +3 -0
- package/lib/typescript/src/domain/groupChannelThread/component/GroupChannelThreadStatusLoading.d.ts +3 -0
- package/lib/typescript/src/domain/groupChannelThread/component/GroupChannelThreadSuggestedMentionList.d.ts +4 -0
- package/lib/typescript/src/domain/groupChannelThread/index.d.ts +8 -0
- package/lib/typescript/src/domain/groupChannelThread/module/createGroupChannelThreadModule.d.ts +3 -0
- package/lib/typescript/src/domain/groupChannelThread/module/moduleContext.d.ts +3 -0
- package/lib/typescript/src/domain/groupChannelThread/types.d.ts +136 -0
- package/lib/typescript/src/domain/openChannel/component/OpenChannelHeader.d.ts +1 -1
- package/lib/typescript/src/fragments/createGroupChannelThreadFragment.d.ts +5 -0
- package/lib/typescript/src/hooks/useChannelInputItems.d.ts +1 -1
- package/lib/typescript/src/index.d.ts +3 -0
- package/lib/typescript/src/libs/VoiceMessageStatusManager.d.ts +11 -0
- package/lib/typescript/src/localization/StringSet.type.d.ts +23 -0
- package/lib/typescript/src/localization/createBaseStringSet.d.ts +1 -1
- package/lib/typescript/src/version.d.ts +1 -1
- package/package.json +6 -6
- package/src/components/ChannelInput/SendInput.tsx +24 -5
- package/src/components/ChannelInput/index.tsx +1 -0
- package/src/components/ChannelMessageList/index.tsx +27 -5
- package/src/components/ChannelThreadMessageList/index.tsx +406 -0
- package/src/components/GroupChannelMessageRenderer/GroupChannelMessageParentMessage.tsx +3 -3
- package/src/components/GroupChannelMessageRenderer/GroupChannelMessageReplyInfo.tsx +96 -0
- package/src/components/GroupChannelMessageRenderer/index.tsx +21 -5
- package/src/components/ReactionAddons/MessageReactionAddon.tsx +38 -5
- package/src/components/ThreadChatFlatList/index.tsx +63 -0
- package/src/components/ThreadParentMessageRenderer/ThreadParentMessage.file.image.tsx +36 -0
- package/src/components/ThreadParentMessageRenderer/ThreadParentMessage.file.tsx +61 -0
- package/src/components/ThreadParentMessageRenderer/ThreadParentMessage.file.video.tsx +45 -0
- package/src/components/ThreadParentMessageRenderer/ThreadParentMessage.file.voice.tsx +107 -0
- package/src/components/ThreadParentMessageRenderer/ThreadParentMessage.user.og.tsx +133 -0
- package/src/components/ThreadParentMessageRenderer/ThreadParentMessage.user.tsx +65 -0
- package/src/components/ThreadParentMessageRenderer/index.tsx +194 -0
- package/src/containers/SendbirdUIKitContainer.tsx +9 -4
- package/src/contexts/SendbirdChatCtx.tsx +20 -0
- package/src/domain/groupChannel/component/GroupChannelMessageList.tsx +37 -8
- package/src/domain/groupChannel/module/moduleContext.tsx +12 -2
- package/src/domain/groupChannel/types.ts +5 -0
- package/src/domain/groupChannelThread/component/GroupChannelThreadHeader.tsx +63 -0
- package/src/domain/groupChannelThread/component/GroupChannelThreadInput.tsx +38 -0
- package/src/domain/groupChannelThread/component/GroupChannelThreadMessageList.tsx +105 -0
- package/src/domain/groupChannelThread/component/GroupChannelThreadParentMessageInfo.tsx +326 -0
- package/src/domain/groupChannelThread/component/GroupChannelThreadStatusEmpty.tsx +18 -0
- package/src/domain/groupChannelThread/component/GroupChannelThreadStatusLoading.tsx +18 -0
- package/src/domain/groupChannelThread/component/GroupChannelThreadSuggestedMentionList.tsx +174 -0
- package/src/domain/groupChannelThread/index.ts +8 -0
- package/src/domain/groupChannelThread/module/createGroupChannelThreadModule.tsx +35 -0
- package/src/domain/groupChannelThread/module/moduleContext.tsx +165 -0
- package/src/domain/groupChannelThread/types.ts +184 -0
- package/src/fragments/createGroupChannelFragment.tsx +38 -8
- package/src/fragments/createGroupChannelThreadFragment.tsx +280 -0
- package/src/hooks/useMentionSuggestion.ts +13 -9
- package/src/index.ts +4 -0
- package/src/libs/VoiceMessageStatusManager.ts +56 -0
- package/src/localization/StringSet.type.ts +27 -0
- package/src/localization/createBaseStringSet.ts +33 -4
- 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
|
|
92
|
-
.
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
member
|
|
98
|
-
|
|
99
|
-
|
|
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
|
|
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
|
|
264
|
-
|
|
265
|
-
|
|
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.
|
|
1
|
+
const VERSION = '3.6.0';
|
|
2
2
|
export default VERSION;
|