From 607c42cf01c1c85c5fce2ac5bec779537810275f Mon Sep 17 00:00:00 2001 From: Josiah Glosson Date: Wed, 2 Jul 2025 15:51:06 -0500 Subject: [PATCH 01/31] Make theseus capable of logging messages from the `log` crate --- packages/app-lib/src/logger.rs | 15 ++++++--------- 1 file changed, 6 insertions(+), 9 deletions(-) diff --git a/packages/app-lib/src/logger.rs b/packages/app-lib/src/logger.rs index 30f0305314..5efcdc0983 100644 --- a/packages/app-lib/src/logger.rs +++ b/packages/app-lib/src/logger.rs @@ -25,12 +25,11 @@ pub fn start_logger() -> Option<()> { .unwrap_or_else(|_| { tracing_subscriber::EnvFilter::new("theseus=info,theseus_gui=info") }); - let subscriber = tracing_subscriber::registry() + tracing_subscriber::registry() .with(tracing_subscriber::fmt::layer()) .with(filter) - .with(tracing_error::ErrorLayer::default()); - tracing::subscriber::set_global_default(subscriber) - .expect("setting default subscriber failed"); + .with(tracing_error::ErrorLayer::default()) + .init(); Some(()) } @@ -76,7 +75,7 @@ pub fn start_logger() -> Option<()> { let filter = tracing_subscriber::EnvFilter::try_from_default_env() .unwrap_or_else(|_| tracing_subscriber::EnvFilter::new("theseus=info")); - let subscriber = tracing_subscriber::registry() + tracing_subscriber::registry() .with( tracing_subscriber::fmt::layer() .with_writer(file) @@ -84,10 +83,8 @@ pub fn start_logger() -> Option<()> { .with_timer(ChronoLocal::rfc_3339()), ) .with(filter) - .with(tracing_error::ErrorLayer::default()); - - tracing::subscriber::set_global_default(subscriber) - .expect("Setting default subscriber failed"); + .with(tracing_error::ErrorLayer::default()) + .init(); Some(()) } From e59dd086fc2ac1eb9be4970707f17196cfd3a597 Mon Sep 17 00:00:00 2001 From: Josiah Glosson Date: Thu, 3 Jul 2025 12:43:13 -0500 Subject: [PATCH 02/31] Move update checking entirely into JS and open a modal if an update is available --- apps/app-frontend/src/App.vue | 34 +++++++-- .../src/components/ui/UpdateModal.vue | 37 +++++++++ apps/app-frontend/src/helpers/utils.js | 4 + apps/app/src/main.rs | 76 ++----------------- 4 files changed, 77 insertions(+), 74 deletions(-) create mode 100644 apps/app-frontend/src/components/ui/UpdateModal.vue diff --git a/apps/app-frontend/src/App.vue b/apps/app-frontend/src/App.vue index 1bc25942c7..6b1a389049 100644 --- a/apps/app-frontend/src/App.vue +++ b/apps/app-frontend/src/App.vue @@ -1,5 +1,5 @@ + + diff --git a/apps/app-frontend/src/helpers/utils.js b/apps/app-frontend/src/helpers/utils.js index 89ebd52bad..554636dda4 100644 --- a/apps/app-frontend/src/helpers/utils.js +++ b/apps/app-frontend/src/helpers/utils.js @@ -5,6 +5,10 @@ export async function isDev() { return await invoke('is_dev') } +export async function areUpdatesEnabled() { + return await invoke('are_updates_enabled') +} + // One of 'Windows', 'Linux', 'MacOS' export async function getOS() { return await invoke('plugin:utils|get_os') diff --git a/apps/app/src/main.rs b/apps/app/src/main.rs index b6b00ea815..07e9da0c6a 100644 --- a/apps/app/src/main.rs +++ b/apps/app/src/main.rs @@ -21,75 +21,9 @@ async fn initialize_state(app: tauri::AppHandle) -> api::Result<()> { tracing::info!("Initializing app event state..."); theseus::EventState::init(app.clone()).await?; - #[cfg(feature = "updater")] - 'updater: { - if env::var("MODRINTH_EXTERNAL_UPDATE_PROVIDER").is_ok() { - State::init().await?; - break 'updater; - } - - use tauri_plugin_updater::UpdaterExt; - - let updater = app.updater_builder().build()?; - - let update_fut = updater.check(); - - tracing::info!("Initializing app state..."); - State::init().await?; - - let check_bar = theseus::init_loading( - theseus::LoadingBarType::CheckingForUpdates, - 1.0, - "Checking for updates...", - ) - .await?; - - tracing::info!("Checking for updates..."); - let update = update_fut.await; - - drop(check_bar); - - if let Some(update) = update.ok().flatten() { - tracing::info!("Update found: {:?}", update.download_url); - let loader_bar_id = theseus::init_loading( - theseus::LoadingBarType::LauncherUpdate { - version: update.version.clone(), - current_version: update.current_version.clone(), - }, - 1.0, - "Updating Modrinth App...", - ) - .await?; - - // 100 MiB - const DEFAULT_CONTENT_LENGTH: u64 = 1024 * 1024 * 100; - - update - .download_and_install( - |chunk_length, content_length| { - let _ = theseus::emit_loading( - &loader_bar_id, - (chunk_length as f64) - / (content_length - .unwrap_or(DEFAULT_CONTENT_LENGTH) - as f64), - None, - ); - }, - || {}, - ) - .await?; - - app.restart(); - } - } - - #[cfg(not(feature = "updater"))] - { - State::init().await?; - } + tracing::info!("Initializing app state..."); + State::init().await?; - tracing::info!("Finished checking for updates!"); let state = State::get().await?; app.asset_protocol_scope() .allow_directory(state.directories.caches_dir(), true)?; @@ -125,6 +59,11 @@ fn is_dev() -> bool { cfg!(debug_assertions) } +#[tauri::command] +fn are_updates_enabled() -> bool { + cfg!(feature = "updater") +} + // Toggles decorations #[tauri::command] async fn toggle_decorations(b: bool, window: tauri::Window) -> api::Result<()> { @@ -264,6 +203,7 @@ fn main() { .invoke_handler(tauri::generate_handler![ initialize_state, is_dev, + are_updates_enabled, toggle_decorations, show_window, restart_app, From 36cb3f16860172291fb2012581cf3d64a33497f6 Mon Sep 17 00:00:00 2001 From: Josiah Glosson Date: Thu, 3 Jul 2025 13:01:14 -0500 Subject: [PATCH 03/31] Fix formatjs on Windows and run formatjs --- apps/app-frontend/package.json | 2 +- apps/app-frontend/src/locales/en-US/index.json | 3 +++ apps/frontend/package.json | 2 +- 3 files changed, 5 insertions(+), 2 deletions(-) diff --git a/apps/app-frontend/package.json b/apps/app-frontend/package.json index b58e635533..77a697c216 100644 --- a/apps/app-frontend/package.json +++ b/apps/app-frontend/package.json @@ -9,7 +9,7 @@ "tsc:check": "vue-tsc --noEmit", "lint": "eslint . && prettier --check .", "fix": "eslint . --fix && prettier --write .", - "intl:extract": "formatjs extract \"{,src/components,src/composables,src/helpers,src/pages,src/store}/**/*.{vue,ts,tsx,js,jsx,mts,cts,mjs,cjs}\" --ignore '**/*.d.ts' --ignore 'node_modules' --out-file src/locales/en-US/index.json --format crowdin --preserve-whitespace", + "intl:extract": "formatjs extract \"{,src/components,src/composables,src/helpers,src/pages,src/store}/**/*.{vue,ts,tsx,js,jsx,mts,cts,mjs,cjs}\" --ignore \"**/*.d.ts\" --ignore node_modules --out-file src/locales/en-US/index.json --format crowdin --preserve-whitespace", "test": "vue-tsc --noEmit" }, "dependencies": { diff --git a/apps/app-frontend/src/locales/en-US/index.json b/apps/app-frontend/src/locales/en-US/index.json index fa2563da9b..0ed5424ddd 100644 --- a/apps/app-frontend/src/locales/en-US/index.json +++ b/apps/app-frontend/src/locales/en-US/index.json @@ -20,6 +20,9 @@ "app.settings.tabs.resource-management": { "message": "Resource management" }, + "app.update.modal-header": { + "message": "An update is available!" + }, "instance.add-server.add-and-play": { "message": "Add and play" }, diff --git a/apps/frontend/package.json b/apps/frontend/package.json index 3c395e55c5..334c6317a1 100644 --- a/apps/frontend/package.json +++ b/apps/frontend/package.json @@ -10,7 +10,7 @@ "postinstall": "nuxi prepare", "lint": "eslint . && prettier --check .", "fix": "eslint . --fix && prettier --write .", - "intl:extract": "formatjs extract \"{,src/components,src/composables,src/layouts,src/middleware,src/modules,src/pages,src/plugins,src/utils}/**/*.{vue,ts,tsx,js,jsx,mts,cts,mjs,cjs}\" \"src/error.vue\" --ignore '**/*.d.ts' --ignore 'node_modules' --out-file src/locales/en-US/index.json --format crowdin --preserve-whitespace", + "intl:extract": "formatjs extract \"{,src/components,src/composables,src/layouts,src/middleware,src/modules,src/pages,src/plugins,src/utils}/**/*.{vue,ts,tsx,js,jsx,mts,cts,mjs,cjs}\" \"src/error.vue\" --ignore \"**/*.d.ts\" --ignore node_modules --out-file src/locales/en-US/index.json --format crowdin --preserve-whitespace", "test": "nuxi build" }, "devDependencies": { From 35aea3cab26cee561dec48b430c3933915de34cb Mon Sep 17 00:00:00 2001 From: Josiah Glosson Date: Thu, 3 Jul 2025 13:43:13 -0500 Subject: [PATCH 04/31] Add in the buttons and body --- apps/app-frontend/src/App.vue | 2 +- .../src/components/ui/UpdateModal.vue | 64 ++++++++++++++++--- .../app-frontend/src/locales/en-US/index.json | 12 ++++ packages/assets/generated-icons.ts | 2 + packages/assets/icons/refresh-cw.svg | 1 + 5 files changed, 70 insertions(+), 11 deletions(-) create mode 100644 packages/assets/icons/refresh-cw.svg diff --git a/apps/app-frontend/src/App.vue b/apps/app-frontend/src/App.vue index 6b1a389049..c9ac718723 100644 --- a/apps/app-frontend/src/App.vue +++ b/apps/app-frontend/src/App.vue @@ -364,7 +364,7 @@ async function checkUpdates() { updateAvailable.value = !!update if (updateAvailable.value) { console.log(`Update ${update.version} is available. Showing update modal.`) - updateModal.value.show() + updateModal.value.show(update) } } diff --git a/apps/app-frontend/src/components/ui/UpdateModal.vue b/apps/app-frontend/src/components/ui/UpdateModal.vue index 4dd77b93c3..b6bf0539ce 100644 --- a/apps/app-frontend/src/components/ui/UpdateModal.vue +++ b/apps/app-frontend/src/components/ui/UpdateModal.vue @@ -1,32 +1,76 @@ - + From 52d6bf390727c18fc6f2035d0211cb2333efa5ad Mon Sep 17 00:00:00 2001 From: Josiah Glosson Date: Mon, 7 Jul 2025 12:26:53 -0500 Subject: [PATCH 06/31] Show update size in modal --- apps/app-frontend/src/App.vue | 2 +- .../src/components/ui/UpdateModal.vue | 41 ++++++++++++--- apps/app-frontend/src/helpers/utils.js | 4 ++ .../app-frontend/src/locales/en-US/index.json | 12 +++-- apps/app/src/main.rs | 13 +++++ apps/app/src/update_size_checker.rs | 52 +++++++++++++++++++ 6 files changed, 112 insertions(+), 12 deletions(-) create mode 100644 apps/app/src/update_size_checker.rs diff --git a/apps/app-frontend/src/App.vue b/apps/app-frontend/src/App.vue index 42b60534f0..7dc975982e 100644 --- a/apps/app-frontend/src/App.vue +++ b/apps/app-frontend/src/App.vue @@ -360,7 +360,7 @@ async function checkUpdates() { return } - const update = await check() + const update = await invoke('plugin:updater|check') updateAvailable.value = !!update if (updateAvailable.value) { console.log(`Update ${update.version} is available. Showing update modal.`) diff --git a/apps/app-frontend/src/components/ui/UpdateModal.vue b/apps/app-frontend/src/components/ui/UpdateModal.vue index 5ae0436094..2b8c80c6f0 100644 --- a/apps/app-frontend/src/components/ui/UpdateModal.vue +++ b/apps/app-frontend/src/components/ui/UpdateModal.vue @@ -1,6 +1,14 @@