You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
115 lines
3.5 KiB
115 lines
3.5 KiB
import type { ButtonProps, TooltipProps } from 'antd'
|
|
import { Button, Tooltip } from 'antd'
|
|
import { CSSProperties, FC, memo } from 'react'
|
|
import { ConfigProvider } from '@/components/config-provider'
|
|
import { useStyles } from './style'
|
|
|
|
/**
|
|
* @title 动作图标属性
|
|
* @description 继承自 `Button` 组件所有属性,除了 `title`, `type` 和 `size`
|
|
*/
|
|
export interface ActionIconProps extends Omit<ButtonProps, 'title' | 'size'> {
|
|
/**
|
|
* @title 鼠标类型
|
|
*/
|
|
cursor?: CSSProperties['cursor'];
|
|
/**
|
|
* @title 动作提示
|
|
*/
|
|
title?: TooltipProps['title'];
|
|
/**
|
|
* @title 提示位置
|
|
*/
|
|
placement?: TooltipProps['placement'];
|
|
/**
|
|
* @title 图标
|
|
*/
|
|
icon: ButtonProps['icon'];
|
|
/**
|
|
* @title 点击回调
|
|
*/
|
|
onClick?: ButtonProps['onClick'];
|
|
/**
|
|
* @title 图标尺寸
|
|
*/
|
|
size?: 'default' | 'large' | number;
|
|
/**
|
|
* @description 鼠标移入时候的延迟tooltip时间,默认 0.5
|
|
* @default 0.5
|
|
*/
|
|
tooltipDelay?: number;
|
|
/**
|
|
* @description 是否展示小箭头,默认不展示
|
|
* @default false
|
|
*/
|
|
arrow?: boolean;
|
|
|
|
bordered?: boolean;
|
|
}
|
|
|
|
const BaseActionIcon: FC<ActionIconProps> = memo(({
|
|
placement,
|
|
title,
|
|
icon,
|
|
cursor,
|
|
onClick,
|
|
className,
|
|
bordered = false,
|
|
arrow = false,
|
|
size = 'default',
|
|
tooltipDelay = 0.5,
|
|
...restProps
|
|
}) => {
|
|
const { styles, cx } = useStyles({ size, bordered, className })
|
|
|
|
const Icon = (
|
|
<Button
|
|
icon={icon}
|
|
className={cx(styles.container, className)}
|
|
type={'text'}
|
|
style={{ cursor }}
|
|
size={typeof size === 'number' || size === 'default' ? 'middle' : size}
|
|
{...restProps}
|
|
onClick={onClick}
|
|
/>
|
|
)
|
|
|
|
return (
|
|
<>
|
|
{!title ? (
|
|
Icon
|
|
) : (
|
|
<Tooltip
|
|
arrow={arrow}
|
|
overlayClassName={styles.tooltip}
|
|
title={title}
|
|
mouseEnterDelay={tooltipDelay}
|
|
placement={placement}
|
|
>
|
|
{Icon}
|
|
</Tooltip>
|
|
)}
|
|
</>
|
|
)
|
|
})
|
|
|
|
const ActionIcon = memo((props: ActionIconProps) => {
|
|
const { size } = props || {}
|
|
const { theme: token } = useStyles({ size })
|
|
|
|
return (
|
|
<ConfigProvider
|
|
componentToken={{
|
|
Button: {
|
|
colorText: token.colorTextTertiary,
|
|
colorBgTextHover: token.colorFillSecondary,
|
|
colorBgTextActive: token.colorFill,
|
|
},
|
|
}}
|
|
>
|
|
<BaseActionIcon {...props} />
|
|
</ConfigProvider>
|
|
)
|
|
})
|
|
|
|
export default ActionIcon
|