import { createEffect, createMemo, onCleanup, Show } from "solid-js" import { createStore } from "solid-js/store" import { Portal } from "solid-js/web" import { useParams } from "@solidjs/router" import { useLayout } from "@/context/layout" import { useCommand } from "@/context/command" import { useLanguage } from "@/context/language" import { usePlatform } from "@/context/platform" import { useSync } from "@/context/sync" import { useGlobalSDK } from "@/context/global-sdk" import { getFilename } from "@opencode-ai/util/path" import { base64Decode } from "@opencode-ai/util/encode" 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 { Popover } from "@opencode-ai/ui/popover" import { TextField } from "@opencode-ai/ui/text-field" import { Keybind } from "@opencode-ai/ui/keybind" import { StatusPopover } from "../status-popover" export function SessionHeader() { const globalSDK = useGlobalSDK() const layout = useLayout() const params = useParams() const command = useCommand() const sync = useSync() const platform = usePlatform() const language = useLanguage() const projectDirectory = createMemo(() => base64Decode(params.dir ?? "")) const project = createMemo(() => { const directory = projectDirectory() if (!directory) return return layout.projects.list().find((p) => p.worktree === directory || p.sandboxes?.includes(directory)) }) const name = createMemo(() => { const current = project() if (current) return current.name || getFilename(current.worktree) return getFilename(projectDirectory()) }) const hotkey = createMemo(() => command.keybind("file.open")) const currentSession = createMemo(() => sync.data.session.find((s) => s.id === params.id)) const shareEnabled = createMemo(() => sync.data.config.share !== "disabled") const showShare = createMemo(() => shareEnabled() && !!currentSession()) const showReview = createMemo(() => !!currentSession()) const sessionKey = createMemo(() => `${params.dir}${params.id ? "/" + params.id : ""}`) const view = createMemo(() => layout.view(sessionKey)) const [state, setState] = createStore({ share: false, unshare: false, copied: false, timer: undefined as number | undefined, }) const shareUrl = createMemo(() => currentSession()?.share?.url) createEffect(() => { const url = shareUrl() if (url) return if (state.timer) window.clearTimeout(state.timer) setState({ copied: false, timer: undefined }) }) onCleanup(() => { if (state.timer) window.clearTimeout(state.timer) }) function shareSession() { const session = currentSession() if (!session || state.share) return setState("share", true) globalSDK.client.session .share({ sessionID: session.id, directory: projectDirectory() }) .catch((error) => { console.error("Failed to share session", error) }) .finally(() => { setState("share", false) }) } function unshareSession() { const session = currentSession() if (!session || state.unshare) return setState("unshare", true) globalSDK.client.session .unshare({ sessionID: session.id, directory: projectDirectory() }) .catch((error) => { console.error("Failed to unshare session", error) }) .finally(() => { setState("unshare", false) }) } function copyLink() { const url = shareUrl() if (!url) return navigator.clipboard .writeText(url) .then(() => { if (state.timer) window.clearTimeout(state.timer) setState("copied", true) const timer = window.setTimeout(() => { setState("copied", false) setState("timer", undefined) }, 3000) setState("timer", timer) }) .catch((error) => { console.error("Failed to copy share link", error) }) } function viewShare() { const url = shareUrl() if (!url) return platform.openLink(url) } const centerMount = createMemo(() => document.getElementById("opencode-titlebar-center")) const rightMount = createMemo(() => document.getElementById("opencode-titlebar-right")) return ( <> {(mount) => ( )} {(mount) => (
} >
)} ) }