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 }); } } },