import { useMutation } from "@tanstack/react-query"; import { useState } from "react"; import { toast } from "sonner"; import { Check, Plug, Trash2, Unplug } from "lucide-react"; import { CreateVolumeForm, formSchema, type FormValues } from "~/client/modules/volumes/components/create-volume-form"; import { AlertDialog, AlertDialogAction, AlertDialogCancel, AlertDialogContent, AlertDialogDescription, AlertDialogFooter, AlertDialogHeader, AlertDialogTitle, } from "~/client/components/ui/alert-dialog"; import { Button } from "~/client/components/ui/button"; import { Card } from "~/client/components/ui/card"; import type { StatFs, Volume } from "~/client/lib/types"; import { HealthchecksCard } from "../components/healthchecks-card"; import { StorageChart } from "../components/storage-chart"; import { deleteVolumeMutation, mountVolumeMutation, unmountVolumeMutation, updateVolumeMutation, } from "~/client/api-client/@tanstack/react-query.gen"; import type { UpdateVolumeResponse } from "~/client/api-client/types.gen"; import { useNavigate } from "@tanstack/react-router"; import { parseError } from "~/client/lib/errors"; import { ManagedBadge } from "~/client/components/managed-badge"; type Props = { volume: Volume; statfs: StatFs; }; export const VolumeInfoTabContent = ({ volume, statfs }: Props) => { const navigate = useNavigate(); const updateMutation = useMutation({ ...updateVolumeMutation(), onSuccess: (data: UpdateVolumeResponse) => { toast.success("Volume updated successfully"); setOpen(false); setPendingValues(null); if (data.name !== volume.name) { void navigate({ to: `/volumes/${data.shortId}` }); } }, onError: (error) => { toast.error("Failed to update volume", { description: error.message }); setOpen(false); setPendingValues(null); }, }); const mountVol = useMutation({ ...mountVolumeMutation(), onSuccess: () => { toast.success("Volume mounted successfully"); }, onError: (error) => { toast.error("Failed to mount volume", { description: parseError(error)?.message, }); }, }); const unmountVol = useMutation({ ...unmountVolumeMutation(), onSuccess: () => { toast.success("Volume unmounted successfully"); }, onError: (error) => { toast.error("Failed to unmount volume", { description: parseError(error)?.message, }); }, }); const deleteVol = useMutation({ ...deleteVolumeMutation(), onSuccess: () => { toast.success("Volume deleted successfully"); void navigate({ to: "/volumes" }); }, onError: (error) => { toast.error("Failed to delete volume", { description: parseError(error)?.message, }); }, }); const [open, setOpen] = useState(false); const [pendingValues, setPendingValues] = useState(null); const [showDeleteConfirm, setShowDeleteConfirm] = useState(false); const handleSubmit = (values: FormValues) => { setPendingValues(values); setOpen(true); }; const confirmUpdate = () => { if (pendingValues) { const { name, ...config } = formSchema.parse(pendingValues); updateMutation.mutate({ path: { shortId: volume.shortId }, body: { name, config }, }); } }; const handleConfirmDelete = () => { setShowDeleteConfirm(false); deleteVol.mutate({ path: { shortId: volume.shortId } }); }; return ( <>
Volume Configuration {volume.provisioningId && }
{volume.status !== "mounted" ? ( ) : ( )}
Update Volume Configuration Editing the volume will remount it with the new config immediately. This may temporarily disrupt access to the volume. Continue? Cancel Update Delete volume? Are you sure you want to delete the volume {volume.name}? This action cannot be undone.

All backup schedules associated with this volume will also be removed.
Cancel Delete volume
); };