Skip to content

Commit 2dfe8af

Browse files
authored
fix: update open channel interface properly (#1049)
- Update the type of `renderMessage` in the OpenChannel module. - Deprecate the `renderInput` prop and add a new `renderMessageInput` prop. - Refactor `isXXXMessage` utils and removed redundant type-casting
1 parent 77ebaf8 commit 2dfe8af

File tree

11 files changed

+138
-130
lines changed

11 files changed

+138
-130
lines changed

src/modules/Channel/context/hooks/useSendFileMessageCallback.ts

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -47,11 +47,16 @@ export default function useSendFileMessageCallback(
4747
pubSub.publish(topics.SEND_MESSAGE_START, {
4848
/* pubSub is used instead of messagesDispatcher
4949
to avoid redundantly calling `messageActionTypes.SEND_MESSAGE_START` */
50+
// TODO: remove data pollution
5051
message: {
5152
...pendingMessage,
5253
url: URL.createObjectURL(compressedFile),
5354
// pending thumbnail message seems to be failed
5455
requestState: 'pending',
56+
isUserMessage: pendingMessage.isUserMessage,
57+
isFileMessage: pendingMessage.isFileMessage,
58+
isAdminMessage: pendingMessage.isAdminMessage,
59+
isMultipleFilesMessage: pendingMessage.isMultipleFilesMessage,
5560
} as unknown as FileMessage,
5661
channel: currentGroupChannel,
5762
publishingModules: [PublishingModuleType.CHANNEL],

src/modules/OpenChannel/components/OpenChannelMessage/index.tsx

Lines changed: 5 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
import React, { useState, useRef, ReactElement, useMemo } from 'react';
1+
import React, { useState, useRef, ReactElement } from 'react';
22
import { AdminMessage, FileMessage, UserMessage } from '@sendbird/chat/message';
33
import { User } from '@sendbird/chat';
44
import format from 'date-fns/format';
@@ -24,17 +24,15 @@ import { useLocalization } from '../../../../lib/LocalizationContext';
2424
import { CoreMessageType, SendableMessageType } from '../../../../utils';
2525

2626
export type OpenChannelMessageProps = {
27-
renderMessage?: (
28-
props: RenderMessageProps
29-
) => React.ElementType<RenderMessageProps>;
27+
renderMessage?: (props: RenderMessageProps) => React.ReactElement;
3028
message: CoreMessageType;
3129
chainTop?: boolean;
3230
chainBottom?: boolean;
3331
hasSeparator?: boolean;
3432
editDisabled?: boolean;
3533
};
3634

37-
export default function MessagOpenChannelMessageeHoc(
35+
export default function OpenChannelMessage(
3836
props: OpenChannelMessageProps,
3937
): ReactElement {
4038
const { message, chainTop, chainBottom, hasSeparator, renderMessage } = props;
@@ -57,13 +55,6 @@ export default function MessagOpenChannelMessageeHoc(
5755
sender = (message as SendableMessageType)?.sender;
5856
}
5957

60-
const RenderedMessage = useMemo(
61-
() => (props: RenderMessageProps) => {
62-
return <>{renderMessage ? renderMessage(props) : null}</>;
63-
},
64-
[message, renderMessage],
65-
);
66-
6758
const [showEdit, setShowEdit] = useState(false);
6859
const [showRemove, setShowRemove] = useState(false);
6960
const [showFileViewer, setShowFileViewer] = useState(false);
@@ -80,14 +71,10 @@ export default function MessagOpenChannelMessageeHoc(
8071
=== SendingMessageStatus.FAILED;
8172
}
8273

83-
if (renderMessage && RenderedMessage) {
74+
if (renderMessage) {
8475
return (
8576
<div className="sendbird-msg-hoc sendbird-msg--scroll-ref">
86-
<RenderedMessage
87-
message={message}
88-
chainTop={chainTop}
89-
chainBottom={chainBottom}
90-
/>
77+
{renderMessage({ message, chainTop, chainBottom })}
9178
</div>
9279
);
9380
}

src/modules/OpenChannel/components/OpenChannelMessageList/index.tsx

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -15,15 +15,15 @@ import useSendbirdStateContext from '../../../../hooks/useSendbirdStateContext';
1515
import { useHandleOnScrollCallback } from '../../../../hooks/useHandleOnScrollCallback';
1616
import { compareMessagesForGrouping } from '../../../../utils/messages';
1717

18-
export type OpenchannelMessageListProps = {
19-
renderMessage?: (props: RenderMessageProps) => React.ElementType<RenderMessageProps>;
18+
export type OpenChannelMessageListProps = {
19+
renderMessage?: (props: RenderMessageProps) => React.ReactElement;
2020
renderPlaceHolderEmptyList?: () => React.ReactElement;
2121
};
2222

23-
function OpenchannelMessageList(
24-
props: OpenchannelMessageListProps,
25-
ref: React.RefObject<HTMLDivElement>,
26-
): ReactElement {
23+
/** @deprecated * */
24+
export type OpenchannelMessageListProps = OpenChannelMessageListProps;
25+
26+
function OpenChannelMessageList(props: OpenChannelMessageListProps, ref: React.RefObject<HTMLDivElement>): ReactElement {
2727
const {
2828
isMessageGroupingEnabled = true,
2929
allMessages,
@@ -129,4 +129,4 @@ function OpenchannelMessageList(
129129
);
130130
}
131131

132-
export default React.forwardRef(OpenchannelMessageList);
132+
export default React.forwardRef(OpenChannelMessageList);

src/modules/OpenChannel/components/OpenChannelUI/index.tsx

Lines changed: 12 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -12,23 +12,27 @@ import OpenChannelMessageList from '../OpenChannelMessageList';
1212
import { RenderMessageProps } from '../../../../types';
1313

1414
export interface OpenChannelUIProps {
15-
renderMessage?: (props: RenderMessageProps) => React.ElementType<RenderMessageProps>;
15+
renderMessage?: (props: RenderMessageProps) => React.ReactElement;
1616
renderHeader?: () => React.ReactElement;
17-
renderInput?: () => React.ReactElement;
17+
renderMessageInput?: () => React.ReactElement;
1818
renderPlaceHolderEmptyList?: () => React.ReactElement;
1919
renderPlaceHolderError?: () => React.ReactElement;
2020
renderPlaceHolderLoading?: () => React.ReactElement;
21+
22+
/** @deprecated Please use renderMessageInput instead * */
23+
renderInput?: () => React.ReactElement;
2124
}
2225

2326
const COMPONENT_CLASS_NAME = 'sendbird-openchannel-conversation';
2427

2528
const OpenChannelUI: React.FC<OpenChannelUIProps> = ({
2629
renderMessage,
2730
renderHeader,
28-
renderInput,
2931
renderPlaceHolderEmptyList,
3032
renderPlaceHolderError,
3133
renderPlaceHolderLoading,
34+
renderMessageInput,
35+
renderInput,
3236
}: OpenChannelUIProps) => {
3337
const {
3438
currentOpenChannel,
@@ -58,28 +62,18 @@ const OpenChannelUI: React.FC<OpenChannelUIProps> = ({
5862
);
5963
}
6064

65+
const renderInputComponent = renderMessageInput || renderInput;
66+
6167
return (
6268
<div className={COMPONENT_CLASS_NAME}>
63-
{
64-
renderHeader?.() || (
65-
<OpenChannelHeader />
66-
)
67-
}
68-
{
69-
currentOpenChannel?.isFrozen && (
70-
<FrozenChannelNotification />
71-
)
72-
}
69+
{renderHeader?.() || <OpenChannelHeader />}
70+
{currentOpenChannel?.isFrozen && <FrozenChannelNotification />}
7371
<OpenChannelMessageList
7472
ref={conversationScrollRef}
7573
renderMessage={renderMessage}
7674
renderPlaceHolderEmptyList={renderPlaceHolderEmptyList}
7775
/>
78-
{
79-
renderInput?.() || (
80-
<OpenChannelInput ref={messageInputRef} />
81-
)
82-
}
76+
{renderInputComponent?.() || <OpenChannelInput ref={messageInputRef} />}
8377
</div>
8478
);
8579
};

src/modules/OpenChannel/context/hooks/useFileUploadCallback.tsx

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -104,11 +104,16 @@ function useFileUploadCallback({
104104
messagesDispatcher({
105105
type: messageActionTypes.SENDING_MESSAGE_START,
106106
payload: {
107+
// TODO: remove data pollution
107108
message: {
108109
...pendingMessage,
109110
url: URL.createObjectURL(file),
110111
// pending thumbnail message seems to be failed
111112
requestState: 'pending',
113+
isUserMessage: pendingMessage.isUserMessage,
114+
isFileMessage: pendingMessage.isFileMessage,
115+
isAdminMessage: pendingMessage.isAdminMessage,
116+
isMultipleFilesMessage: pendingMessage.isMultipleFilesMessage,
112117
},
113118
channel: currentOpenChannel,
114119
},

src/modules/OpenChannel/index.tsx

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@ const OpenChannel: React.FC<OpenChannelProps> = (props: OpenChannelProps) => {
2323
renderMessage={props?.renderMessage}
2424
renderHeader={props?.renderHeader}
2525
renderInput={props?.renderInput}
26+
renderMessageInput={props?.renderMessageInput}
2627
renderPlaceHolderEmptyList={props?.renderPlaceHolderEmptyList}
2728
renderPlaceHolderError={props?.renderPlaceHolderError}
2829
renderPlaceHolderLoading={props?.renderPlaceHolderLoading}

src/modules/Thread/context/hooks/useSendFileMessage.ts

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -56,11 +56,16 @@ export default function useSendFileMessageCallback({
5656
payload: {
5757
/* pubSub is used instead of messagesDispatcher
5858
to avoid redundantly calling `messageActionTypes.SEND_MESSAGE_START` */
59+
// TODO: remove data pollution
5960
message: {
6061
...pendingMessage,
6162
url: URL.createObjectURL(file),
6263
// pending thumbnail message seems to be failed
6364
requestState: 'pending',
65+
isUserMessage: pendingMessage.isUserMessage,
66+
isFileMessage: pendingMessage.isFileMessage,
67+
isAdminMessage: pendingMessage.isAdminMessage,
68+
isMultipleFilesMessage: pendingMessage.isMultipleFilesMessage,
6469
},
6570
},
6671
});

src/modules/Thread/context/hooks/useSendVoiceMessageCallback.ts

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -73,11 +73,16 @@ export const useSendVoiceMessageCallback = ({
7373
payload: {
7474
/* pubSub is used instead of messagesDispatcher
7575
to avoid redundantly calling `messageActionTypes.SEND_MESSAGE_START` */
76+
// TODO: remove data pollution
7677
message: {
7778
...pendingMessage,
7879
url: URL.createObjectURL(file),
7980
// pending thumbnail message seems to be failed
8081
requestState: 'pending',
82+
isUserMessage: pendingMessage.isUserMessage,
83+
isFileMessage: pendingMessage.isFileMessage,
84+
isAdminMessage: pendingMessage.isAdminMessage,
85+
isMultipleFilesMessage: pendingMessage.isMultipleFilesMessage,
8186
},
8287
},
8388
});

0 commit comments

Comments
 (0)