Readd progress bar status, but optimized

This commit is contained in:
Lncvrt committed 2026-03-10 19:56:55 -07:00
1 parent cf72d143f3
commit 6486498c74
2 files changed
+50 -15

No files matched your search

+26
View File
@@ -14,6 +14,7 @@ use std::{
time::Duration, time::Duration,
}; };
use sysinfo::System; use sysinfo::System;
use tauri::window::{ProgressBarState, ProgressBarStatus};
use tauri::{AppHandle, Emitter, Manager}; use tauri::{AppHandle, Emitter, Manager};
use tauri_plugin_os::platform; use tauri_plugin_os::platform;
use tauri_plugin_prevent_default::Flags; use tauri_plugin_prevent_default::Flags;
@@ -135,6 +136,7 @@ async fn download(
hash: String, hash: String,
) -> String { ) -> String {
println!("[download] Starting download for '{}' from '{}'", name, url); println!("[download] Starting download for '{}' from '{}'", name, url);
let window = app.get_webview_window("main").expect("main window missing");
let client = reqwest::Client::new(); let client = reqwest::Client::new();
let resp = match client.get(&url).send().await { let resp = match client.get(&url).send().await {
@@ -274,6 +276,10 @@ async fn download(
eta_secs, eta_secs,
chunk_count, chunk_count,
); );
let _ = window.set_progress_bar(ProgressBarState {
status: Some(ProgressBarStatus::Normal),
progress: Some(progress as u64),
});
} }
let _ = app.emit( let _ = app.emit(
@@ -292,6 +298,10 @@ async fn download(
total_size, total_size,
(downloaded as f64 / total_size as f64) * 100.0 (downloaded as f64 / total_size as f64) * 100.0
); );
let _ = window.set_progress_bar(ProgressBarState {
status: Some(ProgressBarStatus::None),
progress: Some(0),
});
return "-1".to_string(); return "-1".to_string();
} }
@@ -347,6 +357,10 @@ async fn download(
if hash != download_hash { if hash != download_hash {
println!("[download] ERROR: Hash mismatch! File may be corrupt or tampered with."); println!("[download] ERROR: Hash mismatch! File may be corrupt or tampered with.");
let _ = tokio::fs::remove_file(download_part_path.clone()).await; let _ = tokio::fs::remove_file(download_part_path.clone()).await;
let _ = window.set_progress_bar(ProgressBarState {
status: Some(ProgressBarStatus::None),
progress: Some(0),
});
return "-1".to_string(); return "-1".to_string();
} }
@@ -356,6 +370,10 @@ async fn download(
println!("[download] Renaming .part -> .zip: {:?}", download_zip_path); println!("[download] Renaming .part -> .zip: {:?}", download_zip_path);
if let Err(e) = tokio::fs::rename(download_part_path.clone(), download_zip_path.clone()).await { if let Err(e) = tokio::fs::rename(download_part_path.clone(), download_zip_path.clone()).await {
println!("[download] ERROR: Failed to rename .part to .zip: {}", e); println!("[download] ERROR: Failed to rename .part to .zip: {}", e);
let _ = window.set_progress_bar(ProgressBarState {
status: Some(ProgressBarStatus::None),
progress: Some(0),
});
return "-1".to_string(); return "-1".to_string();
} }
@@ -367,6 +385,10 @@ async fn download(
if unzip_res == "-1" { if unzip_res == "-1" {
println!("[download] ERROR: Unzip failed for '{}'", name); println!("[download] ERROR: Unzip failed for '{}'", name);
let _ = window.set_progress_bar(ProgressBarState {
status: Some(ProgressBarStatus::None),
progress: Some(0),
});
return "-1".to_string(); return "-1".to_string();
} }
@@ -374,6 +396,10 @@ async fn download(
"[download] SUCCESS: '{}' downloaded, verified, and extracted", "[download] SUCCESS: '{}' downloaded, verified, and extracted",
name name
); );
let _ = window.set_progress_bar(ProgressBarState {
status: Some(ProgressBarStatus::None),
progress: Some(0),
});
return "1".to_string(); return "1".to_string();
} }
+24 -15
View File
@@ -180,24 +180,25 @@ export default function RootLayout ({
}, [popupMode, selectedGame, pathname, viewingInfoFromDownloads]) }, [popupMode, selectedGame, pathname, viewingInfoFromDownloads])
useEffect(() => { useEffect(() => {
let unlistenProgress: (() => void) | null = null const unlisteners: (() => void)[] = []
listen<string>('download-size', event => { const setupListeners = async () => {
unlisteners.push(
await listen<string>('download-size', event => {
const [displayName, sizeStr] = event.payload.split(':') const [displayName, sizeStr] = event.payload.split(':')
const size = Number(sizeStr) const size = Number(sizeStr)
setDownloadProgress(prev => { setDownloadProgress(prev => {
const i = prev.findIndex(d => d.version === displayName) const i = prev.findIndex(d => d.version === displayName)
if (i === -1) return prev if (i === -1) return prev
const copy = [...prev] const copy = [...prev]
copy[i] = { copy[i] = { ...copy[i], size }
...copy[i],
size
}
return copy return copy
}) })
}).then(f => (unlistenProgress = f)) })
)
listen<string>('download-progress', async event => { unlisteners.push(
await listen<string>('download-progress', async event => {
const [displayName, progStr, totalSizeStr, speedStr, etaSecsStr] = const [displayName, progStr, totalSizeStr, speedStr, etaSecsStr] =
event.payload.split(':') event.payload.split(':')
const prog = Number(progStr) const prog = Number(progStr)
@@ -217,9 +218,11 @@ export default function RootLayout ({
} }
return copy return copy
}) })
}).then(f => (unlistenProgress = f)) })
)
listen<string>('download-hash-checking', event => { unlisteners.push(
await listen<string>('download-hash-checking', event => {
const displayName = event.payload const displayName = event.payload
setDownloadProgress(prev => { setDownloadProgress(prev => {
const i = prev.findIndex(d => d.version === displayName) const i = prev.findIndex(d => d.version === displayName)
@@ -228,9 +231,11 @@ export default function RootLayout ({
copy[i] = { ...copy[i], hash_checking: true } copy[i] = { ...copy[i], hash_checking: true }
return copy return copy
}) })
}).then(f => (unlistenProgress = f)) })
)
listen<string>('download-finishing', event => { unlisteners.push(
await listen<string>('download-finishing', event => {
const displayName = event.payload const displayName = event.payload
setDownloadProgress(prev => { setDownloadProgress(prev => {
const i = prev.findIndex(d => d.version === displayName) const i = prev.findIndex(d => d.version === displayName)
@@ -239,12 +244,16 @@ export default function RootLayout ({
copy[i] = { ...copy[i], hash_checking: false, finishing: true } copy[i] = { ...copy[i], hash_checking: false, finishing: true }
return copy return copy
}) })
}).then(f => (unlistenProgress = f)) })
)
}
setupListeners()
return () => { return () => {
unlistenProgress?.() unlisteners.forEach(unlisten => unlisten())
} }
}, [downloadProgress]) }, [])
useEffect(() => { useEffect(() => {
;(async () => { ;(async () => {