From 352d22a10188bdd6022ad472867f09a15aad606e Mon Sep 17 00:00:00 2001 From: HotelSync Date: Tue, 17 Mar 2026 18:51:32 +0300 Subject: [PATCH] Add WS reconnect logic + connection indicator in calendar - useHotelSocket: reconnect with exponential backoff (up to 30s), return connected state, log errors to console - BookingCalendar: show green/gray dot + Online/Offline label in toolbar - CalendarPage: pass wsConnected prop Co-Authored-By: Claude Sonnet 4.6 --- src/components/calendar/BookingCalendar.tsx | 17 ++++- src/hooks/useHotelSocket.ts | 72 +++++++++++++++++---- src/pages/CalendarPage.tsx | 3 +- 3 files changed, 76 insertions(+), 16 deletions(-) diff --git a/src/components/calendar/BookingCalendar.tsx b/src/components/calendar/BookingCalendar.tsx index 309cbcf..bd3ae46 100644 --- a/src/components/calendar/BookingCalendar.tsx +++ b/src/components/calendar/BookingCalendar.tsx @@ -31,6 +31,7 @@ interface BookingCalendarProps { locks?: Map onDraftStart?: (roomId: string, checkIn: string, checkOut: string) => void onDraftCancel?: (roomId: string) => void + wsConnected?: boolean } const CATEGORY_ORDER: Record = { @@ -54,7 +55,7 @@ function getRoomTypeColor(type: string): string { return map[type] ?? 'bg-slate-100 text-slate-600 dark:bg-slate-700 dark:text-slate-300' } -export function BookingCalendar({ rooms, bookings, onBookingCreate, onBookingUpdate, onBookingBulkUpdate, fadingBookingIds, rentalObjects, rentalBookings, onRentalBookingCreate, locks = new Map(), onDraftStart, onDraftCancel }: BookingCalendarProps) { +export function BookingCalendar({ rooms, bookings, onBookingCreate, onBookingUpdate, onBookingBulkUpdate, fadingBookingIds, rentalObjects, rentalBookings, onRentalBookingCreate, locks = new Map(), onDraftStart, onDraftCancel, wsConnected }: BookingCalendarProps) { const [startDate, setStartDate] = useState(() => startOfDay(new Date())) const [visibleDays, setVisibleDays] = useState(DAYS_VISIBLE) @@ -266,6 +267,20 @@ export function BookingCalendar({ rooms, bookings, onBookingCreate, onBookingUpd ))} + {/* WebSocket status indicator */} + {wsConnected !== undefined && ( +
+ + {wsConnected ? 'Онлайн' : 'Офлайн'} +
+ )} +