Buckets:
| 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/core/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> | |
| ) | |
| } | |
Xet Storage Details
- Size:
- 3.64 kB
- Xet hash:
- 54b5f86556fdde970cb2ea59cb51f3641c80259449159c3f40e22c2b666e924f
·
Xet efficiently stores files, intelligently splitting them into unique chunks and accelerating uploads and downloads. More info.