import { useMutation } from "@tanstack/react-query"; import { useState } from "react"; import { toast } from "sonner"; import { useNavigate } from "react-router"; import { Check, Save } from "lucide-react"; import { Card } from "~/client/components/ui/card"; import { Button } from "~/client/components/ui/button"; import { Input } from "~/client/components/ui/input"; import { Label } from "~/client/components/ui/label"; import { Select, SelectContent, SelectItem, SelectTrigger, SelectValue } from "~/client/components/ui/select"; import { AlertDialog, AlertDialogAction, AlertDialogCancel, AlertDialogContent, AlertDialogDescription, AlertDialogFooter, AlertDialogHeader, AlertDialogTitle, } from "~/client/components/ui/alert-dialog"; import type { Repository } from "~/client/lib/types"; import { slugify } from "~/client/lib/utils"; import { updateRepositoryMutation } from "~/client/api-client/@tanstack/react-query.gen"; import type { UpdateRepositoryResponse } from "~/client/api-client/types.gen"; import type { CompressionMode } from "~/schemas/restic"; type Props = { repository: Repository; }; export const RepositoryInfoTabContent = ({ repository }: Props) => { const navigate = useNavigate(); const [name, setName] = useState(repository.name); const [compressionMode, setCompressionMode] = useState( (repository.compressionMode as CompressionMode) || "off", ); const [showConfirmDialog, setShowConfirmDialog] = useState(false); const updateMutation = useMutation({ ...updateRepositoryMutation(), onSuccess: (data: UpdateRepositoryResponse) => { toast.success("Repository updated successfully"); setShowConfirmDialog(false); if (data.name !== repository.name) { navigate(`/repositories/${data.name}`); } }, onError: (error) => { toast.error("Failed to update repository", { description: error.message, richColors: true }); setShowConfirmDialog(false); }, }); const handleSubmit = (e: React.FormEvent) => { e.preventDefault(); setShowConfirmDialog(true); }; const confirmUpdate = () => { updateMutation.mutate({ path: { name: repository.name }, body: { name, compressionMode }, }); }; const hasChanges = name !== repository.name || compressionMode !== ((repository.compressionMode as CompressionMode) || "off"); return ( <>

Repository Settings

setName(slugify(e.target.value))} placeholder="Repository name" maxLength={32} minLength={2} />

Unique identifier for the repository.

Compression level for new data.

Repository Information

Backend

{repository.type}

Status

{repository.status || "unknown"}

Created At

{new Date(repository.createdAt * 1000).toLocaleString()}

Last Checked

{repository.lastChecked ? new Date(repository.lastChecked).toLocaleString() : "Never"}

{repository.lastError && (

Last Error

{repository.lastError}

)}

Configuration

{JSON.stringify(repository.config, null, 2)}
Update repository Are you sure you want to update the repository settings? Cancel Update ); };