'use client'; import { useCallback } from 'react'; import { useForm } from 'react-hook-form'; import { zodResolver } from '@hookform/resolvers/zod'; import * as z from 'zod'; import { Dialog, DialogContent, DialogDescription, DialogFooter, DialogHeader, DialogTitle, } from '@/components/ui/dialog'; import { Form, FormControl, FormDescription, FormField, FormItem, FormLabel, FormMessage, } from '@/components/ui/form'; import { Input } from '@/components/ui/input'; import { Button } from '@/components/ui/button'; import { useCreateProject } from '@/lib/hooks/use-projects'; import { useAuthStore } from '@/stores/authStore'; import { toast } from 'sonner'; import { logger } from '@/lib/utils/logger'; import type { CreateProjectDto } from '@/types/project'; const projectSchema = z.object({ name: z.string().min(1, 'Project name is required').max(200, 'Project name cannot exceed 200 characters'), description: z.string().max(2000, 'Description cannot exceed 2000 characters').optional(), key: z .string() .min(2, 'Project key must be at least 2 characters') .max(10, 'Project key cannot exceed 10 characters') .regex(/^[A-Z]+$/, 'Project key must contain only uppercase letters'), }); interface CreateProjectDialogProps { open: boolean; onOpenChange: (open: boolean) => void; } export function CreateProjectDialog({ open, onOpenChange, }: CreateProjectDialogProps) { const createProject = useCreateProject(); const user = useAuthStore((state) => state.user); const form = useForm({ resolver: zodResolver(projectSchema), defaultValues: { name: '', description: '', key: '', }, }); const onSubmit = useCallback( async (data: CreateProjectDto) => { // Validate user is logged in if (!user) { toast.error('You must be logged in to create a project'); logger.error('Attempted to create project without authentication'); return; } try { const projectData = { ...data, ownerId: user.id, }; logger.debug('Creating project', projectData); await createProject.mutateAsync(projectData); form.reset(); onOpenChange(false); toast.success('Project created successfully'); } catch (error) { logger.error('Failed to create project', error); toast.error('Failed to create project. Please try again.'); } }, [createProject, form, onOpenChange, user] ); return ( Create New Project Add a new project to organize your work. Click create when you're done.
( Project Name The name of your project. )} /> ( Project Key { field.onChange(e.target.value.toUpperCase()); }} /> A unique identifier for the project (2-10 uppercase letters). )} /> ( Description Optional description for your project. )} />
); }