diff --git a/apps/desktop/src/lib/trpc/routers/workspaces/procedures/status.ts b/apps/desktop/src/lib/trpc/routers/workspaces/procedures/status.ts index c34ee8e8029..d1eebab62d2 100644 --- a/apps/desktop/src/lib/trpc/routers/workspaces/procedures/status.ts +++ b/apps/desktop/src/lib/trpc/routers/workspaces/procedures/status.ts @@ -64,6 +64,7 @@ export const createStatusProcedures = () => { patch: z.object({ name: z.string().optional(), preserveUnnamedStatus: z.boolean().optional(), + isUnnamed: z.boolean().optional(), }), }), ) @@ -75,12 +76,18 @@ export const createStatusProcedures = () => { ); } + const resolveIsUnnamed = () => { + if (input.patch.isUnnamed !== undefined) return input.patch.isUnnamed; + if (input.patch.name !== undefined && !input.patch.preserveUnnamedStatus) + return false; + return undefined; + }; + + const isUnnamed = resolveIsUnnamed(); + touchWorkspace(input.id, { - ...(input.patch.name !== undefined && { - name: input.patch.name, - // Only mark as named if not preserving unnamed status - ...(input.patch.preserveUnnamedStatus ? {} : { isUnnamed: false }), - }), + ...(input.patch.name !== undefined && { name: input.patch.name }), + ...(isUnnamed !== undefined && { isUnnamed }), }); return { success: true }; diff --git a/apps/desktop/src/renderer/routes/_authenticated/settings/workspace/$workspaceId/page.tsx b/apps/desktop/src/renderer/routes/_authenticated/settings/workspace/$workspaceId/page.tsx index 2e5b30f8fa0..55c0d79407e 100644 --- a/apps/desktop/src/renderer/routes/_authenticated/settings/workspace/$workspaceId/page.tsx +++ b/apps/desktop/src/renderer/routes/_authenticated/settings/workspace/$workspaceId/page.tsx @@ -43,7 +43,11 @@ function WorkspaceSettingsPage() { id: workspaceId, }); - const rename = useWorkspaceRename(workspace?.id ?? "", workspace?.name ?? ""); + const rename = useWorkspaceRename( + workspace?.id ?? "", + workspace?.name ?? "", + workspace?.branch ?? "", + ); // Workspace is guaranteed to exist here because loader handles 404s if (!workspace) { diff --git a/apps/desktop/src/renderer/screens/main/components/WorkspaceSidebar/WorkspaceListItem/WorkspaceListItem.tsx b/apps/desktop/src/renderer/screens/main/components/WorkspaceSidebar/WorkspaceListItem/WorkspaceListItem.tsx index b9f559e3acb..5cda546e352 100644 --- a/apps/desktop/src/renderer/screens/main/components/WorkspaceSidebar/WorkspaceListItem/WorkspaceListItem.tsx +++ b/apps/desktop/src/renderer/screens/main/components/WorkspaceSidebar/WorkspaceListItem/WorkspaceListItem.tsx @@ -88,7 +88,7 @@ export function WorkspaceListItem({ const matchRoute = useMatchRoute(); const reorderWorkspaces = useReorderWorkspaces(); const [hasHovered, setHasHovered] = useState(false); - const rename = useWorkspaceRename(id, name); + const rename = useWorkspaceRename(id, name, branch); const tabs = useTabsStore((s) => s.tabs); const panes = useTabsStore((s) => s.panes); const clearWorkspaceAttentionStatus = useTabsStore( diff --git a/apps/desktop/src/renderer/screens/main/hooks/useWorkspaceRename/useWorkspaceRename.ts b/apps/desktop/src/renderer/screens/main/hooks/useWorkspaceRename/useWorkspaceRename.ts index dc2e0b1c43d..17efd8b1ba3 100644 --- a/apps/desktop/src/renderer/screens/main/hooks/useWorkspaceRename/useWorkspaceRename.ts +++ b/apps/desktop/src/renderer/screens/main/hooks/useWorkspaceRename/useWorkspaceRename.ts @@ -1,20 +1,22 @@ import { useEffect, useRef, useState } from "react"; import { useUpdateWorkspace } from "renderer/react-query/workspaces/useUpdateWorkspace"; -export function useWorkspaceRename(workspaceId: string, workspaceName: string) { +export function useWorkspaceRename( + workspaceId: string, + workspaceName: string, + branch: string, +) { const [isRenaming, setIsRenaming] = useState(false); const [renameValue, setRenameValue] = useState(workspaceName); const inputRef = useRef(null); const updateWorkspace = useUpdateWorkspace(); - // Select input text when rename mode is activated useEffect(() => { if (isRenaming && inputRef.current) { inputRef.current.select(); } }, [isRenaming]); - // Sync rename value when workspace name changes useEffect(() => { setRenameValue(workspaceName); }, [workspaceName]); @@ -25,7 +27,15 @@ export function useWorkspaceRename(workspaceId: string, workspaceName: string) { const submitRename = () => { const trimmedValue = renameValue.trim(); - if (trimmedValue && trimmedValue !== workspaceName) { + const isCleared = !trimmedValue; + + if (isCleared) { + updateWorkspace.mutate({ + id: workspaceId, + patch: { name: branch, isUnnamed: true }, + }); + setRenameValue(branch); + } else if (trimmedValue !== workspaceName) { updateWorkspace.mutate({ id: workspaceId, patch: { name: trimmedValue },