import React from 'react'; import { View, Text, StyleSheet } from 'react-native'; import { Ionicons } from '@expo/vector-icons'; import { SensorHealthMetrics, SensorHealthStatus, WiFiSignalQuality, } from '@/services/ble/types'; import { AppColors, FontSizes, FontWeights, Spacing, BorderRadius } from '@/constants/theme'; interface SensorHealthCardProps { metrics: SensorHealthMetrics; } export function SensorHealthCard({ metrics }: SensorHealthCardProps) { const getHealthColor = (status: SensorHealthStatus): string => { switch (status) { case SensorHealthStatus.EXCELLENT: return AppColors.success; case SensorHealthStatus.GOOD: return '#4CAF50'; case SensorHealthStatus.FAIR: return AppColors.warning; case SensorHealthStatus.POOR: return '#FF9800'; case SensorHealthStatus.CRITICAL: return AppColors.error; default: return AppColors.textSecondary; } }; const getHealthIcon = (status: SensorHealthStatus): keyof typeof Ionicons.glyphMap => { switch (status) { case SensorHealthStatus.EXCELLENT: return 'checkmark-circle'; case SensorHealthStatus.GOOD: return 'checkmark-circle-outline'; case SensorHealthStatus.FAIR: return 'alert-circle-outline'; case SensorHealthStatus.POOR: return 'warning-outline'; case SensorHealthStatus.CRITICAL: return 'close-circle'; default: return 'help-circle-outline'; } }; const getWiFiSignalIcon = (quality: WiFiSignalQuality): keyof typeof Ionicons.glyphMap => { switch (quality) { case WiFiSignalQuality.EXCELLENT: return 'wifi'; case WiFiSignalQuality.GOOD: return 'wifi'; case WiFiSignalQuality.FAIR: return 'wifi-outline'; case WiFiSignalQuality.WEAK: return 'wifi-outline'; default: return 'help-circle-outline'; } }; const getWiFiSignalColor = (quality: WiFiSignalQuality): string => { switch (quality) { case WiFiSignalQuality.EXCELLENT: return AppColors.success; case WiFiSignalQuality.GOOD: return '#4CAF50'; case WiFiSignalQuality.FAIR: return AppColors.warning; case WiFiSignalQuality.WEAK: return AppColors.error; default: return AppColors.textSecondary; } }; const successRate = metrics.communication.successfulCommands + metrics.communication.failedCommands > 0 ? ( (metrics.communication.successfulCommands / (metrics.communication.successfulCommands + metrics.communication.failedCommands)) * 100 ).toFixed(1) : '100'; return ( {/* Header with Overall Health */} {metrics.overallHealth.charAt(0).toUpperCase() + metrics.overallHealth.slice(1)} {metrics.deviceName} {/* Metrics Grid */} {/* Connection Status */} Status {metrics.connectionStatus.charAt(0).toUpperCase() + metrics.connectionStatus.slice(1)} {/* WiFi Signal */} WiFi Signal {metrics.wifiRssi ? `${metrics.wifiRssi} dBm` : 'Unknown'} {/* Last Seen */} Last Seen {metrics.lastSeenMinutesAgo} min ago {/* Success Rate */} Success Rate {successRate}% {/* WiFi Network Info */} {metrics.wifiSsid && ( Connected to {metrics.wifiSsid} )} {/* Communication Stats */} Communication ✓ {metrics.communication.successfulCommands} successful · ✗{' '} {metrics.communication.failedCommands} failed · Avg {metrics.communication.averageResponseTime}ms ); } const styles = StyleSheet.create({ container: { backgroundColor: AppColors.cardBackground, borderRadius: BorderRadius.medium, padding: Spacing.medium, marginBottom: Spacing.medium, }, header: { marginBottom: Spacing.medium, }, healthIndicator: { flexDirection: 'row', alignItems: 'center', gap: Spacing.small, marginBottom: Spacing.small, }, healthText: { fontSize: FontSizes.medium, fontWeight: FontWeights.semibold, }, deviceName: { fontSize: FontSizes.small, color: AppColors.textSecondary, }, metricsGrid: { flexDirection: 'row', flexWrap: 'wrap', gap: Spacing.medium, marginBottom: Spacing.medium, }, metricItem: { width: '48%', }, metricLabel: { fontSize: FontSizes.tiny, color: AppColors.textSecondary, marginBottom: 4, }, metricValue: { flexDirection: 'row', alignItems: 'center', gap: Spacing.tiny, }, metricText: { fontSize: FontSizes.small, fontWeight: FontWeights.medium, color: AppColors.text, }, statusDot: { width: 8, height: 8, borderRadius: 4, }, wifiInfo: { flexDirection: 'row', alignItems: 'center', gap: Spacing.tiny, paddingTop: Spacing.small, borderTopWidth: 1, borderTopColor: AppColors.border, marginBottom: Spacing.small, }, wifiText: { fontSize: FontSizes.tiny, color: AppColors.textSecondary, }, commStats: { paddingTop: Spacing.small, borderTopWidth: 1, borderTopColor: AppColors.border, }, commStatsLabel: { fontSize: FontSizes.tiny, color: AppColors.textSecondary, marginBottom: 4, }, commStatsText: { fontSize: FontSizes.tiny, color: AppColors.textSecondary, }, });