diff --git a/src-web/components/CommandPalette.tsx b/src-web/components/CommandPalette.tsx
index 41888852..4779ed92 100644
--- a/src-web/components/CommandPalette.tsx
+++ b/src-web/components/CommandPalette.tsx
@@ -278,7 +278,7 @@ export function CommandPalette({ onClose }: { onClose: () => void }) {
workspaceGroup.items.push({
key: `switch-workspace-${w.id}`,
label: w.name,
- onSelect: () => openWorkspace.mutate({ workspace: w, inNewWindow: false }),
+ onSelect: () => openWorkspace.mutate({ workspaceId: w.id, inNewWindow: false }),
});
}
diff --git a/src-web/components/OpenWorkspaceDialog.tsx b/src-web/components/OpenWorkspaceDialog.tsx
index 9222cf74..b739e5a4 100644
--- a/src-web/components/OpenWorkspaceDialog.tsx
+++ b/src-web/components/OpenWorkspaceDialog.tsx
@@ -31,7 +31,7 @@ export function OpenWorkspaceDialog({ hide, workspace }: Props) {
color="primary"
onClick={() => {
hide();
- openWorkspace.mutate({ workspace, inNewWindow: false });
+ openWorkspace.mutate({ workspaceId: workspace.id, inNewWindow: false });
if (remember) {
updateSettings.mutate({ openWorkspaceNewWindow: false });
}
@@ -45,7 +45,7 @@ export function OpenWorkspaceDialog({ hide, workspace }: Props) {
rightSlot={}
onClick={() => {
hide();
- openWorkspace.mutate({ workspace, inNewWindow: true });
+ openWorkspace.mutate({ workspaceId: workspace.id, inNewWindow: true });
if (remember) {
updateSettings.mutate({ openWorkspaceNewWindow: true });
}
diff --git a/src-web/components/WorkspaceActionsDropdown.tsx b/src-web/components/WorkspaceActionsDropdown.tsx
index c784569f..408229de 100644
--- a/src-web/components/WorkspaceActionsDropdown.tsx
+++ b/src-web/components/WorkspaceActionsDropdown.tsx
@@ -1,5 +1,5 @@
import classNames from 'classnames';
-import { memo, useMemo } from 'react';
+import { memo, useCallback, useMemo } from 'react';
import { useActiveWorkspace } from '../hooks/useActiveWorkspace';
import { useCreateWorkspace } from '../hooks/useCreateWorkspace';
import { useDeleteWorkspace } from '../hooks/useDeleteWorkspace';
@@ -8,12 +8,14 @@ import { usePrompt } from '../hooks/usePrompt';
import { useSettings } from '../hooks/useSettings';
import { useUpdateWorkspace } from '../hooks/useUpdateWorkspace';
import { useWorkspaces } from '../hooks/useWorkspaces';
+import { getWorkspace } from '../lib/store';
import type { ButtonProps } from './core/Button';
import { Button } from './core/Button';
import type { DropdownItem } from './core/Dropdown';
-import { Dropdown } from './core/Dropdown';
import { Icon } from './core/Icon';
import { InlineCode } from './core/InlineCode';
+import type { RadioDropdownItem } from './core/RadioDropdown';
+import { RadioDropdown } from './core/RadioDropdown';
import { useDialog } from './DialogContext';
import { OpenWorkspaceDialog } from './OpenWorkspaceDialog';
@@ -35,39 +37,18 @@ export const WorkspaceActionsDropdown = memo(function WorkspaceActionsDropdown({
const openWorkspace = useOpenWorkspace();
const openWorkspaceNewWindow = settings?.openWorkspaceNewWindow ?? null;
- const items: DropdownItem[] = useMemo(() => {
- const workspaceItems: DropdownItem[] = workspaces.map((w) => ({
+ const { workspaceItems, extraItems } = useMemo<{
+ workspaceItems: RadioDropdownItem[];
+ extraItems: DropdownItem[];
+ }>(() => {
+ const workspaceItems: RadioDropdownItem[] = workspaces.map((w) => ({
key: w.id,
label: w.name,
+ value: w.id,
leftSlot: w.id === activeWorkspaceId ? : ,
- 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 }) => ,
- });
- },
}));
- const activeWorkspaceItems: DropdownItem[] =
- workspaces.length <= 1
- ? []
- : [
- ...workspaceItems,
- {
- type: 'separator',
- label: activeWorkspace?.name,
- },
- ];
-
- return [
- ...activeWorkspaceItems,
+ const extraItems: DropdownItem[] = [
{
key: 'rename',
label: 'Rename',
@@ -104,21 +85,47 @@ export const WorkspaceActionsDropdown = memo(function WorkspaceActionsDropdown({
onSelect: createWorkspace.mutate,
},
];
+
+ return { workspaceItems, extraItems };
}, [
activeWorkspace?.name,
activeWorkspaceId,
createWorkspace,
deleteWorkspace.mutate,
- dialog,
- openWorkspace,
prompt,
- openWorkspaceNewWindow,
updateWorkspace,
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 }) => ,
+ });
+ },
+ [dialog, openWorkspace, openWorkspaceNewWindow],
+ );
+
return (
-
+
-
+
);
});
diff --git a/src-web/hooks/useOpenWorkspace.ts b/src-web/hooks/useOpenWorkspace.ts
index aea48100..ed4c5bd1 100644
--- a/src-web/hooks/useOpenWorkspace.ts
+++ b/src-web/hooks/useOpenWorkspace.ts
@@ -1,6 +1,5 @@
import { useMutation } from '@tanstack/react-query';
import { invoke } from '@tauri-apps/api/core';
-import type { Workspace } from '../lib/models';
import { useAppRoutes } from './useAppRoutes';
import { getRecentEnvironments } from './useRecentEnvironments';
import { getRecentRequests } from './useRecentRequests';
@@ -10,37 +9,35 @@ export function useOpenWorkspace() {
return useMutation({
mutationFn: async ({
- workspace,
+ workspaceId,
inNewWindow,
}: {
- workspace: Workspace;
+ workspaceId: string;
inNewWindow: boolean;
}) => {
- if (workspace == null) return;
-
if (inNewWindow) {
- const environmentId = (await getRecentEnvironments(workspace.id))[0];
- const requestId = (await getRecentRequests(workspace.id))[0];
+ const environmentId = (await getRecentEnvironments(workspaceId))[0];
+ const requestId = (await getRecentRequests(workspaceId))[0];
const path =
requestId != null
? routes.paths.request({
- workspaceId: workspace.id,
+ workspaceId,
environmentId,
requestId,
})
- : routes.paths.workspace({ workspaceId: workspace.id, environmentId });
+ : routes.paths.workspace({ workspaceId, environmentId });
await invoke('cmd_new_window', { url: path });
} else {
- const environmentId = (await getRecentEnvironments(workspace.id))[0];
- const requestId = (await getRecentRequests(workspace.id))[0];
+ const environmentId = (await getRecentEnvironments(workspaceId))[0];
+ const requestId = (await getRecentRequests(workspaceId))[0];
if (requestId != null) {
routes.navigate('request', {
- workspaceId: workspace.id,
+ workspaceId: workspaceId,
environmentId,
requestId,
});
} else {
- routes.navigate('workspace', { workspaceId: workspace.id, environmentId });
+ routes.navigate('workspace', { workspaceId, environmentId });
}
}
},