'use client'; import { useState, useEffect } from 'react'; import { useRouter } from 'next/navigation'; import Link from 'next/link'; import { useForm } from 'react-hook-form'; import { zodResolver } from '@hookform/resolvers/zod'; import * as z from 'zod'; import { Card, CardContent, CardHeader, CardTitle } from '@/components/ui/card'; import { Button } from '@/components/ui/button'; import { Input } from '@/components/ui/input'; import { Textarea } from '@/components/ui/textarea'; import { Select, SelectContent, SelectItem, SelectTrigger, SelectValue } from '@/components/ui/select'; import { Form, FormControl, FormField, FormItem, FormLabel, FormMessage } from '@/components/ui/form'; import { Checkbox } from '@/components/ui/checkbox'; import { useUser } from '@/components/user-context'; import { toast } from 'sonner'; import type { User } from '@/types/database'; import { ArrowLeft, Loader2 } from 'lucide-react'; import { getErrorMessage } from '@/lib/error-utils'; const formSchema = z.object({ name: z.string().min(1, '项目名称不能为空'), description: z.string().optional(), project_type: z.string().optional(), pm_id: z.string().optional(), member_ids: z.array(z.string()).optional(), }); type FormValues = z.infer; export default function NewProjectPage() { const router = useRouter(); const { currentUser, users } = useUser(); const [isSubmitting, setIsSubmitting] = useState(false); const form = useForm({ resolver: zodResolver(formSchema), defaultValues: { name: '', description: '', project_type: '', pm_id: '', member_ids: [], }, }); const onSubmit = async (values: FormValues) => { setIsSubmitting(true); try { const res = await fetch('/api/projects', { method: 'POST', headers: { 'Content-Type': 'application/json' }, body: JSON.stringify({ ...values, owner_id: currentUser?.id, }), }); if (!res.ok) { const data = await res.json(); throw new Error(data.error || '创建失败'); } const project = await res.json(); toast.success('项目创建成功'); router.push(`/projects/${project.id}`); } catch (error) { toast.error(getErrorMessage(error)); } finally { setIsSubmitting(false); } }; const pmCandidates = users.filter(u => u.role === 'owner' || u.role === 'pm'); const memberCandidates = users; return (
返回项目列表 新建项目
( 项目名称 * )} /> ( 项目描述