From 4f2299e492354cc419c37b77baaf48e9fe33f702 Mon Sep 17 00:00:00 2001 From: duckietm Date: Thu, 19 Mar 2026 15:05:41 +0100 Subject: [PATCH] =?UTF-8?q?=F0=9F=86=95=20Disconnection=20handler,=20when?= =?UTF-8?q?=20you=20got=20disconnected=20you=20automatic=20go=20back=20to?= =?UTF-8?q?=20the=20room?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/App.tsx | 2 + src/components/MainView.tsx | 4 +- src/components/reconnect/ReconnectView.tsx | 108 +++++++++++++++++++++ src/hooks/navigator/useNavigator.ts | 4 +- 4 files changed, 116 insertions(+), 2 deletions(-) create mode 100644 src/components/reconnect/ReconnectView.tsx diff --git a/src/App.tsx b/src/App.tsx index d3566cc..c97d6fa 100644 --- a/src/App.tsx +++ b/src/App.tsx @@ -4,6 +4,7 @@ import { GetUIVersion } from './api'; import { Base } from './common'; import { LoadingView } from './components/loading/LoadingView'; import { MainView } from './components/MainView'; +import { ReconnectView } from './components/reconnect/ReconnectView'; import { useMessageEvent } from './hooks'; NitroVersion.UI_VERSION = GetUIVersion(); @@ -93,6 +94,7 @@ export const App: FC<{}> = props => { !isReady && } { isReady && } + ); diff --git a/src/components/MainView.tsx b/src/components/MainView.tsx index 3fef0cc..50ada98 100644 --- a/src/components/MainView.tsx +++ b/src/components/MainView.tsx @@ -1,4 +1,4 @@ -import { AddLinkEventTracker, GetCommunication, HabboWebTools, ILinkEventTracker, RemoveLinkEventTracker, RoomSessionEvent } from '@nitrots/nitro-renderer'; +import { AddLinkEventTracker, GetCommunication, GetRoomSessionManager, HabboWebTools, ILinkEventTracker, RemoveLinkEventTracker, RoomSessionEvent } from '@nitrots/nitro-renderer'; import { AnimatePresence, motion } from 'framer-motion'; import { FC, useEffect, useState } from 'react'; import { useNitroEvent } from '../hooks'; @@ -41,6 +41,8 @@ export const MainView: FC<{}> = props => { setIsReady(true); + GetRoomSessionManager().tryRestoreSession(); + GetCommunication().connection.ready(); }, []); diff --git a/src/components/reconnect/ReconnectView.tsx b/src/components/reconnect/ReconnectView.tsx new file mode 100644 index 0000000..5dc2acf --- /dev/null +++ b/src/components/reconnect/ReconnectView.tsx @@ -0,0 +1,108 @@ +import { NitroEventType, ReconnectEvent } from '@nitrots/nitro-renderer'; +import { FC, useCallback, useState } from 'react'; +import { Base, Column, Text } from '../../common'; +import { useNitroEvent } from '../../hooks'; + +export const ReconnectView: FC<{}> = props => +{ + const [ isReconnecting, setIsReconnecting ] = useState(false); + const [ attempt, setAttempt ] = useState(0); + const [ maxAttempts, setMaxAttempts ] = useState(0); + const [ hasFailed, setHasFailed ] = useState(false); + + const onReconnecting = useCallback((event: ReconnectEvent) => + { + setIsReconnecting(true); + setHasFailed(false); + setAttempt(event.attempt); + setMaxAttempts(event.maxAttempts); + }, []); + + const onReconnected = useCallback(() => + { + setIsReconnecting(false); + setHasFailed(false); + setAttempt(0); + }, []); + + const onReconnectFailed = useCallback(() => + { + setIsReconnecting(false); + setHasFailed(true); + }, []); + + useNitroEvent(NitroEventType.SOCKET_RECONNECTING, onReconnecting); + useNitroEvent(NitroEventType.SOCKET_RECONNECTED, onReconnected); + useNitroEvent(NitroEventType.SOCKET_RECONNECT_FAILED, onReconnectFailed); + + const handleReload = useCallback(() => + { + window.location.reload(); + }, []); + + const handleGoHome = useCallback(() => + { + sessionStorage.removeItem('nitro_last_room'); + sessionStorage.removeItem('nitro_last_room_password'); + window.location.reload(); + }, []); + + if(!isReconnecting && !hasFailed) return null; + + return ( + + + { isReconnecting && ( + <> + + + Connection lost + + + Reconnecting to server... (attempt { attempt }/{ maxAttempts }) + + + + + + Please wait, your session will be restored automatically + + + ) } + + { hasFailed && ( + <> + + + Connection failed + + + Unable to reconnect to the server after multiple attempts. + + + + Reload Page + + + Go to Home + + + + ) } + + + ); +}; diff --git a/src/hooks/navigator/useNavigator.ts b/src/hooks/navigator/useNavigator.ts index 90df9fc..416c0af 100644 --- a/src/hooks/navigator/useNavigator.ts +++ b/src/hooks/navigator/useNavigator.ts @@ -1,4 +1,4 @@ -import { CanCreateRoomEventEvent, CantConnectMessageParser, CreateLinkEvent, DoorbellMessageEvent, FavouriteChangedEvent, FavouritesEvent, FlatAccessDeniedMessageEvent, FlatCreatedEvent, FollowFriendMessageComposer, GenericErrorEvent, GetGuestRoomMessageComposer, GetGuestRoomResultEvent, 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, 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'; @@ -397,6 +397,8 @@ const useNavigatorState = () => return; } + if(GetRoomSessionManager().viewerSession) return; + let forwardType = -1; let forwardId = -1;