import React, { useRef, useState } from "react";
import Draggable, { DraggableData, DraggableEvent } from "react-draggable";
import { Modal } from "antd";
const PbModal = (propsParams: { children: React.ReactNode; title: string; width?: number;closable?:boolean; open: boolean; onOk?: () => void; onCancel?: () => void; confirmLoading?: boolean; footer?: any }) => {
const [disabled, setDisabled] = useState(false);
const [bounds, setBounds] = useState({ left: 0, top: 0, bottom: 0, right: 0 });
const draggleRef = useRef<HTMLDivElement>(null);
const onStart = (_event: DraggableEvent, uiData: DraggableData) => {
const { clientWidth, clientHeight } = window.document.documentElement;
const targetRect = draggleRef.current?.getBoundingClientRect();
if (!targetRect) {
return;
}
setBounds({
left: -targetRect.left + uiData.x,
right: clientWidth - (targetRect.right - uiData.x),
top: -targetRect.top + uiData.y,
bottom: clientHeight - (targetRect.bottom - uiData.y),
});
};
return (
<Modal
{...propsParams}
title={
<div
style={{
width: "100%",
cursor: "move",
}}
onMouseOver={() => {
if (disabled) {
setDisabled(false);
}
}}
onMouseOut={() => {
setDisabled(true);
}}
onFocus={() => {}}
onBlur={() => {}}
>
{propsParams.title}
</div>
}
modalRender={(modal) => (
<Draggable disabled={disabled} bounds={bounds} onStart={(event, uiData) => onStart(event, uiData)}>
<div ref={draggleRef}>{modal}</div>
</Draggable>
)}
>
{propsParams.children}
</Modal>
);
};
export default PbModal;
"react": "^18.2.0",
"react-dom": "^18.2.0",
"react-draggable": "^4.4.5",