// Required for the core webserver integration to work import 'vite/modulepreload-polyfill'; import { ErrorBoundary } from "react-error-boundary"; import ReactDOM from 'react-dom/client'; import './globals.css'; import MainShell from './layout/MainShell.tsx'; import { AppErrorFallback } from './components/ErrorFallback.tsx'; import { logoutWatcher, useIsAuthenticated } from './hooks/auth.ts'; import AuthShell from './layout/AuthShell.tsx'; import { isValidRedirectPath, redirectToLogin } from '@/lib/navigation'; import ThemeProvider from './components/ThemeProvider.tsx'; import { StrictMode, useEffect } from 'react'; import { isMobile } from 'is-mobile'; import { useAtomValue } from 'jotai'; import { pageTitleWatcher } from './hooks/pages.ts'; //If inside NUI, silence console.* calls to prevent confusion. if (!window.txConsts.isWebInterface) { console.log = () => { }; console.info = () => { }; console.warn = () => { }; console.error = () => { }; console.debug = () => { }; console.table = () => { }; console.group = () => { }; console.groupEnd = () => { }; console.groupCollapsed = () => { }; console.time = () => { }; console.timeEnd = () => { }; console.timeLog = () => { }; } //Detecting if the user is on a mobile device try { window.txIsMobile = isMobile({ tablet: true }); } catch (error) { window.txIsMobile = false; } //Detecting locale preferences try { window.txBrowserLocale = window?.nuiSystemLanguages ?? navigator.language ?? 'en'; } catch (error) { window.txBrowserLocale = 'en'; } try { const localeOption = Intl.DateTimeFormat(window.txBrowserLocale, { hour: 'numeric' }).resolvedOptions().hour12 window.txBrowserHour12 = localeOption ?? true; } catch (error) { window.txBrowserHour12 = true; } //If the initial routing is from WebPipe, remove it from the pathname so the router can handle it if (window.location.pathname.substring(0, 8) === '/WebPipe') { console.info('Removing WebPipe prefix from the pathname.'); const newUrl = window.location.pathname.substring(8) + window.location.search + window.location.hash; window.history.replaceState(null, '', newUrl); } //Rendering auth or main pages depending on if the user is authenticated const authRoutePrefixes = ['/login', '/addMaster']; const isAuthRoute = (pathname: string) => { return authRoutePrefixes.some(prefix => pathname.startsWith(prefix)); } export function AuthContextSwitch() { useAtomValue(logoutWatcher); useAtomValue(pageTitleWatcher); const isAuthenticated = useIsAuthenticated(); useEffect(() => { if (isAuthenticated) { //Replace the current URL with the redirect path if it exists and is valid const urlParams = new URLSearchParams(window.location.search); const redirectPath = urlParams.get('r'); if (redirectPath) { if (isValidRedirectPath(redirectPath)) { window.history.replaceState(null, '', redirectPath); } else { window.history.replaceState(null, '', '/'); } } else if (isAuthRoute(window.location.pathname)) { window.history.replaceState(null, '', '/'); } } else { //Unless the user is already in the auth pages, redirect to the login page if (!window.txConsts.hasMasterAccount && !window.location.pathname.startsWith('/addMaster')) { console.log('No master account detected. Redirecting to addMaster page.'); window.history.replaceState(null, '', '/addMaster/pin'); } else if (!isAuthRoute(window.location.pathname)) { console.log('User is not authenticated. Redirecting to login page.'); redirectToLogin(); } } }, [isAuthenticated]); return isAuthenticated ? : ; } ReactDOM.createRoot(document.getElementById('root')!).render( , )