Skip to content

Commit 89ad7dc

Browse files
authored
fix: clean up the interface of thread module (#459)
### Description Of Changes Issue * Had to cover parent message with brackets before putting it to the Thread. So it caused confusing work around Fix * Check if the message is parent message or thread message inside of the Thread * Use case (Before) ```javascript <Thread message={message} // or message={{ parentMessage }} /> ``` * Use case (After) ```javascript <Thread message={message} // or message={parentMessage} /> ``` * Remove props on the interface: `includePollDetails` * Add util functions `isParentMessage` and `isThreadMessage` [UIKIT-3325](https://sendbird.atlassian.net/browse/UIKIT-3325)
1 parent d194cbe commit 89ad7dc

File tree

9 files changed

+86
-23
lines changed

9 files changed

+86
-23
lines changed

scripts/index_d_ts

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -664,7 +664,6 @@ declare module "SendbirdUIKitGlobal" {
664664
// includeReactions?: boolean,
665665
// UIKit doesn't support message threading in OpenChannel
666666
// includeThreadInfo?: boolean,
667-
includePollDetails?: boolean,
668667
includeParentMessageInfo?: boolean,
669668
showSubchannelMessagesOnly?: boolean,
670669
customTypes?: Array<string>,

src/index.d.ts

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -956,7 +956,6 @@ type OpenChannelQueries = {
956956
// includeReactions?: boolean,
957957
// UIKit doesn't support message threading in OpenChannel
958958
// includeThreadInfo?: boolean,
959-
includePollDetails?: boolean,
960959
includeParentMessageInfo?: boolean,
961960
showSubchannelMessagesOnly?: boolean,
962961
customTypes?: Array<string>,

src/smart-components/App/DesktopLayout.tsx

Lines changed: 1 addition & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,6 @@ import Channel from '../Channel';
77
import ChannelSettings from '../ChannelSettings';
88
import MessageSearchPannel from '../MessageSearch';
99
import Thread from '../Thread';
10-
import { BaseMessage, UserMessage } from '@sendbird/chat/message';
1110

1211
export const DesktopLayout: React.FC<DesktopLayoutProps> = (
1312
props: DesktopLayoutProps,
@@ -77,10 +76,7 @@ export const DesktopLayout: React.FC<DesktopLayoutProps> = (
7776
setShowSettings(false);
7877
setShowSearch(false);
7978
if (replyType === 'THREAD') {
80-
setThreadTargetMessage({
81-
parentMessage: message as BaseMessage,
82-
parentMessageId: message?.messageId,
83-
} as UserMessage);
79+
setThreadTargetMessage(message);
8480
setShowThread(true);
8581
}
8682
}}

src/smart-components/Channel/context/ChannelProvider.tsx

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -55,7 +55,6 @@ export type MessageListParams = {
5555
includeMetaArray?: boolean,
5656
includeReactions?: boolean,
5757
includeThreadInfo?: boolean,
58-
includePollDetails?: boolean,
5958
includeParentMessageInfo?: boolean,
6059
showSubchannelMessagesOnly?: boolean,
6160
customTypes?: Array<string>,

src/smart-components/OpenChannel/context/OpenChannelProvider.tsx

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -46,7 +46,6 @@ type OpenChannelQueries = {
4646
// includeReactions?: boolean,
4747
// UIKit doesn't support message threading in OpenChannel
4848
// includeThreadInfo?: boolean,
49-
includePollDetails?: boolean,
5049
includeParentMessageInfo?: boolean,
5150
showSubchannelMessagesOnly?: boolean,
5251
customTypes?: Array<string>,

src/smart-components/Thread/context/ThreadProvider.tsx

Lines changed: 8 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@ import { User } from '@sendbird/chat';
33
import { GroupChannel } from '@sendbird/chat/groupChannel';
44
import { BaseMessage, FileMessage, FileMessageCreateParams, UserMessage } from '@sendbird/chat/message';
55

6-
import { getNicknamesMapFromMembers } from './utils';
6+
import { getNicknamesMapFromMembers, getParentMessageFrom } from './utils';
77
import { UserProfileProvider } from '../../../lib/UserProfileContext';
88
import { CustomUseReducerDispatcher } from '../../../lib/SendbirdState';
99
import useSendbirdStateContext from '../../../hooks/useSendbirdStateContext';
@@ -64,7 +64,6 @@ export const ThreadProvider: React.FC<ThreadProviderProps> = (props: ThreadProvi
6464
const {
6565
children,
6666
channelUrl,
67-
message,
6867
onHeaderActionClick,
6968
onMoveToParentMessage,
7069
onBeforeSendVoiceMessage,
@@ -73,6 +72,8 @@ export const ThreadProvider: React.FC<ThreadProviderProps> = (props: ThreadProvi
7372
renderUserProfile,
7473
onUserProfileMessage,
7574
} = props;
75+
const propsMessage = props?.message;
76+
const propsParentMessage = getParentMessageFrom(propsMessage);
7677
// Context from SendbirdProvider
7778
const globalStore = useSendbirdStateContext();
7879
const { stores, config } = globalStore;
@@ -120,19 +121,19 @@ export const ThreadProvider: React.FC<ThreadProviderProps> = (props: ThreadProvi
120121
useGetChannel({
121122
channelUrl,
122123
sdkInit,
123-
message,
124+
message: propsMessage,
124125
}, { sdk, logger, threadDispatcher });
125126
useGetParentMessage({
126127
channelUrl,
127128
sdkInit,
128-
parentMessageId: message?.parentMessageId,
129-
parentMessage: message?.parentMessage,
129+
parentMessage: propsParentMessage,
130130
}, { sdk, logger, threadDispatcher });
131131
useGetThreadList({
132132
sdkInit,
133133
parentMessage,
134134
isReactionEnabled,
135-
anchorMessage: message?.messageId ? message : null,
135+
anchorMessage: propsMessage?.messageId !== propsParentMessage?.messageId ? propsMessage : null,
136+
// anchorMessage should be null when parentMessage doesn't exist
136137
}, { logger, threadDispatcher });
137138
useGetAllEmoji({ sdk }, { logger, threadDispatcher });
138139
// Handle channel events
@@ -193,7 +194,7 @@ export const ThreadProvider: React.FC<ThreadProviderProps> = (props: ThreadProvi
193194
value={{
194195
// ThreadProviderProps
195196
channelUrl,
196-
message,
197+
message: propsMessage,
197198
onHeaderActionClick,
198199
onMoveToParentMessage,
199200
// ThreadContextInitialState
Lines changed: 47 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,47 @@
1+
import { UserMessage } from "@sendbird/chat/message";
2+
import { getParentMessageFrom, isParentMessage, isThreadMessage } from "../utils";
3+
4+
const mockParentMessage = {
5+
messageId: 1,
6+
parentMessage: null,
7+
parentMessageId: null,
8+
threadInfo: {
9+
lastRepliedAt: 100000,
10+
replyCount: 1,
11+
mostRepliedUsers: [],
12+
updatedAt: 100000,
13+
},
14+
};
15+
const mockThreadMessage = {
16+
messageId: 2,
17+
parentMessage: mockParentMessage,
18+
parentMessageId: 1,
19+
threadInfo: null,
20+
};
21+
22+
describe('Thread/utils - isParentMessage', () => {
23+
it('should comfirm if the message is a parent message', () => {
24+
expect(isParentMessage(mockParentMessage as UserMessage)).toBe(true);
25+
});
26+
it('should confirm if the message is not a parent message', () => {
27+
expect(isParentMessage(mockThreadMessage as UserMessage)).toBe(false);
28+
});
29+
});
30+
31+
describe('Thread/utils - isThreadMessage', () => {
32+
it('should comfirm if the message is a thread message', () => {
33+
expect(isThreadMessage(mockThreadMessage as UserMessage)).toBe(true);
34+
});
35+
it('should comfirm if the message is not a thread message', () => {
36+
expect(isThreadMessage(mockParentMessage as UserMessage)).toBe(false);
37+
});
38+
});
39+
40+
describe('Thread/utils - getParentMessageFrom', () => {
41+
it('should return parent message if it has a parent message', () => {
42+
expect(getParentMessageFrom(mockThreadMessage as UserMessage)).toBe(mockParentMessage);
43+
});
44+
it('should return itself if it is a parent message', () => {
45+
expect(getParentMessageFrom(mockParentMessage as UserMessage)).toBe(mockParentMessage);
46+
});
47+
});

src/smart-components/Thread/context/hooks/useGetParentMessage.ts

Lines changed: 3 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,6 @@ import { ChannelType } from '@sendbird/chat';
88

99
interface DynamicProps {
1010
channelUrl: string;
11-
parentMessageId: number;
1211
sdkInit: boolean;
1312
parentMessage?: BaseMessage;
1413
}
@@ -21,7 +20,6 @@ interface StaticProps {
2120

2221
export default function useGetParentMessage({
2322
channelUrl,
24-
parentMessageId,
2523
sdkInit,
2624
parentMessage,
2725
}: DynamicProps, {
@@ -39,11 +37,10 @@ export default function useGetParentMessage({
3937
const params: MessageRetrievalParams = {
4038
channelUrl,
4139
channelType: ChannelType.GROUP,
42-
messageId: parentMessageId,
40+
messageId: parentMessage?.messageId,
4341
includeMetaArray: true,
4442
includeReactions: true,
4543
includeThreadInfo: true,
46-
includePollDetails: true,
4744
includeParentMessageInfo: true,
4845
};
4946
logger.info('Thread | useGetParentMessage: Get parent message start.', params);
@@ -54,7 +51,7 @@ export default function useGetParentMessage({
5451
fetchParentMessage()
5552
.then((parentMsg) => {
5653
logger.info('Thread | useGetParentMessage: Get parent message succeeded.', parentMessage);
57-
parentMsg.ogMetaData = parentMessage.ogMetaData;// ogMetaData is not included for now
54+
parentMsg.ogMetaData = parentMessage?.ogMetaData || null;// ogMetaData is not included for now
5855
threadDispatcher({
5956
type: ThreadContextActionTypes.GET_PARENT_MESSAGE_SUCCESS,
6057
payload: { parentMessage: parentMsg },
@@ -68,7 +65,7 @@ export default function useGetParentMessage({
6865
});
6966
});
7067
}
71-
}, [sdkInit, parentMessageId]);
68+
}, [sdkInit, parentMessage?.messageId]);
7269
/**
7370
* We don't use channelUrl here,
7471
* because Thread must operate independently of the channel.

src/smart-components/Thread/context/utils.ts

Lines changed: 27 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
import format from 'date-fns/format';
22
import { GroupChannel } from "@sendbird/chat/groupChannel";
3-
import { FileMessage, UserMessage } from "@sendbird/chat/message";
3+
import { BaseMessage, FileMessage, UserMessage } from "@sendbird/chat/message";
44
import { getOutgoingMessageState, OutgoingMessageStates } from "../../../utils/exports/getOutgoingMessageState";
55

66
export const getNicknamesMapFromMembers = (members = []): Map<string, string> => {
@@ -12,6 +12,32 @@ export const getNicknamesMapFromMembers = (members = []): Map<string, string> =>
1212
return nicknamesMap;
1313
};
1414

15+
export const getParentMessageFrom = (message: UserMessage | FileMessage): UserMessage | FileMessage | BaseMessage => {
16+
if (isParentMessage(message)) {
17+
return message;
18+
}
19+
if (isThreadMessage(message)) {
20+
return message?.parentMessage;
21+
}
22+
return null;
23+
};
24+
25+
export const isParentMessage = (message: UserMessage | FileMessage): boolean => {
26+
return (
27+
message?.parentMessage === null
28+
&& message?.parentMessageId === null
29+
&& message?.threadInfo !== null
30+
);
31+
};
32+
33+
export const isThreadMessage = (message: UserMessage | FileMessage): boolean => {
34+
return (
35+
message?.parentMessage !== null
36+
&& message?.parentMessageId !== null
37+
&& message?.threadInfo === null
38+
);
39+
};
40+
1541
export const isAboutSame = (a: number, b: number, px: number): boolean => (Math.abs(a - b) <= px);
1642

1743
export const isEmpty = (val: unknown): boolean => (val === null || val === undefined);

0 commit comments

Comments
 (0)