From 97918500d4020a7b44f3636f23daabc8c477008b Mon Sep 17 00:00:00 2001 From: Brendan Allan Date: Thu, 16 Apr 2026 14:10:23 +0800 Subject: app: start migrating bootstrap data fetching to TanStack Query (#22756) --- packages/app/src/app.tsx | 23 +- packages/app/src/components/prompt-input.tsx | 203 +++++++++------- packages/app/src/context/global-sync.tsx | 91 ++++--- packages/app/src/context/global-sync/bootstrap.ts | 269 ++++++++++++--------- .../app/src/context/global-sync/child-store.ts | 1 + packages/app/src/context/global-sync/types.ts | 1 + packages/app/src/pages/layout.tsx | 10 +- .../app/src/pages/layout/sidebar-workspace.tsx | 8 +- packages/app/src/pages/session.tsx | 16 +- 9 files changed, 351 insertions(+), 271 deletions(-) (limited to 'packages') diff --git a/packages/app/src/app.tsx b/packages/app/src/app.tsx index a2a746c05..dbe107448 100644 --- a/packages/app/src/app.tsx +++ b/packages/app/src/app.tsx @@ -121,10 +121,10 @@ function SessionProviders(props: ParentProps) { function RouterRoot(props: ParentProps<{ appChildren?: JSX.Element }>) { return ( - }> - {props.appChildren} - {props.children} - + {/*}>*/} + {props.appChildren} + {props.children} + {/**/} ) } @@ -184,14 +184,22 @@ function ConnectionGate(props: ParentProps<{ disableHealthCheck?: boolean }>) { ) return ( - } > + {/* + + + } + >*/} + {checkMode() === "blocking" ? startupHealthCheck() : startupHealthCheck.latest} ) { > {props.children} - + {/**/} + ) } diff --git a/packages/app/src/components/prompt-input.tsx b/packages/app/src/components/prompt-input.tsx index 534215022..156b0b3a4 100644 --- a/packages/app/src/components/prompt-input.tsx +++ b/packages/app/src/components/prompt-input.tsx @@ -54,6 +54,8 @@ import { PromptImageAttachments } from "./prompt-input/image-attachments" import { PromptDragOverlay } from "./prompt-input/drag-overlay" import { promptPlaceholder } from "./prompt-input/placeholder" import { ImagePreview } from "@opencode-ai/ui/image-preview" +import { useQuery } from "@tanstack/solid-query" +import { loadAgentsQuery, loadProvidersQuery } from "@/context/global-sync/bootstrap" interface PromptInputProps { class?: string @@ -100,6 +102,7 @@ const NON_EMPTY_TEXT = /[^\s\u200B]/ export const PromptInput: Component = (props) => { const sdk = useSDK() + const sync = useSync() const local = useLocal() const files = useFile() @@ -1249,6 +1252,14 @@ export const PromptInput: Component = (props) => { } } + const agentsQuery = useQuery(() => loadAgentsQuery(sdk.directory)) + const agentsLoading = () => agentsQuery.isLoading + + const globalProvidersQuery = useQuery(() => loadProvidersQuery(null)) + const providersQuery = useQuery(() => loadProvidersQuery(sdk.directory)) + + const providersLoading = () => agentsLoading() || providersQuery.isLoading || globalProvidersQuery.isLoading + return (
= (props) => { {language.t("prompt.mode.shell")}
-
-
- - { + local.agent.set(value) + restoreFocus() + }} + class="capitalize max-w-[160px] text-text-base" + valueClass="truncate text-13-regular text-text-base" + triggerStyle={control()} + triggerProps={{ "data-action": "prompt-agent" }} + variant="ghost" + /> + +
+ + + +
+ 0} + fallback={ + + + + } + > - + - } - > + +
+
- (x === "default" ? language.t("common.default") : x)} + onSelect={(value) => { + local.model.variant.set(value === "default" ? undefined : value) + restoreFocus() }} - onClose={restoreFocus} - > - - - - - {local.model.current()?.name ?? language.t("dialog.model.select.title")} - - - + class="capitalize max-w-[160px] text-text-base" + valueClass="truncate text-13-regular text-text-base" + triggerStyle={control()} + triggerProps={{ "data-action": "prompt-model-variant" }} + variant="ghost" + /> - -
-
- -