Readd progress bar status, but optimized
This commit is contained in:
2 files changed
+50
-15
No files matched your search
@@ -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
@@ -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 () => {
|
||||||
|
|||||||
Reference in new issue
Block a user