import { useMutation } from '@tanstack/react-query'; import type { Environment, Folder, GrpcRequest, HttpRequest, Workspace } from '@yaakapp/api'; import { Button } from '../components/core/Button'; import { FormattedError } from '../components/core/FormattedError'; import { VStack } from '../components/core/Stacks'; import { useDialog } from '../components/DialogContext'; import { ImportDataDialog } from '../components/ImportDataDialog'; import { count } from '../lib/pluralize'; import { invokeCmd } from '../lib/tauri'; import { useActiveWorkspace } from './useActiveWorkspace'; import { useAlert } from './useAlert'; import { useAppRoutes } from './useAppRoutes'; export function useImportData() { const routes = useAppRoutes(); const dialog = useDialog(); const alert = useAlert(); const activeWorkspace = useActiveWorkspace(); const importData = async (filePath: string): Promise => { const imported: { workspaces: Workspace[]; environments: Environment[]; folders: Folder[]; httpRequests: HttpRequest[]; grpcRequests: GrpcRequest[]; } = await invokeCmd('cmd_import_data', { filePath, workspaceId: activeWorkspace?.id, }); const importedWorkspace = imported.workspaces[0]; dialog.show({ id: 'import-complete', title: 'Import Complete', size: 'sm', hideX: true, render: ({ hide }) => { const { workspaces, environments, folders, httpRequests, grpcRequests } = imported; return (
); }, }); if (importedWorkspace != null) { routes.navigate('workspace', { workspaceId: importedWorkspace.id, environmentId: imported.environments[0]?.id, }); } return true; }; return useMutation({ mutationKey: ['import_data'], onError: (err: string) => { alert({ id: 'import-failed', title: 'Import Failed', size: 'md', body: {err}, }); }, mutationFn: async () => { return new Promise((resolve, reject) => { dialog.show({ id: 'import', title: 'Import Data', size: 'sm', render: ({ hide }) => { const importAndHide = async (filePath: string) => { try { const didImport = await importData(filePath); if (!didImport) { return; } resolve(); } catch (err) { reject(err); } finally { hide(); } }; return ; }, }); }); }, }); }