refactor(app): simplify session routing and tab close handling (#28767)

This commit is contained in:
Brendan Allan
2026-05-22 12:48:09 +08:00
committed by GitHub
parent 1f0390cfbb
commit 6466fcfdea
2 changed files with 24 additions and 26 deletions
+9 -14
View File
@@ -48,22 +48,17 @@ import { ErrorPage } from "./pages/error"
import { useCheckServerHealth } from "./utils/server-health" import { useCheckServerHealth } from "./utils/server-health"
const HomeRoute = lazy(() => import("@/pages/home")) const HomeRoute = lazy(() => import("@/pages/home"))
const loadSession = () => import("@/pages/session") const Session = lazy(() => import("@/pages/session"))
const Session = lazy(loadSession)
const Loading = () => <div class="size-full" />
if (typeof location === "object" && /\/session(?:\/|$)/.test(location.pathname)) { const SessionRoute = Object.assign(
void loadSession() () => (
} <SessionProviders>
<Session />
const SessionRoute = () => ( </SessionProviders>
<SessionProviders> ),
<Session /> { preload: Session.preload },
</SessionProviders>
) )
const SessionIndexRoute = () => <Navigate href="session" />
function UiI18nBridge(props: ParentProps) { function UiI18nBridge(props: ParentProps) {
const language = useLanguage() const language = useLanguage()
return <I18nProvider value={{ locale: language.intl, t: language.t }}>{props.children}</I18nProvider> return <I18nProvider value={{ locale: language.intl, t: language.t }}>{props.children}</I18nProvider>
@@ -317,7 +312,7 @@ export function AppInterface(props: {
> >
<Route path="/" component={HomeRoute} /> <Route path="/" component={HomeRoute} />
<Route path="/:dir" component={DirectoryLayout}> <Route path="/:dir" component={DirectoryLayout}>
<Route path="/" component={SessionIndexRoute} /> <Route path="/" component={() => <Navigate href="session" />} />
<Route path="/session/:id?" component={SessionRoute} /> <Route path="/session/:id?" component={SessionRoute} />
</Route> </Route>
</Dynamic> </Dynamic>
+15 -12
View File
@@ -223,19 +223,13 @@ export function Titlebar(props: { update?: TitlebarUpdate }) {
const navigate = useNavigate() const navigate = useNavigate()
const homeMatch = useMatch(() => "/") const homeMatch = useMatch(() => "/")
const openNewSession = () => { const newSessionHref = () => {
if (params.dir) { if (params.dir) return `/${params.dir}/session`
navigate(`/${params.dir}/session`)
return
}
const project = layout.projects.list()[0] const project = layout.projects.list()[0]
if (!project) { if (!project) return "/"
navigate("/")
return
}
navigate(`/${base64Encode(project.worktree)}/session`) return `/${base64Encode(project.worktree)}/session`
} }
type Tab = { dir: string; sessionId: string; href: string } type Tab = { dir: string; sessionId: string; href: string }
@@ -313,13 +307,21 @@ export function Titlebar(props: { update?: TitlebarUpdate }) {
return true return true
} }
const closeNewSessionTab = () => {
if (!(params.dir && !params.id)) return false
const last = tabsStore[tabsStore.length - 1]
if (last) navigate(last.href)
else navigate("/")
return true
}
makeEventListener( makeEventListener(
document, document,
"keydown", "keydown",
(event) => { (event) => {
if (!event.metaKey || event.ctrlKey || event.altKey || event.shiftKey) return if (!event.metaKey || event.ctrlKey || event.altKey || event.shiftKey) return
if (event.key.toLowerCase() !== "w") return if (event.key.toLowerCase() !== "w") return
if (!closeCurrentSessionTab()) return if (!(closeCurrentSessionTab() || closeNewSessionTab())) return
event.preventDefault() event.preventDefault()
event.stopPropagation() event.stopPropagation()
@@ -391,7 +393,8 @@ export function Titlebar(props: { update?: TitlebarUpdate }) {
size="large" size="large"
class="shrink-0" class="shrink-0"
icon={<IconV2 name="plus" />} icon={<IconV2 name="plus" />}
onClick={openNewSession} as="a"
href={newSessionHref()}
aria-label={language.t("command.session.new")} aria-label={language.t("command.session.new")}
/> />
} }