"use client"; import { useMutation, useQuery, useQueryClient } from "@tanstack/react-query"; import { AlertDialog, AlertDialogCancel, AlertDialogContent, AlertDialogDescription, AlertDialogFooter, AlertDialogHeader, AlertDialogTitle, AlertDialogTrigger, } from "@workspace/ui/components/alert-dialog"; import { Badge } from "@workspace/ui/components/badge"; import { Button } from "@workspace/ui/components/button"; import { Card, CardContent, CardHeader, CardTitle, } from "@workspace/ui/components/card"; import { Icon } from "@workspace/ui/composed/icon"; import { getModuleConfig } from "@workspace/ui/services/admin/system"; import { restartSystem } from "@workspace/ui/services/admin/tool"; import { basicCheckServiceVersion } from "@workspace/ui/services/gateway/basicCheckServiceVersion"; import { basicUpdateService } from "@workspace/ui/services/gateway/basicUpdateService"; import { useState } from "react"; import { useTranslation } from "react-i18next"; import { toast } from "sonner"; import packageJson from "../../../../../../package.json"; import SystemLogsDialog from "./system-logs-dialog"; export default function SystemVersionCard() { const { t } = useTranslation("tool"); const queryClient = useQueryClient(); const [openRestart, setOpenRestart] = useState(false); const [isRestarting, setIsRestarting] = useState(false); const [openUpdateWeb, setOpenUpdateWeb] = useState(false); const [openUpdateServer, setOpenUpdateServer] = useState(false); const [isUpdatingWeb, setIsUpdatingWeb] = useState(false); const { data: moduleConfig } = useQuery({ queryKey: ["getModuleConfig"], queryFn: async () => { const { data } = await getModuleConfig({ skipErrorHandler: true }); return data.data; }, staleTime: 0, }); const { data: serverVersionInfo } = useQuery({ queryKey: ["checkServerVersion", moduleConfig?.secret], queryFn: async () => { const { data } = await basicCheckServiceVersion( { service_name: moduleConfig!.service_name, secret: moduleConfig!.secret, }, { skipErrorHandler: true } ); return data.data; }, enabled: !!moduleConfig?.secret, staleTime: 0, retry: 1, }); const { data: webVersionInfo } = useQuery({ queryKey: ["checkWebVersion", moduleConfig?.secret], queryFn: async () => { const { data } = await basicCheckServiceVersion( { service_name: "admin", secret: moduleConfig!.secret, }, { skipErrorHandler: true } ); return data.data; }, enabled: !!moduleConfig?.secret, staleTime: 0, retry: 1, }); const updateServerMutation = useMutation({ mutationFn: async (serviceName: string) => { await basicUpdateService({ service_name: serviceName, secret: moduleConfig!.secret, }); }, onSuccess: () => { toast.success(t("updateSuccess", "Update completed successfully")); queryClient.invalidateQueries({ queryKey: ["checkServerVersion"] }); queryClient.invalidateQueries({ queryKey: ["getModuleConfig"] }); setOpenUpdateServer(false); }, onError: () => { toast.error(t("updateFailed", "Update failed")); }, }); const handleUpdateWeb = async () => { if (!moduleConfig?.secret) return; setIsUpdatingWeb(true); try { await basicUpdateService({ service_name: "admin", secret: moduleConfig.secret, }); toast.success(t("adminUpdateSuccess", "Admin updated successfully")); await basicUpdateService({ service_name: "user", secret: moduleConfig.secret, }); toast.success(t("userUpdateSuccess", "User updated successfully")); setOpenUpdateWeb(false); window.location.reload(); } catch { toast.error(t("updateFailed", "Update failed")); } finally { setIsUpdatingWeb(false); } }; const hasServerNewVersion = serverVersionInfo?.has_update ?? false; const hasWebNewVersion = webVersionInfo?.has_update ?? false; const isUpdatingServer = updateServerMutation.isPending; return ( {t("systemServices", "System Services")}
{t("confirmSystemReboot", "Confirm System Reboot")} {t( "rebootDescription", "Are you sure you want to reboot the system? This action cannot be undone." )} {t("cancel", "Cancel")}
{t("webVersion", "Web Version")}
V{packageJson.version} {hasWebNewVersion && webVersionInfo && ( {t("confirmUpdate", "Confirm Update")} {t( "updateWebDescription", "Are you sure you want to update the web version from V{{current}} to V{{latest}}?", { current: packageJson.version, latest: webVersionInfo.latest_version, } )} {t("cancel", "Cancel")} )}
{t("serverVersion", "Server Version")}
V {moduleConfig?.service_version || serverVersionInfo?.current_version || "1.0.0"} {hasServerNewVersion && serverVersionInfo && moduleConfig && ( {t("confirmUpdate", "Confirm Update")} {t( "updateServerDescription", "Are you sure you want to update the server version from V{{current}} to V{{latest}}?", { current: moduleConfig.service_version || serverVersionInfo.current_version, latest: serverVersionInfo.latest_version, } )} {t("cancel", "Cancel")} )}
); }