From 7bd0e038ba04916e6d97d20d34ce85e98d29f90b Mon Sep 17 00:00:00 2001 From: HotelSync Date: Sat, 21 Mar 2026 01:05:40 +0300 Subject: [PATCH] Fix: block drag-to-move if target room has conflicting booking Co-Authored-By: Claude Sonnet 4.6 --- src/components/calendar/BookingCalendar.tsx | 15 +++++++++++++-- 1 file changed, 13 insertions(+), 2 deletions(-) diff --git a/src/components/calendar/BookingCalendar.tsx b/src/components/calendar/BookingCalendar.tsx index 4ce7583..095c8d5 100644 --- a/src/components/calendar/BookingCalendar.tsx +++ b/src/components/calendar/BookingCalendar.tsx @@ -87,8 +87,10 @@ export function BookingCalendar({ rooms, bookings, slug, onBookingCreate, onBook const [ghostPos, setGhostPos] = useState<{ x: number; y: number } | null>(null) const movingBookingRef = useRef(null) const moveTargetRoomIdRef = useRef(null) // всегда актуален, без stale closure + const bookingsRef = useRef(bookings) const didDragRef = useRef(false) movingBookingRef.current = movingBooking + bookingsRef.current = bookings // Compact mode (default from Settings → Appearance) const [compact, setCompact] = useState( @@ -510,8 +512,17 @@ export function BookingCalendar({ rooms, bookings, slug, onBookingCreate, onBook // Читаем из ref — всегда актуальное значение, не stale closure const targetRoomId = moveTargetRoomIdRef.current if (targetRoomId && targetRoomId !== booking.roomId) { - didDragRef.current = true - onBookingUpdate(booking.id, { roomId: targetRoomId }) + // Проверяем конфликт в целевом номере + const hasConflict = bookingsRef.current.some(b => + b.roomId === targetRoomId && + b.id !== booking.id && + b.status !== 'cancelled' && b.status !== 'no_show' && b.status !== 'checked_out' && + b.checkIn < booking.checkOut && b.checkOut > booking.checkIn, + ) + if (!hasConflict) { + didDragRef.current = true + onBookingUpdate(booking.id, { roomId: targetRoomId }) + } } setMovingBooking(null) setMoveTargetRoomId(null)