fix(app): route new sessions through tabs (#33582)
This commit is contained in:
parent
51eb87b256
commit
5303ab09f8
@ -10,7 +10,7 @@ import { Splash } from "@opencode-ai/ui/logo"
|
|||||||
import { ThemeProvider } from "@opencode-ai/ui/theme/context"
|
import { ThemeProvider } from "@opencode-ai/ui/theme/context"
|
||||||
import { MetaProvider } from "@solidjs/meta"
|
import { MetaProvider } from "@solidjs/meta"
|
||||||
import { type BaseRouterProps, Navigate, Route, Router, useParams, useSearchParams } from "@solidjs/router"
|
import { type BaseRouterProps, Navigate, Route, Router, useParams, useSearchParams } from "@solidjs/router"
|
||||||
import { keepPreviousData, QueryClient, QueryClientProvider, useQuery } from "@tanstack/solid-query"
|
import { QueryClient, QueryClientProvider, useQuery } from "@tanstack/solid-query"
|
||||||
import { Effect } from "effect"
|
import { Effect } from "effect"
|
||||||
import {
|
import {
|
||||||
type Component,
|
type Component,
|
||||||
@ -166,20 +166,22 @@ function TargetDirectoryLayout(props: ParentProps) {
|
|||||||
return tabs.store.find((tab): tab is DraftTab => tab.type === "draft" && tab.draftID === search.draftId)?.server
|
return tabs.store.find((tab): tab is DraftTab => tab.type === "draft" && tab.draftID === search.draftId)?.server
|
||||||
})
|
})
|
||||||
|
|
||||||
const resolved = useQuery(() => ({
|
const resolved = useQuery(() => {
|
||||||
queryKey: [serverSDK().scope, "session-route", params.id] as const,
|
const id = params.id
|
||||||
enabled: !!params.serverKey && !!params.id,
|
return {
|
||||||
placeholderData: keepPreviousData,
|
queryKey: [serverSDK().scope, "session-route", id] as const,
|
||||||
queryFn: async () => {
|
enabled: !!params.serverKey && !!params.id,
|
||||||
const session = (await serverSDK().client.session.get({ sessionID: params.id! })).data!
|
queryFn: async () => {
|
||||||
const root = await rootSession(session, (sessionID) =>
|
const session = (await serverSDK().client.session.get({ sessionID: params.id! })).data!
|
||||||
serverSDK()
|
const root = await rootSession(session, (sessionID) =>
|
||||||
.client.session.get({ sessionID })
|
serverSDK()
|
||||||
.then((result) => result.data!),
|
.client.session.get({ sessionID })
|
||||||
)
|
.then((result) => result.data!),
|
||||||
return { session, rootID: root.id }
|
)
|
||||||
},
|
return { session, rootID: root.id }
|
||||||
}))
|
},
|
||||||
|
}
|
||||||
|
})
|
||||||
const resolvedDirectory = createMemo(() => {
|
const resolvedDirectory = createMemo(() => {
|
||||||
if (params.serverKey) return resolved.data?.session.directory
|
if (params.serverKey) return resolved.data?.session.directory
|
||||||
if (!search.draftId) return undefined
|
if (!search.draftId) return undefined
|
||||||
|
|||||||
@ -115,13 +115,15 @@ export const { use: useTabs, provider: TabsProvider } = createSimpleContext({
|
|||||||
const actions = {
|
const actions = {
|
||||||
addSessionTab: (tab: Omit<SessionTab, "type">) => {
|
addSessionTab: (tab: Omit<SessionTab, "type">) => {
|
||||||
const next = { type: "session" as const, ...tab }
|
const next = { type: "session" as const, ...tab }
|
||||||
if (closing.has(tabKey(next))) return
|
const existing = store.find((item) => tabKey(item) === tabKey(next))
|
||||||
|
if (existing) return existing
|
||||||
setStore(
|
setStore(
|
||||||
produce((tabs) => {
|
produce((tabs) => {
|
||||||
if (tabs.some((item) => tabKey(item) === tabKey(next))) return
|
if (tabs.some((item) => tabKey(item) === tabKey(next))) return
|
||||||
tabs.push(next)
|
tabs.push(next)
|
||||||
}),
|
}),
|
||||||
)
|
)
|
||||||
|
return next
|
||||||
},
|
},
|
||||||
draft(draftID: string) {
|
draft(draftID: string) {
|
||||||
const tab = store.find((item) => item.type === "draft" && item.draftID === draftID)
|
const tab = store.find((item) => item.type === "draft" && item.draftID === draftID)
|
||||||
|
|||||||
@ -1,5 +1,17 @@
|
|||||||
import type { Session } from "@opencode-ai/sdk/v2/client"
|
import type { Session } from "@opencode-ai/sdk/v2/client"
|
||||||
import { batch, createEffect, createMemo, For, Match, on, onCleanup, onMount, Show, Switch } from "solid-js"
|
import {
|
||||||
|
batch,
|
||||||
|
createEffect,
|
||||||
|
createMemo,
|
||||||
|
For,
|
||||||
|
Match,
|
||||||
|
on,
|
||||||
|
onCleanup,
|
||||||
|
onMount,
|
||||||
|
Show,
|
||||||
|
startTransition,
|
||||||
|
Switch,
|
||||||
|
} from "solid-js"
|
||||||
import { makeEventListener } from "@solid-primitives/event-listener"
|
import { makeEventListener } from "@solid-primitives/event-listener"
|
||||||
import { createStore } from "solid-js/store"
|
import { createStore } from "solid-js/store"
|
||||||
import { useQuery } from "@tanstack/solid-query"
|
import { useQuery } from "@tanstack/solid-query"
|
||||||
@ -294,7 +306,10 @@ export function NewHome() {
|
|||||||
const ctx = global.createServerCtx(conn)
|
const ctx = global.createServerCtx(conn)
|
||||||
ctx.projects.open(directory)
|
ctx.projects.open(directory)
|
||||||
ctx.projects.touch(directory)
|
ctx.projects.touch(directory)
|
||||||
navigate(`/server/${base64Encode(ServerConnection.key(conn))}/session/${session.id}`)
|
startTransition(() => {
|
||||||
|
const tab = tabs.addSessionTab({ server: ServerConnection.key(conn), sessionId: session.id })
|
||||||
|
tabs.select(tab)
|
||||||
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
function chooseProject(conn: ServerConnection.Any) {
|
function chooseProject(conn: ServerConnection.Any) {
|
||||||
@ -302,8 +317,6 @@ export function NewHome() {
|
|||||||
addProjects(conn, homeProjectDirectories(result))
|
addProjects(conn, homeProjectDirectories(result))
|
||||||
}
|
}
|
||||||
|
|
||||||
const server = global.createServerCtx(conn)
|
|
||||||
|
|
||||||
pickDirectory({
|
pickDirectory({
|
||||||
server: conn,
|
server: conn,
|
||||||
title: language.t("command.project.open"),
|
title: language.t("command.project.open"),
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user