import { useMutation, useQuery } from "@tanstack/react-query"; import { Copy } from "lucide-react"; import { useState } from "react"; import { toast } from "sonner"; import { type ListVolumesResponse, listVolumes } from "~/api-client"; import { deleteVolumeMutation, listVolumesOptions } from "~/api-client/@tanstack/react-query.gen"; import { CreateVolumeDialog } from "~/components/create-volume-dialog"; import { EditVolumeDialog } from "~/components/edit-volume-dialog"; 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 { parseError } from "~/lib/errors"; import { cn } from "~/lib/utils"; 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 [volumeToEdit, setVolumeToEdit] = useState(); const [createVolumeOpen, setCreateVolumeOpen] = useState(false); const deleteVol = useMutation({ ...deleteVolumeMutation(), onSuccess: () => { toast.success("Volume deleted successfully"); }, onError: (error) => { toast.error("Failed to delete volume", { description: parseError(error)?.message, }); }, }); const handleDeleteConfirm = (name: string) => { if (confirm(`Are you sure you want to delete the volume "${name}"? This action cannot be undone.`)) { deleteVol.mutate({ path: { name } }); } }; const { data } = useQuery({ ...listVolumesOptions(), initialData: loaderData, }); return (

Ironmount

Create, manage, monitor, and automate your volumes with ease.

A list of your managed volumes. Name Backend Mountpoint Status Actions {data?.volumes.map((volume) => ( {volume.name} {volume.path}
))}
setVolumeToEdit(undefined)} initialValues={volumeToEdit} />
); }