| import { useState, useCallback, useEffect } from 'react'; |
| import { RouterProvider } from '@tanstack/react-router'; |
| import { createLogger } from '@automaker/utils/logger'; |
| import { router } from './utils/router'; |
| import { SplashScreen } from './components/splash-screen'; |
| import { useSettingsSync } from './hooks/use-settings-sync'; |
| import { useCursorStatusInit } from './hooks/use-cursor-status-init'; |
| import { useProviderAuthInit } from './hooks/use-provider-auth-init'; |
| import { useMobileVisibility, useMobileOnlineManager } from './hooks/use-mobile-visibility'; |
| import { useAppStore } from './store/app-store'; |
| import { TooltipProvider } from '@/components/ui/tooltip'; |
| import './styles/global.css'; |
| import './styles/theme-imports'; |
| import './styles/font-imports'; |
| import { loadUserFonts, preloadAllFonts } from './styles/font-imports'; |
|
|
| const logger = createLogger('App'); |
|
|
| |
| const DISABLE_SPLASH_KEY = 'automaker-disable-splash'; |
|
|
| export default function App() { |
| const disableSplashScreen = useAppStore((state) => state.disableSplashScreen); |
|
|
| const [showSplash, setShowSplash] = useState(() => { |
| |
| const savedPreference = localStorage.getItem(DISABLE_SPLASH_KEY); |
| if (savedPreference === 'true') { |
| return false; |
| } |
| |
| |
| |
| |
| |
| |
| if (localStorage.getItem('automaker-splash-shown-session')) { |
| return false; |
| } |
| return true; |
| }); |
|
|
| |
| useEffect(() => { |
| localStorage.setItem(DISABLE_SPLASH_KEY, String(disableSplashScreen)); |
| }, [disableSplashScreen]); |
|
|
| |
| |
| |
| useEffect(() => { |
| |
| loadUserFonts(); |
|
|
| |
| |
| |
| |
| |
| const schedulePreload = |
| typeof requestIdleCallback !== 'undefined' |
| ? () => requestIdleCallback(() => preloadAllFonts(), { timeout: 5000 }) |
| : () => setTimeout(() => preloadAllFonts(), 3000); |
|
|
| const timer = setTimeout(() => { |
| schedulePreload(); |
| }, 2000); |
|
|
| return () => clearTimeout(timer); |
| }, []); |
|
|
| |
| |
| useEffect(() => { |
| if (import.meta.env.DEV) { |
| const clearPerfEntries = () => { |
| |
| if (window.performance) { |
| window.performance.clearMarks(); |
| window.performance.clearMeasures(); |
| } |
| }; |
| const interval = setInterval(clearPerfEntries, 5000); |
| return () => clearInterval(interval); |
| } |
| }, []); |
|
|
| |
| |
| |
|
|
| |
| const settingsSyncState = useSettingsSync(); |
| if (settingsSyncState.error) { |
| logger.error('Settings sync error:', settingsSyncState.error); |
| } |
|
|
| |
| useCursorStatusInit(); |
|
|
| |
| useProviderAuthInit(); |
|
|
| |
| |
| |
| useMobileVisibility(); |
| useMobileOnlineManager(); |
|
|
| const handleSplashComplete = useCallback(() => { |
| |
| localStorage.setItem('automaker-splash-shown-session', 'true'); |
| setShowSplash(false); |
| }, []); |
|
|
| |
| |
| |
| useEffect(() => { |
| const handlePageHide = (e: PageTransitionEvent) => { |
| if (!e.persisted) { |
| |
| localStorage.removeItem('automaker-splash-shown-session'); |
| } |
| }; |
| window.addEventListener('pagehide', handlePageHide); |
| return () => window.removeEventListener('pagehide', handlePageHide); |
| }, []); |
|
|
| return ( |
| <TooltipProvider delayDuration={300}> |
| <RouterProvider router={router} /> |
| {showSplash && !disableSplashScreen && <SplashScreen onComplete={handleSplashComplete} />} |
| </TooltipProvider> |
| ); |
| } |
|
|