mirror of
https://github.com/duckietm/Nitro-V3.git
synced 2026-06-19 23:16:21 +00:00
25d51aff3f
App.tsx's prepare() useEffect ran four .init() calls (SessionDataManager, RoomSessionManager, RoomEngine, Communication) without any guard, plus an immediate heartbeat ping and a legacy authentication track. Under StrictMode dev double-invoke, those fire twice — risking duplicate session/communication state. - Gate the four .init() chain behind gameInitPromiseRef: both the first and the simulated second invocation await the same promise. - Gate the legacy track + immediate heartbeat behind bootstrapDoneRef. - Heartbeat and remember-rotate intervals were already idempotent (clearInterval before setInterval); ticker registration was already guarded by tickersStartedRef; renderer/warmup were already gated by rendererPromiseRef/warmupPromiseRef. No change needed there. Wrap <App /> in <StrictMode> in src/index.tsx now that the renderer init path is double-invoke safe. https://claude.ai/code/session_01GrR87LAqnAEyKG2ZbmQt5Q
61 lines
1.5 KiB
TypeScript
61 lines
1.5 KiB
TypeScript
import { StrictMode, Suspense } from 'react';
|
|
import { createRoot } from 'react-dom/client';
|
|
import { ErrorBoundary } from 'react-error-boundary';
|
|
import { App } from './App';
|
|
import { LoadingView } from './components/loading/LoadingView';
|
|
|
|
import './css/index.css';
|
|
|
|
import './css/backgrounds/BackgroundsView.css';
|
|
|
|
import './css/chat/Chats.css';
|
|
|
|
import './css/common/Buttons.css';
|
|
|
|
|
|
import './css/forms/form_select.css';
|
|
|
|
import './css/friends/FriendsView.css';
|
|
|
|
import './css/hotelview/HotelView.css';
|
|
|
|
import './css/login/LoginView.css';
|
|
|
|
import './css/icons/icons.css';
|
|
|
|
|
|
import './css/layout/LayoutTrophy.css';
|
|
|
|
|
|
import './css/nitrocard/NitroCardView.css';
|
|
|
|
import './css/notification/NotificationCenterView.css';
|
|
|
|
import './css/purse/PurseView.css';
|
|
|
|
import './css/room/InfoStand.css';
|
|
import './css/room/NavigatorRoomSettings.css';
|
|
import './css/room/RoomWidgets.css';
|
|
|
|
import './css/slider.css';
|
|
|
|
import './css/toolbar/ToolBar.css';
|
|
|
|
import './css/widgets/FurnitureWidgets.css';
|
|
|
|
createRoot(document.getElementById('root')).render(
|
|
<StrictMode>
|
|
<ErrorBoundary
|
|
fallbackRender={ ({ error }) => (
|
|
<LoadingView
|
|
isError={ true }
|
|
message={ `Something went wrong.\n${ (error as Error)?.message ?? 'Unknown error' }` }
|
|
homeUrl={ window.location.origin + '/' } />
|
|
) }>
|
|
<Suspense fallback={ <LoadingView message="Loading…" /> }>
|
|
<App />
|
|
</Suspense>
|
|
</ErrorBoundary>
|
|
</StrictMode>
|
|
);
|