diff --git a/src/components/layout/update-dialog.tsx b/src/components/layout/update-dialog.tsx
index c8b94e3e4a9063db6d47a5a3a76f854b8292f0db..2d2c3f4c33a1b0953af8e42dec4fbb791e6e7b3b 100644
--- a/src/components/layout/update-dialog.tsx
+++ b/src/components/layout/update-dialog.tsx
@@ -1,6 +1,7 @@
 import useSWR from "swr";
 import snarkdown from "snarkdown";
-import { useState, useMemo } from "react";
+import { useMemo } from "react";
+import { useRecoilState } from "recoil";
 import {
   Box,
   Button,
@@ -13,6 +14,7 @@ import {
 import { relaunch } from "@tauri-apps/api/process";
 import { checkUpdate, installUpdate } from "@tauri-apps/api/updater";
 import { killSidecars, restartSidecar } from "../../services/cmds";
+import { atomUpdateState } from "../../services/states";
 import Notice from "../base/base-notice";
 
 interface Props {
@@ -24,8 +26,6 @@ const UpdateLog = styled(Box)(() => ({
   "h1,h2,h3,ul,ol,p": { margin: "0.5em 0", color: "inherit" },
 }));
 
-let uploadingState = false;
-
 const UpdateDialog = (props: Props) => {
   const { open, onClose } = props;
   const { data: updateInfo } = useSWR("checkUpdate", checkUpdate, {
@@ -33,22 +33,22 @@ const UpdateDialog = (props: Props) => {
     revalidateIfStale: false,
     focusThrottleInterval: 36e5, // 1 hour
   });
-  const [uploading, setUploading] = useState(uploadingState);
+
+  const [updateState, setUpdateState] = useRecoilState(atomUpdateState);
 
   const onUpdate = async () => {
-    setUploading(true);
-    uploadingState = true;
+    if (updateState) return;
+    setUpdateState(true);
 
     try {
-      await installUpdate();
       await killSidecars();
+      await installUpdate();
       await relaunch();
     } catch (err: any) {
       await restartSidecar();
       Notice.error(err?.message || err.toString());
     } finally {
-      setUploading(false);
-      uploadingState = false;
+      setUpdateState(false);
     }
   };
 
@@ -73,7 +73,7 @@ const UpdateDialog = (props: Props) => {
         <Button
           autoFocus
           variant="contained"
-          disabled={uploading}
+          disabled={updateState}
           onClick={onUpdate}
         >
           Update
diff --git a/src/services/states.ts b/src/services/states.ts
index 63b9762ba3d10a48ec6d7a293a6f359c0a4c656d..250e31ecb589b2ad0878279c94bb6ff4c6a639ae 100644
--- a/src/services/states.ts
+++ b/src/services/states.ts
@@ -16,3 +16,9 @@ export const atomLoadingCache = atom<Record<string, boolean>>({
   key: "atomLoadingCache",
   default: {},
 });
+
+// save update state
+export const atomUpdateState = atom<boolean>({
+  key: "atomUpdateState",
+  default: false,
+});