fix(hosts): switch hosts resource to LocalResource to fix hydration warning

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
2026-05-16 03:12:14 +02:00
parent 5789aba86b
commit 359d67fabc

View File

@@ -287,12 +287,12 @@ fn PaginationBar(
#[component] #[component]
fn HostTable( fn HostTable(
hosts: Resource<Result<HostsPageData, ServerFnError>>, hosts: LocalResource<Result<HostsPageData, ServerFnError>>,
pending_delete: RwSignal<Option<(i64, String)>>, pending_delete: RwSignal<Option<(i64, String)>>,
) -> impl IntoView { ) -> impl IntoView {
view! { view! {
<Suspense fallback=|| view! { <p class="empty">"Loading hosts…"</p> }> <Suspense fallback=|| view! { <p class="empty">"Loading hosts…"</p> }>
{move || hosts.get().map(|result| match result { {move || hosts.get().map(|r| match (*r).clone() {
Err(e) => view! { Err(e) => view! {
<p class="error">"Could not load hosts: " {e.to_string()}</p> <p class="error">"Could not load hosts: " {e.to_string()}</p>
}.into_any(), }.into_any(),
@@ -380,28 +380,30 @@ pub fn HostsPage() -> impl IntoView {
let page = RwSignal::new(1i64); let page = RwSignal::new(1i64);
let per_page = RwSignal::new(15i64); let per_page = RwSignal::new(15i64);
let hosts = Resource::new( // LocalResource avoids reading a resource outside <Suspense> during hydration.
move || ( // All dependencies (filters, pagination, action versions) are client-side only,
// so there is no benefit to SSR for this resource.
let hosts = LocalResource::new(move || {
let _ = create_action.version().get();
let _ = delete_action.version().get();
get_hosts_page(
name_filter.get(), name_filter.get(),
network_id_filter.get(), network_id_filter.get(),
port_filter.get(), port_filter.get(),
app_id_filter.get(), app_id_filter.get(),
page.get(), page.get(),
per_page.get(), per_page.get(),
create_action.version().get(), )
delete_action.version().get(), });
),
|(name, net, port, app, p, pp, _, _)| get_hosts_page(name, net, port, app, p, pp),
);
let networks_res = LocalResource::new(|| get_networks()); let networks_res = LocalResource::new(|| get_networks());
let applications_res = LocalResource::new(|| get_applications()); let applications_res = LocalResource::new(|| get_applications());
let total_pages = Signal::derive(move || { let total_pages = Signal::derive(move || {
hosts.get().and_then(|r| r.ok()).map(|p| p.total_pages).unwrap_or(1) hosts.get().and_then(|r| (*r).clone().ok()).map(|p| p.total_pages).unwrap_or(1)
}); });
let total = Signal::derive(move || { let total = Signal::derive(move || {
hosts.get().and_then(|r| r.ok()).map(|p| p.total).unwrap_or(0) hosts.get().and_then(|r| (*r).clone().ok()).map(|p| p.total).unwrap_or(0)
}); });
view! { view! {