import React, { useState } from "react"; import { Button } from "@/components/ui/button"; import { Input } from "@/components/ui/input"; import { Label } from "@/components/ui/label"; import { Dialog, DialogContent, DialogDescription, DialogFooter, DialogHeader, DialogTitle, } from "@/components/ui/dialog"; import { useCreateApp } from "@/hooks/useCreateApp"; import { useCheckName } from "@/hooks/useCheckName"; import { useSetAtom } from "jotai"; import { selectedAppIdAtom } from "@/atoms/appAtoms"; import { NEON_TEMPLATE_IDS, Template } from "@/shared/templates"; import { useRouter } from "@tanstack/react-router"; import { Loader2 } from "lucide-react"; import { neonTemplateHook } from "@/client_logic/template_hook"; import { showError } from "@/lib/toast"; interface CreateAppDialogProps { open: boolean; onOpenChange: (open: boolean) => void; template: Template | undefined; } export function CreateAppDialog({ open, onOpenChange, template, }: CreateAppDialogProps) { const setSelectedAppId = useSetAtom(selectedAppIdAtom); const [appName, setAppName] = useState(""); const [isSubmitting, setIsSubmitting] = useState(false); const { createApp } = useCreateApp(); const { data: nameCheckResult } = useCheckName(appName); const router = useRouter(); const handleSubmit = async (e: React.FormEvent) => { e.preventDefault(); if (!appName.trim()) { return; } if (nameCheckResult?.exists) { return; } setIsSubmitting(true); try { const result = await createApp({ name: appName.trim() }); if (template && NEON_TEMPLATE_IDS.has(template.id)) { await neonTemplateHook({ appId: result.app.id, appName: result.app.name, }); } setSelectedAppId(result.app.id); // Navigate to the new app's first chat router.navigate({ to: "/chat", search: { id: result.chatId }, }); setAppName(""); onOpenChange(false); } catch (error) { showError(error as any); // Error is already handled by createApp hook or shown above console.error("Error creating app:", error); } finally { setIsSubmitting(false); } }; const isNameValid = appName.trim().length > 0; const nameExists = nameCheckResult?.exists; const canSubmit = isNameValid && !nameExists && !isSubmitting; return ( Create New App {`Create a new app using the ${template?.title} template.`}
setAppName(e.target.value)} placeholder="Enter app name..." className={nameExists ? "border-red-500" : ""} disabled={isSubmitting} /> {nameExists && (

An app with this name already exists

)}
); }