Skip to content

Commit 16e26e1

Browse files
authored
Merge pull request #674 from ant-design/feature
chore: sync feature to main branch
2 parents d3232c9 + 27d6505 commit 16e26e1

25 files changed

+1707
-109
lines changed

components/bubble/BubbleList.tsx

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,9 @@ export type BubbleDataType = BubbleProps & {
2727

2828
export type RoleType = Partial<Omit<BubbleProps, 'content'>>;
2929

30-
export type RolesType = Record<string, RoleType> | ((bubbleDataP: BubbleDataType, index: number) => RoleType);
30+
export type RolesType =
31+
| Record<string, RoleType>
32+
| ((bubbleDataP: BubbleDataType, index: number) => RoleType);
3133

3234
export interface BubbleListProps extends React.HTMLAttributes<HTMLDivElement> {
3335
prefixCls?: string;

components/bubble/hooks/useTypedEffect.ts

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,6 @@ const useTypedEffect = (
1515
typingStep: number,
1616
typingInterval: number,
1717
): [typedContent: React.ReactNode | object, isTyping: boolean] => {
18-
1918
const prevContentRef = React.useRef<React.ReactNode | object>('');
2019

2120
const [typingIndex, setTypingIndex] = React.useState<number>(1);
@@ -26,7 +25,11 @@ const useTypedEffect = (
2625
useLayoutEffect(() => {
2726
if (!mergedTypingEnabled && isString(content)) {
2827
setTypingIndex(content.length);
29-
} else if (isString(content) && isString(prevContentRef.current) && content.indexOf(prevContentRef.current) !== 0) {
28+
} else if (
29+
isString(content) &&
30+
isString(prevContentRef.current) &&
31+
content.indexOf(prevContentRef.current) !== 0
32+
) {
3033
setTypingIndex(1);
3134
}
3235
prevContentRef.current = content;
@@ -50,4 +53,4 @@ const useTypedEffect = (
5053
return [mergedTypingContent, mergedTypingEnabled && typingIndex < content.length];
5154
};
5255

53-
export default useTypedEffect;
56+
export default useTypedEffect;

components/conversations/Item.tsx

Lines changed: 29 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,9 @@
11
import { EllipsisOutlined } from '@ant-design/icons';
22
import { Dropdown, Tooltip, Typography } from 'antd';
3+
import type { MenuProps } from 'antd';
34
import classnames from 'classnames';
4-
import React from 'react';
5+
import React, { useMemo } from 'react';
56

6-
import type { MenuProps } from 'antd';
77
import type { DirectionType } from 'antd/es/config-provider';
88
import pickAttrs from 'rc-util/lib/pickAttrs';
99
import type { Conversation } from './interface';
@@ -13,7 +13,11 @@ export interface ConversationsItemProps
1313
info: Conversation;
1414
prefixCls?: string;
1515
direction?: DirectionType;
16-
menu?: MenuProps;
16+
menu?: MenuProps & {
17+
trigger?:
18+
| React.ReactNode
19+
| ((conversation: Conversation, info: { originNode: React.ReactNode }) => React.ReactNode);
20+
};
1721
active?: boolean;
1822
onClick?: (info: Conversation) => void;
1923
}
@@ -61,6 +65,25 @@ const ConversationsItem: React.FC<ConversationsItemProps> = (props) => {
6165
}
6266
};
6367

68+
// ============================ Menu ============================
69+
70+
const [trigger, dropdownMenu] = useMemo(() => {
71+
const { trigger, ...dropdownMenu } = menu || {};
72+
return [trigger, dropdownMenu];
73+
}, [menu]);
74+
75+
const renderMenuTrigger = (conversation: Conversation) => {
76+
const originTriggerNode = (
77+
<EllipsisOutlined onClick={stopPropagation} className={`${prefixCls}-menu-icon`} />
78+
);
79+
if (trigger) {
80+
return typeof trigger === 'function'
81+
? trigger(conversation, { originNode: originTriggerNode })
82+
: trigger;
83+
}
84+
return originTriggerNode;
85+
};
86+
6487
// ============================ Render ============================
6588
return (
6689
<Tooltip
@@ -79,19 +102,15 @@ const ConversationsItem: React.FC<ConversationsItemProps> = (props) => {
79102
>
80103
{info.label}
81104
</Typography.Text>
82-
{menu && !disabled && (
105+
{!disabled && menu && (
83106
<Dropdown
84-
menu={menu}
107+
menu={dropdownMenu}
85108
placement={direction === 'rtl' ? 'bottomLeft' : 'bottomRight'}
86109
trigger={['click']}
87110
disabled={disabled}
88111
onOpenChange={onOpenChange}
89112
>
90-
<EllipsisOutlined
91-
onClick={stopPropagation}
92-
disabled={disabled}
93-
className={`${prefixCls}-menu-icon`}
94-
/>
113+
{renderMenuTrigger(info)}
95114
</Dropdown>
96115
)}
97116
</li>

0 commit comments

Comments
 (0)