import { Button } from "@minmon/ui/components/button"; import { StatusBadge } from "@minmon/ui/components/status-badge"; import { useMutation, useQuery } from "@tanstack/react-query"; import { createFileRoute, Link } from "@tanstack/react-router"; import { toast } from "sonner"; import { PageSection, QueryStateCard, ResourceListCard } from "@/components/dashboard-ui"; import { queryClient, trpc, trpcClient } from "@/utils/trpc"; export const Route = createFileRoute("/dashboard/domains")({ component: RouteComponent, }); function dnsStatusVariant(status: "MATCH" | "MISMATCH" | "UNRESOLVED") { if (status === "MATCH") return "success" as const; if (status === "MISMATCH") return "warning" as const; return "destructive" as const; } function RouteComponent() { const domains = useQuery(trpc.domains.list.queryOptions()); const services = useQuery(trpc.services.list.queryOptions()); const removeDomain = useMutation({ mutationFn: async (id: string) => trpcClient.domains.delete.mutate({ id }), onSuccess: async () => { toast.success("Domain deleted"); await queryClient.invalidateQueries(); }, onError: (error) => toast.error(error.message), }); const checkDns = useMutation({ mutationFn: async (id: string) => trpcClient.domains.check.mutate({ id }), onSuccess: async () => { toast.success("DNS check completed"); await queryClient.invalidateQueries(); }, onError: (error) => toast.error(error.message), }); if (domains.isLoading || services.isLoading) { return ; } if (domains.isError || services.isError || !domains.data || !services.data) { return ; } const serviceMap = new Map(services.data.map((item) => [item.id, item.name])); return ( } > (
{item.name} {item.remarks || "No remarks"}
), }, { key: "service", header: "Service", render: (item: (typeof domains.data)[number]) => serviceMap.get(item.serviceId) || item.serviceId, }, { key: "expectedServerIp", header: "Expected IP", render: (item: (typeof domains.data)[number]) => item.expectedServerIp, }, { key: "lastResolvedIp", header: "Last resolved IP", render: (item: (typeof domains.data)[number]) => item.lastResolvedIp || "-", }, { key: "status", header: "DNS status", className: "w-36", render: (item: (typeof domains.data)[number]) => ( {item.resolutionStatus} ), }, { key: "actions", header: "Actions", className: "w-44", render: (item: (typeof domains.data)[number]) => (
), }, ]} items={domains.data} emptyTitle="No domains added" emptyDescription="Create a domain after adding a service." />
); }