import { Button } from "@minmon/ui/components/button"; import { useForm } from "@tanstack/react-form"; import { useMutation, useQuery } from "@tanstack/react-query"; import { createFileRoute, useNavigate } from "@tanstack/react-router"; import { toast } from "sonner"; import { FormCard, PageSection, QueryStateCard, TextAreaField, TextField } from "@/components/dashboard-ui"; import { queryClient, trpc, trpcClient } from "@/utils/trpc"; export const Route = createFileRoute("/dashboard/domains/new")({ component: RouteComponent, }); type DomainFormValues = { serviceId: string; name: string; expectedServerIp: string; remarks: string; }; function RouteComponent() { const navigate = useNavigate(); const services = useQuery(trpc.domains.serviceOptions.queryOptions()); const createDomain = useMutation({ mutationFn: async (values: DomainFormValues) => trpcClient.domains.create.mutate({ serviceId: values.serviceId, name: values.name, expectedServerIp: values.expectedServerIp || undefined, remarks: values.remarks || null, }), onSuccess: async (created) => { toast.success("Domain created"); await queryClient.invalidateQueries(); navigate({ to: "/dashboard/domains/$domainId", params: { domainId: created.id } }); }, onError: (error) => toast.error(error.message), }); const defaultValues: DomainFormValues = { serviceId: "", name: "", expectedServerIp: "", remarks: "", }; const form = useForm({ defaultValues, onSubmit: async ({ value }) => { await createDomain.mutateAsync(value); }, }); if (services.isLoading) { return ; } if (services.isError || !services.data) { return ; } return (
{ e.preventDefault(); e.stopPropagation(); form.handleSubmit(); }} > ({ isSubmitting: state.isSubmitting })}> {({ isSubmitting }) => } } > {(field) => ( field.handleChange(e.target.value)} description={`Available: ${services.data.map((item) => `${item.name} (${item.id})`).join(", ")}`} /> )}
{(field) => field.handleChange(e.target.value)} placeholder="dashboard.minmon.dev" />} {(field) => field.handleChange(e.target.value)} placeholder="203.0.113.10" />}
{(field) => field.handleChange(e.target.value)} />}
); }