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;