Skip to content

Commit 278822f

Browse files
authored
Added renderSuggestedReplies in Message module (#977)
Fixes: [AC-1280](https://sendbird.atlassian.net/browse/AC-1280) ### Changelogs * Added `showSuggestedRepliesFor` global option * How to use? ```tsx <App appId={appId} userId={userId} uikitOptions={{ groupChannel: { // Below setting always shows `SuggestedReplies` component of a message. Default value is 'last_message_only'. showSuggestedRepliesFor: 'always', } }} /> ``` * Added `renderSuggestedReplies` in `Message` module * How to use? ```tsx <Channel renderSuggestedReplies={(suggestedRepliesProps) => { const { replyOptions, onSendMessage, message } = suggestedRepliesProps; return <CustomSuggestedReplies options={replyOptions} />; }} /> ``` ### Design Doc https://sendbird.atlassian.net/wiki/spaces/SDK/pages/2262860027/React+Design+Doc ### Customer Requirements Doc https://sendbird.atlassian.net/wiki/spaces/SDK/pages/2262860027/React+Design+Doc [AC-1280]: https://sendbird.atlassian.net/browse/AC-1280?atlOrigin=eyJpIjoiNWRkNTljNzYxNjVmNDY3MDlhMDU5Y2ZhYzA5YTRkZjUiLCJwIjoiZ2l0aHViLWNvbS1KU1cifQ
1 parent 198e834 commit 278822f

File tree

13 files changed

+55
-14
lines changed

13 files changed

+55
-14
lines changed

package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -68,7 +68,7 @@
6868
},
6969
"dependencies": {
7070
"@sendbird/chat": "^4.10.10",
71-
"@sendbird/uikit-tools": "0.0.1-alpha.62",
71+
"@sendbird/uikit-tools": "0.0.1-alpha.64",
7272
"css-vars-ponyfill": "^2.3.2",
7373
"date-fns": "^2.16.1",
7474
"dompurify": "^3.0.1"

src/lib/Sendbird.tsx

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -386,6 +386,7 @@ const SendbirdSDK = ({
386386
typingIndicatorTypes: configs.groupChannel.channel.typingIndicatorTypes,
387387
enableFeedback: configs.groupChannel.channel.enableFeedback,
388388
enableSuggestedReplies: configs.groupChannel.channel.enableSuggestedReplies,
389+
showSuggestedRepliesFor: configs.groupChannel.channel.showSuggestedRepliesFor,
389390
},
390391
openChannel: {
391392
enableOgtag:

src/lib/types.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -106,6 +106,7 @@ export interface SendBirdStateConfig {
106106
typingIndicatorTypes: SBUConfig['groupChannel']['channel']['typingIndicatorTypes'];
107107
enableFeedback: SBUConfig['groupChannel']['channel']['enableFeedback'];
108108
enableSuggestedReplies: SBUConfig['groupChannel']['channel']['enableSuggestedReplies'];
109+
showSuggestedRepliesFor: SBUConfig['groupChannel']['channel']['showSuggestedRepliesFor'];
109110
},
110111
openChannel: {
111112
enableOgtag: SBUConfig['openChannel']['channel']['enableOgtag'];

src/lib/utils/uikitConfigMapper.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,7 @@ export function uikitConfigMapper({
3737
typingIndicatorTypes: uikitOptions.groupChannel?.typingIndicatorTypes,
3838
enableFeedback: uikitOptions.groupChannel?.enableFeedback,
3939
enableSuggestedReplies: uikitOptions.groupChannel?.enableSuggestedReplies,
40+
showSuggestedRepliesFor: uikitOptions.groupChannel?.showSuggestedRepliesFor,
4041
},
4142
groupChannelList: {
4243
enableTypingIndicator: uikitOptions.groupChannelList?.enableTypingIndicator ?? isTypingIndicatorEnabledOnChannelList,

src/modules/App/stories/integrated.stories.js

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -352,6 +352,7 @@ export const GroupChannel = () => {
352352
typingIndicatorTypes: new Set([TypingIndicatorType.Bubble, TypingIndicatorType.Text]),
353353
enableFeedback: true, // This enables feedback message feature.
354354
enableSuggestedReplies: true, // This enables suggested replies feature.
355+
showSuggestedRepliesFor: 'all_messages', // This enables suggested replies should be displayed for all messages but not just the last message.
355356
}
356357
}}
357358
imageCompression={{ compressionRate: sampleOptions.imageCompression ? 0.7 : 1 }}

src/modules/Channel/components/Message/index.tsx

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -49,7 +49,11 @@ const Message = (props: MessageProps): React.ReactElement => {
4949
}
5050
shouldRenderSuggestedReplies={
5151
config?.groupChannel?.enableSuggestedReplies
52-
&& message.messageId === currentGroupChannel?.lastMessage?.messageId
52+
&& (
53+
config?.groupChannel?.showSuggestedRepliesFor === 'all_messages'
54+
? true
55+
: message.messageId === currentGroupChannel?.lastMessage?.messageId
56+
)
5357
// the options should appear only when there's no failed or pending messages
5458
&& localMessages?.length === 0
5559
&& getSuggestedReplies(message).length > 0

src/modules/Channel/components/MessageList/index.tsx

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,7 @@ export const MessageList = ({
3737
className = '',
3838
renderMessage,
3939
renderMessageContent,
40+
renderSuggestedReplies,
4041
renderCustomSeparator,
4142
renderPlaceholderLoader = () => <PlaceHolder type={PlaceHolderTypes.LOADING} />,
4243
renderPlaceholderEmpty = () => <PlaceHolder className="sendbird-conversation__no-messages" type={PlaceHolderTypes.NO_MESSAGES} />,
@@ -202,6 +203,7 @@ export const MessageList = ({
202203
chainTop={chainTop}
203204
chainBottom={chainBottom}
204205
renderMessageContent={renderMessageContent}
206+
renderSuggestedReplies={renderSuggestedReplies}
205207
renderCustomSeparator={renderCustomSeparator}
206208
// backward compatibility
207209
renderMessage={renderMessage}
@@ -227,6 +229,7 @@ export const MessageList = ({
227229
chainTop={chainTop}
228230
chainBottom={chainBottom}
229231
renderMessageContent={renderMessageContent}
232+
renderSuggestedReplies={renderSuggestedReplies}
230233
renderCustomSeparator={renderCustomSeparator}
231234
// backward compatibility
232235
renderMessage={renderMessage}

src/modules/GroupChannel/components/GroupChannelUI/GroupChannelUIView.tsx

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@ import type { RenderCustomSeparatorProps, RenderMessageParamsType } from '../../
1212
import type { GroupChannelHeaderProps } from '../GroupChannelHeader';
1313
import type { GroupChannelMessageListProps } from '../MessageList';
1414
import type { MessageContentProps } from '../../../../ui/MessageContent';
15+
import { SuggestedRepliesProps } from '../SuggestedReplies';
1516

1617
export interface GroupChannelUIBasicProps {
1718
// Components
@@ -50,6 +51,10 @@ export interface GroupChannelUIBasicProps {
5051
* A function that customizes the rendering of the content portion of each message component.
5152
*/
5253
renderMessageContent?: (props: MessageContentProps) => React.ReactElement;
54+
/**
55+
* A function that customizes the rendering of the suggested replies of each message component.
56+
*/
57+
renderSuggestedReplies?: (props: SuggestedRepliesProps) => React.ReactElement;
5358
/**
5459
* A function that customizes the rendering of a separator component between messages.
5560
*/

src/modules/GroupChannel/components/Message/MessageView.tsx

Lines changed: 14 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@ import MessageInput from '../../../../ui/MessageInput';
1818
import { MessageInputKeys } from '../../../../ui/MessageInput/const';
1919
import MessageContent, { MessageContentProps } from '../../../../ui/MessageContent';
2020

21-
import SuggestedReplies from '../SuggestedReplies';
21+
import SuggestedReplies, { SuggestedRepliesProps } from '../SuggestedReplies';
2222
import SuggestedMentionListView from '../SuggestedMentionList/SuggestedMentionListView';
2323

2424
export interface MessageProps {
@@ -36,6 +36,10 @@ export interface MessageProps {
3636
* A function that customizes the rendering of the content portion of message component.
3737
*/
3838
renderMessageContent?: (props: MessageContentProps) => React.ReactElement;
39+
/**
40+
* A function that customizes the rendering of suggested replies component of messages.
41+
*/
42+
renderSuggestedReplies?: (props: SuggestedRepliesProps) => React.ReactElement;
3943
/**
4044
* A function that customizes the rendering of a separator between messages.
4145
*/
@@ -96,6 +100,9 @@ const MessageView = (props: MessageViewProps) => {
96100
renderMessage,
97101
children,
98102
renderMessageContent = (props) => <MessageContent {...props} />,
103+
renderSuggestedReplies = (props) => (
104+
<SuggestedReplies {...props} />
105+
),
99106
renderCustomSeparator,
100107
renderEditInput,
101108
hasSeparator,
@@ -283,9 +290,13 @@ const MessageView = (props: MessageViewProps) => {
283290
onQuoteMessageClick: onQuoteMessageClick,
284291
onMessageHeightChange: handleScroll,
285292
})}
293+
{ /* Suggested Replies */ }
286294
{
287-
/** Suggested Replies */
288-
shouldRenderSuggestedReplies && <SuggestedReplies replyOptions={getSuggestedReplies(message)} onSendMessage={sendUserMessage} />
295+
shouldRenderSuggestedReplies && renderSuggestedReplies({
296+
replyOptions: getSuggestedReplies(message),
297+
onSendMessage: sendUserMessage,
298+
message,
299+
})
289300
}
290301
{/* Modal */}
291302
{showRemove && renderRemoveMessageModal({ message, onCancel: () => setShowRemove(false) })}

src/modules/GroupChannel/components/Message/index.tsx

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -37,9 +37,15 @@ export const Message = (props: MessageProps): React.ReactElement => {
3737
const { message } = props;
3838
const initialized = !loading && Boolean(currentChannel);
3939

40+
const groupChannelConfig = config?.groupChannel;
4041
const shouldRenderSuggestedReplies = useIIFE(() => {
41-
if (!config?.groupChannel?.enableSuggestedReplies) return false;
42-
if (message.messageId !== currentChannel?.lastMessage?.messageId) return false;
42+
if (!groupChannelConfig) return false;
43+
const { enableSuggestedReplies, showSuggestedRepliesFor } = groupChannelConfig;
44+
if (!enableSuggestedReplies) return false;
45+
if (
46+
(!showSuggestedRepliesFor || showSuggestedRepliesFor === 'last_message_only')
47+
&& message.messageId === currentChannel?.lastMessage?.messageId
48+
) return false;
4349
if (getSuggestedReplies(message).length === 0) return false;
4450
const lastMessage = messages[messages.length - 1];
4551
if (lastMessage && isSendableMessage(lastMessage) && lastMessage.sendingStatus !== 'succeeded') return false;

0 commit comments

Comments
 (0)