import { useState, useEffect } from "react"; import { BACKEND_URL, APP_CONFIG } from "../config/constants"; interface BackendHealthCheckProps { backendUrl?: string; checkInterval?: number; } export function BackendHealthCheck({ checkInterval = APP_CONFIG.HEALTH_CHECK_INTERVAL }: BackendHealthCheckProps) { // Only render in development mode if (import.meta.env.PROD) { return null; } const [backendStatus, setBackendStatus] = useState<'loading' | 'online' | 'offline'>('loading'); const [showTooltip, setShowTooltip] = useState(false); const [copied, setCopied] = useState(false); const healthCheckUrl = `${BACKEND_URL}/api/health`; useEffect(() => { const checkBackendHealth = async () => { try { const response = await fetch(healthCheckUrl); if (response.ok) { const data = await response.json(); if (data.status === 'ok') { setBackendStatus('online'); } else { setBackendStatus('offline'); } } else { setBackendStatus('offline'); } } catch (error) { setBackendStatus('offline'); } }; checkBackendHealth(); // Check health at specified interval const interval = setInterval(checkBackendHealth, checkInterval); return () => clearInterval(interval); }, [healthCheckUrl, checkInterval]); const handleCopyCode = async () => { const codeText = `cd backend/\nmake install\nmake backend`; try { await navigator.clipboard.writeText(codeText); setCopied(true); setTimeout(() => setCopied(false), 2000); } catch (err) { console.error('Failed to copy text: ', err); } }; const getStatusColor = () => { switch (backendStatus) { case 'online': return 'bg-green-500'; case 'offline': return 'bg-red-500'; case 'loading': return 'bg-yellow-500'; default: return 'bg-gray-500'; } }; const getStatusText = () => { switch (backendStatus) { case 'online': return 'Backend Online'; case 'offline': return 'Backend Offline'; case 'loading': return 'Checking Backend...'; default: return 'Unknown Status'; } }; return (
backendStatus === 'offline' && setShowTooltip(true)} onMouseLeave={() => setShowTooltip(false)} >
{getStatusText()} {/* Info icon when backend is offline */} {backendStatus === 'offline' && ( )} {/* Tooltip for offline backend */} {showTooltip && backendStatus === 'offline' && (
setShowTooltip(true)} onMouseLeave={() => setShowTooltip(false)} >

Start the server with:

cd backend/
make install
make backend
{/* Arrow pointing up */}
)}
); }