import { invoke } from '@tauri-apps/api'; import classNames from 'classnames'; import { memo, useMemo } from 'react'; import { useActiveWorkspace } from '../hooks/useActiveWorkspace'; import { useAppRoutes } from '../hooks/useAppRoutes'; import { useAppVersion } from '../hooks/useAppVersion'; import { useCreateWorkspace } from '../hooks/useCreateWorkspace'; import { useDeleteWorkspace } from '../hooks/useDeleteWorkspace'; import { useExportData } from '../hooks/useExportData'; import { useImportData } from '../hooks/useImportData'; import { usePrompt } from '../hooks/usePrompt'; import { getRecentEnvironments } from '../hooks/useRecentEnvironments'; import { useTheme } from '../hooks/useTheme'; import { useUpdateMode } from '../hooks/useUpdateMode'; import { useUpdateWorkspace } from '../hooks/useUpdateWorkspace'; import { useWorkspaces } from '../hooks/useWorkspaces'; 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 { HStack } from './core/Stacks'; import { useDialog } from './DialogContext'; type Props = Pick; export const WorkspaceActionsDropdown = memo(function WorkspaceActionsDropdown({ className, ...buttonProps }: Props) { const workspaces = useWorkspaces(); const activeWorkspace = useActiveWorkspace(); const activeWorkspaceId = activeWorkspace?.id ?? null; const createWorkspace = useCreateWorkspace({ navigateAfter: true }); const updateWorkspace = useUpdateWorkspace(activeWorkspaceId); const deleteWorkspace = useDeleteWorkspace(activeWorkspace); const importData = useImportData(); const exportData = useExportData(); const { appearance, toggleAppearance } = useTheme(); const dialog = useDialog(); const prompt = usePrompt(); const routes = useAppRoutes(); const appVersion = useAppVersion(); const [updateMode, setUpdateMode] = useUpdateMode(); const items: DropdownItem[] = useMemo(() => { const workspaceItems: DropdownItem[] = workspaces.map((w) => ({ key: w.id, label: w.name, leftSlot: w.id === activeWorkspaceId ? : , onSelect: async () => { dialog.show({ id: 'open-workspace', size: 'sm', title: 'Open Workspace', description: ( <> Where would you like to open {w.name}? ), render: ({ hide }) => { return ( ); }, }); }, })); const activeWorkspaceItems: DropdownItem[] = workspaces.length <= 1 ? [] : [ ...workspaceItems, { type: 'separator', label: activeWorkspace?.name, }, ]; return [ ...activeWorkspaceItems, { key: 'rename', label: 'Rename', leftSlot: , onSelect: async () => { const name = await prompt({ title: 'Rename Workspace', description: ( <> Enter a new name for {activeWorkspace?.name} ), name: 'name', label: 'Name', defaultValue: activeWorkspace?.name, }); updateWorkspace.mutate({ name }); }, }, { key: 'delete', label: 'Delete', leftSlot: , onSelect: deleteWorkspace.mutate, variant: 'danger', }, { type: 'separator' }, { key: 'create-workspace', label: 'New Workspace', leftSlot: , onSelect: async () => { const name = await prompt({ name: 'name', label: 'Name', defaultValue: 'My Workspace', title: 'New Workspace', }); createWorkspace.mutate({ name }); }, }, { key: 'import-data', label: 'Import Data', leftSlot: , onSelect: () => importData.mutate(), }, { key: 'export-data', label: 'Export Data', leftSlot: , onSelect: () => exportData.mutate(), }, { type: 'separator', label: `v${appVersion.data}` }, { key: 'appearance', label: 'Toggle Theme', onSelect: toggleAppearance, leftSlot: , }, { key: 'update-mode', label: updateMode === 'stable' ? 'Enable Beta' : 'Disable Beta', onSelect: () => setUpdateMode(updateMode === 'stable' ? 'beta' : 'stable'), leftSlot: , }, { key: 'update-check', label: 'Check for Updates', onSelect: () => invoke('check_for_updates'), leftSlot: , }, ]; }, [ activeWorkspace?.name, activeWorkspaceId, appearance, createWorkspace, deleteWorkspace.mutate, dialog, exportData, importData, prompt, routes, setUpdateMode, toggleAppearance, updateMode, updateWorkspace, workspaces, ]); return ( ); });