import { useEffect, useState } from "react"; import { useNavigate } from "react-router-dom"; import { LoadIcon } from "../../../components/bs-icons/loading"; import { Button } from "../../../components/bs-ui/button"; import { DialogClose, DialogContent, DialogFooter, DialogHeader, DialogTitle } from "../../../components/bs-ui/dialog"; import { Input, Textarea } from "../../../components/bs-ui/input"; import { createAssistantsApi } from "../../../controllers/API/assistant"; import { captureAndAlertRequestErrorHoc } from "../../../controllers/request"; import { useTranslation } from "react-i18next"; import { TitleIconBg } from "@/components/bs-comp/cardComponent"; import { uploadFileWithProgress, uploadNpcHeaderLibFileWithProgress } from "../../../modals/UploadModal/upload"; import huifumoren from "../../../assets/npc/huifumoren.png"; import npcIcon from "../../../assets/npc/npcIcon.png"; export default function CreateAssistant() { const { t } = useTranslation() // State for form fields const [formData, setFormData] = useState({ name: '', roleAndTasks: `示例: 示例一 示例二 1. XX 2. XX 3. …` }); const [loading, setLoading] = useState(false); // State for errors const [errors, setErrors] = useState({}); // Validate form fields const validateField = (name, value) => { switch (name) { case 'name': if (!value) return t('build.nameRequired'); if (value.length > 50) return t('build.nameMaxLength'); return ''; case 'roleAndTasks': if (value.length < 20) return t('build.forBetter'); return ''; default: return ''; } }; // Handle field change const handleChange = (e) => { const { name, value } = e.target; const error = validateField(name, value); setFormData(prev => ({ ...prev, [name]: value })); setErrors(prev => ({ ...prev, [name]: error })); }; // Validate entire form const validateForm = () => { const formErrors = {}; let isValid = true; Object.keys(formData).forEach(key => { const error = validateField(key, formData[key]); if (error) { formErrors[key] = error; isValid = false; } }); setErrors(formErrors); return isValid; }; const [avatar_img, setAvatar_img] = useState("") const [avatar_color, setAvatar_color] = useState("") const randomNum = Math.floor(Math.random()*(4-0+1)+0).toString(); useEffect(() => { if (avatar_color != "") return setAvatar_color(randomNum); }, [avatar_color]); // Handle form submission const navigate = useNavigate() const handleSubmit = async (e) => { e.preventDefault(); const isValid = validateForm(); if (isValid) { console.log('Form data:', formData); setLoading(true) const res = await captureAndAlertRequestErrorHoc(createAssistantsApi(formData.name, formData.roleAndTasks, avatar_img, avatar_color)) if (res) { window.assistantCreate = true // 标记新建助手 navigate('/assistant/' + res.id) } setLoading(false) } }; const handleButtonClick = () => { // Create a file input element const input = document.createElement("input"); input.type = "file"; input.accept = "image/*"; input.style.display = "none"; // Hidden from view input.multiple = false; // Allow only one file selection input.onchange = (e: Event) => { setLoading(true); // Get the selected file const file = (e.target as HTMLInputElement).files?.[0]; // Check if the file type is correct // Upload the file uploadNpcHeaderLibFileWithProgress(file, (progress) => { }).then(res => { setLoading(false); setAvatar_img(res); }) }; // Trigger the file selection dialog input.click(); }; return 创建NPC
{/* */}
setAvatar_img("")}> 恢复默认
{errors.name &&

名称不可为空

}