mirror of
https://github.com/mountain-loop/yaak.git
synced 2026-05-31 03:40:42 +02:00
Workspace dropdown to RadioDropdown
This commit is contained in:
@@ -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 }),
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -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 });
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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>
|
||||||
);
|
);
|
||||||
});
|
});
|
||||||
|
|||||||
@@ -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 });
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
|||||||
Reference in New Issue
Block a user