'use client'; import { useForm } from 'react-hook-form'; import { zodResolver } from '@hookform/resolvers/zod'; import * as z from 'zod'; import { Button } from '@/components/ui/button'; import { Form, FormControl, FormDescription, FormField, FormItem, FormLabel, FormMessage, } from '@/components/ui/form'; import { Input } from '@/components/ui/input'; import { Textarea } from '@/components/ui/textarea'; import { useCreateProject, useUpdateProject } from '@/lib/hooks/use-projects'; import type { Project } from '@/types/project'; import { toast } from 'sonner'; import { Loader2 } from 'lucide-react'; const projectSchema = z.object({ name: z .string() .min(1, 'Name is required') .max(100, 'Name must be less than 100 characters'), key: z .string() .min(3, 'Key must be at least 3 characters') .max(10, 'Key must be less than 10 characters') .regex(/^[A-Z]+$/, 'Key must be uppercase letters only'), description: z .string() .max(500, 'Description must be less than 500 characters') .optional(), }); type ProjectFormValues = z.infer; interface ProjectFormProps { project?: Project; onSuccess?: () => void; onCancel?: () => void; } export function ProjectForm({ project, onSuccess, onCancel }: ProjectFormProps) { const isEditing = !!project; const createProject = useCreateProject(); const updateProject = useUpdateProject(project?.id || ''); const form = useForm({ resolver: zodResolver(projectSchema), defaultValues: { name: project?.name || '', key: project?.key || '', description: project?.description || '', }, }); async function onSubmit(data: ProjectFormValues) { try { if (isEditing) { await updateProject.mutateAsync(data); toast.success('Project updated successfully'); } else { await createProject.mutateAsync(data); toast.success('Project created successfully'); } onSuccess?.(); } catch (error) { const message = error instanceof Error ? error.message : 'Operation failed'; toast.error(message); } } const isLoading = createProject.isPending || updateProject.isPending; return (
( Project Name * The display name for your project )} /> ( Project Key * { // Auto-uppercase const value = e.target.value.toUpperCase(); field.onChange(value); }} maxLength={10} /> 3-10 uppercase letters (used in issue IDs like COLA-123) )} /> ( Description