From cbd85c5c7e2062a71b70b5a01cbba18367c569dc Mon Sep 17 00:00:00 2001 From: HotelSync Date: Tue, 17 Mar 2026 20:13:10 +0300 Subject: [PATCH] Clear stale WS locks on reconnect to fix phantom overlays When WS reconnects after a disconnect, the browser may have missed unlock/booking:created messages, leaving gray striped overlays stuck forever. Clearing all locks on reconnect ensures stale state is removed. Co-Authored-By: Claude Sonnet 4.6 --- src/pages/CalendarPage.tsx | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/src/pages/CalendarPage.tsx b/src/pages/CalendarPage.tsx index 1895c1c..be6a7d2 100644 --- a/src/pages/CalendarPage.tsx +++ b/src/pages/CalendarPage.tsx @@ -1,4 +1,4 @@ -import { useState, useEffect, useCallback } from 'react' +import { useState, useEffect, useCallback, useRef } from 'react' import { BookingCalendar } from '../components/calendar/BookingCalendar' import { RENTAL_OBJECTS, MOCK_RENTAL_BOOKINGS } from '../data/rentalData' import { useModules } from '../contexts/ModulesContext' @@ -51,6 +51,15 @@ export function CalendarPage() { const { send, connected } = useHotelSocket({ slug, token: session?.token ?? null, onMessage: handleWsMessage }) + // Clear stale locks on WS reconnect (may have missed unlock/booking:created while disconnected) + const prevConnected = useRef(false) + useEffect(() => { + if (connected && !prevConnected.current) { + setLocks(new Map()) + } + prevConnected.current = connected + }, [connected]) + const handleCreate = async (data: Partial) => { try { const created = await api.bookings.create(slug, {