From 2f5a64b97d4f1923506ed6d9fcec106aaa521bc1 Mon Sep 17 00:00:00 2001 From: LynithDev <61880709+LynithDev@users.noreply.github.com> Date: Sat, 10 Oct 2026 00:58:42 +0200 Subject: [PATCH] Fix/linux skia crashes (#966) * fix: run hooks before early returns in cluster and gallery views * chore: upgrade freya to 0.5.0-beta.9 * chore: pin freya to 0.5.0-beta.10 branch for skia 0.103.2 --- Cargo.lock | 126 +++++++++++------- Cargo.toml | 8 +- .../oneclient_app/src/components/button.rs | 2 + .../oneclient_app/src/components/charts.rs | 11 +- .../src/components/player_model.rs | 12 +- .../src/components/screenshot_viewer.rs | 5 +- .../oneclient_app/src/layout/app_shell.rs | 7 +- .../src/view/app/browser/package/gallery.rs | 6 +- .../src/view/app/cluster/overview.rs | 3 +- .../src/view/app/cluster/screenshots.rs | 13 +- 10 files changed, 115 insertions(+), 78 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index da9d6039..afb8d587 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -2253,8 +2253,8 @@ dependencies = [ [[package]] name = "freya" -version = "0.5.0-rc.8" -source = "git+https://github.com/Polyfrost/freya?rev=2e4a11ec569d72ef1a809e9365548daa3cc5f6b5#2e4a11ec569d72ef1a809e9365548daa3cc5f6b5" +version = "0.5.0-beta.10" +source = "git+https://github.com/marc2332/freya?rev=ed0a7c3e530e4e23334f2333c408198a3d79c42e#ed0a7c3e530e4e23334f2333c408198a3d79c42e" dependencies = [ "cfg-if", "freya-android", @@ -2278,8 +2278,8 @@ dependencies = [ [[package]] name = "freya-android" -version = "0.5.0-rc.8" -source = "git+https://github.com/Polyfrost/freya?rev=2e4a11ec569d72ef1a809e9365548daa3cc5f6b5#2e4a11ec569d72ef1a809e9365548daa3cc5f6b5" +version = "0.5.0-beta.10" +source = "git+https://github.com/marc2332/freya?rev=ed0a7c3e530e4e23334f2333c408198a3d79c42e#ed0a7c3e530e4e23334f2333c408198a3d79c42e" dependencies = [ "freya-components", "freya-core", @@ -2291,8 +2291,8 @@ dependencies = [ [[package]] name = "freya-animation" -version = "0.5.0-rc.8" -source = "git+https://github.com/Polyfrost/freya?rev=2e4a11ec569d72ef1a809e9365548daa3cc5f6b5#2e4a11ec569d72ef1a809e9365548daa3cc5f6b5" +version = "0.5.0-beta.10" +source = "git+https://github.com/marc2332/freya?rev=ed0a7c3e530e4e23334f2333c408198a3d79c42e#ed0a7c3e530e4e23334f2333c408198a3d79c42e" dependencies = [ "easer", "freya-core", @@ -2300,8 +2300,8 @@ dependencies = [ [[package]] name = "freya-borderless-plugin" -version = "0.5.0-rc.8" -source = "git+https://github.com/Polyfrost/freya?rev=2e4a11ec569d72ef1a809e9365548daa3cc5f6b5#2e4a11ec569d72ef1a809e9365548daa3cc5f6b5" +version = "0.5.0-beta.10" +source = "git+https://github.com/marc2332/freya?rev=ed0a7c3e530e4e23334f2333c408198a3d79c42e#ed0a7c3e530e4e23334f2333c408198a3d79c42e" dependencies = [ "freya-core", "freya-engine", @@ -2311,8 +2311,8 @@ dependencies = [ [[package]] name = "freya-clipboard" -version = "0.5.0-rc.8" -source = "git+https://github.com/Polyfrost/freya?rev=2e4a11ec569d72ef1a809e9365548daa3cc5f6b5#2e4a11ec569d72ef1a809e9365548daa3cc5f6b5" +version = "0.5.0-beta.10" +source = "git+https://github.com/marc2332/freya?rev=ed0a7c3e530e4e23334f2333c408198a3d79c42e#ed0a7c3e530e4e23334f2333c408198a3d79c42e" dependencies = [ "copypasta", "freya-core", @@ -2320,8 +2320,8 @@ dependencies = [ [[package]] name = "freya-components" -version = "0.5.0-rc.8" -source = "git+https://github.com/Polyfrost/freya?rev=2e4a11ec569d72ef1a809e9365548daa3cc5f6b5#2e4a11ec569d72ef1a809e9365548daa3cc5f6b5" +version = "0.5.0-beta.10" +source = "git+https://github.com/marc2332/freya?rev=ed0a7c3e530e4e23334f2333c408198a3d79c42e#ed0a7c3e530e4e23334f2333c408198a3d79c42e" dependencies = [ "accesskit", "anyhow", @@ -2346,8 +2346,8 @@ dependencies = [ [[package]] name = "freya-core" -version = "0.5.0-rc.8" -source = "git+https://github.com/Polyfrost/freya?rev=2e4a11ec569d72ef1a809e9365548daa3cc5f6b5#2e4a11ec569d72ef1a809e9365548daa3cc5f6b5" +version = "0.5.0-beta.10" +source = "git+https://github.com/marc2332/freya?rev=ed0a7c3e530e4e23334f2333c408198a3d79c42e#ed0a7c3e530e4e23334f2333c408198a3d79c42e" dependencies = [ "accesskit", "async-io", @@ -2376,8 +2376,8 @@ dependencies = [ [[package]] name = "freya-edit" -version = "0.5.0-rc.8" -source = "git+https://github.com/Polyfrost/freya?rev=2e4a11ec569d72ef1a809e9365548daa3cc5f6b5#2e4a11ec569d72ef1a809e9365548daa3cc5f6b5" +version = "0.5.0-beta.10" +source = "git+https://github.com/marc2332/freya?rev=ed0a7c3e530e4e23334f2333c408198a3d79c42e#ed0a7c3e530e4e23334f2333c408198a3d79c42e" dependencies = [ "bitflags 2.13.2", "freya-clipboard", @@ -2390,16 +2390,16 @@ dependencies = [ [[package]] name = "freya-engine" -version = "0.5.0-rc.8" -source = "git+https://github.com/Polyfrost/freya?rev=2e4a11ec569d72ef1a809e9365548daa3cc5f6b5#2e4a11ec569d72ef1a809e9365548daa3cc5f6b5" +version = "0.5.0-beta.10" +source = "git+https://github.com/marc2332/freya?rev=ed0a7c3e530e4e23334f2333c408198a3d79c42e#ed0a7c3e530e4e23334f2333c408198a3d79c42e" dependencies = [ "freya-skia-safe", ] [[package]] name = "freya-markdown" -version = "0.5.0-rc.8" -source = "git+https://github.com/Polyfrost/freya?rev=2e4a11ec569d72ef1a809e9365548daa3cc5f6b5#2e4a11ec569d72ef1a809e9365548daa3cc5f6b5" +version = "0.5.0-beta.10" +source = "git+https://github.com/marc2332/freya?rev=ed0a7c3e530e4e23334f2333c408198a3d79c42e#ed0a7c3e530e4e23334f2333c408198a3d79c42e" dependencies = [ "freya-components", "freya-core", @@ -2409,8 +2409,8 @@ dependencies = [ [[package]] name = "freya-metrics-plugin" -version = "0.5.0-rc.8" -source = "git+https://github.com/Polyfrost/freya?rev=2e4a11ec569d72ef1a809e9365548daa3cc5f6b5#2e4a11ec569d72ef1a809e9365548daa3cc5f6b5" +version = "0.5.0-beta.10" +source = "git+https://github.com/marc2332/freya?rev=ed0a7c3e530e4e23334f2333c408198a3d79c42e#ed0a7c3e530e4e23334f2333c408198a3d79c42e" dependencies = [ "freya-core", "freya-engine", @@ -2420,8 +2420,8 @@ dependencies = [ [[package]] name = "freya-query" -version = "0.5.0-rc.8" -source = "git+https://github.com/Polyfrost/freya?rev=2e4a11ec569d72ef1a809e9365548daa3cc5f6b5#2e4a11ec569d72ef1a809e9365548daa3cc5f6b5" +version = "0.5.0-beta.10" +source = "git+https://github.com/marc2332/freya?rev=ed0a7c3e530e4e23334f2333c408198a3d79c42e#ed0a7c3e530e4e23334f2333c408198a3d79c42e" dependencies = [ "freya-core", "futures-util", @@ -2429,16 +2429,16 @@ dependencies = [ [[package]] name = "freya-radio" -version = "0.5.0-rc.8" -source = "git+https://github.com/Polyfrost/freya?rev=2e4a11ec569d72ef1a809e9365548daa3cc5f6b5#2e4a11ec569d72ef1a809e9365548daa3cc5f6b5" +version = "0.5.0-beta.10" +source = "git+https://github.com/marc2332/freya?rev=ed0a7c3e530e4e23334f2333c408198a3d79c42e#ed0a7c3e530e4e23334f2333c408198a3d79c42e" dependencies = [ "freya-core", ] [[package]] name = "freya-router" -version = "0.5.0-rc.8" -source = "git+https://github.com/Polyfrost/freya?rev=2e4a11ec569d72ef1a809e9365548daa3cc5f6b5#2e4a11ec569d72ef1a809e9365548daa3cc5f6b5" +version = "0.5.0-beta.10" +source = "git+https://github.com/marc2332/freya?rev=ed0a7c3e530e4e23334f2333c408198a3d79c42e#ed0a7c3e530e4e23334f2333c408198a3d79c42e" dependencies = [ "freya-core", "freya-router-macro", @@ -2449,8 +2449,8 @@ dependencies = [ [[package]] name = "freya-router-macro" -version = "0.5.0-rc.8" -source = "git+https://github.com/Polyfrost/freya?rev=2e4a11ec569d72ef1a809e9365548daa3cc5f6b5#2e4a11ec569d72ef1a809e9365548daa3cc5f6b5" +version = "0.5.0-beta.10" +source = "git+https://github.com/marc2332/freya?rev=ed0a7c3e530e4e23334f2333c408198a3d79c42e#ed0a7c3e530e4e23334f2333c408198a3d79c42e" dependencies = [ "proc-macro2", "quote", @@ -2460,8 +2460,8 @@ dependencies = [ [[package]] name = "freya-sdk" -version = "0.5.0-rc.8" -source = "git+https://github.com/Polyfrost/freya?rev=2e4a11ec569d72ef1a809e9365548daa3cc5f6b5#2e4a11ec569d72ef1a809e9365548daa3cc5f6b5" +version = "0.5.0-beta.10" +source = "git+https://github.com/marc2332/freya?rev=ed0a7c3e530e4e23334f2333c408198a3d79c42e#ed0a7c3e530e4e23334f2333c408198a3d79c42e" dependencies = [ "freya-core", "tokio", @@ -2469,9 +2469,9 @@ dependencies = [ [[package]] name = "freya-skia-bindings" -version = "0.100.0-beta.1" +version = "0.103.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ab63f601c617af7bd05abdf71f504577f77760ef12b281f5ab06078d301a6636" +checksum = "423c6e5119a363d09120729908d478b6d906dcd7ae76e6b2b2e437d708d42ddf" dependencies = [ "bindgen", "cc", @@ -2486,9 +2486,9 @@ dependencies = [ [[package]] name = "freya-skia-safe" -version = "0.100.0-beta.1" +version = "0.103.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "94035ce89b42c8c3b69a854904deea53b1a88d8e1654de270484767ba500cffc" +checksum = "76caec9c4cc139acd1d73016d63a782708693a54fffe6bc9a53112e2f710d22d" dependencies = [ "base64 0.23.1", "bitflags 2.13.2", @@ -2499,9 +2499,9 @@ dependencies = [ [[package]] name = "freya-skia-svg-macros" -version = "0.100.0-beta.1" +version = "0.103.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3b32021e23aabcfb098ad578b547569ebe246bb6658e94b0ae472ca0d5a50977" +checksum = "7f789a635e4ca6346ec08f71f02dd6778428887786f14267f7a3de1c98a44e18" dependencies = [ "proc-macro2", "quote", @@ -2510,8 +2510,8 @@ dependencies = [ [[package]] name = "freya-testing" -version = "0.5.0-rc.8" -source = "git+https://github.com/Polyfrost/freya?rev=2e4a11ec569d72ef1a809e9365548daa3cc5f6b5#2e4a11ec569d72ef1a809e9365548daa3cc5f6b5" +version = "0.5.0-beta.10" +source = "git+https://github.com/marc2332/freya?rev=ed0a7c3e530e4e23334f2333c408198a3d79c42e#ed0a7c3e530e4e23334f2333c408198a3d79c42e" dependencies = [ "accesskit", "freya-clipboard", @@ -2525,8 +2525,8 @@ dependencies = [ [[package]] name = "freya-winit" -version = "0.5.0-rc.8" -source = "git+https://github.com/Polyfrost/freya?rev=2e4a11ec569d72ef1a809e9365548daa3cc5f6b5#2e4a11ec569d72ef1a809e9365548daa3cc5f6b5" +version = "0.5.0-beta.10" +source = "git+https://github.com/marc2332/freya?rev=ed0a7c3e530e4e23334f2333c408198a3d79c42e#ed0a7c3e530e4e23334f2333c408198a3d79c42e" dependencies = [ "accesskit", "accesskit_winit", @@ -3965,6 +3965,25 @@ dependencies = [ "vcpkg", ] +[[package]] +name = "libxdo" +version = "0.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "00333b8756a3d28e78def82067a377de7fa61b24909000aeaa2b446a948d14db" +dependencies = [ + "libxdo-sys", +] + +[[package]] +name = "libxdo-sys" +version = "0.11.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "db23b9e7e2b7831bbd8aac0bbeeeb7b68cbebc162b227e7052e8e55829a09212" +dependencies = [ + "libc", + "x11", +] + [[package]] name = "linux-raw-sys" version = "0.4.15" @@ -4199,6 +4218,7 @@ dependencies = [ "dpi", "gtk", "keyboard-types 0.7.0", + "libxdo", "objc2 0.6.4", "objc2-app-kit 0.3.2", "objc2-core-foundation", @@ -5404,8 +5424,8 @@ checksum = "35fb2e5f958ec131621fdd531e9fc186ed768cbe395337403ae56c17a74c68ec" [[package]] name = "pathgraph" -version = "0.5.0-rc.8" -source = "git+https://github.com/Polyfrost/freya?rev=2e4a11ec569d72ef1a809e9365548daa3cc5f6b5#2e4a11ec569d72ef1a809e9365548daa3cc5f6b5" +version = "0.5.0-beta.10" +source = "git+https://github.com/marc2332/freya?rev=ed0a7c3e530e4e23334f2333c408198a3d79c42e#ed0a7c3e530e4e23334f2333c408198a3d79c42e" [[package]] name = "percent-encoding" @@ -5899,8 +5919,8 @@ checksum = "f8dcc9c7d52a811697d2151c701e0d08956f92b0e24136cf4cf27b57a6a0d9bf" [[package]] name = "ragnarok" -version = "0.5.0-rc.8" -source = "git+https://github.com/Polyfrost/freya?rev=2e4a11ec569d72ef1a809e9365548daa3cc5f6b5#2e4a11ec569d72ef1a809e9365548daa3cc5f6b5" +version = "0.5.0-beta.10" +source = "git+https://github.com/marc2332/freya?rev=ed0a7c3e530e4e23334f2333c408198a3d79c42e#ed0a7c3e530e4e23334f2333c408198a3d79c42e" dependencies = [ "euclid", "hotpath", @@ -7758,8 +7778,8 @@ checksum = "7d56353a2a665ad0f41a421187180aab746c8c325620617ad883a99a1cbe66d2" [[package]] name = "torin" -version = "0.5.0-rc.8" -source = "git+https://github.com/Polyfrost/freya?rev=2e4a11ec569d72ef1a809e9365548daa3cc5f6b5#2e4a11ec569d72ef1a809e9365548daa3cc5f6b5" +version = "0.5.0-beta.10" +source = "git+https://github.com/marc2332/freya?rev=ed0a7c3e530e4e23334f2333c408198a3d79c42e#ed0a7c3e530e4e23334f2333c408198a3d79c42e" dependencies = [ "euclid", "itertools", @@ -9014,6 +9034,16 @@ version = "0.6.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3ad82d2a33cdc9674dc7465672f271e096168fcdbe0f799d9e6db8c5892679dc" +[[package]] +name = "x11" +version = "2.21.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "502da5464ccd04011667b11c435cb992822c2c0dbde1770c988480d312a0db2e" +dependencies = [ + "libc", + "pkg-config", +] + [[package]] name = "x11-clipboard" version = "0.9.3" diff --git a/Cargo.toml b/Cargo.toml index 04b9554e..114aa2da 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -144,10 +144,10 @@ syn = {version = "=3.0.6"} thiserror = {version = "=2.0.21"} # ui -freya = {git = "https://github.com/Polyfrost/freya", rev = "2e4a11ec569d72ef1a809e9365548daa3cc5f6b5", features = ["engine", "winit", "router", "remote-asset", "sdk-tokio", "query", "radio", "borderless", "titlebar", "tray", "metrics"]} -freya-core = {git = "https://github.com/Polyfrost/freya", rev = "2e4a11ec569d72ef1a809e9365548daa3cc5f6b5" } -freya-testing = {git = "https://github.com/Polyfrost/freya", rev = "2e4a11ec569d72ef1a809e9365548daa3cc5f6b5" } -freya-skia-safe = "=0.100.0-beta.1" # required for the SKSL player renderer +freya = {git = "https://github.com/marc2332/freya", rev = "ed0a7c3e530e4e23334f2333c408198a3d79c42e", features = ["engine", "winit", "router", "remote-asset", "sdk-tokio", "query", "radio", "borderless", "titlebar", "tray", "metrics"]} +freya-core = {git = "https://github.com/marc2332/freya", rev = "ed0a7c3e530e4e23334f2333c408198a3d79c42e"} +freya-testing = {git = "https://github.com/marc2332/freya", rev = "ed0a7c3e530e4e23334f2333c408198a3d79c42e"} +freya-skia-safe = "=0.103.2" # required for the SKSL player renderer image = {version = "=0.25.10", default-features = false, features = ["png", "jpeg"]} [profile.release] diff --git a/packages/oneclient_app/src/components/button.rs b/packages/oneclient_app/src/components/button.rs index bad5dd82..b4740a05 100644 --- a/packages/oneclient_app/src/components/button.rs +++ b/packages/oneclient_app/src/components/button.rs @@ -258,6 +258,8 @@ impl LayoutExt for Button { impl ContainerExt for Button {} +impl DecorationExt for Button {} + impl StyleExt for Button { fn get_style(&mut self) -> &mut StyleState { &mut self.style diff --git a/packages/oneclient_app/src/components/charts.rs b/packages/oneclient_app/src/components/charts.rs index cd0e918d..bbb300ff 100644 --- a/packages/oneclient_app/src/components/charts.rs +++ b/packages/oneclient_app/src/components/charts.rs @@ -93,7 +93,7 @@ impl Component for PieChart { let values = self.values.clone(); let hit_values = self.values.clone(); - let render_cb = RenderCallback::new(move |ctx: &mut CanvasContext| { + let render_cb = RenderCallback::new(move |ctx: &mut FillRenderContext| { let (w, h) = (ctx.size.width, ctx.size.height); if w <= 0.0 || h <= 0.0 { return; @@ -182,8 +182,13 @@ impl Component for PieChart { .height(Size::fill()) .position(Position::new_absolute()) .interactive(false) - // Childless canvas auto-sizes to 0x0 without an explicit size - .child(canvas(render_cb).width(Size::fill()).height(Size::fill())), + // Childless rect auto-sizes to 0x0 without an explicit size + .child( + rect() + .width(Size::fill()) + .height(Size::fill()) + .background(render_cb), + ), ) .child( rect() diff --git a/packages/oneclient_app/src/components/player_model.rs b/packages/oneclient_app/src/components/player_model.rs index 76f42997..9fa0690c 100644 --- a/packages/oneclient_app/src/components/player_model.rs +++ b/packages/oneclient_app/src/components/player_model.rs @@ -121,7 +121,7 @@ impl Component for PlayerModel { let effect = player_effect(); - let render_cb = RenderCallback::new(move |ctx: &mut CanvasContext| { + let render_cb = RenderCallback::new(move |ctx: &mut FillRenderContext| { let (Some(effect), Some(skin)) = (&effect, &skin_shader) else { return; }; @@ -155,18 +155,12 @@ impl Component for PlayerModel { ctx.canvas.draw_rect(SkRect::new(0.0, 0.0, w, h), &paint); }); - // `canvas` carries no style data, so the cursor rides on a wrapper `rect` that - // covers exactly the same area rect() + .key(src_ptr as u64) .width(self.width.clone()) .height(self.height.clone()) .cursor(CursorIcon::Grab) - .child( - canvas(render_cb) - .key(src_ptr as u64) - .width(Size::fill()) - .height(Size::fill()), - ) + .background(render_cb) .on_pointer_down(move |e: Event| { let loc = e.global_location(); drag.set(Some((loc.x as f32, loc.y as f32, yaw(), pitch()))); diff --git a/packages/oneclient_app/src/components/screenshot_viewer.rs b/packages/oneclient_app/src/components/screenshot_viewer.rs index 6f1b83dc..37710d1b 100644 --- a/packages/oneclient_app/src/components/screenshot_viewer.rs +++ b/packages/oneclient_app/src/components/screenshot_viewer.rs @@ -45,6 +45,8 @@ impl Component for ScreenshotViewer { move || start }); let mut menu = use_state(|| None::<(f32, f32)>); + let action = use_screenshot_action(); + let dispatch = use_dispatch(); if len == 0 { return rect().into_element(); @@ -52,9 +54,6 @@ impl Component for ScreenshotViewer { let idx = (*index.read()).min(len - 1); let info = shots[idx].clone(); - let action = use_screenshot_action(); - let dispatch = use_dispatch(); - let close = self.on_close.clone(); let scrim_close = self.on_close.clone(); let delete_close = self.on_close.clone(); diff --git a/packages/oneclient_app/src/layout/app_shell.rs b/packages/oneclient_app/src/layout/app_shell.rs index 6164dfb0..b6953f76 100644 --- a/packages/oneclient_app/src/layout/app_shell.rs +++ b/packages/oneclient_app/src/layout/app_shell.rs @@ -381,7 +381,7 @@ impl Component for ParallaxArt { let parallax_enabled = self.parallax_enabled; let fade_opacity = self.fade_opacity; - let render_cb = RenderCallback::new(move |ctx: &mut CanvasContext| { + let render_cb = RenderCallback::new(move |ctx: &mut FillRenderContext| { let Some(image) = &image else { return; }; @@ -479,10 +479,11 @@ impl Component for ParallaxArt { .layer(Layer::Relative(0)) .opacity(fade_opacity) .child( - canvas(render_cb) + rect() .key(src_ptr as u64) .width(Size::fill()) - .height(Size::fill()), + .height(Size::fill()) + .background(render_cb), ), ) } diff --git a/packages/oneclient_app/src/view/app/browser/package/gallery.rs b/packages/oneclient_app/src/view/app/browser/package/gallery.rs index 898fdfc1..31f00dc1 100644 --- a/packages/oneclient_app/src/view/app/browser/package/gallery.rs +++ b/packages/oneclient_app/src/view/app/browser/package/gallery.rs @@ -158,13 +158,13 @@ impl Component for GalleryViewer { move || start }); + let idx = (*index.read()).min(len.saturating_sub(1)); + let query = use_cached_image(self.images.get(idx).map(|i| i.url.clone()), FULL_EDGE); + if len == 0 { return rect().into_element(); } - let idx = (*index.read()).min(len - 1); let image = self.images[idx].clone(); - - let query = use_cached_image(Some(image.url.clone()), FULL_EDGE); let loaded = loaded_image(Some(&image.url), &query); let close = self.on_close.clone(); diff --git a/packages/oneclient_app/src/view/app/cluster/overview.rs b/packages/oneclient_app/src/view/app/cluster/overview.rs index 655ea2aa..dfa6286c 100644 --- a/packages/oneclient_app/src/view/app/cluster/overview.rs +++ b/packages/oneclient_app/src/view/app/cluster/overview.rs @@ -19,11 +19,12 @@ impl Component for ClusterOverview { fn render(&self) -> impl IntoElement { let cluster_id = self.cluster_id; + let query = use_cluster_analytics(cluster_id); + let Some(cluster) = use_cluster(cluster_id) else { return cluster_content().child(cluster_not_found()).into_element(); }; - let query = use_cluster_analytics(cluster_id); let analytics = try_cluster_analytics(&query); let body: Element = match &analytics { diff --git a/packages/oneclient_app/src/view/app/cluster/screenshots.rs b/packages/oneclient_app/src/view/app/cluster/screenshots.rs index 4d049594..c5465063 100644 --- a/packages/oneclient_app/src/view/app/cluster/screenshots.rs +++ b/packages/oneclient_app/src/view/app/cluster/screenshots.rs @@ -36,10 +36,11 @@ pub struct ClusterScreenshots { impl Component for ClusterScreenshots { fn render(&self) -> impl IntoElement { - let Some(cluster) = use_cluster(self.cluster_id) else { - return cluster_not_found(); - }; - let folder = cluster.game_dir().ok().map(|d| d.join("screenshots")); + let cluster = use_cluster(self.cluster_id); + let folder = cluster + .as_ref() + .and_then(|c| c.game_dir().ok()) + .map(|d| d.join("screenshots")); let query = use_cluster_screenshots(self.cluster_id); // Otherwise a screenshot taken in game only shows up on the next visit @@ -57,6 +58,10 @@ impl Component for ClusterScreenshots { let grid_width = use_state(|| 0f32); let mut menu = use_state(|| None::<(f32, f32, PathBuf)>); + if cluster.is_none() { + return cluster_not_found(); + } + let order: Vec = shots.iter().map(|s| s.path.clone()).collect(); let selected = selection.selected_in(&order); let editing = selection.is_active();