import { useMutation } from "@tanstack/react-query"; import { AlertTriangle, Download } from "lucide-react"; import { useState } from "react"; import { useNavigate } from "react-router"; 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 { authMiddleware } from "~/middleware/auth"; import type { Route } from "./+types/download-recovery-key"; import { downloadResticPasswordMutation } from "~/client/api-client/@tanstack/react-query.gen"; export const clientMiddleware = [authMiddleware]; export function meta(_: Route.MetaArgs) { return [ { title: "Zerobyte - Download Recovery Key" }, { name: "description", content: "Download your backup recovery key to ensure you can restore your data.", }, ]; } export default 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!"); navigate("/volumes", { replace: true }); }, onError: (error) => { toast.error("Failed to download recovery key", { description: error.message }); }, }); const handleSubmit = (e: React.FormEvent) => { 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 autoFocus disabled={downloadResticPassword.isPending} />

Enter your account password to download the recovery key

); }