diff --git a/src/components/calendar/BookingCalendar.tsx b/src/components/calendar/BookingCalendar.tsx index 135f4da..4ce7583 100644 --- a/src/components/calendar/BookingCalendar.tsx +++ b/src/components/calendar/BookingCalendar.tsx @@ -86,6 +86,7 @@ export function BookingCalendar({ rooms, bookings, slug, onBookingCreate, onBook const [moveTargetRoomId, setMoveTargetRoomId] = useState(null) const [ghostPos, setGhostPos] = useState<{ x: number; y: number } | null>(null) const movingBookingRef = useRef(null) + const moveTargetRoomIdRef = useRef(null) // всегда актуален, без stale closure const didDragRef = useRef(false) movingBookingRef.current = movingBooking @@ -486,24 +487,28 @@ export function BookingCalendar({ rooms, bookings, slug, onBookingCreate, onBook if (Math.abs(ev.clientX - startX) > 5 || Math.abs(ev.clientY - startY) > 5) { dragging = true setMovingBooking(booking) + moveTargetRoomIdRef.current = booking.roomId setMoveTargetRoomId(booking.roomId) document.body.style.cursor = 'grabbing' } return } setGhostPos({ x: ev.clientX, y: ev.clientY }) + // Находим строку под курсором и запоминаем в ref (без stale closure) const el = document.elementFromPoint(ev.clientX, ev.clientY) const row = el?.closest('[data-room-id]') as HTMLElement | null - if (row?.dataset.roomId) setMoveTargetRoomId(row.dataset.roomId) + if (row?.dataset.roomId) { + moveTargetRoomIdRef.current = row.dataset.roomId + setMoveTargetRoomId(row.dataset.roomId) + } } - const onUp = (ev: MouseEvent) => { + const onUp = () => { window.removeEventListener('mousemove', onMove) window.removeEventListener('mouseup', onUp) document.body.style.cursor = '' if (dragging) { - const el = document.elementFromPoint(ev.clientX, ev.clientY) - const row = el?.closest('[data-room-id]') as HTMLElement | null - const targetRoomId = row?.dataset.roomId + // Читаем из ref — всегда актуальное значение, не stale closure + const targetRoomId = moveTargetRoomIdRef.current if (targetRoomId && targetRoomId !== booking.roomId) { didDragRef.current = true onBookingUpdate(booking.id, { roomId: targetRoomId }) @@ -511,6 +516,7 @@ export function BookingCalendar({ rooms, bookings, slug, onBookingCreate, onBook setMovingBooking(null) setMoveTargetRoomId(null) setGhostPos(null) + moveTargetRoomIdRef.current = null } } window.addEventListener('mousemove', onMove)