mirror of
https://gitea.toothfairyai.com/ToothFairyAI/tf_code.git
synced 2026-04-05 00:23:10 +00:00
92 lines
3.6 KiB
TypeScript
92 lines
3.6 KiB
TypeScript
import { Show, createMemo } from "solid-js"
|
|
import { DateTime } from "luxon"
|
|
import { useSync } from "@/context/sync"
|
|
import { useSDK } from "@/context/sdk"
|
|
import { useLanguage } from "@/context/language"
|
|
import { Icon } from "@opencode-ai/ui/icon"
|
|
import { Mark } from "@opencode-ai/ui/logo"
|
|
import { getDirectory, getFilename } from "@opencode-ai/util/path"
|
|
|
|
const MAIN_WORKTREE = "main"
|
|
const CREATE_WORKTREE = "create"
|
|
const ROOT_CLASS = "size-full flex flex-col"
|
|
|
|
interface NewSessionViewProps {
|
|
worktree: string
|
|
}
|
|
|
|
export function NewSessionView(props: NewSessionViewProps) {
|
|
const sync = useSync()
|
|
const sdk = useSDK()
|
|
const language = useLanguage()
|
|
|
|
const sandboxes = createMemo(() => sync.project?.sandboxes ?? [])
|
|
const options = createMemo(() => [MAIN_WORKTREE, ...sandboxes(), CREATE_WORKTREE])
|
|
const current = createMemo(() => {
|
|
const selection = props.worktree
|
|
if (options().includes(selection)) return selection
|
|
return MAIN_WORKTREE
|
|
})
|
|
const projectRoot = createMemo(() => sync.project?.worktree ?? sdk.directory)
|
|
const isWorktree = createMemo(() => {
|
|
const project = sync.project
|
|
if (!project) return false
|
|
return sdk.directory !== project.worktree
|
|
})
|
|
|
|
const label = (value: string) => {
|
|
if (value === MAIN_WORKTREE) {
|
|
if (isWorktree()) return language.t("session.new.worktree.main")
|
|
const branch = sync.data.vcs?.branch
|
|
if (branch) return language.t("session.new.worktree.mainWithBranch", { branch })
|
|
return language.t("session.new.worktree.main")
|
|
}
|
|
|
|
if (value === CREATE_WORKTREE) return language.t("session.new.worktree.create")
|
|
|
|
return getFilename(value)
|
|
}
|
|
|
|
return (
|
|
<div class={ROOT_CLASS}>
|
|
<div class="h-12 shrink-0" aria-hidden />
|
|
<div class="flex-1 px-6 pb-30 flex items-center justify-center text-center">
|
|
<div class="w-full max-w-200 flex flex-col items-center text-center gap-4">
|
|
<div class="flex flex-col items-center gap-6">
|
|
<Mark class="w-10" />
|
|
<div class="text-20-medium text-text-strong">{language.t("session.new.title")}</div>
|
|
</div>
|
|
<div class="w-full flex flex-col gap-4 items-center">
|
|
<div class="flex items-start justify-center gap-3 min-h-5">
|
|
<div class="text-12-medium text-text-weak select-text leading-5 min-w-0 max-w-160 break-words text-center">
|
|
{getDirectory(projectRoot())}
|
|
<span class="text-text-strong">{getFilename(projectRoot())}</span>
|
|
</div>
|
|
</div>
|
|
<div class="flex items-start justify-center gap-1.5 min-h-5">
|
|
<Icon name="branch" size="small" class="mt-0.5 shrink-0" />
|
|
<div class="text-12-medium text-text-weak select-text leading-5 min-w-0 max-w-160 break-words text-center">
|
|
{label(current())}
|
|
</div>
|
|
</div>
|
|
<Show when={sync.project}>
|
|
{(project) => (
|
|
<div class="flex items-start justify-center gap-3 min-h-5">
|
|
<div class="text-12-medium text-text-weak leading-5 min-w-0 max-w-160 break-words text-center">
|
|
{language.t("session.new.lastModified")}
|
|
<span class="text-text-strong">
|
|
{DateTime.fromMillis(project().time.updated ?? project().time.created)
|
|
.setLocale(language.intl())
|
|
.toRelative()}
|
|
</span>
|
|
</div>
|
|
</div>
|
|
)}
|
|
</Show>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
)
|
|
}
|