-
= ({ className = '' }) => {
onClick={() => setLanguage('zh')}
>
中文
-
-
+
+
);
};
diff --git a/electron-app/src/hooks/useApiStatus.ts b/electron-app/src/hooks/useApiStatus.ts
index 9bc78d8a..1bd9770c 100644
--- a/electron-app/src/hooks/useApiStatus.ts
+++ b/electron-app/src/hooks/useApiStatus.ts
@@ -44,20 +44,6 @@ export const useApiStatus = (): UseApiStatusReturn => {
clearInterval(checkInterval);
console.log('[useApiStatus] window.apiClient is available:', window.apiClient);
setApiStatus('API 客户端已就绪');
-
- (async () => {
- try {
- if (window.electron && window.electron.ipcRenderer) {
- console.log('[useApiStatus] Testing IPC config retrieval...');
- const config = await window.electron.ipcRenderer.invoke('get-ipc-config');
- console.log('[useApiStatus] IPC Config:', config);
- } else {
- console.log('[useApiStatus] window.electron.ipcRenderer not available');
- }
- } catch (error) {
- console.error('[useApiStatus] IPC config error:', error);
- }
- })();
} else if (attempts >= maxAttempts) {
clearInterval(checkInterval);
console.error('[useApiStatus] window.apiClient not available after maximum attempts');
diff --git a/electron-app/src/hooks/useSessionSmoke.ts b/electron-app/src/hooks/useSessionSmoke.ts
new file mode 100644
index 00000000..a136e93f
--- /dev/null
+++ b/electron-app/src/hooks/useSessionSmoke.ts
@@ -0,0 +1,264 @@
+import { useCallback, useMemo, useState } from 'react';
+
+type ApiResponse = {
+ status: number;
+ body: string;
+};
+
+type SessionSmokePhase =
+ 'idle' | 'creating' | 'running' | 'polling' | 'result-ready' | 'analysis-ready' | 'failed';
+
+type BuffTimelineEntry = {
+ Task: string;
+ Start: number;
+ Finish: number;
+ Value: number | null;
+};
+
+type NormalResultPayload = {
+ dmg_result?: unknown;
+ buff_result?: Record