"use client"; import { zodResolver } from "@hookform/resolvers/zod"; import { useAtomValue } from "jotai"; import { useRouter } from "next/navigation"; import { useTranslations } from "next-intl"; import { useState } from "react"; import { useForm } from "react-hook-form"; import * as z from "zod"; import { createWorkspaceMutationAtom } from "@/atoms/workspaces/workspace-mutation.atoms"; import { Button } from "@/components/ui/button"; import { Dialog, DialogContent, DialogDescription, DialogFooter, DialogHeader, DialogTitle, } from "@/components/ui/dialog"; import { Form, FormControl, FormField, FormItem, FormLabel, FormMessage, } from "@/components/ui/form"; import { Input } from "@/components/ui/input"; import { Spinner } from "@/components/ui/spinner"; import { trackWorkspaceCreated } from "@/lib/posthog/events"; import { cacheKeys } from "@/lib/query-client/cache-keys"; import { queryClient } from "@/lib/query-client/client"; const formSchema = z.object({ name: z.string().min(1, "Name is required"), description: z.string().optional(), }); type FormValues = z.infer; interface CreateWorkspaceDialogProps { open: boolean; onOpenChange: (open: boolean) => void; } export function CreateWorkspaceDialog({ open, onOpenChange }: CreateWorkspaceDialogProps) { const t = useTranslations("workspace"); const tCommon = useTranslations("common"); const router = useRouter(); const [isSubmitting, setIsSubmitting] = useState(false); const { mutateAsync: createWorkspace } = useAtomValue(createWorkspaceMutationAtom); const form = useForm({ resolver: zodResolver(formSchema), defaultValues: { name: "", description: "", }, }); const handleSubmit = async (values: FormValues) => { setIsSubmitting(true); try { const result = await createWorkspace({ name: values.name, description: values.description || "", }); trackWorkspaceCreated(result.id, values.name); // Seed the gate's query so it resolves without a loader flash, and // route straight to onboarding vs. new-chat on the first hop. if (result.llm_setup) { queryClient.setQueryData( cacheKeys.modelConnections.setupStatus(result.id), result.llm_setup ); } // A fresh workspace can never be recovery, so this matches the gate, // which is the authoritative net regardless. const isInitialSetup = result.llm_setup?.stage === "initial_setup"; router.push( isInitialSetup ? `/dashboard/${result.id}/onboard` : `/dashboard/${result.id}/new-chat` ); } catch (error) { console.error("Failed to create workspace:", error); setIsSubmitting(false); } }; const handleOpenChange = (newOpen: boolean) => { if (!newOpen) { form.reset(); } onOpenChange(newOpen); }; return (
{t("create_title")} {t("create_description")}
( {t("name_label")} )} /> ( {t("description_label")}{" "} ({tCommon("optional")}) )} />
); }