"use client" import { useState, useEffect } from "react" import { zodResolver } from "@hookform/resolvers/zod" import { useForm } from "react-hook-form" import * as z from "zod" import { Button } from "@/components/ui/button" import { Form, FormControl, FormField, FormItem, FormLabel, FormMessage, } from "@/components/ui/form" import { Input } from "@/components/ui/input" import { Textarea } from "@/components/ui/textarea" import { Card, CardContent, CardDescription, CardFooter, CardHeader, CardTitle, } from "@/components/ui/card" import { toast } from "sonner" const formSchema = z.object({ name: z.string().min(2, "项目名称至少需要2个字符"), account: z.string().min(3, "账号至少需要3个字符"), password: z.string().optional(), confirmPassword: z.string().optional(), phone: z.string().optional(), memo: z.string().optional(), }) interface ProjectEditProps { projectId: string onSuccess?: () => void } interface ProjectData { id: number name: string account: string memo?: string phone?: string } export default function ProjectEdit({ projectId, onSuccess }: ProjectEditProps) { const [isLoading, setIsLoading] = useState(false) const [isFetching, setIsFetching] = useState(true) const form = useForm>({ resolver: zodResolver(formSchema), defaultValues: { name: "", account: "", password: "", confirmPassword: "", phone: "", memo: "", }, }) // 获取项目数据 useEffect(() => { const fetchProject = async () => { setIsFetching(true) try { const response = await fetch(`${process.env.NEXT_PUBLIC_API_BASE_URL}/company/profile/${projectId}`) const data = await response.json() if (data.code === 200) { const project = data.data form.reset({ name: project.name || "", account: project.account || "", password: "", confirmPassword: "", phone: project.phone || "", memo: project.memo || "", }) } else { toast.error(data.msg || "获取项目信息失败") } } catch (error) { toast.error("网络错误,请稍后重试") } finally { setIsFetching(false) } } fetchProject() }, [projectId, form]) const onSubmit = async (values: z.infer) => { // 检查密码是否匹配 if (values.password && values.password !== values.confirmPassword) { toast.error("两次输入的密码不一致") return } setIsLoading(true) try { // 准备请求数据,根据需要添加或移除字段 const updateData: Record = { id: parseInt(projectId), name: values.name, account: values.account, memo: values.memo, phone: values.phone, } // 如果提供了密码,则包含密码字段 if (values.password) { updateData.password = values.password } const response = await fetch(`${process.env.NEXT_PUBLIC_API_BASE_URL}/company/update`, { method: "POST", headers: { "Content-Type": "application/json", }, body: JSON.stringify(updateData), }) const data = await response.json() if (data.code === 200) { toast.success("项目更新成功") if (onSuccess) { onSuccess() } } else { toast.error(data.msg || "更新项目失败") } } catch (error) { toast.error("网络错误,请稍后重试") } finally { setIsLoading(false) } } if (isFetching) { return
加载中...
} return ( 编辑项目 更新项目信息和设置
( 项目名称 )} />
( 账号 )} /> ( 手机号 )} />
( 密码 )} /> ( 确认密码 )} />
( 项目描述