11import { EllipsisOutlined } from '@ant-design/icons' ;
22import { Dropdown , Tooltip , Typography } from 'antd' ;
3+ import type { MenuProps } from 'antd' ;
34import classnames from 'classnames' ;
4- import React from 'react' ;
5+ import React , { useMemo } from 'react' ;
56
6- import type { MenuProps } from 'antd' ;
77import type { DirectionType } from 'antd/es/config-provider' ;
88import pickAttrs from 'rc-util/lib/pickAttrs' ;
99import 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