|
|
@@ -19,6 +19,9 @@ import { createPromptInputController, createPromptProjectControls } from "@/page
|
|
|
import { useSessionKey } from "@/pages/session/session-layout"
|
|
|
import { useComposerCommands } from "@/pages/session/use-composer-commands"
|
|
|
import { NEW_SESSION_CONTENT_WIDTH } from "@/pages/session/new-session-layout"
|
|
|
+import { PromptWorkspaceSelector } from "@/components/prompt-workspace-selector"
|
|
|
+
|
|
|
+const showWorkspaceBar = import.meta.env.VITE_OPENCODE_CHANNEL !== "prod"
|
|
|
|
|
|
/**
|
|
|
* The `/new-session` draft page. Unlike `session.tsx`, this only renders the prompt
|
|
|
@@ -51,16 +54,21 @@ export default function NewSessionPage() {
|
|
|
onDone: () => inputRef?.focus(),
|
|
|
})
|
|
|
|
|
|
- const [store, setStore] = createStore({
|
|
|
- worktree: "main",
|
|
|
- })
|
|
|
+ const [store, setStore] = createStore<{ worktree?: string }>({})
|
|
|
|
|
|
const newSessionWorktree = createMemo(() => {
|
|
|
- if (store.worktree === "create") return "create"
|
|
|
+ if (store.worktree) return store.worktree
|
|
|
const project = sync().project
|
|
|
if (project && sdk().directory !== project.worktree) return sdk().directory
|
|
|
return "main"
|
|
|
})
|
|
|
+ const projectRoot = createMemo(() => sync().project?.worktree ?? sdk().directory)
|
|
|
+ const localBranch = createMemo(() => serverSync().child(projectRoot())[0].vcs?.branch)
|
|
|
+ const selectedBranch = createMemo(() => {
|
|
|
+ const worktree = newSessionWorktree()
|
|
|
+ if (worktree === "main" || worktree === "create") return localBranch()
|
|
|
+ return serverSync().child(worktree)[0].vcs?.branch ?? localBranch()
|
|
|
+ })
|
|
|
|
|
|
createEffect(() => {
|
|
|
if (!prompt.ready()) return
|
|
|
@@ -97,7 +105,7 @@ export default function NewSessionPage() {
|
|
|
</div>
|
|
|
}
|
|
|
>
|
|
|
- <div class="flex flex-col gap-3">
|
|
|
+ <div class="flex flex-col" classList={{ "gap-8": showWorkspaceBar, "gap-3": !showWorkspaceBar }}>
|
|
|
<PromptInput
|
|
|
controls={inputController()}
|
|
|
variant="new-session"
|
|
|
@@ -105,7 +113,7 @@ export default function NewSessionPage() {
|
|
|
inputRef = el
|
|
|
}}
|
|
|
newSessionWorktree={newSessionWorktree()}
|
|
|
- onNewSessionWorktreeReset={() => setStore("worktree", "main")}
|
|
|
+ onNewSessionWorktreeReset={() => setStore("worktree", undefined)}
|
|
|
onSubmit={() => comments.clear()}
|
|
|
toolbar={
|
|
|
<Show when={!projectController.selected()}>
|
|
|
@@ -114,8 +122,34 @@ export default function NewSessionPage() {
|
|
|
}
|
|
|
/>
|
|
|
<Show when={projectController.selected()}>
|
|
|
- <div class="flex h-7 min-w-0 items-center gap-0 px-2">
|
|
|
- <PromptProjectSelector controller={projectController} />
|
|
|
+ <div
|
|
|
+ class="flex min-h-7 min-w-0 items-center gap-0 text-v2-text-text-faint"
|
|
|
+ classList={{
|
|
|
+ "flex-col justify-center sm:flex-row": showWorkspaceBar,
|
|
|
+ "justify-start": !showWorkspaceBar,
|
|
|
+ }}
|
|
|
+ >
|
|
|
+ <PromptProjectSelector
|
|
|
+ controller={projectController}
|
|
|
+ placement={showWorkspaceBar ? "bottom" : "bottom-start"}
|
|
|
+ />
|
|
|
+ <Show when={showWorkspaceBar}>
|
|
|
+ <PromptWorkspaceSelector
|
|
|
+ value={newSessionWorktree()}
|
|
|
+ projectRoot={projectRoot()}
|
|
|
+ workspaces={sync().project?.sandboxes ?? []}
|
|
|
+ branch={selectedBranch()}
|
|
|
+ onChange={(value) =>
|
|
|
+ setStore(
|
|
|
+ "worktree",
|
|
|
+ value === "main" && sync().project?.worktree !== sdk().directory
|
|
|
+ ? sync().project?.worktree
|
|
|
+ : value,
|
|
|
+ )
|
|
|
+ }
|
|
|
+ onDone={() => inputRef?.focus()}
|
|
|
+ />
|
|
|
+ </Show>
|
|
|
</div>
|
|
|
</Show>
|
|
|
</div>
|