Workspace dropdown to RadioDropdown

This commit is contained in:
Gregory Schier
2024-06-14 17:07:35 -07:00
parent 6c331ed734
commit b49081cd06
4 changed files with 55 additions and 51 deletions
+1 -1
View File
@@ -278,7 +278,7 @@ export function CommandPalette({ onClose }: { onClose: () => void }) {
workspaceGroup.items.push({ workspaceGroup.items.push({
key: `switch-workspace-${w.id}`, key: `switch-workspace-${w.id}`,
label: w.name, label: w.name,
onSelect: () => openWorkspace.mutate({ workspace: w, inNewWindow: false }), onSelect: () => openWorkspace.mutate({ workspaceId: w.id, inNewWindow: false }),
}); });
} }
+2 -2
View File
@@ -31,7 +31,7 @@ export function OpenWorkspaceDialog({ hide, workspace }: Props) {
color="primary" color="primary"
onClick={() => { onClick={() => {
hide(); hide();
openWorkspace.mutate({ workspace, inNewWindow: false }); openWorkspace.mutate({ workspaceId: workspace.id, inNewWindow: false });
if (remember) { if (remember) {
updateSettings.mutate({ openWorkspaceNewWindow: false }); updateSettings.mutate({ openWorkspaceNewWindow: false });
} }
@@ -45,7 +45,7 @@ export function OpenWorkspaceDialog({ hide, workspace }: Props) {
rightSlot={<Icon icon="externalLink" />} rightSlot={<Icon icon="externalLink" />}
onClick={() => { onClick={() => {
hide(); hide();
openWorkspace.mutate({ workspace, inNewWindow: true }); openWorkspace.mutate({ workspaceId: workspace.id, inNewWindow: true });
if (remember) { if (remember) {
updateSettings.mutate({ openWorkspaceNewWindow: true }); updateSettings.mutate({ openWorkspaceNewWindow: true });
} }
+42 -35
View File
@@ -1,5 +1,5 @@
import classNames from 'classnames'; import classNames from 'classnames';
import { memo, useMemo } from 'react'; import { memo, useCallback, useMemo } from 'react';
import { useActiveWorkspace } from '../hooks/useActiveWorkspace'; import { useActiveWorkspace } from '../hooks/useActiveWorkspace';
import { useCreateWorkspace } from '../hooks/useCreateWorkspace'; import { useCreateWorkspace } from '../hooks/useCreateWorkspace';
import { useDeleteWorkspace } from '../hooks/useDeleteWorkspace'; import { useDeleteWorkspace } from '../hooks/useDeleteWorkspace';
@@ -8,12 +8,14 @@ import { usePrompt } from '../hooks/usePrompt';
import { useSettings } from '../hooks/useSettings'; import { useSettings } from '../hooks/useSettings';
import { useUpdateWorkspace } from '../hooks/useUpdateWorkspace'; import { useUpdateWorkspace } from '../hooks/useUpdateWorkspace';
import { useWorkspaces } from '../hooks/useWorkspaces'; import { useWorkspaces } from '../hooks/useWorkspaces';
import { getWorkspace } from '../lib/store';
import type { ButtonProps } from './core/Button'; import type { ButtonProps } from './core/Button';
import { Button } from './core/Button'; import { Button } from './core/Button';
import type { DropdownItem } from './core/Dropdown'; import type { DropdownItem } from './core/Dropdown';
import { Dropdown } from './core/Dropdown';
import { Icon } from './core/Icon'; import { Icon } from './core/Icon';
import { InlineCode } from './core/InlineCode'; import { InlineCode } from './core/InlineCode';
import type { RadioDropdownItem } from './core/RadioDropdown';
import { RadioDropdown } from './core/RadioDropdown';
import { useDialog } from './DialogContext'; import { useDialog } from './DialogContext';
import { OpenWorkspaceDialog } from './OpenWorkspaceDialog'; import { OpenWorkspaceDialog } from './OpenWorkspaceDialog';
@@ -35,39 +37,18 @@ export const WorkspaceActionsDropdown = memo(function WorkspaceActionsDropdown({
const openWorkspace = useOpenWorkspace(); const openWorkspace = useOpenWorkspace();
const openWorkspaceNewWindow = settings?.openWorkspaceNewWindow ?? null; const openWorkspaceNewWindow = settings?.openWorkspaceNewWindow ?? null;
const items: DropdownItem[] = useMemo(() => { const { workspaceItems, extraItems } = useMemo<{
const workspaceItems: DropdownItem[] = workspaces.map((w) => ({ workspaceItems: RadioDropdownItem[];
extraItems: DropdownItem[];
}>(() => {
const workspaceItems: RadioDropdownItem[] = workspaces.map((w) => ({
key: w.id, key: w.id,
label: w.name, label: w.name,
value: w.id,
leftSlot: w.id === activeWorkspaceId ? <Icon icon="check" /> : <Icon icon="empty" />, leftSlot: w.id === activeWorkspaceId ? <Icon icon="check" /> : <Icon icon="empty" />,
onSelect: async () => {
if (typeof openWorkspaceNewWindow === 'boolean') {
openWorkspace.mutate({ workspace: w, inNewWindow: openWorkspaceNewWindow });
return;
}
dialog.show({
id: 'open-workspace',
size: 'sm',
title: 'Open Workspace',
render: ({ hide }) => <OpenWorkspaceDialog workspace={w} hide={hide} />,
});
},
})); }));
const activeWorkspaceItems: DropdownItem[] = const extraItems: DropdownItem[] = [
workspaces.length <= 1
? []
: [
...workspaceItems,
{
type: 'separator',
label: activeWorkspace?.name,
},
];
return [
...activeWorkspaceItems,
{ {
key: 'rename', key: 'rename',
label: 'Rename', label: 'Rename',
@@ -104,21 +85,47 @@ export const WorkspaceActionsDropdown = memo(function WorkspaceActionsDropdown({
onSelect: createWorkspace.mutate, onSelect: createWorkspace.mutate,
}, },
]; ];
return { workspaceItems, extraItems };
}, [ }, [
activeWorkspace?.name, activeWorkspace?.name,
activeWorkspaceId, activeWorkspaceId,
createWorkspace, createWorkspace,
deleteWorkspace.mutate, deleteWorkspace.mutate,
dialog,
openWorkspace,
prompt, prompt,
openWorkspaceNewWindow,
updateWorkspace, updateWorkspace,
workspaces, workspaces,
]); ]);
const handleChange = useCallback(
async (workspaceId: string | null) => {
if (workspaceId == null) return;
if (typeof openWorkspaceNewWindow === 'boolean') {
openWorkspace.mutate({ workspaceId, inNewWindow: openWorkspaceNewWindow });
return;
}
const workspace = await getWorkspace(workspaceId);
if (workspace == null) return;
dialog.show({
id: 'open-workspace',
size: 'sm',
title: 'Open Workspace',
render: ({ hide }) => <OpenWorkspaceDialog workspace={workspace} hide={hide} />,
});
},
[dialog, openWorkspace, openWorkspaceNewWindow],
);
return ( return (
<Dropdown items={items}> <RadioDropdown
items={workspaceItems}
extraItems={extraItems}
onChange={handleChange}
value={activeWorkspaceId}
>
<Button <Button
size="sm" size="sm"
className={classNames( className={classNames(
@@ -130,6 +137,6 @@ export const WorkspaceActionsDropdown = memo(function WorkspaceActionsDropdown({
> >
{activeWorkspace?.name ?? 'Workspace'} {activeWorkspace?.name ?? 'Workspace'}
</Button> </Button>
</Dropdown> </RadioDropdown>
); );
}); });
+10 -13
View File
@@ -1,6 +1,5 @@
import { useMutation } from '@tanstack/react-query'; import { useMutation } from '@tanstack/react-query';
import { invoke } from '@tauri-apps/api/core'; import { invoke } from '@tauri-apps/api/core';
import type { Workspace } from '../lib/models';
import { useAppRoutes } from './useAppRoutes'; import { useAppRoutes } from './useAppRoutes';
import { getRecentEnvironments } from './useRecentEnvironments'; import { getRecentEnvironments } from './useRecentEnvironments';
import { getRecentRequests } from './useRecentRequests'; import { getRecentRequests } from './useRecentRequests';
@@ -10,37 +9,35 @@ export function useOpenWorkspace() {
return useMutation({ return useMutation({
mutationFn: async ({ mutationFn: async ({
workspace, workspaceId,
inNewWindow, inNewWindow,
}: { }: {
workspace: Workspace; workspaceId: string;
inNewWindow: boolean; inNewWindow: boolean;
}) => { }) => {
if (workspace == null) return;
if (inNewWindow) { if (inNewWindow) {
const environmentId = (await getRecentEnvironments(workspace.id))[0]; const environmentId = (await getRecentEnvironments(workspaceId))[0];
const requestId = (await getRecentRequests(workspace.id))[0]; const requestId = (await getRecentRequests(workspaceId))[0];
const path = const path =
requestId != null requestId != null
? routes.paths.request({ ? routes.paths.request({
workspaceId: workspace.id, workspaceId,
environmentId, environmentId,
requestId, requestId,
}) })
: routes.paths.workspace({ workspaceId: workspace.id, environmentId }); : routes.paths.workspace({ workspaceId, environmentId });
await invoke('cmd_new_window', { url: path }); await invoke('cmd_new_window', { url: path });
} else { } else {
const environmentId = (await getRecentEnvironments(workspace.id))[0]; const environmentId = (await getRecentEnvironments(workspaceId))[0];
const requestId = (await getRecentRequests(workspace.id))[0]; const requestId = (await getRecentRequests(workspaceId))[0];
if (requestId != null) { if (requestId != null) {
routes.navigate('request', { routes.navigate('request', {
workspaceId: workspace.id, workspaceId: workspaceId,
environmentId, environmentId,
requestId, requestId,
}); });
} else { } else {
routes.navigate('workspace', { workspaceId: workspace.id, environmentId }); routes.navigate('workspace', { workspaceId, environmentId });
} }
} }
}, },