Spaces:
Paused
Paused
import { useShowDeleteConfirm } from '@/hooks/common-hooks'; | |
import { DeleteOutlined, MoreOutlined } from '@ant-design/icons'; | |
import { Dropdown, MenuProps, Space } from 'antd'; | |
import { useTranslation } from 'react-i18next'; | |
import React, { useMemo } from 'react'; | |
import styles from './index.less'; | |
interface IProps { | |
deleteItem: () => Promise<any> | void; | |
iconFontSize?: number; | |
iconFontColor?: string; | |
items?: MenuProps['items']; | |
height?: number; | |
needsDeletionValidation?: boolean; | |
} | |
const OperateDropdown = ({ | |
deleteItem, | |
children, | |
iconFontSize = 30, | |
iconFontColor = 'gray', | |
items: otherItems = [], | |
height = 24, | |
needsDeletionValidation = true, | |
}: React.PropsWithChildren<IProps>) => { | |
const { t } = useTranslation(); | |
const showDeleteConfirm = useShowDeleteConfirm(); | |
const handleDelete = () => { | |
if (needsDeletionValidation) { | |
showDeleteConfirm({ onOk: deleteItem }); | |
} else { | |
deleteItem(); | |
} | |
}; | |
const handleDropdownMenuClick: MenuProps['onClick'] = ({ domEvent, key }) => { | |
domEvent.preventDefault(); | |
domEvent.stopPropagation(); | |
if (key === '1') { | |
handleDelete(); | |
} | |
}; | |
const items: MenuProps['items'] = useMemo(() => { | |
return [ | |
{ | |
key: '1', | |
label: ( | |
<Space> | |
{t('common.delete')} | |
<DeleteOutlined /> | |
</Space> | |
), | |
}, | |
...otherItems, | |
]; | |
}, [t, otherItems]); | |
return ( | |
<Dropdown | |
menu={{ | |
items, | |
onClick: handleDropdownMenuClick, | |
}} | |
> | |
{children || ( | |
<span className={styles.delete}> | |
<MoreOutlined | |
rotate={90} | |
style={{ | |
fontSize: iconFontSize, | |
color: iconFontColor, | |
cursor: 'pointer', | |
height, | |
}} | |
/> | |
</span> | |
)} | |
</Dropdown> | |
); | |
}; | |
export default OperateDropdown; | |