import React from 'react'; import { Outlet, Route, createBrowserRouter, createHashRouter, createRoutesFromElements, redirect, } from 'react-router-dom'; import { ClientConfig } from '../hooks/useClientConfig'; import { AuthLayout, Login, Register, ResetPassword } from './auth'; import { DIRECT_PATH, EXPLORE_PATH, HOME_PATH, LOGIN_PATH, INBOX_PATH, REGISTER_PATH, RESET_PASSWORD_PATH, SPACE_PATH, _CREATE_PATH, _FEATURED_PATH, _INVITES_PATH, _JOIN_PATH, _FEED_PATH, _LOBBY_PATH, _NOTIFICATIONS_PATH, _ROOM_PATH, _SEARCH_PATH, _SERVER_PATH, CREATE_PATH, } from './paths'; import { getAppPathFromHref, getExploreFeaturedPath, getHomePath, getInboxNotificationsPath, getLoginPath, getOriginBaseUrl, } from './pathUtils'; import { ClientBindAtoms, ClientLayout, ClientRoot } from './client'; import { Home, HomeRouteRoomProvider, HomeSearch } from './client/home'; import { Direct, DirectCreate, DirectRouteRoomProvider, DirectSearch } from './client/direct'; import { RouteSpaceProvider, SpaceRouteRoomProvider, SpaceSearch, SpaceIndexRedirect } from './client/space'; import { ForumAwareSpaceLayout } from '../features/forum/ForumAwareSpaceLayout'; import { ForumFeedPage } from '../features/forum/ForumFeedPage'; import { Explore, FeaturedRooms, PublicRooms } from './client/explore'; import { Notifications, Inbox, Invites } from './client/inbox'; import { setAfterLoginRedirectPath } from './afterLoginRedirectPath'; import { Room } from '../features/room'; import { Lobby } from '../features/lobby'; import { WelcomePage } from './client/WelcomePage'; import { SidebarNav } from './client/SidebarNav'; import { PageRoot } from '../components/page'; import { ScreenSize } from '../hooks/useScreenSize'; import { MobileFriendlyPageNav, MobileFriendlyClientNav } from './MobileFriendly'; import { ClientInitStorageAtom } from './client/ClientInitStorageAtom'; import { ClientNonUIFeatures } from './client/ClientNonUIFeatures'; import { AuthRouteThemeManager, UnAuthRouteThemeManager } from './ThemeManager'; import { ReceiveSelfDeviceVerification } from '../components/DeviceVerification'; import { AutoRestoreBackupOnVerification } from '../components/BackupRestore'; import { RoomSettingsRenderer } from '../features/room-settings'; import { ClientRoomsNotificationPreferences } from './client/ClientRoomsNotificationPreferences'; import { SpaceSettingsRenderer } from '../features/space-settings'; import { UserRoomProfileRenderer } from '../components/UserRoomProfileRenderer'; import { CreateRoomModalRenderer } from '../features/create-room'; import { HomeCreateRoom } from './client/home/CreateRoom'; import { Create } from './client/create'; import { CreateSpaceModalRenderer } from '../features/create-space'; import { SearchModalRenderer } from '../features/search'; import { getCurrentSession } from '../state/sessions'; import { AnimatedOutlet } from '../components/AnimatedOutlet'; export const createRouter = (clientConfig: ClientConfig, screenSize: ScreenSize) => { const { hashRouter } = clientConfig; const mobile = screenSize === ScreenSize.Mobile; console.log('[Router] Creating router:', { hashRouter, hashRouterEnabled: hashRouter?.enabled, baseUrl: import.meta.env.BASE_URL, locationHref: window.location.href, }); const routes = createRoutesFromElements( { if (getCurrentSession()) return redirect(getInboxNotificationsPath()); const afterLoginPath = getAppPathFromHref(getOriginBaseUrl(), window.location.href); if (afterLoginPath) setAfterLoginRedirectPath(afterLoginPath); return redirect(getLoginPath()); }} /> { const url = new URL(request.url); const addingAccount = url.searchParams.get('add-account') === 'true'; const hasSession = !!getCurrentSession(); // Log to localStorage for persistence across reloads const debugInfo = { timestamp: new Date().toISOString(), url: url.toString(), pathname: url.pathname, search: url.search, hash: url.hash, addingAccount, hasSession, willRedirect: hasSession && !addingAccount }; console.log('[Router] Auth loader:', debugInfo); const debugLog = JSON.parse(localStorage.getItem('debug-router-logs') || '[]'); debugLog.push(debugInfo); if (debugLog.length > 10) debugLog.shift(); // Keep last 10 localStorage.setItem('debug-router-logs', JSON.stringify(debugLog)); if (hasSession && !addingAccount) { console.log('[Router] Redirecting to Inbox/Notifications because session exists and not adding account'); return redirect(getInboxNotificationsPath()); } return null; }} element={ <> } > } /> } /> } /> { if (!getCurrentSession()) { const afterLoginPath = getAppPathFromHref( getOriginBaseUrl(hashRouter), window.location.href ); if (afterLoginPath) setAfterLoginRedirectPath(afterLoginPath); return redirect(getLoginPath()); } return null; }} element={ } > } > } > } > {mobile ? null : } />} } /> join

} /> } /> } /> } > } > {mobile ? null : } />} } /> } /> } /> } /> } /> } > } /> } /> } /> } /> } /> } > } > {mobile ? null : ( redirect(getExploreFeaturedPath())} element={} /> )} } /> } /> } /> } > } > {mobile ? null : ( redirect(getInboxNotificationsPath())} element={} /> )} } /> } /> Page not found

} />
); if (hashRouter?.enabled) { console.log('[Router] Using HashRouter with basename:', hashRouter.basename); return createHashRouter(routes, { basename: hashRouter.basename }); } console.log('[Router] Using BrowserRouter with basename:', import.meta.env.BASE_URL); return createBrowserRouter(routes, { basename: import.meta.env.BASE_URL, }); };