2
0

Header.tsx 2.7 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283
  1. /**
  2. * 页面头部组件
  3. *
  4. * 核心概念:
  5. * - Web UI 是 MCP 测试工具,不需要全局登录
  6. * - 显示已连接的 MCP 服务器数量
  7. */
  8. 'use client';
  9. import { useState, useEffect } from 'react';
  10. import Link from 'next/link';
  11. import { mcpTokenManager } from '@/lib/mcp-token-manager';
  12. export default function Header() {
  13. const [loggedInCount, setLoggedInCount] = useState(0);
  14. const [total, setTotal] = useState(0);
  15. useEffect(() => {
  16. // 更新 MCP 登录状态
  17. const updateStatus = () => {
  18. const servers = Object.keys(mcpTokenManager as any).filter(k => k.startsWith('novel-'));
  19. setLoggedInCount(mcpTokenManager.getLoggedInMcpList().length);
  20. setTotal(servers.length || 3);
  21. };
  22. updateStatus();
  23. // 监听 storage 变化
  24. const handleStorageChange = () => updateStatus();
  25. window.addEventListener('storage', handleStorageChange);
  26. return () => window.removeEventListener('storage', handleStorageChange);
  27. }, []);
  28. return (
  29. <header className="bg-white dark:bg-gray-800 border-b dark:border-gray-700 px-6 py-4">
  30. <div className="flex items-center justify-between">
  31. <div className="flex items-center space-x-4">
  32. <h1 className="text-xl font-bold text-gray-800 dark:text-white">
  33. AI MCP Web UI
  34. </h1>
  35. <nav className="flex space-x-4">
  36. <Link href="/" className="text-gray-600 dark:text-gray-300 hover:text-blue-500">
  37. 聊天
  38. </Link>
  39. <Link href="/mcp" className="text-gray-600 dark:text-gray-300 hover:text-blue-500">
  40. MCP 管理
  41. </Link>
  42. </nav>
  43. </div>
  44. <div className="flex items-center space-x-4">
  45. {/* MCP 连接状态 */}
  46. <div className="flex items-center space-x-2 text-sm">
  47. <span className="text-gray-600 dark:text-gray-400">MCP 连接:</span>
  48. <span className={`px-2 py-1 rounded ${
  49. loggedInCount > 0
  50. ? 'bg-green-100 dark:bg-green-900 text-green-800 dark:text-green-200'
  51. : 'bg-gray-100 dark:bg-gray-700 text-gray-600 dark:text-gray-400'
  52. }`}>
  53. {loggedInCount}/{total}
  54. </span>
  55. </div>
  56. {loggedInCount > 0 ? (
  57. <Link
  58. href="/mcp"
  59. className="text-sm text-blue-500 hover:text-blue-600"
  60. >
  61. 管理连接
  62. </Link>
  63. ) : (
  64. <Link
  65. href="/mcp"
  66. className="px-4 py-2 text-sm bg-blue-500 text-white rounded-lg hover:bg-blue-600 transition-colors"
  67. >
  68. 连接 MCP
  69. </Link>
  70. )}
  71. </div>
  72. </div>
  73. </header>
  74. );
  75. }