Skip to content

Commit

Permalink
Infinite suspense fix (#31)
Browse files Browse the repository at this point in the history
* improve demo docs

* use hydration context

* fix clippy error

* fix clippy error

* remove execute from resource fetcher
  • Loading branch information
nicoburniske committed Mar 9, 2024
1 parent 9a1bec1 commit 93ace36
Showing 1 changed file with 15 additions and 7 deletions.
22 changes: 15 additions & 7 deletions query/src/use_query.rs
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@ use crate::query_result::QueryResult;
use crate::{
query_is_suppressed, use_query_client, QueryOptions, QueryState, RefetchFn, ResourceOption,
};
use leptos::leptos_dom::HydrationCtx;
use leptos::*;
use std::cell::Cell;
use std::future::Future;
Expand Down Expand Up @@ -119,22 +120,29 @@ where
}
});

// First read.
{
let query = query.get_untracked();

if resource.loading().get_untracked()
&& !HydrationCtx::is_hydrating()
&& query.with_state(|state| matches!(state, QueryState::Created))
{
query.execute()
}
}

let data = Signal::derive({
move || {
let read = resource.get().and_then(|r| r.0);
let query = query.get_untracked();

// First Read.
// Putting this in an effect will cause it to always refetch needlessly on the client after SSR.
if read.is_none() && query.with_state(|state| matches!(state, QueryState::Created)) {
query.execute()
}
let _ = read;

// SSR edge case.
// Given hydrate can happen before resource resolves, signals on the client can be out of sync with resource.
// Need to force insert the resource data into the query state.
#[cfg(feature = "hydrate")]
if let Some(ref data) = read {
let query = query.get_untracked();
if query.with_state(|state| matches!(state, QueryState::Created)) {
let data = crate::QueryData::now(data.clone());
query.set_state(QueryState::Loaded(data));
Expand Down

0 comments on commit 93ace36

Please sign in to comment.