Skip to content

Commit 2e68f74

Browse files
committed
Don't stream down resources not read under a <Suspense/>, fixing rendering issue
1 parent dc8dbf2 commit 2e68f74

File tree

4 files changed

+38
-5
lines changed

4 files changed

+38
-5
lines changed

leptos_dom/src/ssr.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -116,7 +116,7 @@ pub fn render_to_stream_with_prefix_undisposed(
116116
// this does NOT contain any of the data being loaded asynchronously in resources
117117
let shell = view(cx).render_to_string(cx);
118118

119-
let resources = cx.all_resources();
119+
let resources = cx.pending_resources();
120120
let pending_resources = serde_json::to_string(&resources).unwrap();
121121
let prefix = prefix(cx);
122122

leptos_reactive/src/resource.rs

Lines changed: 18 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@ use std::{
88
pin::Pin,
99
rc::Rc,
1010
};
11-
11+
use cfg_if::cfg_if;
1212
use crate::{
1313
create_effect, create_isomorphic_effect, create_memo, create_signal, queue_microtask,
1414
runtime::{with_runtime, RuntimeId},
@@ -116,9 +116,23 @@ where
116116
suspense_contexts: Default::default(),
117117
});
118118

119-
let id = with_runtime(cx.runtime, |runtime| {
120-
runtime.create_serializable_resource(Rc::clone(&r))
121-
});
119+
cfg_if! {
120+
if #[cfg(any(feature = "csr", feature = "hydrate"))] {
121+
let id = with_runtime(cx.runtime, |runtime| {
122+
runtime.create_serializable_resource(Rc::clone(&r))
123+
});
124+
} else {
125+
let id = if use_context::<SuspenseContext>(cx).is_some() {
126+
with_runtime(cx.runtime, |runtime| {
127+
runtime.create_serializable_resource(Rc::clone(&r))
128+
})
129+
} else {
130+
with_runtime(cx.runtime, |runtime| {
131+
runtime.create_unserializable_resource(Rc::clone(&r))
132+
})
133+
};
134+
}
135+
}
122136

123137
create_isomorphic_effect(cx, {
124138
let r = Rc::clone(&r);

leptos_reactive/src/runtime.rs

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -296,6 +296,19 @@ impl Runtime {
296296
.collect()
297297
}
298298

299+
/// Returns IDs for all [Resource]s found on any scope, pending from the server.
300+
pub(crate) fn pending_resources(&self) -> Vec<ResourceId> {
301+
self.resources
302+
.borrow()
303+
.iter()
304+
.filter_map(|(resource_id, res)| if matches!(res, AnyResource::Serializable(_)) {
305+
Some(resource_id)
306+
} else {
307+
None
308+
})
309+
.collect()
310+
}
311+
299312
pub(crate) fn serialization_resolvers(
300313
&self,
301314
) -> FuturesUnordered<PinnedFuture<(ResourceId, String)>> {

leptos_reactive/src/scope.rs

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -282,6 +282,12 @@ impl Scope {
282282
with_runtime(self.runtime, |runtime| runtime.all_resources())
283283
}
284284

285+
/// Returns IDs for all [Resource](crate::Resource)s found on any scope that are
286+
/// pending from the server.
287+
pub fn pending_resources(&self) -> Vec<ResourceId> {
288+
with_runtime(self.runtime, |runtime| runtime.pending_resources())
289+
}
290+
285291
/// Returns IDs for all [Resource](crate::Resource)s found on any scope.
286292
pub fn serialization_resolvers(&self) -> FuturesUnordered<PinnedFuture<(ResourceId, String)>> {
287293
with_runtime(self.runtime, |runtime| runtime.serialization_resolvers())

0 commit comments

Comments
 (0)