import { useSuspenseQuery } from "@tanstack/react-query"; import { HardDrive, Plus, RotateCcw } from "lucide-react"; import { useState } from "react"; import { EmptyState } from "~/client/components/empty-state"; import { StatusDot } from "~/client/components/status-dot"; import { Button } from "~/client/components/ui/button"; import { Card } from "~/client/components/ui/card"; import { Input } from "~/client/components/ui/input"; import { Select, SelectContent, SelectItem, SelectTrigger, SelectValue } from "~/client/components/ui/select"; import { Table, TableBody, TableCell, TableHead, TableHeader, TableRow } from "~/client/components/ui/table"; import { VolumeIcon } from "~/client/components/volume-icon"; import { listVolumesOptions } from "~/client/api-client/@tanstack/react-query.gen"; import type { VolumeStatus } from "~/client/lib/types"; import { useNavigate } from "@tanstack/react-router"; import { cn } from "~/client/lib/utils"; 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 VolumesPage() { const [searchQuery, setSearchQuery] = useState(""); const [statusFilter, setStatusFilter] = useState(""); const [backendFilter, setBackendFilter] = useState(""); const clearFilters = () => { setSearchQuery(""); setStatusFilter(""); setBackendFilter(""); }; const navigate = useNavigate(); const { data } = useSuspenseQuery({ ...listVolumesOptions(), }); const filteredVolumes = data.filter((volume) => { const matchesSearch = volume.name.toLowerCase().includes(searchQuery.toLowerCase()); const matchesStatus = !statusFilter || volume.status === statusFilter; const matchesBackend = !backendFilter || volume.type === backendFilter; return matchesSearch && matchesStatus && matchesBackend; }) || []; const hasNoVolumes = data.length === 0; const hasNoFilteredVolumes = filteredVolumes.length === 0 && !hasNoVolumes; if (hasNoVolumes) { return ( navigate({ to: "/volumes/create" })}> Create Volume } /> ); } return (
setSearchQuery(e.target.value)} /> {(searchQuery || statusFilter || backendFilter) && ( )}
Name Backend Status

No volumes match your filters.

{filteredVolumes.map((volume) => ( navigate({ to: `/volumes/${volume.shortId}` })} >
{volume.name}
))}
{hasNoFilteredVolumes ? ( "No volumes match filters." ) : ( {filteredVolumes.length} volume {filteredVolumes.length > 1 ? "s" : ""} )}
); }