Fix drag drop: use ref for target room ID instead of elementFromPoint in mouseup (stale closure fix)

This commit is contained in:
2026-03-21 00:44:30 +03:00
parent 3e4a2a3cd2
commit 97b2ca1f91

View File

@@ -86,6 +86,7 @@ export function BookingCalendar({ rooms, bookings, slug, onBookingCreate, onBook
const [moveTargetRoomId, setMoveTargetRoomId] = useState<string | null>(null)
const [ghostPos, setGhostPos] = useState<{ x: number; y: number } | null>(null)
const movingBookingRef = useRef<Booking | null>(null)
const moveTargetRoomIdRef = useRef<string | null>(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)