|
1 | 1 | import { createFileRoute, useNavigate, useSearch } from '@tanstack/solid-router' |
2 | 2 | import { createServerFn } from '@tanstack/solid-start' |
3 | | -import { createEffect, createResource, on, Show, Suspense } from 'solid-js' |
4 | | -import { isServer } from 'solid-js/web' |
| 3 | +import { useServerFn } from '@tanstack/solid-start' |
| 4 | +import { createSignal, onMount, Show } from 'solid-js' |
5 | 5 | import PlaygroundLayout from '../components/playground/PlaygroundLayout' |
6 | 6 | import type { PlaygroundSession } from '../lib/playground-types' |
7 | 7 |
|
@@ -30,40 +30,36 @@ export const Route = createFileRoute('/playground')({ |
30 | 30 | function PlaygroundPage() { |
31 | 31 | const search = useSearch({ from: '/playground' }) |
32 | 32 | const navigate = useNavigate() |
| 33 | + const fetchSession = useServerFn(getOrCreateSession) |
| 34 | + const [session, setSession] = createSignal<PlaygroundSession | null>(null) |
| 35 | + const [loading, setLoading] = createSignal(true) |
33 | 36 |
|
34 | | - const [session] = createResource( |
35 | | - () => search.session, |
36 | | - async (sessionId) => { |
37 | | - const result = await getOrCreateSession({ data: { sessionId } }) |
38 | | - return result as PlaygroundSession |
39 | | - }, |
40 | | - ) |
| 37 | + onMount(async () => { |
| 38 | + try { |
| 39 | + const result = await fetchSession({ data: { sessionId: search.session } }) |
| 40 | + const s = result as PlaygroundSession |
| 41 | + setSession(s) |
41 | 42 |
|
42 | | - // Update URL with session ID after hydration (client-only) |
43 | | - createEffect( |
44 | | - on( |
45 | | - () => session(), |
46 | | - (s) => { |
47 | | - if (isServer || !s) return |
48 | | - if (search.session !== s.id) { |
49 | | - navigate({ search: { session: s.id }, replace: true }) |
50 | | - } |
51 | | - }, |
52 | | - { defer: true }, |
53 | | - ), |
54 | | - ) |
| 43 | + // Update URL with session ID if it changed or was missing |
| 44 | + if (search.session !== s.id) { |
| 45 | + navigate({ search: { session: s.id }, replace: true }) |
| 46 | + } |
| 47 | + } finally { |
| 48 | + setLoading(false) |
| 49 | + } |
| 50 | + }) |
55 | 51 |
|
56 | 52 | return ( |
57 | | - <Suspense |
| 53 | + <Show |
| 54 | + when={session()} |
| 55 | + keyed |
58 | 56 | fallback={ |
59 | 57 | <div class="flex h-[calc(100vh-56px)] items-center justify-center"> |
60 | 58 | <div class="h-6 w-6 animate-spin rounded-full border-2 border-accent border-t-transparent" /> |
61 | 59 | </div> |
62 | 60 | } |
63 | 61 | > |
64 | | - <Show when={session()} keyed> |
65 | | - {(s) => <PlaygroundLayout session={s} />} |
66 | | - </Show> |
67 | | - </Suspense> |
| 62 | + {(s) => <PlaygroundLayout session={s} />} |
| 63 | + </Show> |
68 | 64 | ) |
69 | 65 | } |
0 commit comments