import * as React from "react"; import { useNavigate } from "@tanstack/react-router"; import { useMutation, useQueryClient } from "@tanstack/react-query"; import { toast } from "sonner"; import { Modal } from "@/client/components/Modal"; import { getStandardErrorMessage } from "@/client/lib/error-messages"; import { setLastProjectId } from "@/client/lib/active-project"; import { createProject } from "@/serverFunctions/projects"; export function CreateProjectModal({ onClose }: { onClose: () => void }) { const navigate = useNavigate(); const queryClient = useQueryClient(); const [name, setName] = React.useState(""); const [domain, setDomain] = React.useState(""); const createMutation = useMutation({ mutationFn: () => createProject({ data: { name: name.trim(), domain: domain.trim() || undefined }, }), onSuccess: async (created) => { setLastProjectId(created.id); await queryClient.invalidateQueries({ queryKey: ["projects"] }); onClose(); toast.success("Project created"); // Land on the new project's settings so they can connect Search Console // and finish setting up the workspace. void navigate({ to: "/p/$projectId/settings", params: { projectId: created.id }, }); }, onError: (error) => toast.error(getStandardErrorMessage(error, "Failed to create project")), }); const isPending = createMutation.isPending; const handleSubmit = (event: React.FormEvent) => { event.preventDefault(); if (isPending) return; if (!name.trim()) { toast.error("Project name is required"); return; } createMutation.mutate(); }; return (

New project

); }