From 54e877cbd8f8790039d6794483e5c5ef37a7d672 Mon Sep 17 00:00:00 2001 From: cheestard <134115886+cheestard@users.noreply.github.com> Date: Wed, 3 Dec 2025 18:55:48 +0800 Subject: [PATCH] feat: add reload button. (#471) --- frontend/src/components/ServerCard.tsx | 35 +++++++++++++++++++++++-- frontend/src/contexts/ServerContext.tsx | 26 ++++++++++++++++++ frontend/src/pages/ServersPage.tsx | 4 ++- locales/en.json | 4 +++ locales/fr.json | 4 +++ locales/tr.json | 4 +++ locales/zh.json | 4 +++ src/controllers/serverController.ts | 27 +++++++++++++++++++ src/routes/index.ts | 2 ++ src/services/mcpService.ts | 12 ++------- 10 files changed, 109 insertions(+), 13 deletions(-) diff --git a/frontend/src/components/ServerCard.tsx b/frontend/src/components/ServerCard.tsx index 7d9da64..cbc4e40 100644 --- a/frontend/src/components/ServerCard.tsx +++ b/frontend/src/components/ServerCard.tsx @@ -15,14 +15,16 @@ interface ServerCardProps { onEdit: (server: Server) => void; onToggle?: (server: Server, enabled: boolean) => Promise; onRefresh?: () => void; + onReload?: (server: Server) => Promise; } -const ServerCard = ({ server, onRemove, onEdit, onToggle, onRefresh }: ServerCardProps) => { +const ServerCard = ({ server, onRemove, onEdit, onToggle, onRefresh, onReload }: ServerCardProps) => { const { t } = useTranslation(); const { showToast } = useToast(); const [isExpanded, setIsExpanded] = useState(false); const [showDeleteDialog, setShowDeleteDialog] = useState(false); const [isToggling, setIsToggling] = useState(false); + const [isReloading, setIsReloading] = useState(false); const [showErrorPopover, setShowErrorPopover] = useState(false); const [copied, setCopied] = useState(false); const errorPopoverRef = useRef(null); @@ -64,6 +66,26 @@ const ServerCard = ({ server, onRemove, onEdit, onToggle, onRefresh }: ServerCar } }; + const handleReload = async (e: React.MouseEvent) => { + e.stopPropagation(); + if (isReloading || !onReload) return; + + setIsReloading(true); + try { + const success = await onReload(server); + if (success) { + showToast(t('server.reloadSuccess') || 'Server reloaded successfully', 'success'); + } else { + showToast( + t('server.reloadError', { serverName: server.name }) || 'Failed to reload server', + 'error', + ); + } + } finally { + setIsReloading(false); + } + }; + const handleErrorIconClick = (e: React.MouseEvent) => { e.stopPropagation(); setShowErrorPopover(!showErrorPopover); @@ -330,7 +352,7 @@ const ServerCard = ({ server, onRemove, onEdit, onToggle, onRefresh }: ServerCar ? 'bg-green-100 text-green-800 hover:bg-green-200 btn-secondary' : 'bg-gray-100 text-gray-800 hover:bg-gray-200 btn-primary' }`} - disabled={isToggling} + disabled={isToggling || isReloading} > {isToggling ? t('common.processing') @@ -339,6 +361,15 @@ const ServerCard = ({ server, onRemove, onEdit, onToggle, onRefresh }: ServerCar : t('server.enable')} + {server.enabled !== false && onReload && ( + + )}