You've already forked AstralRinth
forked from didirus/AstralRinth
* Make theseus capable of logging messages from the `log` crate * Move update checking entirely into JS and open a modal if an update is available * Fix formatjs on Windows and run formatjs * Add in the buttons and body * Fix lint * Show update size in modal * Fix update not being rechecked if the update modal was directly dismissed * Slight UI tweaks * Fix lint * Implement skipping the update * Implement the Update Now button * Implement updating at next exit * Turn download progress into an error bar on failure * Restore 5 minute update check instead of 30 seconds * Fix PendingUpdateData being seen as a unit struct * Fix lint * Make CI also lint updater code * feat: create AppearingProgressBar component * feat: polish update available modal * feat: add error handling * Open changelog with tauri-plugin-opener * Run intl:extract * Update completion toasts (#3978) * Use single LAUNCHER_USER_AGENT constant for all user agents * Fix build on Mac * Request the update size with HEAD instead of GET * UI tweaks * lint * Fix lint * fix: hide modal header & add "Hide update reminder" button w/ tooltip * Run intl:extract * fix: lint issues * fix: merge issues * notifications.js no longer exists * Add metered network checking * Add a timeout to macOS is_network_metered * Fix tauri.conf.json * vibe debugging * Set a dispatch queue * Have a popup that asks you if you'd like to disable automatic file downloads if you're on a metered network * Move UpdateModal to modal package * Fix lint * Add a toggle for automatic downloads * Fix type Co-authored-by: Alejandro González <7822554+AlexTMjugador@users.noreply.github.com> Signed-off-by: Josiah Glosson <soujournme@gmail.com> * Redo updating UI and experience * lint * fix unlistener issue * remove unneeded translation keys * Fix expose issue * temp disable cranelift, tweak some messages * change version back * Clean up App.vue * move toast to top right * update reload icon * Fixed the bug!!!!!!!!!!!! * improve messages * intl:extract * Add liquid glass icon file * not you! * use dependency injection * lint on apple icon * Fix imports, move download size to button * change update check back to 5 mins * lint + move to providers * intl:extract --------- Signed-off-by: Cal H. <hendersoncal117@gmail.com> Signed-off-by: Josiah Glosson <soujournme@gmail.com> Co-authored-by: Calum <calum@modrinth.com> Co-authored-by: Prospector <prospectordev@gmail.com> Co-authored-by: Cal H. <hendersoncal117@gmail.com> Co-authored-by: Prospector <6166773+Prospector@users.noreply.github.com> Co-authored-by: Alejandro González <7822554+AlexTMjugador@users.noreply.github.com>
122 lines
3.4 KiB
Rust
122 lines
3.4 KiB
Rust
use crate::api::Result;
|
|
use std::sync::{Arc, Mutex};
|
|
use tauri::http::HeaderValue;
|
|
use tauri::http::header::ACCEPT;
|
|
use tauri::{Manager, ResourceId, Runtime, Webview};
|
|
use tauri_plugin_http::reqwest;
|
|
use tauri_plugin_http::reqwest::ClientBuilder;
|
|
use tauri_plugin_updater::Error;
|
|
use tauri_plugin_updater::Update;
|
|
use theseus::{
|
|
LAUNCHER_USER_AGENT, LoadingBarType, emit_loading, init_loading,
|
|
};
|
|
use tokio::time::Instant;
|
|
|
|
#[derive(Default)]
|
|
pub struct PendingUpdateData(pub Mutex<Option<(Arc<Update>, Vec<u8>)>>);
|
|
|
|
// Reimplementation of Update::download mostly, minus the actual download part
|
|
#[tauri::command]
|
|
pub async fn get_update_size<R: Runtime>(
|
|
webview: Webview<R>,
|
|
rid: ResourceId,
|
|
) -> Result<Option<u64>> {
|
|
let update = webview.resources_table().get::<Update>(rid)?;
|
|
|
|
let mut headers = update.headers.clone();
|
|
if !headers.contains_key(ACCEPT) {
|
|
headers.insert(
|
|
ACCEPT,
|
|
HeaderValue::from_static("application/octet-stream"),
|
|
);
|
|
}
|
|
|
|
let mut request = ClientBuilder::new().user_agent(LAUNCHER_USER_AGENT);
|
|
if let Some(timeout) = update.timeout {
|
|
request = request.timeout(timeout);
|
|
}
|
|
if let Some(ref proxy) = update.proxy {
|
|
let proxy = reqwest::Proxy::all(proxy.as_str())?;
|
|
request = request.proxy(proxy);
|
|
}
|
|
let response = request
|
|
.build()?
|
|
.head(update.download_url.clone())
|
|
.headers(headers)
|
|
.send()
|
|
.await?;
|
|
|
|
if !response.status().is_success() {
|
|
return Err(Error::Network(format!(
|
|
"Download request failed with status: {}",
|
|
response.status()
|
|
))
|
|
.into());
|
|
}
|
|
|
|
let content_length = response
|
|
.headers()
|
|
.get("Content-Length")
|
|
.and_then(|value| value.to_str().ok())
|
|
.and_then(|value| value.parse().ok());
|
|
|
|
Ok(content_length)
|
|
}
|
|
|
|
#[tauri::command]
|
|
pub async fn enqueue_update_for_installation<R: Runtime>(
|
|
webview: Webview<R>,
|
|
rid: ResourceId,
|
|
) -> Result<()> {
|
|
let pending_data = webview.state::<PendingUpdateData>().inner();
|
|
|
|
let update = webview.resources_table().get::<Update>(rid)?;
|
|
|
|
let progress = init_loading(
|
|
LoadingBarType::LauncherUpdate {
|
|
version: update.version.clone(),
|
|
current_version: update.current_version.clone(),
|
|
},
|
|
1.0,
|
|
"Downloading update...",
|
|
)
|
|
.await?;
|
|
|
|
let download_start = Instant::now();
|
|
let update_data = update
|
|
.download(
|
|
|chunk_size, total_size| {
|
|
let Some(total_size) = total_size else {
|
|
return;
|
|
};
|
|
if let Err(e) = emit_loading(
|
|
&progress,
|
|
chunk_size as f64 / total_size as f64,
|
|
None,
|
|
) {
|
|
tracing::error!(
|
|
"Failed to update download progress bar: {e}"
|
|
);
|
|
}
|
|
},
|
|
|| {},
|
|
)
|
|
.await?;
|
|
let download_duration = download_start.elapsed();
|
|
tracing::info!("Downloaded update in {download_duration:?}");
|
|
|
|
pending_data
|
|
.0
|
|
.lock()
|
|
.unwrap()
|
|
.replace((update, update_data));
|
|
|
|
Ok(())
|
|
}
|
|
|
|
#[tauri::command]
|
|
pub fn remove_enqueued_update<R: Runtime>(webview: Webview<R>) {
|
|
let pending_data = webview.state::<PendingUpdateData>().inner();
|
|
pending_data.0.lock().unwrap().take();
|
|
}
|