Spaces:
Sleeping
Sleeping
import React, { useState } from 'react'; | |
import { PromptGroup } from '../../types'; | |
import Input from '../common/Input'; | |
import TextArea from '../common/TextArea'; | |
import Button from '../common/Button'; | |
import CategorySelector from '../Category/CategorySelector'; | |
import { useApp } from '../../contexts/AppContext'; | |
interface PromptGroupFormProps { | |
initialPromptGroup?: Partial<PromptGroup>; | |
onSubmit: (promptGroup: { name: string; description: string; category: string }) => void; | |
onCancel: () => void; | |
} | |
const PromptGroupForm: React.FC<PromptGroupFormProps> = ({ | |
initialPromptGroup = {}, | |
onSubmit, | |
onCancel | |
}) => { | |
const { categories } = useApp(); | |
const [name, setName] = useState(initialPromptGroup.name || ''); | |
const [description, setDescription] = useState(initialPromptGroup.description || ''); | |
const [category, setCategory] = useState(initialPromptGroup.category || (categories.length > 0 ? categories[0]._id : '')); | |
const [errors, setErrors] = useState({ | |
name: '', | |
category: '' | |
}); | |
const validate = (): boolean => { | |
const newErrors = { | |
name: '', | |
category: '' | |
}; | |
if (!name.trim()) { | |
newErrors.name = '请输入提示词组名称'; | |
} | |
if (!category) { | |
newErrors.category = '请选择分类'; | |
} | |
setErrors(newErrors); | |
return !newErrors.name && !newErrors.category; | |
}; | |
const handleSubmit = (e: React.FormEvent) => { | |
e.preventDefault(); | |
if (!validate()) return; | |
// 确保 category 是字符串类型 | |
const categoryId = typeof category === 'object' ? category._id : category; | |
onSubmit({ | |
name: name.trim(), | |
description: description.trim(), | |
category: categoryId | |
}); | |
}; | |
const handleCategoryChange = (categoryId: string) => { | |
setCategory(categoryId); | |
if (errors.category) { | |
setErrors(prev => ({ ...prev, category: '' })); | |
} | |
}; | |
return ( | |
<form onSubmit={handleSubmit} className="space-y-4"> | |
<Input | |
label="名称" | |
placeholder="输入提示词组名称" | |
value={name} | |
onChange={(e) => setName(e.target.value)} | |
error={errors.name} | |
required | |
/> | |
<TextArea | |
label="描述" | |
placeholder="输入提示词组描述..." | |
value={description} | |
onChange={(e) => setDescription(e.target.value)} | |
rows={4} | |
/> | |
<div> | |
<label className="block text-sm font-medium mb-1 text-gray-700"> | |
分类 {errors.category && <span className="text-red-600">({errors.category})</span>} | |
</label> | |
<CategorySelector | |
selectedCategory={category} | |
onChange={handleCategoryChange} | |
/> | |
</div> | |
<div className="flex justify-end space-x-3 mt-6"> | |
<Button | |
type="button" | |
variant="secondary" | |
onClick={onCancel} | |
> | |
取消 | |
</Button> | |
<Button | |
type="submit" | |
variant="primary" | |
> | |
保存 | |
</Button> | |
</div> | |
</form> | |
); | |
}; | |
export default PromptGroupForm; |