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( // oxlint-disable-next-line no-accumulating-spread 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)" : ""} ))} ); }