From 961457c50815d9955345fcb4b2ed4418c416b421 Mon Sep 17 00:00:00 2001 From: duckietm Date: Fri, 20 Mar 2026 16:06:51 +0100 Subject: [PATCH] =?UTF-8?q?=F0=9F=86=99=20Stage=201=20reconnect?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/api/nitro/session/VisitDesktop.ts | 4 +++- src/components/reconnect/ReconnectView.tsx | 15 +++++++++++++-- src/hooks/navigator/useNavigator.ts | 20 ++++++++++++++++++-- 3 files changed, 34 insertions(+), 5 deletions(-) diff --git a/src/api/nitro/session/VisitDesktop.ts b/src/api/nitro/session/VisitDesktop.ts index 2309f01..364b56f 100644 --- a/src/api/nitro/session/VisitDesktop.ts +++ b/src/api/nitro/session/VisitDesktop.ts @@ -1,4 +1,4 @@ -import { GetRoomSessionManager } from '@nitrots/nitro-renderer'; +import { GetRoomSessionManager, NitroLogger } from '@nitrots/nitro-renderer'; import { GetRoomSession } from './GetRoomSession'; import { GoToDesktop } from './GoToDesktop'; @@ -6,6 +6,8 @@ export const VisitDesktop = () => { if(!GetRoomSession()) return; + NitroLogger.log('[VisitDesktop] Called (isReconnecting=' + GetRoomSessionManager().isReconnecting + ')'); + GoToDesktop(); GetRoomSessionManager().removeSession(-1); }; diff --git a/src/components/reconnect/ReconnectView.tsx b/src/components/reconnect/ReconnectView.tsx index 5dc2acf..4c13094 100644 --- a/src/components/reconnect/ReconnectView.tsx +++ b/src/components/reconnect/ReconnectView.tsx @@ -20,6 +20,16 @@ export const ReconnectView: FC<{}> = props => const onReconnected = useCallback(() => { + // Socket is open but not yet re-authenticated. + // Update attempt display but keep the overlay visible until + // re-authentication completes (SOCKET_REAUTHENTICATED). + setHasFailed(false); + }, []); + + const onReauthenticated = useCallback(() => + { + // Fully re-authenticated — dismiss the overlay so the room view + // (which stayed alive behind the overlay) is visible again. setIsReconnecting(false); setHasFailed(false); setAttempt(0); @@ -33,6 +43,7 @@ export const ReconnectView: FC<{}> = props => useNitroEvent(NitroEventType.SOCKET_RECONNECTING, onReconnecting); useNitroEvent(NitroEventType.SOCKET_RECONNECTED, onReconnected); + useNitroEvent(NitroEventType.SOCKET_REAUTHENTICATED, onReauthenticated); useNitroEvent(NitroEventType.SOCKET_RECONNECT_FAILED, onReconnectFailed); const handleReload = useCallback(() => @@ -42,8 +53,8 @@ export const ReconnectView: FC<{}> = props => const handleGoHome = useCallback(() => { - sessionStorage.removeItem('nitro_last_room'); - sessionStorage.removeItem('nitro_last_room_password'); + sessionStorage.removeItem('nitro.session.lastRoomId'); + sessionStorage.removeItem('nitro.session.lastRoomPassword'); window.location.reload(); }, []); diff --git a/src/hooks/navigator/useNavigator.ts b/src/hooks/navigator/useNavigator.ts index 416c0af..a934aff 100644 --- a/src/hooks/navigator/useNavigator.ts +++ b/src/hooks/navigator/useNavigator.ts @@ -1,8 +1,8 @@ -import { CanCreateRoomEventEvent, CantConnectMessageParser, CreateLinkEvent, DoorbellMessageEvent, FavouriteChangedEvent, FavouritesEvent, FlatAccessDeniedMessageEvent, FlatCreatedEvent, FollowFriendMessageComposer, GenericErrorEvent, GetGuestRoomMessageComposer, GetGuestRoomResultEvent, GetRoomSessionManager, GetSessionDataManager, GetUserEventCatsMessageComposer, GetUserFlatCatsMessageComposer, HabboWebTools, LegacyExternalInterface, NavigatorCategoryDataParser, NavigatorEventCategoryDataParser, NavigatorHomeRoomEvent, NavigatorMetadataEvent, NavigatorOpenRoomCreatorEvent, NavigatorSavedSearch, NavigatorSearchesEvent, NavigatorSearchEvent, NavigatorSearchResultSet, NavigatorTopLevelContext, RoomDataParser, RoomDoorbellAcceptedEvent, RoomEnterErrorEvent, RoomEntryInfoMessageEvent, RoomForwardEvent, RoomScoreEvent, RoomSettingsUpdatedEvent, SecurityLevel, UserEventCatsEvent, UserFlatCatsEvent, UserInfoEvent, UserPermissionsEvent } from '@nitrots/nitro-renderer'; +import { CanCreateRoomEventEvent, CantConnectMessageParser, CreateLinkEvent, DoorbellMessageEvent, FavouriteChangedEvent, FavouritesEvent, FlatAccessDeniedMessageEvent, FlatCreatedEvent, FollowFriendMessageComposer, GenericErrorEvent, GetGuestRoomMessageComposer, GetGuestRoomResultEvent, GetRoomSessionManager, GetSessionDataManager, GetUserEventCatsMessageComposer, GetUserFlatCatsMessageComposer, HabboWebTools, LegacyExternalInterface, NavigatorCategoryDataParser, NavigatorEventCategoryDataParser, NavigatorHomeRoomEvent, NavigatorMetadataEvent, NavigatorOpenRoomCreatorEvent, NavigatorSavedSearch, NavigatorSearchesEvent, NavigatorSearchEvent, NavigatorSearchResultSet, NavigatorTopLevelContext, NitroEventType, RoomDataParser, RoomDoorbellAcceptedEvent, RoomEnterErrorEvent, RoomEntryInfoMessageEvent, RoomForwardEvent, RoomScoreEvent, RoomSettingsUpdatedEvent, SecurityLevel, UserEventCatsEvent, UserFlatCatsEvent, UserInfoEvent, UserPermissionsEvent } from '@nitrots/nitro-renderer'; import { useState } from 'react'; import { useBetween } from 'use-between'; import { CreateRoomSession, DoorStateType, GetConfigurationValue, INavigatorData, LocalizeText, NotificationAlertType, SendMessageComposer, TryVisitRoom, VisitDesktop } from '../../api'; -import { useMessageEvent } from '../events'; +import { useMessageEvent, useNitroEvent } from '../events'; import { useNotification } from '../notification'; const useNavigatorState = () => @@ -373,6 +373,15 @@ const useNavigatorState = () => CreateRoomSession(parser.roomId); }); + // When reconnection starts, reset settingsReceived so the login sequence's + // NavigatorHomeRoomEvent is treated as a fresh login. Without this, the + // prevSettingsReceived check blocks home room navigation after reconnection, + // leaving the user stuck on hotel view. + useNitroEvent(NitroEventType.SOCKET_RECONNECTING, () => + { + setNavigatorData(prevValue => ({ ...prevValue, settingsReceived: false })); + }); + useMessageEvent(NavigatorHomeRoomEvent, event => { const parser = event.getParser(); @@ -397,6 +406,8 @@ const useNavigatorState = () => return; } + // If a room session was already restored (from a network disconnect reload), + // skip the normal home room navigation to avoid overriding it. if(GetRoomSessionManager().viewerSession) return; let forwardType = -1; @@ -458,6 +469,11 @@ const useNavigatorState = () => break; } + // During reconnection, don't navigate to desktop — the reconnection guard + // will handle retrying or cleaning up. Calling VisitDesktop here would + // remove the session from the map and send the user to hotel view. + if(GetRoomSessionManager().isReconnecting) return; + VisitDesktop(); });