/*global Dingdocs*/ import { useEffect, useState, useCallback } from 'react'; import { initView } from 'dingtalk-docs-cool-app'; import { Typography, Button, Card, Select, Input, Spin } from 'dingtalk-design-desktop'; import './style.css'; interface ApiParam { paramName: string; paramDesc: string; exampleValue?: string; valueList?: string[]; value?: string; } interface ApiItem { id: string; apiName: string; url: string; description: string; aiTableId: string; aiTablename: string; apiParamAuth: ApiParam[]; } interface ApiResponse { code: number; msg: string; data?: any; } interface UserInfo { userId: string; name?: string; avatar?: string; mobile?: string; jobnumber?: string; department?: number[]; permissions?: string[]; [key: string]: any; } function App() { const [loading, setLoading] = useState(true); const [apiList, setApiList] = useState([]); const [currentApi, setCurrentApi] = useState(null); const [apiParams, setApiParams] = useState>({}); const [result, setResult] = useState(''); const [callLoading, setCallLoading] = useState(false); const [userInfo, setUserInfo] = useState(null); const [error, setError] = useState(''); const [documentInfo, setDocumentInfo] = useState<{ uuid: string; currentSheet: string } | null>(null); const [customTableId, setCustomTableId] = useState(''); const [customTableName, setCustomTableName] = useState(''); const loadApiList = useCallback(async () => { try { const list = await Dingdocs.script.run('getApiList'); setApiList(list); } catch (error: any) { console.error('加载 API 列表失败:', error); setError(error.message || '加载 API 列表失败'); } }, []); const handleAutoLogin = useCallback(async () => { try { const urlParams = new URLSearchParams(window.location.search); const corpId = urlParams.get('corpId') || ''; const authResult = await Dingdocs.base.host.getAuthCode(corpId); const authCode = authResult.code; const user = await Dingdocs.script.run('login', authCode); setUserInfo(user); console.log('自动登录成功:', user); } catch (error: any) { console.error('自动登录失败:', error); setError(error.message || '登录失败'); throw error; } }, []); const loadDocumentInfo = useCallback(async () => { try { const info = await Dingdocs.script.run('getDocumentInfo'); setDocumentInfo({ uuid: info?.uuid || '', currentSheet: info?.currentSheet || '' }); setCustomTableId(info?.uuid || ''); setCustomTableName(info?.currentSheet || ''); } catch (error: any) { console.error('获取文档信息失败:', error); } }, []); const handleApiChange = (apiId: string) => { const api = apiList.find(item => item.id === apiId); if (api) { setCurrentApi(api); const params: Record = {}; api.apiParamAuth.forEach(param => { params[param.paramName] = param.value || ''; }); setApiParams(params); setResult(''); } else { setCurrentApi(null); setApiParams({}); setResult(''); } }; const handleParamChange = (paramName: string, value: string) => { setApiParams(prev => ({ ...prev, [paramName]: value })); }; const handleCallApi = async () => { if (!currentApi || callLoading) return; setCallLoading(true); setResult(''); const apiItem = { ...currentApi, aiTableId: customTableId || currentApi.aiTableId, aiTablename: customTableName || currentApi.aiTablename, apiParamAuth: currentApi.apiParamAuth.map(p => ({ paramName: p.paramName, value: apiParams[p.paramName] || p.value || '' })) }; try { const response: ApiResponse = await Dingdocs.script.run('callApi', apiItem); setResult(JSON.stringify(response, null, 2)); } catch (error: any) { setResult(`调用失败: ${error.message}`); } finally { setCallLoading(false); } }; useEffect(() => { initView({ onReady: async () => { setLoading(true); setError(''); try { await handleAutoLogin(); await loadApiList(); loadDocumentInfo(); } catch (error: any) { console.error('初始化失败:', error); setError(error.message || '初始化失败'); } finally { setLoading(false); } }, }); }, [handleAutoLogin, loadApiList, loadDocumentInfo]); if (loading) { return (
加载中...
); } if (error) { return (
{error}
); } return (
API 调用测试
{userInfo?.name || userInfo?.userId || '用户'}
选择 API
{currentApi && (
API 名称: {currentApi.apiName}
功能描述: {currentApi.description}
文档信息
文档 ID (documentId) setCustomTableId(e.target.value)} />
表格名称 (tableName) setCustomTableName(e.target.value)} />
请求参数
{currentApi.apiParamAuth.map(param => (
{param.paramDesc} ({param.paramName}) {param.valueList && param.valueList.length > 0 && param.valueList.some(v => v) ? ( ) : ( handleParamChange(param.paramName, e.target.value)} /> )}
))}
{result && ( 返回结果
{result}
)}
)}
); } export default App;