import { useMutation, useSuspenseQuery } from "@tanstack/react-query"; import { useSearch } from "@tanstack/react-router"; import { toast } from "sonner"; import { useState } from "react"; import { Plug, Unplug } from "lucide-react"; import { StatusDot } from "~/client/components/status-dot"; import { Button } from "~/client/components/ui/button"; import { Tabs, TabsContent, TabsList, TabsTrigger } from "~/client/components/ui/tabs"; import { AlertDialog, AlertDialogAction, AlertDialogCancel, AlertDialogContent, AlertDialogDescription, AlertDialogHeader, AlertDialogTitle, } from "~/client/components/ui/alert-dialog"; import { VolumeIcon } from "~/client/components/volume-icon"; import { parseError } from "~/client/lib/errors"; import { cn } from "~/client/lib/utils"; import { VolumeInfoTabContent } from "../tabs/info"; import { FilesTabContent } from "../tabs/files"; import type { VolumeStatus } from "~/client/lib/types"; import { deleteVolumeMutation, getVolumeOptions, mountVolumeMutation, unmountVolumeMutation, } from "~/client/api-client/@tanstack/react-query.gen"; import { useNavigate } from "@tanstack/react-router"; const getVolumeStatusVariant = (status: VolumeStatus): "success" | "neutral" | "error" | "warning" => { const statusMap = { mounted: "success" as const, unmounted: "neutral" as const, error: "error" as const, unknown: "warning" as const, }; return statusMap[status]; }; export function VolumeDetails({ volumeId }: { volumeId: string }) { const navigate = useNavigate(); const searchParams = useSearch({ from: "/(dashboard)/volumes/$volumeId" }); const activeTab = searchParams.tab || "info"; const [showDeleteConfirm, setShowDeleteConfirm] = useState(false); const { data } = useSuspenseQuery({ ...getVolumeOptions({ path: { id: volumeId } }), }); 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 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 handleConfirmDelete = () => { setShowDeleteConfirm(false); deleteVol.mutate({ path: { id: volumeId } }); }; if (!volumeId) { return
Volume not found
; } if (!data) { return
Loading...
; } const { volume, statfs } = data; return ( <>
  {volume.status[0].toUpperCase() + volume.status.slice(1)}
navigate({ to: ".", search: () => ({ tab: value }) })} className="mt-4" > Configuration Files Delete volume? Are you sure you want to delete the volume {volume.name}? This action cannot be undone.
Cancel Delete volume
); }