import { useQuery } from "@tanstack/react-query"; import { Copy, RotateCcw } from "lucide-react"; import { useState } from "react"; import { useNavigate } from "react-router"; import { listVolumes } from "~/api-client"; import { listVolumesOptions } from "~/api-client/@tanstack/react-query.gen"; import { CreateVolumeDialog } from "~/components/create-volume-dialog"; import { StatusDot } from "~/components/status-dot"; import { Button } from "~/components/ui/button"; import { Input } from "~/components/ui/input"; import { Select, SelectContent, SelectItem, SelectTrigger, SelectValue } from "~/components/ui/select"; import { Table, TableBody, TableCaption, TableCell, TableHead, TableHeader, TableRow } from "~/components/ui/table"; import { VolumeIcon } from "~/components/volume-icon"; import type { Route } from "./+types/home"; export function meta(_: Route.MetaArgs) { return [ { title: "Ironmount" }, { name: "description", content: "Create, manage, monitor, and automate your Docker volumes with ease.", }, ]; } export const clientLoader = async () => { const volumes = await listVolumes(); if (volumes.data) return { volumes: volumes.data.volumes }; return { volumes: [] }; }; export default function Home({ loaderData }: Route.ComponentProps) { const [createVolumeOpen, setCreateVolumeOpen] = useState(false); const [searchQuery, setSearchQuery] = useState(""); const [statusFilter, setStatusFilter] = useState(""); const [backendFilter, setBackendFilter] = useState(""); const clearFilters = () => { setSearchQuery(""); setStatusFilter(""); setBackendFilter(""); }; const navigate = useNavigate(); const { data } = useQuery({ ...listVolumesOptions(), initialData: loaderData, refetchInterval: 10000, refetchOnWindowFocus: true, }); const filteredVolumes = data?.volumes.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; }) || []; return ( <>