import { useTranslation } from "react-i18next"; import { useLockFn } from "ahooks"; import { showNotice } from "@/services/noticeService"; import { installService, isServiceAvailable, restartCore, } from "@/services/cmds"; import { useSystemState } from "@/hooks/use-system-state"; import { mutate } from "swr"; export function useServiceInstaller() { const { t } = useTranslation(); const { mutateRunningMode } = useSystemState(); const installServiceAndRestartCore = useLockFn(async () => { try { showNotice("info", t("Installing Service...")); await installService(); showNotice("success", t("Service Installed Successfully")); showNotice("info", t("Waiting for service to be ready...")); let serviceReady = false; for (let i = 0; i < 5; i++) { try { // 等待1秒再检查 await new Promise((resolve) => setTimeout(resolve, 1000)); const isAvailable = await isServiceAvailable(); if (isAvailable) { serviceReady = true; mutate("isServiceAvailable", true, false); break; } // 最后一次尝试不显示重试信息 if (i < 4) { showNotice( "info", t("Service not ready, retrying attempt {count}/{total}...", { count: i + 1, total: 5, }), ); } } catch (error) { console.error(t("Error checking service status:"), error); if (i < 4) { showNotice( "error", t( "Failed to check service status, retrying attempt {count}/{total}...", { count: i + 1, total: 5, }, ), ); } } } if (!serviceReady) { showNotice( "info", t( "Service did not become ready after attempts. Proceeding with core restart.", ), ); } showNotice("info", t("Restarting Core...")); await restartCore(); // 核心重启后,再次确认并更新相关状态 await mutateRunningMode(); const finalServiceStatus = await isServiceAvailable(); mutate("isServiceAvailable", finalServiceStatus, false); if (serviceReady && finalServiceStatus) { showNotice("success", t("Service is ready and core restarted")); } else if (finalServiceStatus) { showNotice("success", t("Core restarted. Service is now available.")); } else if (serviceReady) { showNotice( "info", t( "Service was ready, but core restart might have issues or service became unavailable. Please check.", ), ); } else { showNotice( "error", t( "Service installation or core restart encountered issues. Service might not be available. Please check system logs.", ), ); } return finalServiceStatus; } catch (err: any) { showNotice("error", err.message || err.toString()); // 尝试性回退或最终操作 try { showNotice("info", t("Attempting to restart core as a fallback...")); await restartCore(); await mutateRunningMode(); await isServiceAvailable().then((status) => mutate("isServiceAvailable", status, false), ); } catch (recoveryError: any) { showNotice( "error", t("Fallback core restart also failed: {message}", { message: recoveryError.message, }), ); } return false; } }); return { installServiceAndRestartCore }; }