import { useMutation } from "@tanstack/react-query"; import { Download } from "lucide-react"; import { useState } from "react"; import { toast } from "sonner"; import { exportFullConfigMutation } from "~/client/api-client/@tanstack/react-query.gen"; import { Button } from "~/client/components/ui/button"; import { Checkbox } from "~/client/components/ui/checkbox"; import { Dialog, DialogContent, DialogDescription, DialogFooter, DialogHeader, DialogTitle, DialogTrigger, } from "~/client/components/ui/dialog"; import { Input } from "~/client/components/ui/input"; import { Label } from "~/client/components/ui/label"; import { parseError } from "../lib/errors"; import { downloadFile } from "../lib/utils"; const DEFAULT_EXPORT_FILENAME = "zerobyte-full-config"; export const ExportDialog = () => { const [open, setOpen] = useState(false); const [includeMetadata, setIncludeMetadata] = useState(false); const [password, setPassword] = useState(""); const exportMutation = useMutation({ ...exportFullConfigMutation(), onSuccess: (data) => { downloadFile(data, `${DEFAULT_EXPORT_FILENAME}.json`, "application/json"); toast.success("Configuration exported successfully"); setOpen(false); setPassword(""); }, onError: (e) => { toast.error("Export failed", { description: parseError(e)?.message, }); }, }); const handleExport = (e: React.FormEvent) => { e.preventDefault(); if (!password) { toast.error("Password is required"); return; } exportMutation.mutate({ body: { password, includeMetadata, }, }); }; const handleDialogChange = (isOpen: boolean) => { setOpen(isOpen); if (!isOpen) { setPassword(""); } }; return (
Export Full Configuration Export the complete Zerobyte configuration.
setIncludeMetadata(checked === true)} />

Include timestamps and runtime state (status, health checks, last backup info).

setPassword(e.target.value)} placeholder="Enter your password to export" required />

Password is required to verify your identity before exporting configuration.

); };