Skip to content

Commit 1848e3e

Browse files
Adjust MessageActions render conditions
1 parent 3a9acea commit 1848e3e

File tree

3 files changed

+58
-21
lines changed

3 files changed

+58
-21
lines changed

src/components/Message/MessageOptions.tsx

+12-5
Original file line numberDiff line numberDiff line change
@@ -5,14 +5,14 @@ import {
55
ReactionIcon as DefaultReactionIcon,
66
ThreadIcon as DefaultThreadIcon,
77
} from './icons';
8-
import { MESSAGE_ACTIONS, showMessageActionsBox } from './utils';
8+
import { MESSAGE_ACTIONS, shouldRenderMessageActions } from './utils';
99

1010
import { MessageActions } from '../MessageActions';
1111

1212
import { MessageContextValue, useMessageContext } from '../../context/MessageContext';
1313

1414
import type { DefaultStreamChatGenerics, IconProps } from '../../types/types';
15-
import { useTranslationContext } from '../../context';
15+
import { useComponentContext, useTranslationContext } from '../../context';
1616

1717
export type MessageOptionsProps<
1818
StreamChatGenerics extends DefaultStreamChatGenerics = DefaultStreamChatGenerics
@@ -57,13 +57,20 @@ const UnMemoizedMessageOptions = <
5757
threadList,
5858
} = useMessageContext<StreamChatGenerics>('MessageOptions');
5959

60+
const { CustomMessageActionsList } = useComponentContext('MessageOptions');
61+
6062
const { t } = useTranslationContext('MessageOptions');
6163

6264
const handleOpenThread = propHandleOpenThread || contextHandleOpenThread;
6365

6466
const messageActions = getMessageActions();
65-
const showActionsBox =
66-
showMessageActionsBox(messageActions, threadList) || !!customMessageActions;
67+
const renderMessageActions = shouldRenderMessageActions({
68+
// @ts-ignore
69+
customMessageActions,
70+
CustomMessageActionsList,
71+
inThread: threadList,
72+
messageActions,
73+
});
6774

6875
const shouldShowReactions = messageActions.indexOf(MESSAGE_ACTIONS.react) > -1;
6976
const shouldShowReplies =
@@ -85,7 +92,7 @@ const UnMemoizedMessageOptions = <
8592

8693
return (
8794
<div className={rootClassName} data-testid='message-options'>
88-
{showActionsBox && (
95+
{renderMessageActions && (
8996
<MessageActions ActionsIcon={ActionsIcon} messageWrapperRef={messageWrapperRef} />
9097
)}
9198
{shouldShowReplies && (

src/components/Message/utils.tsx

+40-8
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,12 @@ import type { TFunction } from 'i18next';
55
import type { MessageResponse, Mute, StreamChat, UserResponse } from 'stream-chat';
66
import type { PinPermissions } from './hooks';
77
import type { MessageProps } from './types';
8-
import type { MessageContextValue, StreamMessage } from '../../context';
8+
import type {
9+
ComponentContextValue,
10+
CustomMessageActions,
11+
MessageContextValue,
12+
StreamMessage,
13+
} from '../../context';
914
import type { DefaultStreamChatGenerics } from '../../types/types';
1015

1116
/**
@@ -206,26 +211,53 @@ export const ACTIONS_NOT_WORKING_IN_THREAD = [
206211
MESSAGE_ACTIONS.markUnread,
207212
];
208213

214+
/**
215+
* @deprecated use `shouldRenderMessageActions` instead
216+
*/
209217
export const showMessageActionsBox = (
210218
actions: MessageActionsArray,
211219
inThread?: boolean | undefined,
212-
) => {
213-
if (actions.length === 0) {
214-
return false;
215-
}
220+
) => shouldRenderMessageActions({ inThread, messageActions: actions });
221+
222+
export const shouldRenderMessageActions = ({
223+
customMessageActions,
224+
CustomMessageActionsList,
225+
inThread,
226+
messageActions,
227+
}: {
228+
messageActions: MessageActionsArray;
229+
customMessageActions?: CustomMessageActions;
230+
CustomMessageActionsList?: ComponentContextValue['CustomMessageActionsList'];
231+
inThread?: boolean;
232+
}) => {
233+
if (
234+
typeof CustomMessageActionsList !== 'undefined' ||
235+
typeof customMessageActions !== 'undefined'
236+
)
237+
return true;
238+
239+
if (!messageActions.length) return false;
216240

217241
if (
218242
inThread &&
219-
actions.filter((action) => !ACTIONS_NOT_WORKING_IN_THREAD.includes(action)).length === 0
243+
messageActions.filter((action) => !ACTIONS_NOT_WORKING_IN_THREAD.includes(action)).length === 0
220244
) {
221245
return false;
222246
}
223247

224-
if (actions.length === 1 && (actions.includes('react') || actions.includes('reply'))) {
248+
if (
249+
messageActions.length === 1 &&
250+
(messageActions.includes(MESSAGE_ACTIONS.react) ||
251+
messageActions.includes(MESSAGE_ACTIONS.reply))
252+
) {
225253
return false;
226254
}
227255

228-
if (actions.length === 2 && actions.includes('react') && actions.includes('reply')) {
256+
if (
257+
messageActions.length === 2 &&
258+
messageActions.includes(MESSAGE_ACTIONS.react) &&
259+
messageActions.includes(MESSAGE_ACTIONS.reply)
260+
) {
229261
return false;
230262
}
231263

src/components/MessageActions/MessageActions.tsx

+6-8
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@ import React, {
66
useRef,
77
useState,
88
} from 'react';
9+
import clsx from 'clsx';
910

1011
import { MessageActionsBox } from './MessageActionsBox';
1112

@@ -65,7 +66,6 @@ export const MessageActions = <
6566

6667
const { mutes } = useChatContext<StreamChatGenerics>('MessageActions');
6768
const {
68-
customMessageActions,
6969
getMessageActions: contextGetMessageActions,
7070
handleDelete: contextHandleDelete,
7171
handleFlag: contextHandleFlag,
@@ -98,7 +98,6 @@ export const MessageActions = <
9898
}
9999
setActionsBoxOpen(false);
100100
}, []);
101-
const messageActions = getMessageActions();
102101
const messageDeletedAt = !!message?.deleted_at;
103102

104103
useEffect(() => {
@@ -133,8 +132,6 @@ export const MessageActions = <
133132
referenceElement: actionsBoxButtonRef.current,
134133
});
135134

136-
if (!messageActions.length && !customMessageActions) return null;
137-
138135
return (
139136
<MessageActionsWrapper
140137
customWrapperClass={customWrapperClass}
@@ -178,10 +175,11 @@ export type MessageActionsWrapperProps = {
178175
const MessageActionsWrapper = (props: PropsWithChildren<MessageActionsWrapperProps>) => {
179176
const { children, customWrapperClass, inline, setActionsBoxOpen } = props;
180177

181-
const defaultWrapperClass = `
182-
str-chat__message-simple__actions__action
183-
str-chat__message-simple__actions__action--options
184-
str-chat__message-actions-container`;
178+
const defaultWrapperClass = clsx(
179+
'str-chat__message-simple__actions__action',
180+
'str-chat__message-simple__actions__action--options',
181+
'str-chat__message-actions-container',
182+
);
185183

186184
const wrapperClass = customWrapperClass || defaultWrapperClass;
187185

0 commit comments

Comments
 (0)