fix(app): move workspace New session into header (#12624)

This commit is contained in:
Kit Langton
2026-02-07 14:21:50 -05:00
committed by GitHub
parent 04f216902b
commit 9401029b1d

View File

@@ -1,3 +1,4 @@
import { useNavigate, useParams } from "@solidjs/router"
import { createEffect, createMemo, For, Show, type Accessor, type JSX } from "solid-js" import { createEffect, createMemo, For, Show, type Accessor, type JSX } from "solid-js"
import { createStore } from "solid-js/store" import { createStore } from "solid-js/store"
import { createSortable } from "@thisbeyond/solid-dnd" import { createSortable } from "@thisbeyond/solid-dnd"
@@ -86,6 +87,8 @@ export const SortableWorkspace = (props: {
project: LocalProject project: LocalProject
mobile?: boolean mobile?: boolean
}): JSX.Element => { }): JSX.Element => {
const navigate = useNavigate()
const params = useParams()
const globalSync = useGlobalSync() const globalSync = useGlobalSync()
const language = useLanguage() const language = useLanguage()
const sortable = createSortable(props.directory) const sortable = createSortable(props.directory)
@@ -111,6 +114,7 @@ export const SortableWorkspace = (props: {
const busy = createMemo(() => props.ctx.isBusy(props.directory)) const busy = createMemo(() => props.ctx.isBusy(props.directory))
const wasBusy = createMemo((prev) => prev || busy(), false) const wasBusy = createMemo((prev) => prev || busy(), false)
const loading = createMemo(() => open() && !booted() && sessions().length === 0 && !wasBusy()) const loading = createMemo(() => open() && !booted() && sessions().length === 0 && !wasBusy())
const showNew = createMemo(() => !loading() && (sessions().length === 0 || (active() && !params.id)))
const loadMore = async () => { const loadMore = async () => {
setWorkspaceStore("limit", (limit) => limit + 5) setWorkspaceStore("limit", (limit) => limit + 5)
await globalSync.project.loadSessions(props.directory) await globalSync.project.loadSessions(props.directory)
@@ -260,6 +264,23 @@ export const SortableWorkspace = (props: {
</DropdownMenu.Content> </DropdownMenu.Content>
</DropdownMenu.Portal> </DropdownMenu.Portal>
</DropdownMenu> </DropdownMenu>
<Tooltip value={language.t("command.session.new")} placement="top">
<IconButton
icon="plus-small"
variant="ghost"
class="size-6 rounded-md opacity-0 pointer-events-none group-hover/workspace:opacity-100 group-hover/workspace:pointer-events-auto group-focus-within/workspace:opacity-100 group-focus-within/workspace:pointer-events-auto"
data-action="workspace-new-session"
data-workspace={base64Encode(props.directory)}
aria-label={language.t("command.session.new")}
onClick={(event) => {
event.preventDefault()
event.stopPropagation()
props.ctx.setHoverSession(undefined)
props.ctx.clearHoverProjectSoon()
navigate(`/${slug()}/session`)
}}
/>
</Tooltip>
</div> </div>
</div> </div>
</div> </div>
@@ -267,13 +288,15 @@ export const SortableWorkspace = (props: {
<Collapsible.Content> <Collapsible.Content>
<nav class="flex flex-col gap-1 px-2"> <nav class="flex flex-col gap-1 px-2">
<NewSessionItem <Show when={showNew()}>
slug={slug()} <NewSessionItem
mobile={props.mobile} slug={slug()}
sidebarExpanded={props.ctx.sidebarExpanded} mobile={props.mobile}
clearHoverProjectSoon={props.ctx.clearHoverProjectSoon} sidebarExpanded={props.ctx.sidebarExpanded}
setHoverSession={props.ctx.setHoverSession} clearHoverProjectSoon={props.ctx.clearHoverProjectSoon}
/> setHoverSession={props.ctx.setHoverSession}
/>
</Show>
<Show when={loading()}> <Show when={loading()}>
<SessionSkeleton /> <SessionSkeleton />
</Show> </Show>