import React, { Suspense, lazy } from 'react'; import ReactDOM from 'react-dom/client'; import { IntlProvider } from 'react-intl'; import { ConfigProvider } from './components/ConfigContext'; import { ErrorBoundary } from './components/ErrorBoundary'; import SuspenseLoader from './suspense-loader'; import { client } from './api/client.gen'; import { setTelemetryEnabled } from './utils/analytics'; import { readConfig } from './api'; import { applyThemeTokens } from './theme/theme-tokens'; import { currentLocale, currentMessageLocale, loadMessages } from './i18n'; // Apply theme tokens to :root before first paint. applyThemeTokens(); const App = lazy(() => import('./App')); const TELEMETRY_CONFIG_KEY = 'GOOSE_TELEMETRY_ENABLED'; let warnedFallbackLocale = false; function handleIntlError(err: { code: string; message?: string }) { if (err.code === 'MISSING_TRANSLATION' && currentLocale !== currentMessageLocale) { if (!warnedFallbackLocale) { warnedFallbackLocale = true; console.warn( `[i18n] Locale "${currentLocale}" has no translations; falling back to "${currentMessageLocale}".` ); } return; } console.error(err); } (async () => { // Check if we're in the launcher view (doesn't need goosed connection) const isLauncher = window.location.hash === '#/launcher'; if (!isLauncher) { const gooseApiHost = await window.electron.getGoosedHostPort(); if (gooseApiHost === null) { window.alert('failed to start goose backend process'); return; } client.setConfig({ baseUrl: gooseApiHost, headers: { 'Content-Type': 'application/json', 'X-Secret-Key': await window.electron.getSecretKey(), }, }); try { const telemetryResponse = await readConfig({ body: { key: TELEMETRY_CONFIG_KEY, is_secret: false }, }); const isTelemetryEnabled = telemetryResponse.data !== false; setTelemetryEnabled(isTelemetryEnabled); } catch (error) { console.warn('[Analytics] Failed to initialize analytics:', error); } } const messages = await loadMessages(currentMessageLocale); ReactDOM.createRoot(document.getElementById('root')!).render( ); })();