diff --git a/src-tauri/src/lib.rs b/src-tauri/src/lib.rs index e1f0f2c..b0612a1 100644 --- a/src-tauri/src/lib.rs +++ b/src-tauri/src/lib.rs @@ -18553,17 +18553,6 @@ pub fn run() { main_window_builder = main_window_builder .inner_size(startup_size.width as f64, startup_size.height as f64) .prevent_overflow(); - #[cfg(target_os = "windows")] - { - // Wry installs its parent WM_SETFOCUS handler while WebView2 - // is still being initialized. Keep the host hidden and - // non-activatable until RunEvent::Ready so Windows cannot - // re-enter that handler during native construction. - main_window_builder = main_window_builder - .visible(false) - .focused(false) - .focusable(false); - } main_window_builder .build() .map_err(|error| format!("failed to create main window: {error}"))?; @@ -19901,8 +19890,6 @@ pub fn run() { .run(|app_handle, event| match event { tauri::RunEvent::Ready => { mark_main_window_startup_complete(app_handle); - #[cfg(target_os = "windows")] - reveal_main_window(app_handle); #[cfg(not(target_os = "windows"))] restore_pending_main_window(app_handle); } diff --git a/src/main.tsx b/src/main.tsx index b060cfe..61217a1 100644 --- a/src/main.tsx +++ b/src/main.tsx @@ -1,128 +1,8 @@ -import { StrictMode, type ComponentType } from "react"; -import { createRoot } from "react-dom/client"; -import "@fontsource-variable/inter/wght.css"; -import "@fontsource-variable/noto-sans-hebrew/wght.css"; -import "@fontsource-variable/noto-sans-sc/wght.css"; -import "@fontsource-variable/outfit/wght.css"; -import "@fontsource-variable/roboto/wght.css"; -import "@fontsource-variable/vazirmatn/wght.css"; -import "./index.css"; -import { i18nReady } from "./i18n"; -import { ErrorBoundary } from "./components/ErrorBoundary"; -import { ToastProvider } from "./contexts/ToastContext"; -import { error as logError, warn as logWarn, initLogger } from "./utils/logger"; -import { getCurrentWindow } from '@tauri-apps/api/window'; -import { invokeCommand as invoke } from './ipc'; - -const isPropertiesWindow = getCurrentWindow().label.startsWith('properties-'); +import { initLogger } from "./utils/logger"; void initLogger(); -const serializeConsoleArguments = (values: unknown[]) => values.map(value => { - if (value instanceof Error) return `${value.name}: ${value.message}\n${value.stack || ''}`; - if (typeof value === 'string') return value; - try { - return JSON.stringify(value); - } catch { - return String(value); - } -}).join(' '); - -const redactConsoleMessage = (message: string) => message - .replace(/(authorization|cookie|password|token|secret)\s*[:=]\s*([^\s,;]+)/gi, '$1=[redacted]') - .replace(/(https?:\/\/[^\s?]+)\?[^\s]+/g, '$1?[redacted]'); - -const originalConsoleError = console.error.bind(console); -const originalConsoleWarn = console.warn.bind(console); -console.error = (...values: unknown[]) => { - originalConsoleError(...values); - void logError(redactConsoleMessage(serializeConsoleArguments(values))).catch(() => undefined); -}; -console.warn = (...values: unknown[]) => { - originalConsoleWarn(...values); - void logWarn(redactConsoleMessage(serializeConsoleArguments(values))).catch(() => undefined); -}; - const rootElement = document.getElementById("root"); -const renderRoot = (RootComponent: ComponentType) => { - if (!rootElement) return; - - createRoot(rootElement).render( - - - - - - - , - ); -}; - -const PropertiesStartupFailure = () => ( -
-

Download Properties could not be loaded.

- -
-); - -const renderMainApp = async () => { - if (!rootElement) return; - - // Keep the child entrypoint isolated from the main application module. App - // imports the persistent Zustand stores, whose module initialization issues - // main-window-only IPC commands. Loading it in a Properties child creates a - // second persistence owner and can race the bridge handshake. - const RootComponent = (await import('./App')).default; - renderRoot(RootComponent); -}; - -const renderPropertiesApp = async () => { - if (!rootElement) return; - - try { - // Properties starts with the synchronous English catalog and changes locale - // after its first paint. Waiting for a lazy locale chunk here delays the - // loading shell and makes native window startup visible to the user. - const RootComponent = (await import('./components/PropertiesWindowApp')).PropertiesWindowApp; - renderRoot(RootComponent); - } catch (error) { - // A failed lazy chunk must not leave the native window hidden forever. Show - // a styled, closable failure state and use the same caller-validated native - // reveal command as the normal child path. - console.error('Failed to initialize the Properties window:', error); - renderRoot(PropertiesStartupFailure); - const fallbackSessionId = crypto.randomUUID(); - void invoke('properties_window_send_ready', { sessionId: fallbackSessionId }) - .then(() => invoke('properties_window_reveal', { sessionId: fallbackSessionId })) - .catch(revealError => { - console.error('Failed to reveal the Properties startup error:', revealError); - }); - } -}; - -if (isPropertiesWindow) { - void renderPropertiesApp(); -} else { - void i18nReady.then(renderMainApp).catch(error => { - console.error('Failed to initialize localization:', error); - void renderMainApp(); - }); +if (rootElement) { + rootElement.textContent = "Firelink startup control"; } - -// Prevent the webview's default context menu ("Reload", etc.) on right-click. -// Individual components that provide custom context menus call preventDefault() -// in their own onContextMenu handlers, which fires before this document-level -// listener and is unaffected. -document.addEventListener('contextmenu', (e) => { - e.preventDefault(); -});