import { useMutation } from "@tanstack/react-query"; import { AlertTriangle, Download } from "lucide-react"; import { useState } from "react"; import { toast } from "sonner"; import { AuthLayout } from "~/client/components/auth-layout"; import { Alert, AlertDescription, AlertTitle } from "~/client/components/ui/alert"; import { Button } from "~/client/components/ui/button"; import { Input } from "~/client/components/ui/input"; import { Label } from "~/client/components/ui/label"; import { downloadResticPasswordMutation } from "~/client/api-client/@tanstack/react-query.gen"; import { useNavigate } from "@tanstack/react-router"; export function DownloadRecoveryKeyPage() { const navigate = useNavigate(); const [password, setPassword] = useState(""); const downloadResticPassword = useMutation({ ...downloadResticPasswordMutation(), onSuccess: (data) => { const blob = new Blob([data], { type: "text/plain" }); const url = window.URL.createObjectURL(blob); const a = document.createElement("a"); a.href = url; a.download = "restic.pass"; document.body.appendChild(a); a.click(); document.body.removeChild(a); window.URL.revokeObjectURL(url); toast.success("Recovery key downloaded successfully!"); void navigate({ to: "/volumes", replace: true }); }, onError: (error) => { toast.error("Failed to download recovery key", { description: error.message }); }, }); const handleSubmit = (e: React.SubmitEvent) => { e.preventDefault(); if (!password) { toast.error("Password is required"); return; } downloadResticPassword.mutate({ body: { password, }, }); }; return ( Important: Save This File Securely Your Restic password is essential for recovering your backup data. If you lose access to this server without this file, your backups will be unrecoverable. Store it in a password manager or encrypted storage.
setPassword(e.target.value)} placeholder="Enter your password" required disabled={downloadResticPassword.isPending} />

Enter your account password to download the recovery key

); }