import { createMemo, createResource, Show } from "solid-js" import { A, useNavigate, useParams } from "@solidjs/router" import { useLayout } from "@/context/layout" import { useCommand } from "@/context/command" import { useServer } from "@/context/server" import { useDialog } from "@opencode-ai/ui/context/dialog" import { useSync } from "@/context/sync" import { useGlobalSDK } from "@/context/global-sdk" import { getFilename } from "@opencode-ai/util/path" import { base64Decode, base64Encode } from "@opencode-ai/util/encode" import { iife } from "@opencode-ai/util/iife" import { Icon } from "@opencode-ai/ui/icon" import { IconButton } from "@opencode-ai/ui/icon-button" import { Button } from "@opencode-ai/ui/button" import { Tooltip, TooltipKeybind } from "@opencode-ai/ui/tooltip" import { Select } from "@opencode-ai/ui/select" import { Popover } from "@opencode-ai/ui/popover" import { TextField } from "@opencode-ai/ui/text-field" import { DialogSelectServer } from "@/components/dialog-select-server" import { SessionLspIndicator } from "@/components/session-lsp-indicator" import { SessionMcpIndicator } from "@/components/session-mcp-indicator" import type { Session } from "@opencode-ai/sdk/v2/client" import { same } from "@/utils/same" export function SessionHeader() { const globalSDK = useGlobalSDK() const layout = useLayout() const params = useParams() const navigate = useNavigate() const command = useCommand() const server = useServer() const dialog = useDialog() const sync = useSync() const projectDirectory = createMemo(() => base64Decode(params.dir ?? "")) const sessions = createMemo(() => (sync.data.session ?? []).filter((s) => !s.parentID)) const currentSession = createMemo(() => sync.data.session.find((s) => s.id === params.id)) const parentSession = createMemo(() => { const current = currentSession() if (!current?.parentID) return undefined return sync.data.session.find((s) => s.id === current.parentID) }) const shareEnabled = createMemo(() => sync.data.config.share !== "disabled") const worktrees = createMemo(() => layout.projects.list().map((p) => p.worktree), [], { equals: same }) const sessionKey = createMemo(() => `${params.dir}${params.id ? "/" + params.id : ""}`) const view = createMemo(() => layout.view(sessionKey())) function navigateToProject(directory: string) { navigate(`/${base64Encode(directory)}`) } function navigateToSession(session: Session | undefined) { if (!session) return // Only navigate if we're actually changing to a different session if (session.id === params.id) return navigate(`/${params.dir}/session/${session.id}`) } return (
x.title} value={(x) => x.id} onSelect={(session) => { // Only navigate if selecting a different session than current parent const currentParent = parentSession() if (session && currentParent && session.id !== currentParent.id) { navigateToSession(session) } }} class="text-14-regular text-text-base max-w-[calc(100vw-180px)] md:max-w-md" variant="ghost" />
/
} > {iife(() => { const [url] = createResource( () => currentSession(), async (session) => { if (!session) return let shareURL = session.share?.url if (!shareURL) { shareURL = await globalSDK.client.session .share({ sessionID: session.id, directory: projectDirectory() }) .then((r) => r.data?.share?.url) .catch((e) => { console.error("Failed to share session", e) return undefined }) } return shareURL }, { initialValue: "" }, ) return ( {(shareUrl) => } ) })}
) }