Skip to content

Commit 7f57d2a

Browse files
authored
feat(app): show draft server status in titlebar (anomalyco#35521)
1 parent 377d5d2 commit 7f57d2a

3 files changed

Lines changed: 27 additions & 3 deletions

File tree

packages/app/src/components/session/session-header.tsx

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,7 @@ import { Icon as IconV2 } from "@opencode-ai/ui/v2/icon"
3131
import { KeybindV2 } from "@opencode-ai/ui/v2/keybind-v2"
3232
import { TooltipV2 } from "@opencode-ai/ui/v2/tooltip-v2"
3333
import { reviewTooltipKeybind } from "../command-tooltip-keybind"
34+
import { useTitlebarRightMount } from "../titlebar"
3435

3536
const OPEN_APPS = [
3637
"vscode",
@@ -284,10 +285,9 @@ export function SessionHeader() {
284285
}
285286

286287
const [centerMount, setCenterMount] = createSignal<HTMLElement | null>(null)
287-
const [rightMount, setRightMount] = createSignal<HTMLElement | null>(null)
288+
const rightMount = useTitlebarRightMount()
288289
onMount(() => {
289290
setCenterMount(document.getElementById("opencode-titlebar-center"))
290-
setRightMount(document.getElementById("opencode-titlebar-right"))
291291
})
292292

293293
return (

packages/app/src/components/titlebar.tsx

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
import { createEffect, createMemo, createResource, createSignal, Match, Show, Switch, untrack } from "solid-js"
1+
import { createEffect, createMemo, createResource, createSignal, Match, onMount, Show, Switch, untrack } from "solid-js"
22
import { createStore } from "solid-js/store"
33
import { useLocation, useNavigate, useParams } from "@solidjs/router"
44
import { IconButton } from "@opencode-ai/ui/icon-button"
@@ -60,6 +60,12 @@ export type TitlebarUpdate = {
6060
install: () => void
6161
}
6262

63+
export function useTitlebarRightMount() {
64+
const [mount, setMount] = createSignal<HTMLElement | null>(null)
65+
onMount(() => setMount(document.getElementById("opencode-titlebar-right")))
66+
return mount
67+
}
68+
6369
export function Titlebar(props: { update?: TitlebarUpdate }) {
6470
const layout = useLayout()
6571
const platform = usePlatform()

packages/app/src/pages/new-session.tsx

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,11 @@
11
import { Show, createEffect, createMemo, createResource, untrack } from "solid-js"
22
import { createStore } from "solid-js/store"
3+
import { Portal } from "solid-js/web"
34
import { useSearchParams } from "@solidjs/router"
5+
import { Tooltip } from "@opencode-ai/ui/tooltip"
46
import { NewSessionDesignView } from "@/components/session"
57
import { PromptInput } from "@/components/prompt-input"
8+
import { StatusPopoverV2 } from "@/components/status-popover"
69
import { useSettingsCommand } from "@/components/settings-dialog"
710
import {
811
PromptProjectAddButton,
@@ -15,11 +18,13 @@ import { useSDK } from "@/context/sdk"
1518
import { useSync } from "@/context/sync"
1619
import { useServerSync } from "@/context/server-sync"
1720
import { useLanguage } from "@/context/language"
21+
import { useSettings } from "@/context/settings"
1822
import { createPromptInputController, createPromptProjectControls } from "@/pages/session/composer"
1923
import { useSessionKey } from "@/pages/session/session-layout"
2024
import { useComposerCommands } from "@/pages/session/use-composer-commands"
2125
import { NEW_SESSION_CONTENT_WIDTH } from "@/pages/session/new-session-layout"
2226
import { PromptWorkspaceSelector } from "@/components/prompt-workspace-selector"
27+
import { useTitlebarRightMount } from "@/components/titlebar"
2328

2429
const showWorkspaceBar = import.meta.env.VITE_OPENCODE_CHANNEL !== "prod"
2530

@@ -35,6 +40,7 @@ export default function NewSessionPage() {
3540
const serverSync = useServerSync()
3641
const comments = useComments()
3742
const language = useLanguage()
43+
const settings = useSettings()
3844
const route = useSessionKey()
3945
const [searchParams, setSearchParams] = useSearchParams<{ draftId?: string; prompt?: string }>()
4046

@@ -55,6 +61,7 @@ export default function NewSessionPage() {
5561
})
5662

5763
const [store, setStore] = createStore<{ worktree?: string }>({})
64+
const rightMount = useTitlebarRightMount()
5865

5966
const newSessionWorktree = createMemo(() => {
6067
if (store.worktree) return store.worktree
@@ -92,6 +99,17 @@ export default function NewSessionPage() {
9299

93100
return (
94101
<div class="relative size-full overflow-hidden flex flex-col">
102+
<Show when={rightMount()}>
103+
{(mount) => (
104+
<Portal mount={mount()}>
105+
<Show when={settings.visibility.status()}>
106+
<Tooltip placement="bottom" value={language.t("status.popover.trigger")}>
107+
<StatusPopoverV2 />
108+
</Tooltip>
109+
</Show>
110+
</Portal>
111+
)}
112+
</Show>
95113
<div class="flex-1 min-h-0 flex flex-col gap-2 p-2">
96114
<div class="@container relative flex flex-col min-h-0 h-full flex-1">
97115
<div class="flex-1 min-h-0 overflow-hidden rounded-[10px]">

0 commit comments

Comments
 (0)