| import type { FC } from 'react' | |
| import { useTranslation } from 'react-i18next' | |
| import Switch from '@/app/components/base/switch' | |
| import type { ModerationContentConfig } from '@/models/debug' | |
| type ModerationContentProps = { | |
| title: string | |
| info?: string | |
| showPreset?: boolean | |
| config: ModerationContentConfig | |
| onConfigChange: (config: ModerationContentConfig) => void | |
| } | |
| const ModerationContent: FC<ModerationContentProps> = ({ | |
| title, | |
| info, | |
| showPreset = true, | |
| config, | |
| onConfigChange, | |
| }) => { | |
| const { t } = useTranslation() | |
| const handleConfigChange = (field: string, value: boolean | string) => { | |
| if (field === 'preset_response' && typeof value === 'string') | |
| value = value.slice(0, 100) | |
| onConfigChange({ ...config, [field]: value }) | |
| } | |
| return ( | |
| <div className='py-2'> | |
| <div className='rounded-lg bg-gray-50 border border-gray-200'> | |
| <div className='flex items-center justify-between px-3 h-10 rounded-lg'> | |
| <div className='shrink-0 text-sm font-medium text-gray-900'>{title}</div> | |
| <div className='grow flex items-center justify-end'> | |
| { | |
| info && ( | |
| <div className='mr-2 text-xs text-gray-500 truncate' title={info}>{info}</div> | |
| ) | |
| } | |
| <Switch | |
| size='l' | |
| defaultValue={config.enabled} | |
| onChange={v => handleConfigChange('enabled', v)} | |
| /> | |
| </div> | |
| </div> | |
| { | |
| config.enabled && showPreset && ( | |
| <div className='px-3 pt-1 pb-3 bg-white rounded-lg'> | |
| <div className='flex items-center justify-between h-8 text-[13px] font-medium text-gray-700'> | |
| {t('appDebug.feature.moderation.modal.content.preset')} | |
| <span className='text-xs font-normal text-gray-500'>{t('appDebug.feature.moderation.modal.content.supportMarkdown')}</span> | |
| </div> | |
| <div className='relative px-3 py-2 h-20 rounded-lg bg-gray-100'> | |
| <textarea | |
| value={config.preset_response || ''} | |
| className='block w-full h-full bg-transparent text-sm outline-none appearance-none resize-none' | |
| placeholder={t('appDebug.feature.moderation.modal.content.placeholder') || ''} | |
| onChange={e => handleConfigChange('preset_response', e.target.value)} | |
| /> | |
| <div className='absolute bottom-2 right-2 flex items-center px-1 h-5 rounded-md bg-gray-50 text-xs font-medium text-gray-300'> | |
| <span>{(config.preset_response || '').length}</span>/<span className='text-gray-500'>100</span> | |
| </div> | |
| </div> | |
| </div> | |
| ) | |
| } | |
| </div> | |
| </div> | |
| ) | |
| } | |
| export default ModerationContent | |