summaryrefslogtreecommitdiffhomepage
path: root/packages/app/src/pages
diff options
context:
space:
mode:
authorBrendan Allan <[email protected]>2026-04-16 14:10:23 +0800
committerGitHub <[email protected]>2026-04-16 06:10:23 +0000
commit97918500d4020a7b44f3636f23daabc8c477008b (patch)
tree158d312230d0522fa702272fafcca9af7e1df544 /packages/app/src/pages
parente2c08039624ac7c799ea5ba6ce94e3c671a8ed7c (diff)
downloadopencode-97918500d4020a7b44f3636f23daabc8c477008b.tar.gz
opencode-97918500d4020a7b44f3636f23daabc8c477008b.zip
app: start migrating bootstrap data fetching to TanStack Query (#22756)
Diffstat (limited to 'packages/app/src/pages')
-rw-r--r--packages/app/src/pages/layout.tsx10
-rw-r--r--packages/app/src/pages/layout/sidebar-workspace.tsx8
-rw-r--r--packages/app/src/pages/session.tsx16
3 files changed, 23 insertions, 11 deletions
diff --git a/packages/app/src/pages/layout.tsx b/packages/app/src/pages/layout.tsx
index 8fad0bafe..12a2bf763 100644
--- a/packages/app/src/pages/layout.tsx
+++ b/packages/app/src/pages/layout.tsx
@@ -132,9 +132,11 @@ export default function Layout(props: ParentProps) {
if (!slug) return { slug, dir: "" }
const dir = decode64(slug)
if (!dir) return { slug, dir: "" }
+ const store = globalSync.peek(dir, { bootstrap: false })
return {
slug,
- dir: globalSync.peek(dir, { bootstrap: false })[0].path.directory || dir,
+ store,
+ dir: store[0].path.directory || dir,
}
})
const availableThemeEntries = createMemo(() => theme.ids().map((id) => [id, theme.themes()[id]] as const))
@@ -2353,8 +2355,14 @@ export default function Layout(props: ParentProps) {
/>
)
+ const [loading] = createResource(
+ () => route()?.store?.[0]?.bootstrapPromise,
+ (p) => p,
+ )
+
return (
<div class="relative bg-background-base flex-1 min-h-0 min-w-0 flex flex-col select-none [&_input]:select-text [&_textarea]:select-text [&_[contenteditable]]:select-text">
+ {(autoselecting(), loading()) ?? ""}
<Titlebar />
<div class="flex-1 min-h-0 min-w-0 flex">
<div class="flex-1 min-h-0 relative">
diff --git a/packages/app/src/pages/layout/sidebar-workspace.tsx b/packages/app/src/pages/layout/sidebar-workspace.tsx
index 9d74651b9..c1836fa8a 100644
--- a/packages/app/src/pages/layout/sidebar-workspace.tsx
+++ b/packages/app/src/pages/layout/sidebar-workspace.tsx
@@ -14,10 +14,11 @@ import { Spinner } from "@opencode-ai/ui/spinner"
import { Tooltip } from "@opencode-ai/ui/tooltip"
import { type Session } from "@opencode-ai/sdk/v2/client"
import { type LocalProject } from "@/context/layout"
-import { useGlobalSync } from "@/context/global-sync"
+import { loadSessionsQuery, useGlobalSync } from "@/context/global-sync"
import { useLanguage } from "@/context/language"
import { NewSessionItem, SessionItem, SessionSkeleton } from "./sidebar-items"
import { sortedRootSessions, workspaceKey } from "./helpers"
+import { useQuery } from "@tanstack/solid-query"
type InlineEditorComponent = (props: {
id: string
@@ -454,7 +455,8 @@ export const LocalWorkspace = (props: {
const sessions = createMemo(() => sortedRootSessions(workspace().store, props.sortNow()))
const booted = createMemo((prev) => prev || workspace().store.status === "complete", false)
const count = createMemo(() => sessions()?.length ?? 0)
- const loading = createMemo(() => !booted() && count() === 0)
+ const query = useQuery(() => ({ ...loadSessionsQuery(props.project.worktree) }))
+ const loading = createMemo(() => query.isPending && count() === 0)
const hasMore = createMemo(() => workspace().store.sessionTotal > count())
const loadMore = async () => {
workspace().setStore("limit", (limit) => (limit ?? 0) + 5)
@@ -471,7 +473,7 @@ export const LocalWorkspace = (props: {
mobile={props.mobile}
ctx={props.ctx}
showNew={() => false}
- loading={loading}
+ loading={() => query.isLoading}
sessions={sessions}
hasMore={hasMore}
loadMore={loadMore}
diff --git a/packages/app/src/pages/session.tsx b/packages/app/src/pages/session.tsx
index 1aba1bb08..c4d642bf8 100644
--- a/packages/app/src/pages/session.tsx
+++ b/packages/app/src/pages/session.tsx
@@ -13,6 +13,7 @@ import {
on,
onMount,
untrack,
+ createResource,
} from "solid-js"
import { makeEventListener } from "@solid-primitives/event-listener"
import { createMediaQuery } from "@solid-primitives/media"
@@ -804,8 +805,9 @@ export default function Page() {
const hasScrollGesture = () => Date.now() - ui.scrollGesture < scrollGestureWindowMs
- createEffect(
- on([() => sdk.directory, () => params.id] as const, ([, id]) => {
+ const [sessionSync] = createResource(
+ () => [sdk.directory, params.id] as const,
+ ([directory, id]) => {
if (refreshFrame !== undefined) cancelAnimationFrame(refreshFrame)
if (refreshTimer !== undefined) window.clearTimeout(refreshTimer)
refreshFrame = undefined
@@ -816,13 +818,10 @@ export default function Page() {
const stale = !cached
? false
: (() => {
- const info = getSessionPrefetch(sdk.directory, id)
+ const info = getSessionPrefetch(directory, id)
if (!info) return true
return Date.now() - info.at > SESSION_PREFETCH_TTL
})()
- untrack(() => {
- void sync.session.sync(id)
- })
refreshFrame = requestAnimationFrame(() => {
refreshFrame = undefined
@@ -834,7 +833,9 @@ export default function Page() {
})
}, 0)
})
- }),
+
+ return sync.session.sync(id)
+ },
)
createEffect(
@@ -1881,6 +1882,7 @@ export default function Page() {
return (
<div class="relative bg-background-base size-full overflow-hidden flex flex-col">
+ {sessionSync() ?? ""}
<SessionHeader />
<div class="flex-1 min-h-0 flex flex-col md:flex-row">
<Show when={!isDesktop() && !!params.id}>