import { useState, useEffect } from 'react'; import type { Role, RoleAssignment, RoleMemory } from '../types'; import { t } from '../i18n'; const LANGUAGE_OPTIONS = [ { value: 'en', label: 'English' }, { value: 'zh-TW', label: '繁體中文' }, { value: 'ja', label: '日本語' }, ]; const REPLY_STYLE_OPTIONS = [ { value: 'concise', labelKey: 'roles.concise' }, { value: 'detailed', labelKey: 'roles.detailed' }, { value: 'casual', labelKey: 'roles.casual' }, { value: 'formal', labelKey: 'roles.formal' }, ]; const PLATFORM_OPTIONS = ['telegram', 'discord'] as const; interface RoleFormData { name: string; personality: string; language: string; reply_style: string; reply_mode: string; reply_keywords: string[]; allowed_skills: string; knowledge_context: string; } const emptyForm = (): RoleFormData => ({ name: '', personality: '', language: 'en', reply_style: 'concise', reply_mode: 'smart', reply_keywords: [] as string[], allowed_skills: '', knowledge_context: '', }); interface RoleFormProps { initial?: RoleFormData; onSave: (data: RoleFormData) => Promise; onCancel: () => void; submitLabel: string; } function RoleForm({ initial, onSave, onCancel, submitLabel }: RoleFormProps) { const [form, setForm] = useState(initial ?? emptyForm()); const [saving, setSaving] = useState(false); const [error, setError] = useState(''); const handleSubmit = async (e: React.FormEvent) => { e.preventDefault(); if (!form.name.trim()) { setError(t('roles.name') + ' is required'); return; } setSaving(true); setError(''); try { await onSave(form); } catch (err) { setError(`Save failed: ${(err as Error).message}`); } finally { setSaving(false); } }; const set = (field: keyof RoleFormData) => (e: React.ChangeEvent) => setForm(prev => ({ ...prev, [field]: e.target.value })); return (

{t('roles.replyModeHint')}

{form.reply_mode === 'keywords' && (
setForm(prev => ({ ...prev, reply_keywords: e.target.value.split(',').map(s => s.trim()).filter(Boolean) }))} className="input-base w-full" placeholder="help, weather, remind, 幫忙, 天氣" />
)}