Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
15 changes: 13 additions & 2 deletions packages/app/src/components/titlebar.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -367,9 +367,20 @@ export function Titlebar(props: { update?: TitlebarUpdate }) {
const project = global.ensureServerCtx(conn).projects.list()[0]
return project ? [{ server: ServerConnection.key(conn), project }] : []
})[0]
if (!fallback) return
if (fallback) {
tabs.newDraft({ server: fallback.server, directory: fallback.project.worktree }, "")
return
}

const conn = global.servers.list()[0] ?? server.current
if (!conn) return
const ctx = global.ensureServerCtx(conn)
const directory = ctx.sync.data.path.directory
if (!directory) return

tabs.newDraft({ server: fallback.server, directory: fallback.project.worktree }, "")
ctx.projects.open(directory)
ctx.projects.touch(directory)
tabs.newDraft({ server: ServerConnection.key(conn), directory }, "")
}
const toggleHome = () => tabs.toggleHome({ home: layout.route().type === "home", current: currentTab() })

Expand Down
20 changes: 14 additions & 6 deletions packages/app/src/pages/home.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -50,6 +50,7 @@ import {
errorMessage,
getProjectAvatarSource,
homeProjectDirectories,
newSessionDirectory,
projectForSession,
toggleHomeProjectSelection,
} from "@/pages/layout/helpers"
Expand Down Expand Up @@ -328,12 +329,19 @@ export function NewHome() {
)
const homedir = createMemo(() => focusedSync().data.path.home ?? "")
const selectedProject = createMemo(() => projects().find((project) => project.worktree === selection().directory))
const newSessionProject = createMemo(
() =>
selectedProject() ??
projects().find((project) => project.worktree === focusedServerCtx()?.projects.last()) ??
projects()[0],
)
const newSessionProject = createMemo(() => {
const list = projects()
const directory = newSessionDirectory(
list,
selectedProject()?.worktree,
focusedServerCtx()?.projects.last(),
focusedSync().data.path.directory,
)
return (
list.find((project) => project.worktree === directory) ??
(directory ? ({ worktree: directory, expanded: true } satisfies LocalProject) : undefined)
)
})
const directories = (project: LocalProject) => [project.worktree, ...(project.sandboxes ?? [])]
const projectDirectories = createMemo(() => {
const project = selectedProject()
Expand Down
21 changes: 21 additions & 0 deletions packages/app/src/pages/layout/helpers.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -18,13 +18,34 @@ import {
homeProjectDirectories,
homeSessionServerStatus,
latestRootSession,
newSessionDirectory,
toggleHomeProjectSelection,
} from "./helpers"
import { pathKey } from "@/utils/path-key"
import { ServerConnection } from "@/context/server"

const serverKey = ServerConnection.Key.make

describe("newSessionDirectory", () => {
const projects = [{ worktree: "/first" }, { worktree: "/second" }]

test("prefers the selected project", () => {
expect(newSessionDirectory(projects, "/second", "/first", "/server")).toBe("/second")
})

test("uses the last project when no project is selected", () => {
expect(newSessionDirectory(projects, undefined, "/second", "/server")).toBe("/second")
})

test("uses the first opened project before the server directory", () => {
expect(newSessionDirectory(projects, undefined, undefined, "/server")).toBe("/first")
})

test("uses the server directory when no project has been opened", () => {
expect(newSessionDirectory([], undefined, undefined, "/server")).toBe("/server")
})
})

const session = (input: Partial<Session> & Pick<Session, "id" | "directory">) =>
({
title: "",
Expand Down
14 changes: 14 additions & 0 deletions packages/app/src/pages/layout/helpers.ts
Original file line number Diff line number Diff line change
Expand Up @@ -87,6 +87,20 @@ export function homeProjectDirectories(result: string | string[] | null) {
return Array.isArray(result) ? result : [result]
}

export function newSessionDirectory(
projects: { worktree: string }[],
selected?: string,
last?: string,
fallback?: string,
) {
return (
projects.find((project) => project.worktree === selected)?.worktree ??
projects.find((project) => project.worktree === last)?.worktree ??
projects[0]?.worktree ??
fallback
)
}

export function homeSessionServerStatus(active: boolean, status: () => { working: boolean; tint?: string }) {
if (!active) return { working: false, tint: undefined }
return status()
Expand Down
Loading