Skip to content

Commit ff136aa

Browse files
authored
fix(solid-router-v2): use TSR_DEFERRED_PROMISE (#7532)
1 parent fc8ad80 commit ff136aa

4 files changed

Lines changed: 34 additions & 23 deletions

File tree

.changeset/tall-horses-repair.md

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
---
2+
'@tanstack/solid-router-ssr-query': patch
3+
'@tanstack/solid-router-devtools': patch
4+
'@tanstack/solid-start-client': patch
5+
'@tanstack/solid-start-server': patch
6+
'@tanstack/solid-router': patch
7+
'@tanstack/solid-start': patch
8+
---
9+
10+
fix: use TSR_DEFERRED_PROMISE

e2e/solid-start/deferred-hydration/src/routes/components.tsx

Lines changed: 5 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -40,14 +40,12 @@ function InteractiveBox(props: { id: string; label: string }) {
4040

4141
function DelayedFallbackBox() {
4242
if (typeof window !== 'undefined') {
43-
const [ready, setReady] = Solid.createSignal(false)
44-
window.setTimeout(() => setReady(true), 1000)
43+
const child = Solid.createMemo(async () => {
44+
await new Promise((resolve) => window.setTimeout(resolve, 1000))
45+
return 'fallback child'
46+
})
4547

46-
return (
47-
<Solid.Show when={ready()}>
48-
<div data-testid="component-fallback-child">fallback child</div>
49-
</Solid.Show>
50-
)
48+
return <div data-testid="component-fallback-child">{child()}</div>
5149
}
5250

5351
return <div data-testid="component-fallback-child">fallback child</div>

packages/router-core/src/ssr/tsrScript.ts

Lines changed: 2 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -9,17 +9,8 @@ self.$_TSR = {
99
},
1010
c() {
1111
if (this.hydrated && this.streamEnded) {
12-
const cleanup = () => {
13-
if (self.$_TSR?.hydrated && self.$_TSR?.streamEnded) {
14-
delete self.$_TSR
15-
delete self.$R['tsr']
16-
}
17-
}
18-
if (document.readyState === 'loading') {
19-
document.addEventListener('DOMContentLoaded', cleanup, { once: true })
20-
} else {
21-
cleanup()
22-
}
12+
delete self.$_TSR
13+
delete self.$R['tsr']
2314
}
2415
},
2516
p(script) {

packages/solid-router/src/awaited.tsx

Lines changed: 17 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
import * as Solid from 'solid-js'
22

3-
import { defer } from '@tanstack/router-core'
3+
import { TSR_DEFERRED_PROMISE, defer } from '@tanstack/router-core'
44
import type { DeferredPromise } from '@tanstack/router-core'
55
import type { SolidNode } from './route'
66

@@ -18,10 +18,16 @@ export function useAwaited<T>({
1818
}
1919

2020
function InnerAwait<T>(props: {
21-
data: Solid.Accessor<T>
21+
deferred: DeferredPromise<T>
22+
ready: Solid.Accessor<unknown>
2223
children: (res: T) => SolidNode
2324
}) {
24-
return props.children(props.data()) as any
25+
props.ready()
26+
const state = props.deferred[TSR_DEFERRED_PROMISE]
27+
if (state.status === 'error') {
28+
throw state.error
29+
}
30+
return props.children(state.data as T) as any
2531
}
2632

2733
export function Await<T>(
@@ -30,11 +36,17 @@ export function Await<T>(
3036
children: (result: T) => SolidNode
3137
},
3238
) {
33-
const data = Solid.createMemo(async () => await defer(props.promise))
39+
const deferred = defer(props.promise)
40+
const ready = Solid.createMemo(async () => {
41+
await deferred
42+
return true
43+
})
3444

3545
return (
3646
<Solid.Loading fallback={props.fallback as any}>
37-
<InnerAwait data={data}>{props.children}</InnerAwait>
47+
<InnerAwait deferred={deferred} ready={ready}>
48+
{props.children}
49+
</InnerAwait>
3850
</Solid.Loading>
3951
)
4052
}

0 commit comments

Comments
 (0)