Skip to content

Commit 7a3af4a

Browse files
chohongmHoonBaekbang9
authored
feat: Replace message type signatures with CoreMessageType and SendableMessageType (#718)
Ticket: https://sendbird.atlassian.net/browse/UIKIT-4358 Replace all existing type signatures that takes message as its params with certain message types such as ``` message: UserMessage | FileMessage | AdminMessage ``` with CoreMessageType and SendableMessageType because old one is redundant and error prone and hard to extend. --------- Co-authored-by: HoonBaek <[email protected]> Co-authored-by: Hyungu Kang | Airen <[email protected]>
1 parent df9e787 commit 7a3af4a

File tree

60 files changed

+424
-324
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

60 files changed

+424
-324
lines changed

.eslintrc.json

Lines changed: 11 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -40,6 +40,14 @@
4040
},
4141
"rules": {
4242
"no-unused-expressions": "off",
43+
// Not to make ESLint complains a type is only being used as type but recognized as a unused variable
44+
// https://stackoverflow.com/questions/57802057/eslint-configuring-no-unused-vars-for-typescript
45+
"no-unused-vars": "off", // or "@typescript-eslint/no-unused-vars": "off",
46+
"unused-imports/no-unused-imports": "error",
47+
"unused-imports/no-unused-vars": [
48+
"warn",
49+
{ "vars": "all", "varsIgnorePattern": "^_", "args": "after-used", "argsIgnorePattern": "^_" }
50+
],
4351
"@typescript-eslint/ban-ts-comment": "off",
4452
"@typescript-eslint/no-explicit-any": "off",
4553
"@typescript-eslint/no-unused-expressions": "error",
@@ -99,11 +107,7 @@
99107
// In some cases, eslint requires semicolon and wants it removed at the same time
100108
// https://stackoverflow.com/questions/58474874/eslint-demands-semicolon-and-wants-it-removed-at-the-same-time
101109
"semi": "off",
102-
"@typescript-eslint/semi": ["error"],
103-
// Not to make ESLint complains a type is only being used as type but recognized as a unused variable
104-
// https://stackoverflow.com/questions/57802057/eslint-configuring-no-unused-vars-for-typescript
105-
"no-unused-vars": "off",
106-
"@typescript-eslint/no-unused-vars": ["error"]
110+
"@typescript-eslint/semi": ["error"]
107111
},
108112
"extends": [
109113
"plugin:react/recommended",
@@ -112,7 +116,8 @@
112116
],
113117
"plugins": [
114118
"react",
115-
"@typescript-eslint"
119+
"@typescript-eslint",
120+
"unused-imports"
116121
],
117122
"ignorePatterns": "['**/*.js', '**/*.jsx', 'node_modules', 'ui/QuoteMessageInput/mockMessage.ts']"
118123
}

package.json

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -121,6 +121,7 @@
121121
"eslint-plugin-jsx-a11y": "^6.7.1",
122122
"eslint-plugin-react": "^7.32.2",
123123
"eslint-plugin-react-hooks": "^4.6.0",
124+
"eslint-plugin-unused-imports": "^3.0.0",
124125
"global-jsdom": "^8.5.0",
125126
"husky": "^8.0.0",
126127
"jest": "29.5.0",

scripts/index_d_ts

Lines changed: 45 additions & 44 deletions
Original file line numberDiff line numberDiff line change
@@ -130,7 +130,7 @@ declare module "SendbirdUIKitGlobal" {
130130
getQueue: () => GroupChannel[];
131131
};
132132

133-
export type MessageHandler = (message: UserMessage | FileMessage) => void;
133+
export type MessageHandler = (message: SendableMessageType) => void;
134134

135135
export interface UikitMessageHandler {
136136
onPending: (handler: MessageHandler) => UikitMessageHandler;
@@ -171,7 +171,7 @@ declare module "SendbirdUIKitGlobal" {
171171
chainBottom: boolean;
172172
}
173173
export interface RenderCustomSeparatorProps {
174-
message: AdminMessage | UserMessage | FileMessage;
174+
message: CoreMessageType;
175175
}
176176

177177
export interface ClientUserMessage extends UserMessage, ClientMessage { }
@@ -224,7 +224,7 @@ declare module "SendbirdUIKitGlobal" {
224224
// ) => Promise<FileMessage>;
225225
export type GetDeleteMessage = (
226226
channel: GroupChannel | OpenChannel,
227-
message: UserMessage | FileMessage
227+
message: SendableMessageType
228228
) => Promise<void>;
229229
export type GetResendUserMessage = (
230230
channel: GroupChannel | OpenChannel,
@@ -577,8 +577,8 @@ declare module "SendbirdUIKitGlobal" {
577577
animatedMessage?: number;
578578
highlightedMessage?: number;
579579
startingPoint?: number;
580-
onBeforeSendUserMessage?(text: string, quotedMessage?: UserMessage | FileMessage): UserMessageCreateParams;
581-
onBeforeSendFileMessage?(file: File, quotedMessage?: UserMessage | FileMessage): FileMessageCreateParams;
580+
onBeforeSendUserMessage?(text: string, quotedMessage?: SendableMessageType): UserMessageCreateParams;
581+
onBeforeSendFileMessage?(file: File, quotedMessage?: SendableMessageType): FileMessageCreateParams;
582582
onBeforeUpdateUserMessage?(text: string): UserMessageUpdateParams;
583583
onChatHeaderActionClick?(event: React.MouseEvent<HTMLElement>): void;
584584
onSearchClick?(): void;
@@ -590,8 +590,8 @@ declare module "SendbirdUIKitGlobal" {
590590
renderUserProfile?: (props: RenderUserProfileProps) => React.ReactElement;
591591
disableUserProfile?: boolean;
592592
disableMarkAsRead?: boolean;
593-
onReplyInThread?: (props: { message: UserMessage | FileMessage }) => void;
594-
onQuoteMessageClick?: (props: { message: UserMessage | FileMessage }) => void;
593+
onReplyInThread?: (props: { message: SendableMessageType }) => void;
594+
onQuoteMessageClick?: (props: { message: SendableMessageType }) => void;
595595
onMessageAnimated?: () => void;
596596
onMessageHighlighted?: () => void;
597597
scrollBehavior?: 'smooth' | 'auto';
@@ -613,7 +613,8 @@ declare module "SendbirdUIKitGlobal" {
613613
renderSendMessageIcon?: () => React.ReactElement;
614614
}
615615

616-
export type CoreMessageType = AdminMessage | UserMessage | FileMessage;
616+
export type CoreMessageType = AdminMessage | UserMessage | FileMessage | MultipleFilesMessage;
617+
export type SendableMessageType = UserMessage | FileMessage | MultipleFilesMessage;
617618

618619
export interface MessageStoreInterface {
619620
allMessages: CoreMessageType[];
@@ -634,7 +635,7 @@ declare module "SendbirdUIKitGlobal" {
634635
scrollToMessage?(createdAt: number, messageId: number): void;
635636
messageActionTypes: Record<string, string>;
636637
quoteMessage: CoreMessageType;
637-
setQuoteMessage: React.Dispatch<React.SetStateAction<UserMessage | FileMessage>>;
638+
setQuoteMessage: React.Dispatch<React.SetStateAction<SendableMessageType>>;
638639
initialTimeStamp: number;
639640
setInitialTimeStamp: React.Dispatch<React.SetStateAction<number>>;
640641
animatedMessageId: number;
@@ -644,7 +645,7 @@ declare module "SendbirdUIKitGlobal" {
644645
setAnimatedMessageId: React.Dispatch<React.SetStateAction<number>>;
645646
setHighLightedMessageId: React.Dispatch<React.SetStateAction<number>>;
646647
messageInputRef: React.MutableRefObject<HTMLInputElement>,
647-
toggleReaction(message: UserMessage | FileMessage, emojiKey: string, isReacted: boolean): void,
648+
toggleReaction(message: SendableMessageType, emojiKey: string, isReacted: boolean): void,
648649
}
649650

650651
export type FileViewerProps = {
@@ -954,7 +955,7 @@ declare module "SendbirdUIKitGlobal" {
954955

955956
export type MessageSearchScrollCallbackReturn = (
956957
callback: (
957-
messages: Array<UserMessage | FileMessage | AdminMessage>,
958+
messages: Array<SendableMessageType>,
958959
/* eslint-disable @typescript-eslint/no-explicit-any*/
959960
error: any,
960961
) => void
@@ -1041,31 +1042,31 @@ declare module "SendbirdUIKitGlobal" {
10411042
toggleReaction: (message, key, isReacted) => void;
10421043
sendMessage: (props: {
10431044
message: string,
1044-
quoteMessage?: UserMessage | FileMessage,
1045+
quoteMessage?: SendableMessageType,
10451046
mentionTemplate?: string,
10461047
mentionedUsers?: Array<User>,
10471048
}) => void;
1048-
sendFileMessage: (file: File, quoteMessage: UserMessage | FileMessage) => void;
1049-
resendMessage: (failedMessage: UserMessage | FileMessage) => void;
1049+
sendFileMessage: (file: File, quoteMessage: SendableMessageType) => void;
1050+
resendMessage: (failedMessage: SendableMessageType) => void;
10501051
updateMessage: (props, callback?: () => void) => void;
1051-
deleteMessage: (message: UserMessage | FileMessage) => Promise<UserMessage | FileMessage>;
1052+
deleteMessage: (message: SendableMessageType) => Promise<SendableMessageType>;
10521053
nicknamesMap: Map<string, string>;
10531054
}
10541055

10551056
export type ThreadProviderProps = {
10561057
children?: React.ReactElement;
10571058
channelUrl: string;
1058-
message: UserMessage | FileMessage;
1059+
message: SendableMessageType;
10591060
onHeaderActionClick?: () => void;
1060-
onMoveToParentMessage?: (props: { message: UserMessage | FileMessage, channel: GroupChannel }) => void;
1061+
onMoveToParentMessage?: (props: { message: SendableMessageType, channel: GroupChannel }) => void;
10611062
disableUserProfile?: boolean;
10621063
renderUserProfile?: (props: { user: User, close: () => void }) => React.ReactElement;
10631064
}
10641065

10651066
export interface ThreadContextInitialState {
10661067
currentChannel: GroupChannel;
10671068
allThreadMessages: Array<BaseMessage>;
1068-
parentMessage: UserMessage | FileMessage;
1069+
parentMessage: SendableMessageType;
10691070
channelState: ChannelStateTypes;
10701071
parentMessageState: ParentMessageStateTypes;
10711072
threadListState: ThreadListStateTypes;
@@ -1081,7 +1082,7 @@ declare module "SendbirdUIKitGlobal" {
10811082
renderHeader?: () => React.ReactElement;
10821083
renderParentMessageInfo?: () => React.ReactElement;
10831084
renderMessage?: (props: {
1084-
message: UserMessage | FileMessage,
1085+
message: SendableMessageType,
10851086
chainTop: boolean,
10861087
chainBottom: boolean,
10871088
hasSeparator: boolean,
@@ -1110,30 +1111,30 @@ declare module "SendbirdUIKitGlobal" {
11101111

11111112
export interface ParentMessageInfoItemProps {
11121113
className?: string;
1113-
message: UserMessage | FileMessage;
1114+
message: SendableMessageType;
11141115
showFileViewer?: (bool: boolean) => void;
11151116
}
11161117

11171118
export interface ThreadListProps {
11181119
className?: string;
1119-
allThreadMessages: Array<UserMessage | FileMessage | BaseMessage>;
1120+
allThreadMessages: Array<SendableMessageType>;
11201121
renderMessage?: (props: {
1121-
message: UserMessage | FileMessage,
1122+
message: SendableMessageType,
11221123
chainTop: boolean,
11231124
chainBottom: boolean,
11241125
hasSeparator: boolean,
11251126
}) => React.ReactElement;
1126-
renderCustomSeparator?: (props: { message: UserMessage | FileMessage }) => React.ReactElement;
1127+
renderCustomSeparator?: (props: { message: SendableMessageType }) => React.ReactElement;
11271128
scrollRef?: React.RefObject<HTMLDivElement>;
11281129
scrollBottom?: number;
11291130
}
11301131
export interface ThreadListItemProps {
11311132
className?: string;
1132-
message: UserMessage | FileMessage;
1133+
message: SendableMessageType;
11331134
chainTop?: boolean;
11341135
chainBottom?: boolean;
11351136
hasSeparator?: boolean;
1136-
renderCustomSeparator?: (props: { message: UserMessage | FileMessage }) => React.ReactElement;
1137+
renderCustomSeparator?: (props: { message: SendableMessageType }) => React.ReactElement;
11371138
handleScroll?: () => void;
11381139
}
11391140

@@ -1290,7 +1291,7 @@ declare module '@sendbird/uikit-react/utils/message/getOutgoingMessageState' {
12901291
}
12911292
export function getOutgoingMessageState(
12921293
channel: GroupChannel | OpenChannel,
1293-
message: UserMessage | FileMessage,
1294+
message: SendableMessageType,
12941295
): OutgoingMessageStates;
12951296
}
12961297

@@ -1413,10 +1414,10 @@ declare module '@sendbird/uikit-react/Channel/utils/getMessagePartsInfo' {
14131414
import type { FileMessage, UserMessage, AdminMessage } from '@sendbird/chat/message';
14141415
import type { GroupChannel } from '@sendbird/chat/groupChannel';
14151416
export interface GetMessagePartsInfoProps {
1416-
allMessages: Array<UserMessage | FileMessage | AdminMessage>;
1417+
allMessages: Array<CoreMessageType>;
14171418
isMessageGroupingEnabled: boolean;
14181419
currentIndex: number;
1419-
currentMessage: UserMessage | FileMessage | AdminMessage;
1420+
currentMessage: CoreMessageType;
14201421
currentChannel: GroupChannel;
14211422
replyType: string;
14221423
}
@@ -1435,9 +1436,9 @@ declare module '@sendbird/uikit-react/Channel/utils/compareMessagesForGrouping'
14351436
import SendbirdUIKitGlobal from 'SendbirdUIKitGlobal';
14361437

14371438
export function compareMessagesForGrouping(
1438-
prevMessage: UserMessage | FileMessage | AdminMessage,
1439-
currMessage: UserMessage | FileMessage | AdminMessage,
1440-
nextMessage: UserMessage | FileMessage | AdminMessage,
1439+
prevMessage: CoreMessageType,
1440+
currMessage: CoreMessageType,
1441+
nextMessage: CoreMessageType,
14411442
currentChannel: GroupChannel,
14421443
replyType: SendbirdUIKitGlobal.ReplyType,
14431444
): [
@@ -1980,13 +1981,13 @@ declare module '@sendbird/uikit-react/ui/EmojiReactions' {
19801981
interface EmojiReactionsProps {
19811982
className?: string | Array<string>;
19821983
userId: string;
1983-
message: UserMessage | FileMessage;
1984+
message: SendableMessageType;
19841985
channel: GroupChannel;
19851986
emojiContainer: EmojiContainer;
19861987
memberNicknamesMap: Map<string, string>;
19871988
spaceFromTrigger?: Record<string, unknown>;
19881989
isByMe?: boolean;
1989-
toggleReaction?: (message: UserMessage | FileMessage, key: string, byMe: boolean) => void;
1990+
toggleReaction?: (message: SendableMessageType, key: string, byMe: boolean) => void;
19901991
}
19911992
const EmojiReactions: React.FC<EmojiReactionsProps>;
19921993
export default EmojiReactions;
@@ -2173,9 +2174,9 @@ declare module '@sendbird/uikit-react/ui/MessageContent' {
21732174
showEdit?: (bool: boolean) => void;
21742175
showRemove?: (bool: boolean) => void;
21752176
showFileViewer?: (bool: boolean) => void;
2176-
resendMessage?: (message: UserMessage | FileMessage) => void;
2177-
toggleReaction?: (message: UserMessage | FileMessage, reactionKey: string, isReacted: boolean) => void;
2178-
setQuoteMessage?: (message: UserMessage | FileMessage) => void;
2177+
resendMessage?: (message: SendableMessageType) => void;
2178+
toggleReaction?: (message: SendableMessageType, reactionKey: string, isReacted: boolean) => void;
2179+
setQuoteMessage?: (message: SendableMessageType) => void;
21792180
}
21802181
const MessageContent: React.FC<MessageContentProps>;
21812182
export default MessageContent;
@@ -2275,18 +2276,18 @@ declare module '@sendbird/uikit-react/ui/MessageItemMenu' {
22752276

22762277
interface MessageItemMenuProps {
22772278
className?: string | Array<string>;
2278-
message: UserMessage | FileMessage;
2279+
message: SendableMessageType;
22792280
channel: GroupChannel | OpenChannel;
22802281
isByMe?: boolean;
22812282
disabled?: boolean;
22822283
replyType?: ReplyType;
22832284
disableDeleteMessage?: boolean;
22842285
showEdit?: (bool: boolean) => void;
22852286
showRemove?: (bool: boolean) => void;
2286-
resendMessage?: (message: UserMessage | FileMessage) => void;
2287-
setQuoteMessage?: (message: UserMessage | FileMessage) => void;
2287+
resendMessage?: (message: SendableMessageType) => void;
2288+
setQuoteMessage?: (message: SendableMessageType) => void;
22882289
setSupposedHover?: (bool: boolean) => void;
2289-
onReplyInThread?: (props: { message: UserMessage | FileMessage }) => void;
2290+
onReplyInThread?: (props: { message: SendableMessageType }) => void;
22902291
onMoveToParentMessage?: () => void;
22912292
}
22922293
const MessageItemMenu: React.FC<MessageItemMenuProps>;
@@ -2300,11 +2301,11 @@ declare module '@sendbird/uikit-react/ui/MessageItemReactionMenu' {
23002301

23012302
interface MessageItemReactionMenuProps {
23022303
className?: string | Array<string>;
2303-
message: UserMessage | FileMessage;
2304+
message: SendableMessageType;
23042305
userId: string;
23052306
spaceFromTrigger?: Record<string, unknown>;
23062307
emojiContainer?: EmojiContainer;
2307-
toggleReaction?: (message: UserMessage | FileMessage, reactionKey: string, isReacted: boolean) => void;
2308+
toggleReaction?: (message: SendableMessageType, reactionKey: string, isReacted: boolean) => void;
23082309
setSupposedHover?: (bool: boolean) => void;
23092310
}
23102311
const MessageItemReactionMenu: React.FC<MessageItemReactionMenuProps>;
@@ -2345,7 +2346,7 @@ declare module '@sendbird/uikit-react/ui/MessageStatus' {
23452346

23462347
interface MessageStatusProps {
23472348
className?: string;
2348-
message: UserMessage | FileMessage;
2349+
message: SendableMessageType;
23492350
channel: GroupChannel;
23502351
isDateSeparatorConsidered?: boolean;
23512352
}
@@ -2497,7 +2498,7 @@ declare module '@sendbird/uikit-react/ui/PlaceHolder' {
24972498
declare module '@sendbird/uikit-react/ui/QuoteMessage' {
24982499
import type { UserMessage, FileMessage } from '@sendbird/chat/message';
24992500
interface QuoteMessageProps {
2500-
message?: UserMessage | FileMessage;
2501+
message?: SendableMessageType;
25012502
userId?: string;
25022503
isByMe?: boolean;
25032504
className?: string | Array<string>;

src/lib/selectors.ts

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@ import {
1616
SendBirdStateStore,
1717
} from './types';
1818
import { noop } from '../utils/utils';
19+
import { SendableMessageType } from '../utils';
1920

2021
/**
2122
* 1. UIKit Instances
@@ -595,7 +596,7 @@ export const getUpdateUserMessage = (state: SendBirdState) => (
595596
* .catch((error) => {})
596597
*/
597598
export const getDeleteMessage = (state: SendBirdState) => (
598-
(channel: GroupChannel | OpenChannel, message: UserMessage | FileMessage): Promise<UserMessage | FileMessage> => (
599+
(channel: GroupChannel | OpenChannel, message: SendableMessageType): Promise<SendableMessageType> => (
599600
new Promise((resolve, reject) => {
600601
const pubSub = getPubSub(state);
601602
const { messageId } = message;

src/lib/types.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,6 @@ import type {
1111
SendbirdOpenChat,
1212
} from '@sendbird/chat/openChannel';
1313
import type {
14-
AdminMessage,
1514
FileMessage,
1615
FileMessageCreateParams,
1716
UserMessage,
@@ -30,6 +29,7 @@ import { PartialDeep } from '../utils/typeHelpers/partialDeep';
3029
import { SBUConfig } from '@sendbird/uikit-tools';
3130

3231
import { Module } from '@sendbird/chat/lib/__definition';
32+
import { CoreMessageType } from '../utils';
3333

3434
// note to SDK team:
3535
// using enum inside .d.ts won’t work for jest, but const enum will work.
@@ -194,7 +194,7 @@ type GetUpdateUserMessage = (
194194
// ) => Promise<FileMessage>;
195195
type GetDeleteMessage = (
196196
channel: GroupChannel | OpenChannel,
197-
message: AdminMessage | UserMessage | FileMessage
197+
message: CoreMessageType
198198
) => Promise<void>;
199199
type GetResendUserMessage = (
200200
channel: GroupChannel | OpenChannel,

0 commit comments

Comments
 (0)