Git branch flow improvements (#370)

This commit is contained in:
Gregory Schier
2026-01-26 14:45:51 -08:00
committed by GitHub
parent eb10910d20
commit 47a3d44888
20 changed files with 862 additions and 423 deletions

View File

@@ -18,6 +18,7 @@ import { useWorkspaceActions } from '../hooks/useWorkspaceActions';
import { showDialog } from '../lib/dialog';
import { jotaiStore } from '../lib/jotai';
import { revealInFinderText } from '../lib/reveal';
import { CloneGitRepositoryDialog } from './CloneGitRepositoryDialog';
import type { ButtonProps } from './core/Button';
import { Button } from './core/Button';
import type { DropdownItem } from './core/Dropdown';
@@ -39,9 +40,19 @@ export const WorkspaceActionsDropdown = memo(function WorkspaceActionsDropdown({
const { mutate: deleteSendHistory } = useDeleteSendHistory();
const workspaceActions = useWorkspaceActions();
const { workspaceItems, itemsAfter } = useMemo<{
const openCloneGitRepositoryDialog = useCallback(() => {
showDialog({
id: 'clone-git-repository',
size: 'md',
title: 'Clone Git Repository',
render: ({ hide }) => <CloneGitRepositoryDialog hide={hide} />,
});
}, []);
const { workspaceItems, itemsAfter, itemsBefore } = useMemo<{
workspaceItems: RadioDropdownItem[];
itemsAfter: DropdownItem[];
itemsBefore: DropdownItem[];
}>(() => {
const workspaceItems: RadioDropdownItem[] = workspaces.map((w) => ({
key: w.id,
@@ -50,6 +61,38 @@ export const WorkspaceActionsDropdown = memo(function WorkspaceActionsDropdown({
leftSlot: w.id === workspace?.id ? <Icon icon="check" /> : <Icon icon="empty" />,
}));
const itemsBefore: DropdownItem[] = [
{
label: 'New Workspace',
leftSlot: <Icon icon="plus" />,
submenu: [
{
label: 'Create Empty',
leftSlot: <Icon icon="plus_circle" />,
onSelect: createWorkspace,
},
{
label: 'Open Folder',
leftSlot: <Icon icon="folder_open" />,
onSelect: async () => {
const dir = await open({
title: 'Select Workspace Directory',
directory: true,
multiple: false,
});
if (dir == null) return;
openWorkspaceFromSyncDir.mutate(dir);
},
},
{
label: 'Clone Git Repository',
leftSlot: <Icon icon="hard_drive_download" />,
onSelect: openCloneGitRepositoryDialog,
},
],
},
];
const itemsAfter: DropdownItem[] = [
...workspaceActions.map((a) => ({
label: a.label,
@@ -80,34 +123,15 @@ export const WorkspaceActionsDropdown = memo(function WorkspaceActionsDropdown({
leftSlot: <Icon icon="history" />,
onSelect: deleteSendHistory,
},
{ type: 'separator' },
{
label: 'New Workspace',
leftSlot: <Icon icon="plus" />,
onSelect: createWorkspace,
},
{
label: 'Open Existing Workspace',
leftSlot: <Icon icon="folder_open" />,
onSelect: async () => {
const dir = await open({
title: 'Select Workspace Directory',
directory: true,
multiple: false,
});
if (dir == null) return;
openWorkspaceFromSyncDir.mutate(dir);
},
},
];
return { workspaceItems, itemsAfter };
return { workspaceItems, itemsAfter, itemsBefore };
}, [
workspaces,
workspaceMeta,
deleteSendHistory,
createWorkspace,
openCloneGitRepositoryDialog,
workspace?.id,
workspace,
workspaceActions.map,
@@ -144,6 +168,7 @@ export const WorkspaceActionsDropdown = memo(function WorkspaceActionsDropdown({
<RadioDropdown
items={workspaceItems}
itemsAfter={itemsAfter}
itemsBefore={itemsBefore}
onChange={handleSwitchWorkspace}
value={workspace?.id ?? null}
>