From 11b58cc6dd4a16845794531c76f2d75f5b8023a0 Mon Sep 17 00:00:00 2001 From: Bryan Roscoe Date: Sun, 21 Jun 2026 22:42:45 -0500 Subject: [PATCH] Updater: 'Restart now' button instead of a static restart message MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit After an update installs, the badge read 'Update installed — restart the app to apply' as dead text. Make it a button that relaunches the app via the process plugin (tauri-plugin-process + process:allow-restart), so the user can finish the update in one click. Falls back to a 'quit and reopen' message if relaunch fails. --- v2/package-lock.json | 14 +++++++++++-- v2/package.json | 1 + v2/src-tauri/Cargo.lock | 11 ++++++++++ v2/src-tauri/Cargo.toml | 1 + v2/src-tauri/capabilities/default.json | 3 ++- v2/src-tauri/src/lib.rs | 1 + v2/src/routes/+layout.svelte | 28 ++++++++++++++++++++++++-- 7 files changed, 54 insertions(+), 5 deletions(-) diff --git a/v2/package-lock.json b/v2/package-lock.json index 2158b0d..a1a8c1f 100644 --- a/v2/package-lock.json +++ b/v2/package-lock.json @@ -1,17 +1,18 @@ { "name": "shield-optimizer-v2", - "version": "2.0.0", + "version": "2.1.0", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "shield-optimizer-v2", - "version": "2.0.0", + "version": "2.1.0", "license": "MIT", "dependencies": { "@tauri-apps/api": "^2", "@tauri-apps/plugin-dialog": "^2.7.1", "@tauri-apps/plugin-opener": "^2", + "@tauri-apps/plugin-process": "^2.3.1", "@tauri-apps/plugin-updater": "^2.10.1" }, "devDependencies": { @@ -1230,6 +1231,15 @@ "@tauri-apps/api": "^2.11.0" } }, + "node_modules/@tauri-apps/plugin-process": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/@tauri-apps/plugin-process/-/plugin-process-2.3.1.tgz", + "integrity": "sha512-nCa4fGVaDL/B9ai03VyPOjfAHRHSBz5v6F/ObsB73r/dA3MHHhZtldaDMIc0V/pnUw9ehzr2iEG+XkSEyC0JJA==", + "license": "MIT OR Apache-2.0", + "dependencies": { + "@tauri-apps/api": "^2.8.0" + } + }, "node_modules/@tauri-apps/plugin-updater": { "version": "2.10.1", "resolved": "https://registry.npmjs.org/@tauri-apps/plugin-updater/-/plugin-updater-2.10.1.tgz", diff --git a/v2/package.json b/v2/package.json index 3d78a8f..32c8ad9 100644 --- a/v2/package.json +++ b/v2/package.json @@ -17,6 +17,7 @@ "@tauri-apps/api": "^2", "@tauri-apps/plugin-dialog": "^2.7.1", "@tauri-apps/plugin-opener": "^2", + "@tauri-apps/plugin-process": "^2.3.1", "@tauri-apps/plugin-updater": "^2.10.1" }, "devDependencies": { diff --git a/v2/src-tauri/Cargo.lock b/v2/src-tauri/Cargo.lock index 6b3013f..95e8f45 100644 --- a/v2/src-tauri/Cargo.lock +++ b/v2/src-tauri/Cargo.lock @@ -3678,6 +3678,7 @@ dependencies = [ "tauri-build", "tauri-plugin-dialog", "tauri-plugin-opener", + "tauri-plugin-process", "tauri-plugin-updater", "tempfile", "thiserror 1.0.69", @@ -4182,6 +4183,16 @@ dependencies = [ "zbus", ] +[[package]] +name = "tauri-plugin-process" +version = "2.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d55511a7bf6cd70c8767b02c97bf8134fa434daf3926cfc1be0a0f94132d165a" +dependencies = [ + "tauri", + "tauri-plugin", +] + [[package]] name = "tauri-plugin-updater" version = "2.10.1" diff --git a/v2/src-tauri/Cargo.toml b/v2/src-tauri/Cargo.toml index 3dcf727..52e9a39 100644 --- a/v2/src-tauri/Cargo.toml +++ b/v2/src-tauri/Cargo.toml @@ -20,6 +20,7 @@ tauri = { version = "2", features = [] } tauri-plugin-opener = "2" tauri-plugin-dialog = "2" tauri-plugin-updater = "2" +tauri-plugin-process = "2" serde = { version = "1", features = ["derive"] } serde_json = "1" diff --git a/v2/src-tauri/capabilities/default.json b/v2/src-tauri/capabilities/default.json index 81f51ba..211c400 100644 --- a/v2/src-tauri/capabilities/default.json +++ b/v2/src-tauri/capabilities/default.json @@ -7,6 +7,7 @@ "core:default", "opener:default", "dialog:allow-open", - "updater:default" + "updater:default", + "process:allow-restart" ] } diff --git a/v2/src-tauri/src/lib.rs b/v2/src-tauri/src/lib.rs index fc43cc3..0d1fde5 100644 --- a/v2/src-tauri/src/lib.rs +++ b/v2/src-tauri/src/lib.rs @@ -67,6 +67,7 @@ pub fn run() { .plugin(tauri_plugin_opener::init()) .plugin(tauri_plugin_dialog::init()) .plugin(tauri_plugin_updater::Builder::new().build()) + .plugin(tauri_plugin_process::init()) .manage(state) .invoke_handler(tauri::generate_handler![ devices::list_devices, diff --git a/v2/src/routes/+layout.svelte b/v2/src/routes/+layout.svelte index c1b831a..b2f29e6 100644 --- a/v2/src/routes/+layout.svelte +++ b/v2/src/routes/+layout.svelte @@ -3,6 +3,7 @@ import { page } from "$app/stores"; import { openUrl } from "@tauri-apps/plugin-opener"; import { check, type Update } from "@tauri-apps/plugin-updater"; + import { relaunch } from "@tauri-apps/plugin-process"; import { getThemePref, setThemePref, type ThemePref } from "$lib/theme"; import { getAutoUpdate, setAutoUpdate } from "$lib/prefs"; import { api } from "$lib/api"; @@ -15,6 +16,7 @@ let update = $state(null); let pendingUpdate = $state(null); let updateBusy = $state(false); + let updateInstalled = $state(false); let updateProgress = $state(""); onMount(() => { @@ -55,13 +57,24 @@ updateProgress = "Installing…"; } }); - updateProgress = "Update installed — restart the app to apply."; + updateInstalled = true; + updateBusy = false; } catch (e) { updateProgress = `Update failed: ${e}`; updateBusy = false; } } + async function restartApp() { + try { + await relaunch(); + } catch (e) { + updateProgress = `Couldn't restart automatically (${e}) — quit and reopen to finish updating.`; + updateInstalled = false; + updateBusy = true; + } + } + function toggleAutoUpdate() { autoUpdate = !autoUpdate; setAutoUpdate(autoUpdate); @@ -87,7 +100,11 @@ {#if update} v{update.current} {#if pendingUpdate} - {#if updateBusy} + {#if updateInstalled} + + {:else if updateBusy} {updateProgress} {:else}