/* * Network Overview Tab Component for Enterprise Dashboard * Shows network-wide status and critical alerts */ import React, { useEffect, useState } from 'react'; import { Card, CardContent, CardHeader, CardTitle } from '../ui/Card'; import { Button } from '../ui/Button'; import { Network, AlertTriangle, CheckCircle2, Activity, TrendingUp, Bell, Clock } from 'lucide-react'; import { useTranslation } from 'react-i18next'; import SystemStatusBlock from './blocks/SystemStatusBlock'; import NetworkSummaryCards from './NetworkSummaryCards'; import { useControlPanelData } from '../../api/hooks/useControlPanelData'; import { useNetworkSummary } from '../../api/hooks/useEnterpriseDashboard'; import { useSSEEvents } from '../../hooks/useSSE'; interface NetworkOverviewTabProps { tenantId: string; onOutletClick?: (outletId: string, outletName: string) => void; } const NetworkOverviewTab: React.FC = ({ tenantId, onOutletClick }) => { const { t } = useTranslation('dashboard'); // Get network-wide control panel data (for system status) const { data: controlPanelData, isLoading: isControlPanelLoading } = useControlPanelData(tenantId); // Get network summary data const { data: networkSummary, isLoading: isNetworkSummaryLoading } = useNetworkSummary(tenantId); // Real-time SSE events const { events: sseEvents, isConnected: sseConnected } = useSSEEvents({ channels: ['*.alerts', '*.notifications', 'recommendations'] }); // State for real-time notifications const [recentEvents, setRecentEvents] = useState([]); const [showAllEvents, setShowAllEvents] = useState(false); // Process SSE events for real-time notifications useEffect(() => { if (sseEvents.length === 0) return; // Filter relevant events for network overview const relevantEventTypes = [ 'network_alert', 'outlet_performance_update', 'distribution_route_update', 'batch_completed', 'batch_started', 'delivery_received', 'delivery_overdue', 'equipment_maintenance', 'production_delay', 'stock_receipt_incomplete' ]; const networkEvents = sseEvents.filter(event => relevantEventTypes.includes(event.event_type) ); // Keep only the 5 most recent events setRecentEvents(networkEvents.slice(0, 5)); }, [sseEvents]); const isLoading = isControlPanelLoading || isNetworkSummaryLoading; return (
{/* Network Status Block - Reusing SystemStatusBlock with network-wide data */}

{t('enterprise.network_status')}

{/* Network Summary Cards */}

{t('enterprise.network_summary')}

{/* Quick Actions */}

{t('enterprise.quick_actions')}

{t('enterprise.add_outlet')}

{t('enterprise.add_outlet_description')}

{t('enterprise.internal_transfers')}

{t('enterprise.manage_transfers')}

{t('enterprise.view_alerts')}

{t('enterprise.network_alerts_description')}

{/* Network Health Indicators */}

{t('enterprise.network_health')}

{/* On-time Delivery Rate */} {t('enterprise.on_time_delivery')}
{controlPanelData?.orchestrationSummary?.aiHandlingRate || 0}%

{t('enterprise.delivery_performance')}

{/* Issue Prevention Rate */} {t('enterprise.issue_prevention')}
{controlPanelData?.issuesPreventedByAI || 0}

{t('enterprise.issues_prevented')}

{/* Active Issues */} {t('enterprise.active_issues')}
{controlPanelData?.issuesRequiringAction || 0}

{t('enterprise.action_required')}

{/* Network Efficiency */} {t('enterprise.network_efficiency')}
{Math.round((controlPanelData?.issuesPreventedByAI || 0) / Math.max(1, (controlPanelData?.issuesPreventedByAI || 0) + (controlPanelData?.issuesRequiringAction || 0)) * 100) || 0}%

{t('enterprise.operational_efficiency')}

{/* Real-time Events Notification */}

{t('enterprise.real_time_events')}

{t('enterprise.recent_activity')} {sseConnected ? (
{t('enterprise.live_updates')}
) : (
{t('enterprise.offline')}
)}
{recentEvents.length > 0 ? (
{recentEvents.slice(0, showAllEvents ? recentEvents.length : 3).map((event, index) => { // Determine event icon and color based on type const getEventConfig = () => { switch (event.event_type) { case 'network_alert': case 'production_delay': case 'equipment_maintenance': return { icon: AlertTriangle, color: 'text-[var(--color-warning)]' }; case 'batch_completed': case 'delivery_received': return { icon: CheckCircle2, color: 'text-[var(--color-success)]' }; case 'batch_started': case 'outlet_performance_update': return { icon: Activity, color: 'text-[var(--color-info)]' }; case 'delivery_overdue': case 'stock_receipt_incomplete': return { icon: Clock, color: 'text-[var(--color-danger)]' }; default: return { icon: Bell, color: 'text-[var(--color-primary)]' }; } }; const { icon: EventIcon, color } = getEventConfig(); const eventTime = new Date(event.timestamp || event.created_at || Date.now()); return (

{event.event_type.replace(/_/g, ' ')}

{eventTime.toLocaleTimeString()}

{event.message && (

{event.message}

)} {event.entity_type && event.entity_id && (

{event.entity_type}: {event.entity_id}

)}
); })} {recentEvents.length > 3 && !showAllEvents && ( )} {showAllEvents && recentEvents.length > 3 && ( )}
) : (
{sseConnected ? t('enterprise.no_recent_activity') : t('enterprise.waiting_for_updates')}
)}
); }; export default NetworkOverviewTab;