import React, { useEffect, useMemo, useState } from 'react'; import { Card, Form, Input, Button, Space, message, Spin, Switch, Alert, Descriptions, Tag, } from 'antd'; import { SaveOutlined, ApiOutlined, CheckCircleOutlined, CloseCircleOutlined, } from '@ant-design/icons'; import api from '../../api'; interface DingTalkConfig { agentId: string; appSecret: string; corpId: string; startEnable: boolean; } /** Utility: recursively flatten org tree nodes to extract user ids (for import guard) */ // eslint-disable-next-line @typescript-eslint/no-explicit-any const getAllUsers = (nodes: any[]): Array<{ userid: string }> => { return nodes.flatMap((n) => [...(n.users ?? []), ...getAllUsers(n.children ?? [])]); }; const IntegrationConfigPage: React.FC = () => { const [loading, setLoading] = useState(false); const [saving, setSaving] = useState(false); const [testing, setTesting] = useState(false); const [config, setConfig] = useState(null); const [verified, setVerified] = useState(null); const [form] = Form.useForm(); const fetchConfig = async () => { setLoading(true); try { const res = await api.get<{ success: boolean; data: Array<{ type: string; verify: boolean; config: DingTalkConfig }> }>('/integration/config'); const dt = res.data?.find((c) => c.type === 'DINGTALK'); if (dt) { setConfig(dt.config); setVerified(dt.verify); form.setFieldsValue(dt.config); } } catch { // not configured } finally { setLoading(false); } }; useEffect(() => { fetchConfig(); }, []); const handleSave = async () => { const values = await form.validateFields(); setSaving(true); try { await api.post('/integration/config', { type: 'DINGTALK', config: values }); message.success('配置已保存'); await fetchConfig(); } catch (e: unknown) { const err = e as { message?: string }; message.error(err?.message || '保存失败'); } finally { setSaving(false); } }; const handleTest = async () => { const values = await form.validateFields(); setTesting(true); try { const res = await api.post<{ success: boolean; message: string }>('/integration/config/test', { type: 'DINGTALK', config: values, }); setVerified(res.success); message.success(res.message); } catch (e: unknown) { const err = e as { message?: string }; setVerified(false); message.error(err?.message || '连接失败'); } finally { setTesting(false); } }; return ( {verified === true && } color="success">已连接} {verified === false && } color="error">未连接} }> {config && ( {config.corpId || '-'} {config.agentId || '-'} {config.startEnable ? '已启用' : '未启用'} )}
); }; export default IntegrationConfigPage;