import { Alert, Button, Drawer, Input, InputNumber, Select, Space, Switch, Typography } from '@arco-design/web-react' import { useEffect, useMemo, useState } from 'react' import type { NotificationDetail, NotificationPayload, NotificationType } from '../../types/notifications' import { getNotificationFieldConfigs, getNotificationTypeLabel, notificationTypeOptions } from './field-config' interface NotificationFormDrawerProps { visible: boolean loading: boolean testing: boolean initialValue: NotificationDetail | null onCancel: () => void onSubmit: (value: NotificationPayload, notificationId?: number) => Promise onTest: (value: NotificationPayload, notificationId?: number) => Promise } function createEmptyDraft(): NotificationPayload { return { name: '', type: 'webhook', enabled: true, onSuccess: false, onFailure: true, config: {}, } } export function NotificationFormDrawer({ visible, loading, testing, initialValue, onCancel, onSubmit, onTest }: NotificationFormDrawerProps) { const [draft, setDraft] = useState(createEmptyDraft()) const [error, setError] = useState('') useEffect(() => { if (!visible) { return } if (!initialValue) { setDraft(createEmptyDraft()) setError('') return } setDraft({ name: initialValue.name, type: initialValue.type, enabled: initialValue.enabled, onSuccess: initialValue.onSuccess, onFailure: initialValue.onFailure, config: { ...initialValue.config }, }) setError('') }, [initialValue, visible]) const fieldConfigs = useMemo(() => getNotificationFieldConfigs(draft.type), [draft.type]) function updateDraft(patch: Partial) { setDraft((current) => ({ ...current, ...patch })) } function updateConfig(key: string, value: string | number) { setDraft((current) => ({ ...current, config: { ...current.config, [key]: value, }, })) } function validate(value: NotificationPayload) { if (!value.name.trim()) { return '请输入通知名称' } for (const field of fieldConfigs) { if (!field.required) { continue } const currentValue = value.config[field.key] if (typeof currentValue === 'number' && currentValue > 0) { continue } if (typeof currentValue === 'string' && currentValue.trim()) { continue } if (initialValue?.maskedFields?.includes(field.key) && (currentValue === '' || currentValue === undefined)) { continue } return `请填写${field.label}` } return '' } async function handleSubmit() { const validationError = validate(draft) if (validationError) { setError(validationError) return } setError('') await onSubmit(draft, initialValue?.id) } async function handleTest() { const validationError = validate(draft) if (validationError) { setError(validationError) return } setError('') await onTest(draft, initialValue?.id) } return ( {error ? : null}
名称 updateDraft({ name: value })} />
类型 updateConfig(field.key, value)} /> )} {field.description ? ( {field.description} ) : null} {initialValue?.maskedFields?.includes(field.key) && !draft.config[field.key] ? ( 已存在敏感配置,留空则保持不变。 ) : null}
) })}
) }