|
1 | 1 | import { ErrorBoundary, createEffect, createMemo, Show, type ParentProps } from "solid-js" |
| 2 | +import { Title } from "@solidjs/meta" |
2 | 3 | import { useParams } from "@solidjs/router" |
3 | 4 | import { createStore } from "solid-js/store" |
4 | 5 | import { makeEventListener } from "@solid-primitives/event-listener" |
5 | 6 | import { DataProvider } from "@opencode/session-ui/context" |
6 | 7 | import { SessionUserMessage } from "@opencode/session-ui/message" |
7 | 8 | import { TextShimmer } from "@opencode/ui/text-shimmer" |
| 9 | +import { isFallbackTitle } from "@opencode/util/session-title-fallback" |
8 | 10 | import { CommentsProvider } from "@/composer/comments" |
9 | 11 | import { readPromptPresentation } from "@/composer/comment-note" |
10 | 12 | import { FileProvider } from "@/workspaces/files/model" |
@@ -39,6 +41,7 @@ export function TargetSessionRouteContent() { |
39 | 41 | return ( |
40 | 42 | <> |
41 | 43 | <MarkSessionViewed sessionID={() => params.id} /> |
| 44 | + <SessionDocumentTitle sessionID={() => params.id} /> |
42 | 45 | <ModelsProvider directory={directory()}> |
43 | 46 | <TargetSessionSettingsCommand /> |
44 | 47 | <SessionRouteErrorBoundary sessionID={params.id} serverKey={requireServerKey(params.serverKey)}> |
@@ -207,3 +210,21 @@ function MarkSessionViewed(props: { sessionID: () => string | undefined }) { |
207 | 210 |
|
208 | 211 | return null |
209 | 212 | } |
| 213 | + |
| 214 | +// Browser tabs and desktop windows are otherwise indistinguishable, so name them after the open session. |
| 215 | +function SessionDocumentTitle(props: { sessionID: () => string }) { |
| 216 | + const data = useData() |
| 217 | + |
| 218 | + const title = createMemo(() => { |
| 219 | + const value = data.session.get(props.sessionID())?.title |
| 220 | + |
| 221 | + return isFallbackTitle(value) ? undefined : value |
| 222 | + }) |
| 223 | + |
| 224 | + // Keyed: <Title> reads its text inside a meta effect, which would hit a stale Show accessor once the session is deleted. |
| 225 | + return ( |
| 226 | + <Show when={title()} keyed> |
| 227 | + {(value) => <Title>{`${value} · OpenCode`}</Title>} |
| 228 | + </Show> |
| 229 | + ) |
| 230 | +} |
0 commit comments