|
|
@@ -3,7 +3,7 @@
|
|
|
*/
|
|
|
'use client';
|
|
|
|
|
|
-import { useState, useEffect } from 'react';
|
|
|
+import { useState, useEffect, useRef } from 'react';
|
|
|
import { MCP_SERVERS, mcpTokenManager, type McpServerConfig } from '@/lib/mcp-token-manager';
|
|
|
|
|
|
/**
|
|
|
@@ -75,11 +75,10 @@ function DevTestAccounts({ mcpType }: { mcpType: string }) {
|
|
|
interface McpServerCardProps {
|
|
|
mcpType: string;
|
|
|
config: McpServerConfig;
|
|
|
- onLoginSuccess?: () => void;
|
|
|
- onLogoutSuccess?: () => void;
|
|
|
+ onConnectionStatusChange?: (mcpType: string, status: { healthy: boolean; loggedIn: boolean }) => void;
|
|
|
}
|
|
|
|
|
|
-export function McpServerCard({ mcpType, config, onLoginSuccess, onLogoutSuccess }: McpServerCardProps) {
|
|
|
+export function McpServerCard({ mcpType, config, onConnectionStatusChange }: McpServerCardProps) {
|
|
|
const [showLoginForm, setShowLoginForm] = useState(false);
|
|
|
const [showTokenForm, setShowTokenForm] = useState(false);
|
|
|
const [email, setEmail] = useState('');
|
|
|
@@ -152,6 +151,27 @@ export function McpServerCard({ mcpType, config, onLoginSuccess, onLogoutSuccess
|
|
|
const remainingTime = mcpTokenManager.getTokenRemainingTime(mcpType);
|
|
|
const hoursRemaining = Math.floor(remainingTime / (1000 * 60 * 60));
|
|
|
|
|
|
+ // 使用 ref 跟踪上次报告的状态,避免重复报告相同状态
|
|
|
+ const lastReportedStatusRef = useRef<{ healthy: boolean | null; loggedIn: boolean }>({
|
|
|
+ healthy: null,
|
|
|
+ loggedIn: false
|
|
|
+ });
|
|
|
+
|
|
|
+ // 向父组件报告连接状态变化
|
|
|
+ useEffect(() => {
|
|
|
+ if (isHealthy !== null) {
|
|
|
+ const lastReported = lastReportedStatusRef.current;
|
|
|
+ // 只在状态真正改变时才报告
|
|
|
+ if (lastReported.healthy !== isHealthy || lastReported.loggedIn !== isLoggedIn) {
|
|
|
+ lastReportedStatusRef.current = { healthy: isHealthy, loggedIn: isLoggedIn };
|
|
|
+ onConnectionStatusChange?.(mcpType, {
|
|
|
+ healthy: isHealthy,
|
|
|
+ loggedIn: isLoggedIn
|
|
|
+ });
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }, [isHealthy, isLoggedIn, mcpType, onConnectionStatusChange]);
|
|
|
+
|
|
|
// 计算连接状态显示
|
|
|
const getConnectionStatus = () => {
|
|
|
if (isHealthy === null) {
|
|
|
@@ -183,7 +203,6 @@ export function McpServerCard({ mcpType, config, onLoginSuccess, onLogoutSuccess
|
|
|
setPassword('');
|
|
|
// 强制刷新组件状态
|
|
|
setUpdateTrigger(prev => prev + 1);
|
|
|
- onLoginSuccess?.();
|
|
|
} else {
|
|
|
setError(result.error || '登录失败');
|
|
|
}
|
|
|
@@ -195,7 +214,6 @@ export function McpServerCard({ mcpType, config, onLoginSuccess, onLogoutSuccess
|
|
|
mcpTokenManager.logoutMcp(mcpType);
|
|
|
// 强制刷新组件状态
|
|
|
setUpdateTrigger(prev => prev + 1);
|
|
|
- onLogoutSuccess?.();
|
|
|
};
|
|
|
|
|
|
const handleSetToken = () => {
|
|
|
@@ -208,7 +226,6 @@ export function McpServerCard({ mcpType, config, onLoginSuccess, onLogoutSuccess
|
|
|
setManualToken('');
|
|
|
setManualUsername('');
|
|
|
setUpdateTrigger(prev => prev + 1);
|
|
|
- onLoginSuccess?.();
|
|
|
};
|
|
|
|
|
|
return (
|