import React, { useState, useRef } from 'react'; import { Menu, Button, Drawer } from 'antd'; import { MenuUnfoldOutlined, UserOutlined, FileSearchOutlined, AlertOutlined, ToolOutlined, PrinterOutlined, } from '@ant-design/icons'; import type { MenuProps } from 'antd'; interface NavbarFloatProps { position?: 'left' | 'right'; className?: string; } const NavbarFloat: React.FC = ({ position = 'left', className, }) => { const [open, setOpen] = useState(false); const [btnPos, setBtnPos] = useState({ x: 100, y: 100 }); React.useEffect(() => { // 组件挂载后再安全访问 window setBtnPos({ x: window.innerWidth - 96, y: window.innerHeight - 96, }); }, []); const [dragged, setDragged] = useState(false); const dragging = useRef(false); const offset = useRef({ x: 0, y: 0 }); // 拖拽事件 const onMouseDown = (e: React.MouseEvent) => { dragging.current = true; setDragged(false); offset.current = { x: e.clientX - btnPos.x, y: e.clientY - btnPos.y, }; document.addEventListener('mousemove', onMouseMove); document.addEventListener('mouseup', onMouseUp); }; const onMouseMove = (e: MouseEvent) => { if (!dragging.current) return; let x = e.clientX - offset.current.x; let y = e.clientY - offset.current.y; // 限制在窗口内 x = Math.max(0, Math.min(window.innerWidth - 80, x)); y = Math.max(0, Math.min(window.innerHeight - 80, y)); setBtnPos({ x, y }); setDragged(true); // 标记为拖拽 }; const onMouseUp = () => { dragging.current = false; setTimeout(() => setDragged(false), 100); // 短暂延迟后重置 document.removeEventListener('mousemove', onMouseMove); document.removeEventListener('mouseup', onMouseUp); }; const menuItems = [ { key: 'patient', icon: