diff --git a/src/App.tsx b/src/App.tsx index c97d6fa..9608aa8 100644 --- a/src/App.tsx +++ b/src/App.tsx @@ -1,17 +1,30 @@ -import { GetAssetManager, GetAvatarRenderManager, GetCommunication, GetConfiguration, GetLocalizationManager, GetRoomEngine, GetRoomSessionManager, GetSessionDataManager, GetSoundManager, GetStage, GetTexturePool, GetTicker, HabboWebTools, LegacyExternalInterface, LoadGameUrlEvent, NitroLogger, NitroVersion, PrepareRenderer } from '@nitrots/nitro-renderer'; -import { FC, useEffect, useState } from 'react'; +import { GetAssetManager, GetAvatarRenderManager, GetCommunication, GetConfiguration, GetLocalizationManager, GetRoomEngine, GetRoomSessionManager, GetSessionDataManager, GetSoundManager, GetStage, GetTexturePool, GetTicker, HabboWebTools, LegacyExternalInterface, LoadGameUrlEvent, NitroEventType, NitroLogger, NitroVersion, PrepareRenderer } from '@nitrots/nitro-renderer'; +import { FC, useCallback, useEffect, useState } from 'react'; 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'; +import { useMessageEvent, useNitroEvent } from './hooks'; NitroVersion.UI_VERSION = GetUIVersion(); export const App: FC<{}> = props => { const [ isReady, setIsReady ] = useState(false); + const [ errorMessage, setErrorMessage ] = useState(''); + const [ homeUrl, setHomeUrl ] = useState(''); + + const showSessionExpired = useCallback(() => + { + const baseUrl = window.location.origin + '/'; + setHomeUrl(baseUrl); + setErrorMessage('Your session has expired.\nPlease log in again to enter the hotel.'); + setIsReady(false); + }, []); + + // Listen for socket closed events (code 1000 "Bye" - server rejected SSO) + useNitroEvent(NitroEventType.SOCKET_CLOSED, showSessionExpired); useMessageEvent(LoadGameUrlEvent, event => { @@ -30,6 +43,14 @@ export const App: FC<{}> = props => { if(!window.NitroConfig) throw new Error('NitroConfig is not defined!'); + const ssoTicket = window.NitroConfig['sso.ticket']; + + if(!ssoTicket || ssoTicket === '') + { + showSessionExpired(); + return; + } + const renderer = await PrepareRenderer({ width: Math.floor(width), height: Math.floor(height), @@ -83,6 +104,7 @@ export const App: FC<{}> = props => catch(err) { NitroLogger.error(err); + showSessionExpired(); } }; @@ -92,7 +114,7 @@ export const App: FC<{}> = props => return ( { !isReady && - } + 0 } message={ errorMessage } homeUrl={ homeUrl } /> } { isReady && } diff --git a/src/components/loading/LoadingView.tsx b/src/components/loading/LoadingView.tsx index a9dc9bc..c8bb131 100644 --- a/src/components/loading/LoadingView.tsx +++ b/src/components/loading/LoadingView.tsx @@ -4,10 +4,11 @@ import { Base, Column, Text } from '../../common'; interface LoadingViewProps { isError?: boolean; message?: string; + homeUrl?: string; } export const LoadingView: FC = props => { - const { isError = false, message = '' } = props; + const { isError = false, message = '', homeUrl = '' } = props; return ( @@ -19,11 +20,16 @@ export const LoadingView: FC = props => { { isError && (message && message.length) ? - Something went wrong while loading - - { message } - + + { homeUrl && + + Back to Hotel + + } : diff --git a/src/components/reconnect/ReconnectView.tsx b/src/components/reconnect/ReconnectView.tsx index 4c13094..af8e896 100644 --- a/src/components/reconnect/ReconnectView.tsx +++ b/src/components/reconnect/ReconnectView.tsx @@ -48,14 +48,14 @@ export const ReconnectView: FC<{}> = props => const handleReload = useCallback(() => { - window.location.reload(); + window.location.href = window.location.origin + '/'; }, []); const handleGoHome = useCallback(() => { sessionStorage.removeItem('nitro.session.lastRoomId'); sessionStorage.removeItem('nitro.session.lastRoomPassword'); - window.location.reload(); + window.location.href = window.location.origin + '/'; }, []); if(!isReconnecting && !hasFailed) return null; @@ -92,24 +92,18 @@ export const ReconnectView: FC<{}> = props => <> - Connection failed + Session expired - Unable to reconnect to the server after multiple attempts. + Your session has expired. Please log in again to enter the hotel. - - Reload Page - - - Go to Home - + Back to Hotel + ) }