diff --git a/rust/src/appdata.rs b/rust/src/appdata.rs index 9bc0649..367eda9 100644 --- a/rust/src/appdata.rs +++ b/rust/src/appdata.rs @@ -11,6 +11,7 @@ use tauri::AppHandle; pub struct GlobalState { pub remain_open: bool, + pub has_updated: bool, } pub struct AppData { @@ -49,7 +50,7 @@ impl AppData { profile: profile, pkgs: PackageStore::new(apph.clone()), cfg, - state: GlobalState { remain_open: true }, + state: GlobalState { remain_open: true, has_updated: false }, patch_set } } diff --git a/rust/src/cmd.rs b/rust/src/cmd.rs index 360f0f2..9146b09 100644 --- a/rust/src/cmd.rs +++ b/rust/src/cmd.rs @@ -469,4 +469,12 @@ pub async fn list_patches(state: State<'_, Mutex>, target: String) -> R let list = appd.patch_set.find_patches(target).map_err(|e| e.to_string())?; Ok(list) +} + +#[tauri::command] +pub async fn has_updated(state: State<'_, Mutex>) -> Result { + log::debug!("invoke: has_updated"); + + let appd = state.lock().await; + Ok(appd.state.has_updated) } \ No newline at end of file diff --git a/rust/src/lib.rs b/rust/src/lib.rs index e015168..eefc756 100644 --- a/rust/src/lib.rs +++ b/rust/src/lib.rs @@ -17,10 +17,9 @@ use fern::colors::{Color, ColoredLevelConfig}; use model::misc::Game; use pkg::PkgKey; use pkg_store::Payload; -use tauri::{AppHandle, Listener, Manager, RunEvent}; +use tauri::{AppHandle, Emitter, Listener, Manager, RunEvent}; use tauri_plugin_deep_link::DeepLinkExt; use tauri_plugin_cli::CliExt; -use tauri_plugin_updater::UpdaterExt; use tokio::{fs, sync::Mutex, try_join}; static EXIT_REQUESTED: OnceLock<()> = OnceLock::new(); @@ -248,7 +247,9 @@ pub async fn run(_args: Vec) { cmd::list_com_ports, - cmd::list_patches + cmd::list_patches, + + cmd::has_updated, ]) .build(tauri::generate_context!()) .expect("error while building tauri application"); @@ -309,28 +310,56 @@ fn deep_link(app: AppHandle, args: Vec) { async fn update(app: tauri::AppHandle) -> tauri_plugin_updater::Result<()> { let mutex = app.state::>(); - let appd = mutex.lock().await; - if !appd.cfg.enable_autoupdates { - log::info!("skipping autoupdate"); - return Ok(()); + { + let mut appd = mutex.lock().await; + if !appd.cfg.enable_autoupdates { + log::info!("skipping auto-update"); + + // The frontend may not be available at this point + // So emit isn't suitable + appd.state.has_updated = true; + + return Ok(()); + } } - if let Some(update) = app.updater()?.check().await? { + #[cfg(not(debug_assertions))] + { + use tauri_plugin_updater::UpdaterExt; + if let Some(update) = app.updater()?.check().await? { + let mut downloaded = 0; + update.download_and_install( + |chunk_length, content_length| { + downloaded += chunk_length; + _ = app.emit("update-progress", (chunk_length as f64) / (content_length.unwrap_or(u64::MAX) as f64)); + }, + || { + log::info!("download finished"); + }, + ) + .await?; + + log::info!("update installed"); + app.restart(); + } + } + + // One day I will write proper tests + #[cfg(debug_assertions)] + { + std::thread::sleep(std::time::Duration::from_millis(2000)); let mut downloaded = 0; - update.download_and_install( - |chunk_length, content_length| { - downloaded += chunk_length; - log::debug!("downloaded {downloaded} from {content_length:?}"); - }, - || { - log::info!("download finished"); - }, - ) - .await?; - - log::info!("update installed"); - app.restart(); + while downloaded < 200 { + std::thread::sleep(std::time::Duration::from_millis(10)); + downloaded += 1; + app.emit("update-progress", (downloaded as f32) / 200f32)?; + } } + log::info!("ending auto-update check"); + + let mut appd = mutex.lock().await; + appd.state.has_updated = true; + Ok(()) } \ No newline at end of file diff --git a/rust/tauri.conf.json b/rust/tauri.conf.json index 27cd23c..1447d91 100644 --- a/rust/tauri.conf.json +++ b/rust/tauri.conf.json @@ -1,7 +1,7 @@ { "$schema": "https://schema.tauri.app/config/2", "productName": "STARTLINER", - "version": "0.5.0", + "version": "0.6.0", "identifier": "zip.patafour.startliner", "build": { "beforeDevCommand": "bun run dev", diff --git a/src/components/App.vue b/src/components/App.vue index 85b491b..7df5f96 100644 --- a/src/components/App.vue +++ b/src/components/App.vue @@ -40,10 +40,30 @@ const pkgSearchTerm = ref(''); const isProfileDisabled = computed(() => prf.current === null); +const updateVisible = ref(false); +const updateProgress = ref(-1); + +const hasUpdatedCheck = async () => { + const res = await invoke('has_updated'); + if (res == false) { + updateVisible.value = true; + setTimeout(hasUpdatedCheck, 200); + } else { + updateVisible.value = false; + } +}; + +listen('update-progress', (ev) => { + updateProgress.value = ev.payload; +}); + onMounted(async () => { invoke('list_directories').then((d) => { general.dirs = d as Dirs; client.load(); + if (client.enableAutoupdates) { + hasUpdatedCheck(); + } }); const fetch_promise = pkg.fetch(true); @@ -135,6 +155,17 @@ listen<{ message: string; header: string }>('invoke-error', (event) => { /> + +
+ {{ (updateProgress * 100).toFixed(0) }}% +
+