import { save } from '@tauri-apps/plugin-dialog'; import type { Workspace } from '@yaakapp-internal/models'; import { workspacesAtom } from '@yaakapp-internal/models'; import { useAtomValue } from 'jotai'; import { useCallback, useMemo, useState } from 'react'; import slugify from 'slugify'; import { activeWorkspaceAtom } from '../hooks/useActiveWorkspace'; import { pluralizeCount } from '../lib/pluralize'; import { invokeCmd } from '../lib/tauri'; import { Button } from './core/Button'; import { Checkbox } from './core/Checkbox'; import { DetailsBanner } from './core/DetailsBanner'; import { Link } from './core/Link'; import { HStack, VStack } from './core/Stacks'; interface Props { onHide: () => void; onSuccess: (path: string) => void; } export function ExportDataDialog({ onHide, onSuccess }: Props) { const allWorkspaces = useAtomValue(workspacesAtom); const activeWorkspace = useAtomValue(activeWorkspaceAtom); if (activeWorkspace == null || allWorkspaces.length === 0) return null; return ( ); } function ExportDataDialogContent({ onHide, onSuccess, activeWorkspace, allWorkspaces, }: Props & { allWorkspaces: Workspace[]; activeWorkspace: Workspace; }) { const [includePrivateEnvironments, setIncludePrivateEnvironments] = useState(false); const [selectedWorkspaces, setSelectedWorkspaces] = useState>({ [activeWorkspace.id]: true, }); // Put the active workspace first const workspaces = useMemo( () => [activeWorkspace, ...allWorkspaces.filter((w) => w.id !== activeWorkspace.id)], [activeWorkspace, allWorkspaces], ); const handleToggleAll = () => { setSelectedWorkspaces( // biome-ignore lint/performance/noAccumulatingSpread: none allSelected ? {} : workspaces.reduce((acc, w) => ({ ...acc, [w.id]: true }), {}), ); }; const handleExport = useCallback(async () => { const ids = Object.keys(selectedWorkspaces).filter((k) => selectedWorkspaces[k]); const workspace = ids.length === 1 ? workspaces.find((w) => w.id === ids[0]) : undefined; const slug = workspace ? slugify(workspace.name, { lower: true }) : 'workspaces'; const exportPath = await save({ title: 'Export Data', defaultPath: `yaak.${slug}.json`, }); if (exportPath == null) { return; } await invokeCmd('cmd_export_data', { workspaceIds: ids, exportPath, includePrivateEnvironments: includePrivateEnvironments, }); onHide(); onSuccess(exportPath); }, [includePrivateEnvironments, onHide, onSuccess, selectedWorkspaces, workspaces]); const allSelected = workspaces.every((w) => selectedWorkspaces[w.id]); const numSelected = Object.values(selectedWorkspaces).filter(Boolean).length; const noneSelected = numSelected === 0; return ( Workspace {workspaces.map((w) => ( setSelectedWorkspaces((prev) => ({ ...prev, [w.id]: !prev[w.id] })) } /> setSelectedWorkspaces((prev) => ({ ...prev, [w.id]: !prev[w.id] })) } > {w.name} {w.id === activeWorkspace.id ? '(current workspace)' : ''} ))} ); }