feat: added rerendering after every new java runtime addition (#721)

This commit is contained in:
Maciek 2026-08-22 19:31:18 +02:00 • committed by GitHub
parent f7b22b650a
commit 3d804edf02
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
4 changed files with 56 additions and 5 deletions

View file

@ -20,7 +20,7 @@ use oneclient_events::{Answer, Level};
use tokio::sync::mpsc;
use crate::components::IconType;
use crate::launcher;
use crate::{invalidate_java_queries, launcher};
use crate::notifications::{
ClusterUpdateSummary, NotificationAction, NotificationSpec, PackageUpdateGroup, PendingPrompt,
};
@ -449,7 +449,10 @@ impl Actions {
let Ok(state) = launcher::state() else { return };
let events = state.services.events.clone();
match state.java.install_runtime_from(&vendor, major).await {
Ok(_) => events.signal(oneclient_events::Signal::JavaChanged),
Ok(_) => {
events.signal(oneclient_events::Signal::JavaChanged);
invalidate_java_queries().await
},
Err(err) => events
.notify("Java install failed")
.body(err.to_string())

View file

@ -4,6 +4,7 @@ use oneclient_java::{JavaRuntime, JavaVendor};
use super::settings_page;
use crate::components::{Button, Icon, IconType, JavaInstallManager, ScrollArea};
use crate::hooks::{Actions, java_runtimes, use_dispatch, use_java_runtimes};
use crate::invalidate_java_queries;
use crate::theme::colors;
use crate::ui::border_all_color;
use crate::view::app::settings::section_header;
@ -18,10 +19,40 @@ impl Component for SettingsJava {
let runtimes = java_runtimes(&runtimes_query);
let mut show_manager = use_state(|| false);
fn invalidate_runtimes(dispatch: Actions) {
spawn(async move {
invalidate_java_queries().await;
dispatch
.notify("Java runtimes refreshed")
.body("The installed runtime list is up to date")
.info()
.send();
});
}
let refresh_dispatch = dispatch.clone();
let mut shell = settings_page()
.child(section_header("ADD RUNTIME"))
.child(AddRow { show_manager }.into_element())
.child(section_header("INSTALLED RUNTIMES"))
.child(
rect()
.width(Size::Fill)
.direction(Direction::Horizontal)
.main_align(Alignment::SpaceBetween)
.cross_align(Alignment::Center)
.child(section_header("INSTALLED RUNTIMES"))
.child(
Button::new()
.secondary()
.small()
.enabled(false) // disabled for now
.on_press(move |_| {
invalidate_runtimes(refresh_dispatch.clone());
})
.child(label().text("Refresh"))
)
)
.child(runtimes_table(runtimes));
if *show_manager.read() {

View file

@ -67,6 +67,7 @@ pub async fn install_package(
if let Some(child) = &child {
child.set_phase(TaskPhase::Extracting);
}
//events.notify("Extracting package...").body(format!("{} {}", package.vendor, major)).send();
match package.archive {
PackageArchive::Zip => polyio::extract_zip(&archive_path, &extract_root).await?,

View file

@ -221,14 +221,30 @@ impl JavaService {
&self,
vendor: &JavaVendor,
major: u32,
) -> JavaResult<JavaRuntime> {
self.install_vendor_runtime(vendor, major, None).await
}
#[tracing::instrument(level = "debug", skip(self, progress))]
async fn install_vendor_runtime(
&self,
vendor: &JavaVendor,
major: u32,
progress: Option<&GroupedProgressSession>,
) -> JavaResult<JavaRuntime> {
let provider = provider_for_vendor(vendor).ok_or(JavaError::PackageNotFound { major })?;
let package = provider
.latest_package_by_major(major, &self.net)
.await?
.ok_or(JavaError::PackageNotFound { major })?;
let owned = progress.is_none().then(|| {
GroupedProgressSession::start(&self.events, format!("Installing Java {major}"))
});
let session = progress.or(owned.as_ref()).expect("session present");
let executable = provider
.install_package(&package, &self.net, &self.events, None)
.install_package(&package, &self.net, &self.events, Some(session))
.await?;
self.register_checked(&executable, Some(major)).await
@ -265,7 +281,7 @@ impl JavaService {
Some(vendor) => {
let vendor = JavaVendor::from_str(vendor)
.unwrap_or_else(|_| JavaVendor::Other(vendor.to_string()));
self.install_runtime_from(&vendor, major).await
self.install_vendor_runtime(&vendor, major, progress).await
}
None => self.download_and_register(major, progress).await,
},