import * as React from 'react'; import classNames from 'classnames'; import ExclamationCircleFilled from '@ant-design/icons/ExclamationCircleFilled'; import KeyCode from 'rc-util/lib/KeyCode'; import Tooltip, { AbstractTooltipProps } from '../tooltip'; import Button from '../button'; import { LegacyButtonType, NativeButtonProps, convertLegacyProps } from '../button/button'; import LocaleReceiver from '../locale-provider/LocaleReceiver'; import defaultLocale from '../locale/default'; import { ConfigContext } from '../config-provider'; import { getRenderPropValue, RenderFunction } from '../_util/getRenderPropValue'; import { cloneElement } from '../_util/reactNode'; export interface PopconfirmProps extends AbstractTooltipProps { title: React.ReactNode | RenderFunction; disabled?: boolean; onConfirm?: (e?: React.MouseEvent) => void; onCancel?: (e?: React.MouseEvent) => void; okText?: React.ReactNode; okType?: LegacyButtonType; cancelText?: React.ReactNode; okButtonProps?: NativeButtonProps; cancelButtonProps?: NativeButtonProps; icon?: React.ReactNode; onVisibleChange?: ( visible: boolean, e?: React.MouseEvent | React.KeyboardEvent, ) => void; } export interface PopconfirmState { visible?: boolean; } export interface PopconfirmLocale { okText: string; cancelText: string; } const Popconfirm = React.forwardRef((props, ref) => { const [visible, setVisible] = React.useState(props.visible); React.useEffect(() => { if ('visible' in props) { setVisible(props.visible); } }, [props.visible]); React.useEffect(() => { if ('defaultVisible' in props) { setVisible(props.defaultVisible); } }, [props.defaultVisible]); const settingVisible = ( value: boolean, e?: React.MouseEvent | React.KeyboardEvent, ) => { if (!('visible' in props)) { setVisible(value); } if (props.onVisibleChange) { props.onVisibleChange(value, e); } }; const onConfirm = (e: React.MouseEvent) => { settingVisible(false, e); if (props.onConfirm) { props.onConfirm.call(this, e); } }; const onCancel = (e: React.MouseEvent) => { settingVisible(false, e); if (props.onCancel) { props.onCancel.call(this, e); } }; const onKeyDown = (e: React.KeyboardEvent) => { if (e.keyCode === KeyCode.ESC && visible) { settingVisible(false, e); } }; const onVisibleChange = (value: boolean) => { const { disabled } = props; if (disabled) { return; } settingVisible(value); }; const renderOverlay = (prefixCls: string, popconfirmLocale: PopconfirmLocale) => { const { okButtonProps, cancelButtonProps, title, cancelText, okText, okType, icon } = props; return (
{icon}
{getRenderPropValue(title)}
); }; const { getPrefixCls } = React.useContext(ConfigContext); const { prefixCls: customizePrefixCls, placement, children, overlayClassName, ...restProps } = props; const prefixCls = getPrefixCls('popover', customizePrefixCls); const prefixClsConfirm = getPrefixCls('popconfirm', customizePrefixCls); const overlayClassNames = classNames(prefixClsConfirm, overlayClassName); const overlay = ( {(popconfirmLocale: PopconfirmLocale) => renderOverlay(prefixCls, popconfirmLocale)} ); return ( {cloneElement(children, { onKeyDown: (e: React.KeyboardEvent) => { if (React.isValidElement(children)) { children?.props.onKeyDown?.(e); } onKeyDown(e); }, })} ); }); Popconfirm.defaultProps = { transitionName: 'zoom-big', placement: 'top' as PopconfirmProps['placement'], trigger: 'click' as PopconfirmProps['trigger'], okType: 'primary' as PopconfirmProps['okType'], icon: , disabled: false, }; export default Popconfirm;