mirror of
https://github.com/nimbold/Firelink.git
synced 2026-07-29 05:19:45 +00:00
0a647cd612
- Disable log capture by default in both backend (LOG_PAUSED=true) and frontend (isPaused=true) to avoid unnecessary disk I/O and battery drain. - Add a global contextmenu listener that prevents the webview's default right-click menu (Reload, etc.) so the app behaves like a native macOS window. Custom context menus in DownloadItem, LogsView, and Sidebar still work because their handlers preventDefault() before the document listener fires. - Sort the download table by queuePosition when viewing a specific queue so the move-up/down controls produce a visible reorder instead of a silent position swap with no UI feedback. - Rework the keychain access flow to eliminate the OS credential prompt that appeared before the app's own KeychainPermissionModal after every binary update. hydrate_extension_pairing_token now always skips the keychain; only the explicit Grant Access button (grant_keychain_access) triggers the OS prompt, which is user-initiated and therefore acceptable even when macOS trust resets after a code-signature change.
56 lines
1.9 KiB
TypeScript
56 lines
1.9 KiB
TypeScript
import { StrictMode } from "react";
|
|
import { createRoot } from "react-dom/client";
|
|
import "./index.css";
|
|
import App from "./App";
|
|
import { ErrorBoundary } from "./components/ErrorBoundary";
|
|
import { ToastProvider } from "./contexts/ToastContext";
|
|
import { error as logError, warn as logWarn, 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");
|
|
if (rootElement) {
|
|
createRoot(rootElement).render(
|
|
<StrictMode>
|
|
<ErrorBoundary>
|
|
<ToastProvider>
|
|
<App />
|
|
</ToastProvider>
|
|
</ErrorBoundary>
|
|
</StrictMode>,
|
|
);
|
|
}
|
|
|
|
// 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();
|
|
});
|