1 line
152 KiB
JSON
1 line
152 KiB
JSON
{"ast":null,"code":"import React,{useState,useEffect}from'react';import{useParams,Link,useNavigate}from'react-router-dom';import{FiArrowLeft,FiEdit,FiTrash2,FiRefreshCw,FiBattery,FiWifi,FiMapPin,FiClock,FiInfo,FiSave,FiCopy,FiServer,FiKey,FiChevronDown,FiChevronUp,FiCode}from'react-icons/fi';import{MapContainer,TileLayer,Marker,Popup}from'react-leaflet';import'leaflet/dist/leaflet.css';import L from'leaflet';import EditDeviceModal from'../components/EditDeviceModal';import{deviceApi}from'../services/api';// Fix for Leaflet marker icons\nimport{jsx as _jsx,jsxs as _jsxs}from\"react/jsx-runtime\";delete L.Icon.Default.prototype._getIconUrl;L.Icon.Default.mergeOptions({iconRetinaUrl:'https://unpkg.com/leaflet@1.7.1/dist/images/marker-icon-2x.png',iconUrl:'https://unpkg.com/leaflet@1.7.1/dist/images/marker-icon.png',shadowUrl:'https://unpkg.com/leaflet@1.7.1/dist/images/marker-shadow.png'});// Dummy data for demonstration\nconst dummyDevices=[{id:'device-001',name:'SIM7000E-001',description:'Solar panel monitoring device',model:'SIM7000E',firmware_version:'1.2.3',status:'online',battery:{level:85,status:'good'},signal:{strength:-65,status:'good'},location:{latitude:47.3769,longitude:8.5417,altitude:408},last_seen:new Date().toISOString(),created_at:new Date(Date.now()-7776000000).toISOString()// 90 days ago\n},{id:'device-002',name:'SIM7000E-002',description:'Wind turbine monitoring device',model:'SIM7000E',firmware_version:'1.2.3',status:'idle',battery:{level:42,status:'low'},signal:{strength:-85,status:'fair'},location:{latitude:47.3780,longitude:8.5390,altitude:410},last_seen:new Date(Date.now()-3600000).toISOString(),// 1 hour ago\ncreated_at:new Date(Date.now()-15552000000).toISOString()// 180 days ago\n}];// Dummy telemetry data\nconst dummyTelemetry=[{id:1,device_id:'device-001',latitude:47.3769,longitude:8.5417,altitude:408,battery_level:85,signal_strength:-65,temperature:24.5,timestamp:new Date().toISOString()},{id:2,device_id:'device-001',latitude:47.3769,longitude:8.5417,altitude:408,battery_level:86,signal_strength:-64,temperature:24.2,timestamp:new Date(Date.now()-3600000).toISOString()// 1 hour ago\n},{id:3,device_id:'device-001',latitude:47.3770,longitude:8.5418,altitude:408,battery_level:87,signal_strength:-63,temperature:23.8,timestamp:new Date(Date.now()-7200000).toISOString()// 2 hours ago\n}];// Dummy logs data\nconst dummyLogs=[{id:1,device_id:'device-001',level:'info',message:'Device connected to network',source:'connection_manager',timestamp:new Date().toISOString()},{id:2,device_id:'device-001',level:'warning',message:'Battery level below 90%',source:'power_monitor',timestamp:new Date(Date.now()-1800000).toISOString()// 30 minutes ago\n},{id:3,device_id:'device-001',level:'info',message:'GPS location updated',source:'gps_module',timestamp:new Date(Date.now()-3600000).toISOString()// 1 hour ago\n}];const DeviceDetail=()=>{const{id}=useParams();const navigate=useNavigate();const[device,setDevice]=useState(null);const[telemetry,setTelemetry]=useState([]);const[logs,setLogs]=useState([]);const[loading,setLoading]=useState(true);const[activeTab,setActiveTab]=useState('overview');const[refreshing,setRefreshing]=useState(false);const[copySuccess,setCopySuccess]=useState('');const[expandedApiSection,setExpandedApiSection]=useState('');const[showEditModal,setShowEditModal]=useState(false);const[deleteConfirm,setDeleteConfirm]=useState(false);useEffect(()=>{fetchDeviceData();},[id]);const fetchDeviceData=async()=>{try{setLoading(true);const token=localStorage.getItem('token');// Fetch device data from API\nconst deviceResponse=await fetch(`/api/devices/${id}`,{headers:{'Authorization':`Bearer ${token}`}});if(deviceResponse.ok){const deviceData=await deviceResponse.json();// Transform the device data to include frontend display properties\nconst transformedDevice={...deviceData,status:getDeviceStatus(deviceData),battery:getBatteryInfo(deviceData),signal:getSignalInfo(deviceData),location:{latitude:deviceData.latitude||47.3769,// Default location if none set\nlongitude:deviceData.longitude||8.5417,altitude:deviceData.altitude||408}};setDevice(transformedDevice);// For now, use dummy telemetry and logs until those APIs are implemented\nconst deviceTelemetry=dummyTelemetry.filter(t=>t.device_id===id);const deviceLogs=dummyLogs.filter(l=>l.device_id===id);setTelemetry(deviceTelemetry);setLogs(deviceLogs);}else if(deviceResponse.status===404){// Device not found in API, try dummy data for existing demo devices\nconst foundDevice=dummyDevices.find(d=>d.id===id);if(foundDevice){setDevice(foundDevice);const deviceTelemetry=dummyTelemetry.filter(t=>t.device_id===id);const deviceLogs=dummyLogs.filter(l=>l.device_id===id);setTelemetry(deviceTelemetry);setLogs(deviceLogs);}else{setDevice(null);// This will show the \"Device Not Found\" message\n}}else{console.error('Failed to fetch device:',deviceResponse.status);setDevice(null);}}catch(error){console.error('Error fetching device data:',error);// Fall back to dummy data\nconst foundDevice=dummyDevices.find(d=>d.id===id);if(foundDevice){setDevice(foundDevice);const deviceTelemetry=dummyTelemetry.filter(t=>t.device_id===id);const deviceLogs=dummyLogs.filter(l=>l.device_id===id);setTelemetry(deviceTelemetry);setLogs(deviceLogs);}else{setDevice(null);}}finally{setLoading(false);}};// Helper functions to transform backend data\nconst getDeviceStatus=device=>{if(!device.is_active)return'offline';if(!device.last_seen)return'offline';const lastSeen=new Date(device.last_seen);const now=new Date();const diffMinutes=(now-lastSeen)/(1000*60);if(diffMinutes<5)return'online';if(diffMinutes<30)return'idle';return'offline';};const getBatteryInfo=device=>{const level=device.battery_level||0;let status='good';if(level<20)status='critical';else if(level<50)status='low';return{level,status};};const getSignalInfo=device=>{const strength=device.signal_strength||-100;let status='poor';if(strength>-70)status='good';else if(strength>-85)status='fair';return{strength,status};};// Helper function to format date\nconst formatDate=dateString=>{const date=new Date(dateString);return date.toLocaleString();};// Helper function to get status color\nconst getStatusColor=status=>{switch(status){case'online':return'text-success-500';case'idle':return'text-warning-500';case'offline':return'text-danger-500';default:return'text-gray-500';}};// Helper function to get battery color\nconst getBatteryColor=status=>{switch(status){case'good':return'text-success-500';case'low':return'text-warning-500';case'critical':return'text-danger-500';default:return'text-gray-500';}};// Helper function to get signal color\nconst getSignalColor=status=>{switch(status){case'good':return'text-success-500';case'fair':return'text-warning-500';case'poor':return'text-danger-500';default:return'text-gray-500';}};// Helper function to get log level color\nconst getLevelColor=level=>{switch(level){case'debug':return'text-gray-500 bg-gray-100';case'info':return'text-blue-500 bg-blue-100';case'warning':return'text-yellow-500 bg-yellow-100';case'error':return'text-red-500 bg-red-100';case'critical':return'text-white bg-red-500';default:return'text-gray-500 bg-gray-100';}};// Handle refresh\nconst handleRefresh=async()=>{setRefreshing(true);await fetchDeviceData();setRefreshing(false);};// Handle copy to clipboard\nconst handleCopy=async(text,label)=>{try{await navigator.clipboard.writeText(text);setCopySuccess(label);setTimeout(()=>setCopySuccess(''),2000);}catch(err){console.error('Failed to copy: ',err);}};// Generate API endpoints for the device\nconst getApiEndpoints=()=>{const baseUrl=window.location.origin;return{telemetry:`${baseUrl}/api/data/${device===null||device===void 0?void 0:device.id}`,status:`${baseUrl}/api/devices/${device===null||device===void 0?void 0:device.id}`,logs:`${baseUrl}/api/logs/${device===null||device===void 0?void 0:device.id}`};};// Toggle API documentation sections\nconst toggleApiSection=section=>{setExpandedApiSection(expandedApiSection===section?'':section);};// Handle edit device\nconst handleEditDevice=()=>{setShowEditModal(true);};const handleCloseEditModal=()=>{setShowEditModal(false);};const handleDeviceUpdated=updatedDevice=>{// Transform the updated device data\nconst transformedDevice={...updatedDevice,status:getDeviceStatus(updatedDevice),battery:getBatteryInfo(updatedDevice),signal:getSignalInfo(updatedDevice),location:{latitude:updatedDevice.latitude||0,longitude:updatedDevice.longitude||0,altitude:updatedDevice.altitude||0}};setDevice(transformedDevice);};// Handle delete device\nconst handleDeleteDevice=()=>{setDeleteConfirm(true);};const confirmDeleteDevice=async()=>{try{await deviceApi.deleteDevice(device.id);navigate('/devices');// Redirect to devices list after deletion\n}catch(error){console.error('Error deleting device:',error);alert('Failed to delete device. Please try again.');setDeleteConfirm(false);}};const cancelDeleteDevice=()=>{setDeleteConfirm(false);};// Generate example API data\nconst getApiExamples=()=>{return{telemetry:{request:{method:'POST',headers:{'Content-Type':'application/json'},body:{device_id:(device===null||device===void 0?void 0:device.id)||'LILYGO_001',device_name:(device===null||device===void 0?void 0:device.name)||'Zurich_Station_1',firmware:'1.1.0',temp:24.3,hum:65.2,solar_volt:12.8,battery_volt:3.8,signal:-65,gps_fixed:true,latitude:47.3769,longitude:8.5417,altitude:408,satellites:8,timestamp:Math.floor(Date.now()/1000)}},response:{status:201,body:{id:123,device_id:(device===null||device===void 0?void 0:device.id)||'LILYGO_001',latitude:47.3769,longitude:8.5417,altitude:408,temperature:24.3,humidity:65.2,solar_voltage:12.8,battery_level:85.5,battery_voltage:3.8,signal_strength:-65,gps_fixed:true,satellites:8,timestamp:new Date().toISOString(),device_timestamp:new Date().toISOString()}}},status:{request:{method:'PUT',headers:{'Content-Type':'application/json','Authorization':'Bearer your-token-here'},body:{name:(device===null||device===void 0?void 0:device.name)||'Your Device Name',firmware_version:\"1.1.0\",is_active:true,battery_level:87.2,signal_strength:-62}},response:{status:200,body:{id:(device===null||device===void 0?void 0:device.id)||'your-device-id',name:(device===null||device===void 0?void 0:device.name)||'Your Device Name',model:'LILYGO T-A7670G',firmware_version:'1.1.0',is_active:true,battery_level:87.2,signal_strength:-62,last_seen:new Date().toISOString(),created_at:new Date().toISOString(),updated_at:new Date().toISOString()}}},logs:{request:{method:'POST',headers:{'Content-Type':'application/json','Authorization':'Bearer your-token-here'},body:{device_id:(device===null||device===void 0?void 0:device.id)||'LILYGO_001',level:\"info\",message:\"Device connected to cellular network\",source:\"network_manager\",timestamp:new Date().toISOString(),metadata:{network_type:\"LTE\",signal_quality:\"good\",operator:\"Swisscom\",modem_model:\"A7670G\"}}},response:{status:201,body:{id:456,device_id:(device===null||device===void 0?void 0:device.id)||'LILYGO_001',level:\"info\",message:\"Device connected to cellular network\",source:\"network_manager\",timestamp:new Date().toISOString(),metadata:{network_type:\"LTE\",signal_quality:\"good\",operator:\"Swisscom\",modem_model:\"A7670G\"}}}}};};if(loading){return/*#__PURE__*/_jsx(\"div\",{className:\"flex items-center justify-center h-full\",children:/*#__PURE__*/_jsxs(\"div\",{className:\"text-center\",children:[/*#__PURE__*/_jsx(\"div\",{className:\"w-16 h-16 border-4 border-primary-500 border-t-transparent rounded-full animate-spin mx-auto\"}),/*#__PURE__*/_jsx(\"p\",{className:\"mt-4 text-gray-600\",children:\"Loading device data...\"})]})});}if(!device){return/*#__PURE__*/_jsxs(\"div\",{className:\"text-center py-10\",children:[/*#__PURE__*/_jsx(\"h2\",{className:\"text-2xl font-semibold text-gray-800 mb-4\",children:\"Device Not Found\"}),/*#__PURE__*/_jsx(\"p\",{className:\"text-gray-600 mb-6\",children:\"The device you are looking for does not exist or has been removed.\"}),/*#__PURE__*/_jsx(Link,{to:\"/devices\",className:\"px-4 py-2 bg-primary-500 text-white rounded-md hover:bg-primary-600 transition-colors\",children:\"Back to Devices\"})]});}return/*#__PURE__*/_jsxs(\"div\",{className:\"space-y-6\",children:[/*#__PURE__*/_jsxs(\"div\",{className:\"flex flex-col md:flex-row md:items-center md:justify-between gap-4\",children:[/*#__PURE__*/_jsxs(\"div\",{className:\"flex items-center gap-4\",children:[/*#__PURE__*/_jsx(Link,{to:\"/devices\",className:\"p-2 text-gray-500 rounded-full hover:bg-gray-100\",children:/*#__PURE__*/_jsx(FiArrowLeft,{className:\"w-5 h-5\"})}),/*#__PURE__*/_jsxs(\"div\",{children:[/*#__PURE__*/_jsx(\"h1\",{className:\"text-2xl font-semibold text-gray-800\",children:device.name}),/*#__PURE__*/_jsx(\"p\",{className:\"text-gray-500\",children:device.description||'No description'})]})]}),/*#__PURE__*/_jsxs(\"div\",{className:\"flex items-center gap-2\",children:[/*#__PURE__*/_jsxs(\"button\",{className:`flex items-center gap-2 px-4 py-2 border border-gray-300 rounded-md hover:bg-gray-50 transition-colors ${refreshing?'opacity-50 cursor-not-allowed':''}`,onClick:handleRefresh,disabled:refreshing,children:[/*#__PURE__*/_jsx(FiRefreshCw,{className:refreshing?'animate-spin':''}),/*#__PURE__*/_jsx(\"span\",{children:\"Refresh\"})]}),/*#__PURE__*/_jsxs(\"button\",{onClick:handleEditDevice,className:\"flex items-center gap-2 px-4 py-2 border border-gray-300 rounded-md hover:bg-gray-50 transition-colors\",children:[/*#__PURE__*/_jsx(FiEdit,{}),/*#__PURE__*/_jsx(\"span\",{children:\"Edit\"})]}),/*#__PURE__*/_jsxs(\"button\",{onClick:handleDeleteDevice,className:\"flex items-center gap-2 px-4 py-2 bg-danger-500 text-white rounded-md hover:bg-danger-600 transition-colors\",children:[/*#__PURE__*/_jsx(FiTrash2,{}),/*#__PURE__*/_jsx(\"span\",{children:\"Delete\"})]})]})]}),/*#__PURE__*/_jsx(\"div\",{className:\"dashboard-card\",children:/*#__PURE__*/_jsxs(\"div\",{className:\"grid grid-cols-1 md:grid-cols-4 gap-4\",children:[/*#__PURE__*/_jsxs(\"div\",{className:\"flex items-center p-4 bg-gray-50 rounded-lg\",children:[/*#__PURE__*/_jsx(\"div\",{className:`h-3 w-3 rounded-full mr-2 ${device.status==='online'?'bg-success-500':device.status==='idle'?'bg-warning-500':'bg-danger-500'}`}),/*#__PURE__*/_jsxs(\"div\",{children:[/*#__PURE__*/_jsx(\"p\",{className:\"text-sm text-gray-500\",children:\"Status\"}),/*#__PURE__*/_jsx(\"p\",{className:`text-lg font-semibold capitalize ${getStatusColor(device.status)}`,children:device.status})]})]}),/*#__PURE__*/_jsxs(\"div\",{className:\"flex items-center p-4 bg-gray-50 rounded-lg\",children:[/*#__PURE__*/_jsx(FiBattery,{className:`w-6 h-6 mr-2 ${getBatteryColor(device.battery.status)}`}),/*#__PURE__*/_jsxs(\"div\",{children:[/*#__PURE__*/_jsx(\"p\",{className:\"text-sm text-gray-500\",children:\"Battery\"}),/*#__PURE__*/_jsxs(\"p\",{className:`text-lg font-semibold ${getBatteryColor(device.battery.status)}`,children:[device.battery.level,\"%\"]})]})]}),/*#__PURE__*/_jsxs(\"div\",{className:\"flex items-center p-4 bg-gray-50 rounded-lg\",children:[/*#__PURE__*/_jsx(FiWifi,{className:`w-6 h-6 mr-2 ${getSignalColor(device.signal.status)}`}),/*#__PURE__*/_jsxs(\"div\",{children:[/*#__PURE__*/_jsx(\"p\",{className:\"text-sm text-gray-500\",children:\"Signal\"}),/*#__PURE__*/_jsxs(\"p\",{className:`text-lg font-semibold ${getSignalColor(device.signal.status)}`,children:[device.signal.strength,\" dBm\"]})]})]}),/*#__PURE__*/_jsxs(\"div\",{className:\"flex items-center p-4 bg-gray-50 rounded-lg\",children:[/*#__PURE__*/_jsx(FiClock,{className:\"w-6 h-6 mr-2 text-gray-500\"}),/*#__PURE__*/_jsxs(\"div\",{children:[/*#__PURE__*/_jsx(\"p\",{className:\"text-sm text-gray-500\",children:\"Last Seen\"}),/*#__PURE__*/_jsx(\"p\",{className:\"text-lg font-semibold text-gray-800\",children:formatDate(device.last_seen)})]})]})]})}),/*#__PURE__*/_jsx(\"div\",{className:\"border-b border-gray-200\",children:/*#__PURE__*/_jsxs(\"nav\",{className:\"-mb-px flex space-x-8\",children:[/*#__PURE__*/_jsx(\"button\",{className:`py-4 px-1 border-b-2 font-medium text-sm ${activeTab==='overview'?'border-primary-500 text-primary-600':'border-transparent text-gray-500 hover:text-gray-700 hover:border-gray-300'}`,onClick:()=>setActiveTab('overview'),children:\"Overview\"}),/*#__PURE__*/_jsx(\"button\",{className:`py-4 px-1 border-b-2 font-medium text-sm ${activeTab==='telemetry'?'border-primary-500 text-primary-600':'border-transparent text-gray-500 hover:text-gray-700 hover:border-gray-300'}`,onClick:()=>setActiveTab('telemetry'),children:\"Telemetry\"}),/*#__PURE__*/_jsx(\"button\",{className:`py-4 px-1 border-b-2 font-medium text-sm ${activeTab==='logs'?'border-primary-500 text-primary-600':'border-transparent text-gray-500 hover:text-gray-700 hover:border-gray-300'}`,onClick:()=>setActiveTab('logs'),children:\"Logs\"}),/*#__PURE__*/_jsx(\"button\",{className:`py-4 px-1 border-b-2 font-medium text-sm ${activeTab==='settings'?'border-primary-500 text-primary-600':'border-transparent text-gray-500 hover:text-gray-700 hover:border-gray-300'}`,onClick:()=>setActiveTab('settings'),children:\"Settings\"})]})}),/*#__PURE__*/_jsxs(\"div\",{children:[activeTab==='overview'&&/*#__PURE__*/_jsxs(\"div\",{className:\"grid grid-cols-1 md:grid-cols-2 gap-6\",children:[/*#__PURE__*/_jsxs(\"div\",{className:\"dashboard-card\",children:[/*#__PURE__*/_jsx(\"h2\",{className:\"text-lg font-semibold text-gray-800 mb-4\",children:\"Device Information\"}),/*#__PURE__*/_jsxs(\"div\",{className:\"space-y-4\",children:[/*#__PURE__*/_jsxs(\"div\",{className:\"grid grid-cols-1 sm:grid-cols-2 gap-4\",children:[/*#__PURE__*/_jsxs(\"div\",{children:[/*#__PURE__*/_jsx(\"p\",{className:\"text-sm text-gray-500\",children:\"Device ID\"}),/*#__PURE__*/_jsx(\"p\",{className:\"font-medium\",children:device.id})]}),/*#__PURE__*/_jsxs(\"div\",{children:[/*#__PURE__*/_jsx(\"p\",{className:\"text-sm text-gray-500\",children:\"Model\"}),/*#__PURE__*/_jsx(\"p\",{className:\"font-medium\",children:device.model})]}),/*#__PURE__*/_jsxs(\"div\",{children:[/*#__PURE__*/_jsx(\"p\",{className:\"text-sm text-gray-500\",children:\"Firmware Version\"}),/*#__PURE__*/_jsxs(\"p\",{className:\"font-medium\",children:[\"v\",device.firmware_version]})]}),/*#__PURE__*/_jsxs(\"div\",{children:[/*#__PURE__*/_jsx(\"p\",{className:\"text-sm text-gray-500\",children:\"Created At\"}),/*#__PURE__*/_jsx(\"p\",{className:\"font-medium\",children:formatDate(device.created_at)})]})]}),/*#__PURE__*/_jsxs(\"div\",{children:[/*#__PURE__*/_jsx(\"p\",{className:\"text-sm text-gray-500\",children:\"Description\"}),/*#__PURE__*/_jsx(\"p\",{className:\"font-medium\",children:device.description||'No description'})]})]})]}),/*#__PURE__*/_jsxs(\"div\",{className:\"dashboard-card h-[300px]\",children:[/*#__PURE__*/_jsx(\"h2\",{className:\"text-lg font-semibold text-gray-800 mb-4\",children:\"Location\"}),/*#__PURE__*/_jsxs(MapContainer,{center:[device.location.latitude,device.location.longitude],zoom:15,style:{height:'calc(100% - 2rem)',width:'100%'},children:[/*#__PURE__*/_jsx(TileLayer,{attribution:\"\\xA9 <a href=\\\"https://www.openstreetmap.org/copyright\\\">OpenStreetMap</a> contributors\",url:\"https://{s}.tile.openstreetmap.org/{z}/{x}/{y}.png\"}),/*#__PURE__*/_jsx(Marker,{position:[device.location.latitude,device.location.longitude],children:/*#__PURE__*/_jsx(Popup,{children:/*#__PURE__*/_jsxs(\"div\",{className:\"p-1\",children:[/*#__PURE__*/_jsx(\"h3\",{className:\"font-semibold\",children:device.name}),/*#__PURE__*/_jsxs(\"p\",{className:\"text-xs text-gray-500\",children:[device.location.latitude.toFixed(6),\", \",device.location.longitude.toFixed(6)]}),/*#__PURE__*/_jsxs(\"p\",{className:\"text-xs text-gray-500\",children:[\"Altitude: \",device.location.altitude,\" m\"]})]})})})]})]}),/*#__PURE__*/_jsxs(\"div\",{className:\"dashboard-card md:col-span-2\",children:[/*#__PURE__*/_jsx(\"h2\",{className:\"text-lg font-semibold text-gray-800 mb-4\",children:\"Recent Activity\"}),/*#__PURE__*/_jsxs(\"div\",{className:\"space-y-4\",children:[logs.slice(0,5).map(log=>/*#__PURE__*/_jsxs(\"div\",{className:\"flex items-start gap-3 p-3 bg-gray-50 rounded-lg\",children:[/*#__PURE__*/_jsx(\"div\",{className:`p-2 rounded-full ${log.level==='info'?'bg-blue-100 text-blue-500':log.level==='warning'?'bg-yellow-100 text-yellow-500':log.level==='error'?'bg-red-100 text-red-500':log.level==='critical'?'bg-red-500 text-white':'bg-gray-100 text-gray-500'}`,children:/*#__PURE__*/_jsx(FiInfo,{className:\"w-5 h-5\"})}),/*#__PURE__*/_jsxs(\"div\",{className:\"flex-1\",children:[/*#__PURE__*/_jsxs(\"div\",{className:\"flex justify-between\",children:[/*#__PURE__*/_jsx(\"p\",{className:\"font-medium text-gray-800\",children:log.message}),/*#__PURE__*/_jsx(\"span\",{className:\"text-sm text-gray-500\",children:formatDate(log.timestamp)})]}),/*#__PURE__*/_jsxs(\"p\",{className:\"text-sm text-gray-500\",children:[\"Source: \",log.source]})]})]},log.id)),logs.length===0&&/*#__PURE__*/_jsx(\"p\",{className:\"text-center py-4 text-gray-500\",children:\"No recent activity\"})]})]})]}),activeTab==='telemetry'&&/*#__PURE__*/_jsxs(\"div\",{className:\"dashboard-card\",children:[/*#__PURE__*/_jsx(\"h2\",{className:\"text-lg font-semibold text-gray-800 mb-4\",children:\"Telemetry Data\"}),telemetry.length===0?/*#__PURE__*/_jsx(\"p\",{className:\"text-center py-4 text-gray-500\",children:\"No telemetry data available\"}):/*#__PURE__*/_jsx(\"div\",{className:\"overflow-x-auto\",children:/*#__PURE__*/_jsxs(\"table\",{className:\"min-w-full divide-y divide-gray-200\",children:[/*#__PURE__*/_jsx(\"thead\",{className:\"bg-gray-50\",children:/*#__PURE__*/_jsxs(\"tr\",{children:[/*#__PURE__*/_jsx(\"th\",{className:\"px-6 py-3 text-left text-xs font-medium text-gray-500 uppercase tracking-wider\",children:\"Timestamp\"}),/*#__PURE__*/_jsx(\"th\",{className:\"px-6 py-3 text-left text-xs font-medium text-gray-500 uppercase tracking-wider\",children:\"Location\"}),/*#__PURE__*/_jsx(\"th\",{className:\"px-6 py-3 text-left text-xs font-medium text-gray-500 uppercase tracking-wider\",children:\"Battery\"}),/*#__PURE__*/_jsx(\"th\",{className:\"px-6 py-3 text-left text-xs font-medium text-gray-500 uppercase tracking-wider\",children:\"Signal\"}),/*#__PURE__*/_jsx(\"th\",{className:\"px-6 py-3 text-left text-xs font-medium text-gray-500 uppercase tracking-wider\",children:\"Temperature\"})]})}),/*#__PURE__*/_jsx(\"tbody\",{className:\"bg-white divide-y divide-gray-200\",children:telemetry.map(item=>/*#__PURE__*/_jsxs(\"tr\",{className:\"hover:bg-gray-50\",children:[/*#__PURE__*/_jsx(\"td\",{className:\"px-6 py-4 whitespace-nowrap text-sm text-gray-500\",children:formatDate(item.timestamp)}),/*#__PURE__*/_jsx(\"td\",{className:\"px-6 py-4 whitespace-nowrap\",children:/*#__PURE__*/_jsxs(\"div\",{className:\"flex items-center\",children:[/*#__PURE__*/_jsx(FiMapPin,{className:\"mr-2 text-gray-500\"}),/*#__PURE__*/_jsxs(\"span\",{className:\"text-gray-800\",children:[item.latitude.toFixed(6),\", \",item.longitude.toFixed(6)]})]})}),/*#__PURE__*/_jsx(\"td\",{className:\"px-6 py-4 whitespace-nowrap\",children:/*#__PURE__*/_jsxs(\"div\",{className:\"flex items-center\",children:[/*#__PURE__*/_jsx(FiBattery,{className:\"mr-2 text-gray-500\"}),/*#__PURE__*/_jsxs(\"span\",{className:\"text-gray-800\",children:[item.battery_level,\"%\"]})]})}),/*#__PURE__*/_jsx(\"td\",{className:\"px-6 py-4 whitespace-nowrap\",children:/*#__PURE__*/_jsxs(\"div\",{className:\"flex items-center\",children:[/*#__PURE__*/_jsx(FiWifi,{className:\"mr-2 text-gray-500\"}),/*#__PURE__*/_jsxs(\"span\",{className:\"text-gray-800\",children:[item.signal_strength,\" dBm\"]})]})}),/*#__PURE__*/_jsxs(\"td\",{className:\"px-6 py-4 whitespace-nowrap text-gray-800\",children:[item.temperature,\"\\xB0C\"]})]},item.id))})]})})]}),activeTab==='logs'&&/*#__PURE__*/_jsxs(\"div\",{className:\"dashboard-card\",children:[/*#__PURE__*/_jsx(\"h2\",{className:\"text-lg font-semibold text-gray-800 mb-4\",children:\"Device Logs\"}),logs.length===0?/*#__PURE__*/_jsx(\"p\",{className:\"text-center py-4 text-gray-500\",children:\"No logs available\"}):/*#__PURE__*/_jsx(\"div\",{className:\"overflow-x-auto\",children:/*#__PURE__*/_jsxs(\"table\",{className:\"min-w-full divide-y divide-gray-200\",children:[/*#__PURE__*/_jsx(\"thead\",{className:\"bg-gray-50\",children:/*#__PURE__*/_jsxs(\"tr\",{children:[/*#__PURE__*/_jsx(\"th\",{className:\"px-6 py-3 text-left text-xs font-medium text-gray-500 uppercase tracking-wider\",children:\"Timestamp\"}),/*#__PURE__*/_jsx(\"th\",{className:\"px-6 py-3 text-left text-xs font-medium text-gray-500 uppercase tracking-wider\",children:\"Level\"}),/*#__PURE__*/_jsx(\"th\",{className:\"px-6 py-3 text-left text-xs font-medium text-gray-500 uppercase tracking-wider\",children:\"Message\"}),/*#__PURE__*/_jsx(\"th\",{className:\"px-6 py-3 text-left text-xs font-medium text-gray-500 uppercase tracking-wider\",children:\"Source\"})]})}),/*#__PURE__*/_jsx(\"tbody\",{className:\"bg-white divide-y divide-gray-200\",children:logs.map(log=>/*#__PURE__*/_jsxs(\"tr\",{className:\"hover:bg-gray-50\",children:[/*#__PURE__*/_jsx(\"td\",{className:\"px-6 py-4 whitespace-nowrap text-sm text-gray-500\",children:formatDate(log.timestamp)}),/*#__PURE__*/_jsx(\"td\",{className:\"px-6 py-4 whitespace-nowrap\",children:/*#__PURE__*/_jsx(\"span\",{className:`px-2 py-1 text-xs font-medium rounded-full ${getLevelColor(log.level)}`,children:log.level.toUpperCase()})}),/*#__PURE__*/_jsx(\"td\",{className:\"px-6 py-4 text-sm text-gray-900\",children:log.message}),/*#__PURE__*/_jsx(\"td\",{className:\"px-6 py-4 whitespace-nowrap text-sm text-gray-500\",children:log.source})]},log.id))})]})})]}),activeTab==='settings'&&/*#__PURE__*/_jsxs(\"div\",{className:\"space-y-6\",children:[/*#__PURE__*/_jsxs(\"div\",{className:\"dashboard-card\",children:[/*#__PURE__*/_jsxs(\"div\",{className:\"flex items-center gap-2 mb-4\",children:[/*#__PURE__*/_jsx(FiServer,{className:\"w-5 h-5 text-primary-500\"}),/*#__PURE__*/_jsx(\"h2\",{className:\"text-lg font-semibold text-gray-800\",children:\"API Configuration\"})]}),/*#__PURE__*/_jsx(\"p\",{className:\"text-sm text-gray-600 mb-6\",children:\"Configure your device to send data to these endpoints. Copy the URLs below and configure them in your IoT device.\"}),/*#__PURE__*/_jsxs(\"div\",{className:\"space-y-4\",children:[/*#__PURE__*/_jsxs(\"div\",{className:\"p-4 bg-blue-50 border border-blue-200 rounded-lg\",children:[/*#__PURE__*/_jsxs(\"div\",{className:\"flex items-center justify-between mb-2\",children:[/*#__PURE__*/_jsx(\"h3\",{className:\"font-medium text-blue-900\",children:\"IoT Device Data Endpoint (LILYGO Format)\"}),/*#__PURE__*/_jsxs(\"div\",{className:\"flex items-center gap-2\",children:[/*#__PURE__*/_jsx(\"span\",{className:\"text-xs bg-blue-100 text-blue-800 px-2 py-1 rounded\",children:\"POST\"}),/*#__PURE__*/_jsxs(\"button\",{onClick:()=>toggleApiSection('telemetry'),className:\"flex items-center gap-1 px-2 py-1 text-blue-600 hover:text-blue-800 transition-colors\",children:[/*#__PURE__*/_jsx(FiCode,{size:14}),expandedApiSection==='telemetry'?/*#__PURE__*/_jsx(FiChevronUp,{size:14}):/*#__PURE__*/_jsx(FiChevronDown,{size:14})]})]})]}),/*#__PURE__*/_jsx(\"p\",{className:\"text-sm text-blue-700 mb-3\",children:\"Send LILYGO T-A7670G device data including temperature, humidity, solar voltage, GPS and battery info\"}),/*#__PURE__*/_jsxs(\"div\",{className:\"flex items-center gap-2 mb-3\",children:[/*#__PURE__*/_jsxs(\"code\",{className:\"flex-1 p-2 bg-white border border-blue-300 rounded text-sm font-mono text-gray-800 overflow-x-auto\",children:[getApiEndpoints().telemetry,\"/iot\"]}),/*#__PURE__*/_jsxs(\"button\",{onClick:()=>handleCopy(getApiEndpoints().telemetry,'telemetry'),className:\"flex items-center gap-1 px-3 py-2 bg-blue-600 text-white rounded hover:bg-blue-700 transition-colors\",children:[/*#__PURE__*/_jsx(FiCopy,{size:14}),copySuccess==='telemetry'?'Copied!':'Copy']})]}),expandedApiSection==='telemetry'&&/*#__PURE__*/_jsxs(\"div\",{className:\"mt-4 space-y-4\",children:[/*#__PURE__*/_jsxs(\"div\",{className:\"bg-white border border-blue-300 rounded-lg p-4\",children:[/*#__PURE__*/_jsxs(\"h4\",{className:\"font-medium text-gray-800 mb-2 flex items-center gap-2\",children:[/*#__PURE__*/_jsx(\"span\",{className:\"w-2 h-2 bg-green-500 rounded-full\"}),\"Request Example\"]}),/*#__PURE__*/_jsxs(\"div\",{className:\"space-y-3\",children:[/*#__PURE__*/_jsxs(\"div\",{children:[/*#__PURE__*/_jsx(\"p\",{className:\"text-xs font-medium text-gray-600 mb-1\",children:\"Headers:\"}),/*#__PURE__*/_jsx(\"pre\",{className:\"text-xs bg-gray-50 p-2 rounded border overflow-x-auto\",children:JSON.stringify(getApiExamples().telemetry.request.headers,null,2)})]}),/*#__PURE__*/_jsxs(\"div\",{children:[/*#__PURE__*/_jsx(\"p\",{className:\"text-xs font-medium text-gray-600 mb-1\",children:\"Body (JSON):\"}),/*#__PURE__*/_jsx(\"pre\",{className:\"text-xs bg-gray-50 p-2 rounded border overflow-x-auto\",children:JSON.stringify(getApiExamples().telemetry.request.body,null,2)})]}),/*#__PURE__*/_jsxs(\"div\",{children:[/*#__PURE__*/_jsx(\"p\",{className:\"text-xs font-medium text-gray-600 mb-1\",children:\"cURL Example:\"}),/*#__PURE__*/_jsx(\"pre\",{className:\"text-xs bg-gray-50 p-2 rounded border overflow-x-auto\",children:`curl -X POST \"${getApiEndpoints().telemetry}/iot\" \\\\\n -H \"Content-Type: application/json\" \\\\\n -d '${JSON.stringify(getApiExamples().telemetry.request.body)}'`})]}),/*#__PURE__*/_jsxs(\"div\",{children:[/*#__PURE__*/_jsx(\"p\",{className:\"text-xs font-medium text-gray-600 mb-1\",children:\"Arduino/ESP32 Example:\"}),/*#__PURE__*/_jsx(\"pre\",{className:\"text-xs bg-gray-50 p-2 rounded border overflow-x-auto\",children:`String json = \"{\";\njson += \"\\\\\"device_id\\\\\":\\\\\"${(device===null||device===void 0?void 0:device.id)||'LILYGO_001'}\\\\\",\";\njson += \"\\\\\"temp\\\\\":\" + String(temperature) + \",\";\njson += \"\\\\\"hum\\\\\":\" + String(humidity) + \",\";\njson += \"\\\\\"solar_volt\\\\\":\" + String(solarVoltage) + \",\";\njson += \"\\\\\"battery_volt\\\\\":\" + String(batteryVoltage) + \",\";\njson += \"\\\\\"signal\\\\\":\" + String(signalStrength) + \",\";\njson += \"\\\\\"gps_fixed\\\\\":\" + (gpsFixed ? \"true\" : \"false\") + \",\";\njson += \"\\\\\"latitude\\\\\":\" + String(latitude, 6) + \",\";\njson += \"\\\\\"longitude\\\\\":\" + String(longitude, 6) + \",\";\njson += \"\\\\\"timestamp\\\\\":\" + String(millis() / 1000);\njson += \"}\";\n\n// Send via HTTP POST to ${getApiEndpoints().telemetry}/iot`})]})]})]}),/*#__PURE__*/_jsxs(\"div\",{className:\"bg-white border border-blue-300 rounded-lg p-4\",children:[/*#__PURE__*/_jsxs(\"h4\",{className:\"font-medium text-gray-800 mb-2 flex items-center gap-2\",children:[/*#__PURE__*/_jsx(\"span\",{className:\"w-2 h-2 bg-blue-500 rounded-full\"}),\"Response Example\"]}),/*#__PURE__*/_jsx(\"div\",{className:\"space-y-3\",children:/*#__PURE__*/_jsxs(\"div\",{children:[/*#__PURE__*/_jsxs(\"p\",{className:\"text-xs font-medium text-gray-600 mb-1\",children:[\"Status: \",getApiExamples().telemetry.response.status]}),/*#__PURE__*/_jsx(\"pre\",{className:\"text-xs bg-gray-50 p-2 rounded border overflow-x-auto\",children:JSON.stringify(getApiExamples().telemetry.response.body,null,2)})]})})]}),/*#__PURE__*/_jsxs(\"div\",{className:\"bg-white border border-blue-300 rounded-lg p-4\",children:[/*#__PURE__*/_jsx(\"h4\",{className:\"font-medium text-gray-800 mb-2\",children:\"LILYGO Field Descriptions\"}),/*#__PURE__*/_jsxs(\"div\",{className:\"text-xs space-y-1\",children:[/*#__PURE__*/_jsxs(\"div\",{children:[/*#__PURE__*/_jsx(\"strong\",{children:\"device_id:\"}),\" Unique device identifier (required)\"]}),/*#__PURE__*/_jsxs(\"div\",{children:[/*#__PURE__*/_jsx(\"strong\",{children:\"device_name:\"}),\" Human-readable device name (optional)\"]}),/*#__PURE__*/_jsxs(\"div\",{children:[/*#__PURE__*/_jsx(\"strong\",{children:\"firmware:\"}),\" Device firmware version (optional)\"]}),/*#__PURE__*/_jsxs(\"div\",{children:[/*#__PURE__*/_jsx(\"strong\",{children:\"temp:\"}),\" Temperature in Celsius (optional)\"]}),/*#__PURE__*/_jsxs(\"div\",{children:[/*#__PURE__*/_jsx(\"strong\",{children:\"hum:\"}),\" Humidity percentage (optional)\"]}),/*#__PURE__*/_jsxs(\"div\",{children:[/*#__PURE__*/_jsx(\"strong\",{children:\"solar_volt:\"}),\" Solar panel voltage (optional)\"]}),/*#__PURE__*/_jsxs(\"div\",{children:[/*#__PURE__*/_jsx(\"strong\",{children:\"battery_volt:\"}),\" Battery voltage (optional)\"]}),/*#__PURE__*/_jsxs(\"div\",{children:[/*#__PURE__*/_jsx(\"strong\",{children:\"signal:\"}),\" Cellular signal in dBm (optional)\"]}),/*#__PURE__*/_jsxs(\"div\",{children:[/*#__PURE__*/_jsx(\"strong\",{children:\"gps_fixed:\"}),\" GPS fix status boolean (optional)\"]}),/*#__PURE__*/_jsxs(\"div\",{children:[/*#__PURE__*/_jsx(\"strong\",{children:\"latitude/longitude:\"}),\" GPS coordinates (optional)\"]}),/*#__PURE__*/_jsxs(\"div\",{children:[/*#__PURE__*/_jsx(\"strong\",{children:\"altitude:\"}),\" Elevation in meters (optional)\"]}),/*#__PURE__*/_jsxs(\"div\",{children:[/*#__PURE__*/_jsx(\"strong\",{children:\"satellites:\"}),\" Number of GPS satellites (optional)\"]}),/*#__PURE__*/_jsxs(\"div\",{children:[/*#__PURE__*/_jsx(\"strong\",{children:\"timestamp:\"}),\" Unix timestamp from device (optional)\"]})]}),/*#__PURE__*/_jsxs(\"div\",{className:\"mt-3 p-2 bg-blue-50 rounded text-xs\",children:[/*#__PURE__*/_jsx(\"strong\",{children:\"Note:\"}),\" This endpoint automatically converts battery voltage to percentage, updates device information, and handles the LILYGO device data format.\"]})]})]})]}),/*#__PURE__*/_jsxs(\"div\",{className:\"p-4 bg-green-50 border border-green-200 rounded-lg\",children:[/*#__PURE__*/_jsxs(\"div\",{className:\"flex items-center justify-between mb-2\",children:[/*#__PURE__*/_jsx(\"h3\",{className:\"font-medium text-green-900\",children:\"Device Status Endpoint\"}),/*#__PURE__*/_jsxs(\"div\",{className:\"flex items-center gap-2\",children:[/*#__PURE__*/_jsx(\"span\",{className:\"text-xs bg-green-100 text-green-800 px-2 py-1 rounded\",children:\"PUT\"}),/*#__PURE__*/_jsxs(\"button\",{onClick:()=>toggleApiSection('status'),className:\"flex items-center gap-1 px-2 py-1 text-green-600 hover:text-green-800 transition-colors\",children:[/*#__PURE__*/_jsx(FiCode,{size:14}),expandedApiSection==='status'?/*#__PURE__*/_jsx(FiChevronUp,{size:14}):/*#__PURE__*/_jsx(FiChevronDown,{size:14})]})]})]}),/*#__PURE__*/_jsx(\"p\",{className:\"text-sm text-green-700 mb-3\",children:\"Update device configuration and status information\"}),/*#__PURE__*/_jsxs(\"div\",{className:\"flex items-center gap-2 mb-3\",children:[/*#__PURE__*/_jsx(\"code\",{className:\"flex-1 p-2 bg-white border border-green-300 rounded text-sm font-mono text-gray-800 overflow-x-auto\",children:getApiEndpoints().status}),/*#__PURE__*/_jsxs(\"button\",{onClick:()=>handleCopy(getApiEndpoints().status,'status'),className:\"flex items-center gap-1 px-3 py-2 bg-green-600 text-white rounded hover:bg-green-700 transition-colors\",children:[/*#__PURE__*/_jsx(FiCopy,{size:14}),copySuccess==='status'?'Copied!':'Copy']})]}),expandedApiSection==='status'&&/*#__PURE__*/_jsxs(\"div\",{className:\"mt-4 space-y-4\",children:[/*#__PURE__*/_jsxs(\"div\",{className:\"bg-white border border-green-300 rounded-lg p-4\",children:[/*#__PURE__*/_jsxs(\"h4\",{className:\"font-medium text-gray-800 mb-2 flex items-center gap-2\",children:[/*#__PURE__*/_jsx(\"span\",{className:\"w-2 h-2 bg-green-500 rounded-full\"}),\"Request Example\"]}),/*#__PURE__*/_jsxs(\"div\",{className:\"space-y-3\",children:[/*#__PURE__*/_jsxs(\"div\",{children:[/*#__PURE__*/_jsx(\"p\",{className:\"text-xs font-medium text-gray-600 mb-1\",children:\"Headers:\"}),/*#__PURE__*/_jsx(\"pre\",{className:\"text-xs bg-gray-50 p-2 rounded border overflow-x-auto\",children:JSON.stringify(getApiExamples().status.request.headers,null,2)})]}),/*#__PURE__*/_jsxs(\"div\",{children:[/*#__PURE__*/_jsx(\"p\",{className:\"text-xs font-medium text-gray-600 mb-1\",children:\"Body (JSON):\"}),/*#__PURE__*/_jsx(\"pre\",{className:\"text-xs bg-gray-50 p-2 rounded border overflow-x-auto\",children:JSON.stringify(getApiExamples().status.request.body,null,2)})]}),/*#__PURE__*/_jsxs(\"div\",{children:[/*#__PURE__*/_jsx(\"p\",{className:\"text-xs font-medium text-gray-600 mb-1\",children:\"cURL Example:\"}),/*#__PURE__*/_jsx(\"pre\",{className:\"text-xs bg-gray-50 p-2 rounded border overflow-x-auto\",children:`curl -X PUT \"${getApiEndpoints().status}\" \\\\\n -H \"Content-Type: application/json\" \\\\\n -H \"Device-ID: ${(device===null||device===void 0?void 0:device.id)||'your-device-id'}\" \\\\\n -d '${JSON.stringify(getApiExamples().status.request.body)}'`})]})]})]}),/*#__PURE__*/_jsxs(\"div\",{className:\"bg-white border border-green-300 rounded-lg p-4\",children:[/*#__PURE__*/_jsxs(\"h4\",{className:\"font-medium text-gray-800 mb-2 flex items-center gap-2\",children:[/*#__PURE__*/_jsx(\"span\",{className:\"w-2 h-2 bg-blue-500 rounded-full\"}),\"Response Example\"]}),/*#__PURE__*/_jsx(\"div\",{className:\"space-y-3\",children:/*#__PURE__*/_jsxs(\"div\",{children:[/*#__PURE__*/_jsxs(\"p\",{className:\"text-xs font-medium text-gray-600 mb-1\",children:[\"Status: \",getApiExamples().status.response.status]}),/*#__PURE__*/_jsx(\"pre\",{className:\"text-xs bg-gray-50 p-2 rounded border overflow-x-auto\",children:JSON.stringify(getApiExamples().status.response.body,null,2)})]})})]}),/*#__PURE__*/_jsxs(\"div\",{className:\"bg-white border border-green-300 rounded-lg p-4\",children:[/*#__PURE__*/_jsx(\"h4\",{className:\"font-medium text-gray-800 mb-2\",children:\"Field Descriptions\"}),/*#__PURE__*/_jsxs(\"div\",{className:\"text-xs space-y-1\",children:[/*#__PURE__*/_jsxs(\"div\",{children:[/*#__PURE__*/_jsx(\"strong\",{children:\"battery_level:\"}),\" Current battery percentage (optional)\"]}),/*#__PURE__*/_jsxs(\"div\",{children:[/*#__PURE__*/_jsx(\"strong\",{children:\"signal_strength:\"}),\" Cellular signal strength in dBm (optional)\"]}),/*#__PURE__*/_jsxs(\"div\",{children:[/*#__PURE__*/_jsx(\"strong\",{children:\"firmware_version:\"}),\" Current firmware version string (optional)\"]}),/*#__PURE__*/_jsxs(\"div\",{children:[/*#__PURE__*/_jsx(\"strong\",{children:\"is_active:\"}),\" Device active status boolean (optional)\"]}),/*#__PURE__*/_jsxs(\"div\",{children:[/*#__PURE__*/_jsx(\"strong\",{children:\"last_seen:\"}),\" Last communication timestamp (optional)\"]})]})]})]})]}),/*#__PURE__*/_jsxs(\"div\",{className:\"p-4 bg-yellow-50 border border-yellow-200 rounded-lg\",children:[/*#__PURE__*/_jsxs(\"div\",{className:\"flex items-center justify-between mb-2\",children:[/*#__PURE__*/_jsx(\"h3\",{className:\"font-medium text-yellow-900\",children:\"Device Logs Endpoint\"}),/*#__PURE__*/_jsxs(\"div\",{className:\"flex items-center gap-2\",children:[/*#__PURE__*/_jsx(\"span\",{className:\"text-xs bg-yellow-100 text-yellow-800 px-2 py-1 rounded\",children:\"POST\"}),/*#__PURE__*/_jsxs(\"button\",{onClick:()=>toggleApiSection('logs'),className:\"flex items-center gap-1 px-2 py-1 text-yellow-600 hover:text-yellow-800 transition-colors\",children:[/*#__PURE__*/_jsx(FiCode,{size:14}),expandedApiSection==='logs'?/*#__PURE__*/_jsx(FiChevronUp,{size:14}):/*#__PURE__*/_jsx(FiChevronDown,{size:14})]})]})]}),/*#__PURE__*/_jsx(\"p\",{className:\"text-sm text-yellow-700 mb-3\",children:\"Send device logs, errors, and diagnostic information\"}),/*#__PURE__*/_jsxs(\"div\",{className:\"flex items-center gap-2 mb-3\",children:[/*#__PURE__*/_jsx(\"code\",{className:\"flex-1 p-2 bg-white border border-yellow-300 rounded text-sm font-mono text-gray-800 overflow-x-auto\",children:getApiEndpoints().logs}),/*#__PURE__*/_jsxs(\"button\",{onClick:()=>handleCopy(getApiEndpoints().logs,'logs'),className:\"flex items-center gap-1 px-3 py-2 bg-yellow-600 text-white rounded hover:bg-yellow-700 transition-colors\",children:[/*#__PURE__*/_jsx(FiCopy,{size:14}),copySuccess==='logs'?'Copied!':'Copy']})]}),expandedApiSection==='logs'&&/*#__PURE__*/_jsxs(\"div\",{className:\"mt-4 space-y-4\",children:[/*#__PURE__*/_jsxs(\"div\",{className:\"bg-white border border-yellow-300 rounded-lg p-4\",children:[/*#__PURE__*/_jsxs(\"h4\",{className:\"font-medium text-gray-800 mb-2 flex items-center gap-2\",children:[/*#__PURE__*/_jsx(\"span\",{className:\"w-2 h-2 bg-green-500 rounded-full\"}),\"Request Example\"]}),/*#__PURE__*/_jsxs(\"div\",{className:\"space-y-3\",children:[/*#__PURE__*/_jsxs(\"div\",{children:[/*#__PURE__*/_jsx(\"p\",{className:\"text-xs font-medium text-gray-600 mb-1\",children:\"Headers:\"}),/*#__PURE__*/_jsx(\"pre\",{className:\"text-xs bg-gray-50 p-2 rounded border overflow-x-auto\",children:JSON.stringify(getApiExamples().logs.request.headers,null,2)})]}),/*#__PURE__*/_jsxs(\"div\",{children:[/*#__PURE__*/_jsx(\"p\",{className:\"text-xs font-medium text-gray-600 mb-1\",children:\"Body (JSON):\"}),/*#__PURE__*/_jsx(\"pre\",{className:\"text-xs bg-gray-50 p-2 rounded border overflow-x-auto\",children:JSON.stringify(getApiExamples().logs.request.body,null,2)})]}),/*#__PURE__*/_jsxs(\"div\",{children:[/*#__PURE__*/_jsx(\"p\",{className:\"text-xs font-medium text-gray-600 mb-1\",children:\"cURL Example:\"}),/*#__PURE__*/_jsx(\"pre\",{className:\"text-xs bg-gray-50 p-2 rounded border overflow-x-auto\",children:`curl -X POST \"${getApiEndpoints().logs}\" \\\\\n -H \"Content-Type: application/json\" \\\\\n -H \"Device-ID: ${(device===null||device===void 0?void 0:device.id)||'your-device-id'}\" \\\\\n -d '${JSON.stringify(getApiExamples().logs.request.body)}'`})]})]})]}),/*#__PURE__*/_jsxs(\"div\",{className:\"bg-white border border-yellow-300 rounded-lg p-4\",children:[/*#__PURE__*/_jsxs(\"h4\",{className:\"font-medium text-gray-800 mb-2 flex items-center gap-2\",children:[/*#__PURE__*/_jsx(\"span\",{className:\"w-2 h-2 bg-blue-500 rounded-full\"}),\"Response Example\"]}),/*#__PURE__*/_jsx(\"div\",{className:\"space-y-3\",children:/*#__PURE__*/_jsxs(\"div\",{children:[/*#__PURE__*/_jsxs(\"p\",{className:\"text-xs font-medium text-gray-600 mb-1\",children:[\"Status: \",getApiExamples().logs.response.status]}),/*#__PURE__*/_jsx(\"pre\",{className:\"text-xs bg-gray-50 p-2 rounded border overflow-x-auto\",children:JSON.stringify(getApiExamples().logs.response.body,null,2)})]})})]}),/*#__PURE__*/_jsxs(\"div\",{className:\"bg-white border border-yellow-300 rounded-lg p-4\",children:[/*#__PURE__*/_jsx(\"h4\",{className:\"font-medium text-gray-800 mb-2\",children:\"Field Descriptions\"}),/*#__PURE__*/_jsxs(\"div\",{className:\"text-xs space-y-1\",children:[/*#__PURE__*/_jsxs(\"div\",{children:[/*#__PURE__*/_jsx(\"strong\",{children:\"level:\"}),\" Log level (debug, info, warning, error, critical) - required\"]}),/*#__PURE__*/_jsxs(\"div\",{children:[/*#__PURE__*/_jsx(\"strong\",{children:\"message:\"}),\" Log message content - required\"]}),/*#__PURE__*/_jsxs(\"div\",{children:[/*#__PURE__*/_jsx(\"strong\",{children:\"source:\"}),\" Component/module that generated the log - required\"]}),/*#__PURE__*/_jsxs(\"div\",{children:[/*#__PURE__*/_jsx(\"strong\",{children:\"timestamp:\"}),\" ISO 8601 datetime string - required\"]}),/*#__PURE__*/_jsxs(\"div\",{children:[/*#__PURE__*/_jsx(\"strong\",{children:\"metadata:\"}),\" Additional structured data object - optional\"]})]})]})]})]}),/*#__PURE__*/_jsxs(\"div\",{className:\"p-4 bg-gray-50 border border-gray-200 rounded-lg\",children:[/*#__PURE__*/_jsxs(\"div\",{className:\"flex items-center gap-2 mb-2\",children:[/*#__PURE__*/_jsx(FiKey,{className:\"w-4 h-4 text-gray-600\"}),/*#__PURE__*/_jsx(\"h3\",{className:\"font-medium text-gray-900\",children:\"Authentication\"})]}),/*#__PURE__*/_jsx(\"p\",{className:\"text-sm text-gray-600 mb-3\",children:\"Include this device ID in your requests for authentication\"}),/*#__PURE__*/_jsxs(\"div\",{className:\"flex items-center gap-2\",children:[/*#__PURE__*/_jsxs(\"code\",{className:\"flex-1 p-2 bg-white border border-gray-300 rounded text-sm font-mono text-gray-800\",children:[\"Device-ID: \",device===null||device===void 0?void 0:device.id]}),/*#__PURE__*/_jsxs(\"button\",{onClick:()=>handleCopy(device===null||device===void 0?void 0:device.id,'deviceId'),className:\"flex items-center gap-1 px-3 py-2 bg-gray-600 text-white rounded hover:bg-gray-700 transition-colors\",children:[/*#__PURE__*/_jsx(FiCopy,{size:14}),copySuccess==='deviceId'?'Copied!':'Copy']})]})]})]})]}),/*#__PURE__*/_jsxs(\"div\",{className:\"dashboard-card\",children:[/*#__PURE__*/_jsx(\"h2\",{className:\"text-lg font-semibold text-gray-800 mb-4\",children:\"Device Settings\"}),/*#__PURE__*/_jsxs(\"form\",{onSubmit:e=>{e.preventDefault();const formData=new FormData(e.target);const updateData={name:formData.get('deviceName'),description:formData.get('deviceDescription'),firmware_version:formData.get('firmwareVersion'),model:formData.get('deviceModel'),is_active:formData.get('status')==='active'};deviceApi.updateDevice(device.id,updateData).then(response=>{handleDeviceUpdated(response.data);alert('Device settings updated successfully!');}).catch(error=>{console.error('Error updating device:',error);alert('Failed to update device settings. Please try again.');});},className:\"space-y-4\",children:[/*#__PURE__*/_jsxs(\"div\",{className:\"grid grid-cols-1 md:grid-cols-2 gap-4\",children:[/*#__PURE__*/_jsxs(\"div\",{children:[/*#__PURE__*/_jsx(\"label\",{htmlFor:\"deviceName\",className:\"block text-sm font-medium text-gray-700 mb-1\",children:\"Device Name\"}),/*#__PURE__*/_jsx(\"input\",{type:\"text\",id:\"deviceName\",name:\"deviceName\",className:\"block w-full px-3 py-2 border border-gray-300 rounded-md shadow-sm focus:outline-none focus:ring-primary-500 focus:border-primary-500 sm:text-sm\",defaultValue:device.name})]}),/*#__PURE__*/_jsxs(\"div\",{children:[/*#__PURE__*/_jsx(\"label\",{htmlFor:\"deviceDescription\",className:\"block text-sm font-medium text-gray-700 mb-1\",children:\"Description\"}),/*#__PURE__*/_jsx(\"input\",{type:\"text\",id:\"deviceDescription\",name:\"deviceDescription\",className:\"block w-full px-3 py-2 border border-gray-300 rounded-md shadow-sm focus:outline-none focus:ring-primary-500 focus:border-primary-500 sm:text-sm\",defaultValue:device.description||''})]}),/*#__PURE__*/_jsxs(\"div\",{children:[/*#__PURE__*/_jsx(\"label\",{htmlFor:\"firmwareVersion\",className:\"block text-sm font-medium text-gray-700 mb-1\",children:\"Firmware Version\"}),/*#__PURE__*/_jsx(\"input\",{type:\"text\",id:\"firmwareVersion\",name:\"firmwareVersion\",className:\"block w-full px-3 py-2 border border-gray-300 rounded-md shadow-sm focus:outline-none focus:ring-primary-500 focus:border-primary-500 sm:text-sm\",defaultValue:device.firmware_version||''})]}),/*#__PURE__*/_jsxs(\"div\",{children:[/*#__PURE__*/_jsx(\"label\",{htmlFor:\"deviceModel\",className:\"block text-sm font-medium text-gray-700 mb-1\",children:\"Model\"}),/*#__PURE__*/_jsxs(\"select\",{id:\"deviceModel\",name:\"deviceModel\",className:\"block w-full px-3 py-2 border border-gray-300 rounded-md shadow-sm focus:outline-none focus:ring-primary-500 focus:border-primary-500 sm:text-sm\",defaultValue:device.model,children:[/*#__PURE__*/_jsx(\"option\",{value:\"SIM7000E\",children:\"SIM7000E\"}),/*#__PURE__*/_jsx(\"option\",{value:\"SIM7000A\",children:\"SIM7000A\"}),/*#__PURE__*/_jsx(\"option\",{value:\"SIM7000G\",children:\"SIM7000G\"}),/*#__PURE__*/_jsx(\"option\",{value:\"Custom\",children:\"Custom\"})]})]})]}),/*#__PURE__*/_jsxs(\"div\",{children:[/*#__PURE__*/_jsx(\"label\",{className:\"block text-sm font-medium text-gray-700 mb-1\",children:\"Device Status\"}),/*#__PURE__*/_jsxs(\"div\",{className:\"flex space-x-4\",children:[/*#__PURE__*/_jsxs(\"div\",{className:\"flex items-center\",children:[/*#__PURE__*/_jsx(\"input\",{id:\"status-active\",name:\"status\",type:\"radio\",value:\"active\",defaultChecked:device.is_active,className:\"h-4 w-4 text-primary-600 focus:ring-primary-500 border-gray-300\"}),/*#__PURE__*/_jsx(\"label\",{htmlFor:\"status-active\",className:\"ml-2 block text-sm text-gray-700\",children:\"Active\"})]}),/*#__PURE__*/_jsxs(\"div\",{className:\"flex items-center\",children:[/*#__PURE__*/_jsx(\"input\",{id:\"status-inactive\",name:\"status\",type:\"radio\",value:\"inactive\",defaultChecked:!device.is_active,className:\"h-4 w-4 text-primary-600 focus:ring-primary-500 border-gray-300\"}),/*#__PURE__*/_jsx(\"label\",{htmlFor:\"status-inactive\",className:\"ml-2 block text-sm text-gray-700\",children:\"Inactive\"})]})]})]}),/*#__PURE__*/_jsx(\"div\",{className:\"pt-4\",children:/*#__PURE__*/_jsxs(\"button\",{type:\"submit\",className:\"flex items-center gap-2 px-4 py-2 bg-primary-500 text-white rounded-md hover:bg-primary-600 transition-colors\",children:[/*#__PURE__*/_jsx(FiSave,{}),/*#__PURE__*/_jsx(\"span\",{children:\"Save Changes\"})]})})]})]})]})]}),/*#__PURE__*/_jsx(EditDeviceModal,{isOpen:showEditModal,onClose:handleCloseEditModal,device:device,onDeviceUpdated:handleDeviceUpdated}),deleteConfirm&&/*#__PURE__*/_jsx(\"div\",{className:\"fixed inset-0 bg-black bg-opacity-50 flex items-center justify-center z-50\",children:/*#__PURE__*/_jsx(\"div\",{className:\"bg-white rounded-lg shadow-xl max-w-md w-full mx-4\",children:/*#__PURE__*/_jsxs(\"div\",{className:\"p-6\",children:[/*#__PURE__*/_jsx(\"h3\",{className:\"text-lg font-semibold text-gray-800 mb-4\",children:\"Delete Device\"}),/*#__PURE__*/_jsxs(\"p\",{className:\"text-gray-600 mb-6\",children:[\"Are you sure you want to delete \\\"\",device===null||device===void 0?void 0:device.name,\"\\\"? This action cannot be undone and will remove all associated telemetry data and logs.\"]}),/*#__PURE__*/_jsxs(\"div\",{className:\"flex justify-end gap-3\",children:[/*#__PURE__*/_jsx(\"button\",{onClick:cancelDeleteDevice,className:\"px-4 py-2 border border-gray-300 rounded-md text-sm font-medium text-gray-700 hover:bg-gray-50 transition-colors\",children:\"Cancel\"}),/*#__PURE__*/_jsx(\"button\",{onClick:confirmDeleteDevice,className:\"px-4 py-2 bg-red-500 text-white rounded-md text-sm font-medium hover:bg-red-600 transition-colors\",children:\"Delete Device\"})]})]})})})]});};export default DeviceDetail;","map":{"version":3,"names":["React","useState","useEffect","useParams","Link","useNavigate","FiArrowLeft","FiEdit","FiTrash2","FiRefreshCw","FiBattery","FiWifi","FiMapPin","FiClock","FiInfo","FiSave","FiCopy","FiServer","FiKey","FiChevronDown","FiChevronUp","FiCode","MapContainer","TileLayer","Marker","Popup","L","EditDeviceModal","deviceApi","jsx","_jsx","jsxs","_jsxs","Icon","Default","prototype","_getIconUrl","mergeOptions","iconRetinaUrl","iconUrl","shadowUrl","dummyDevices","id","name","description","model","firmware_version","status","battery","level","signal","strength","location","latitude","longitude","altitude","last_seen","Date","toISOString","created_at","now","dummyTelemetry","device_id","battery_level","signal_strength","temperature","timestamp","dummyLogs","message","source","DeviceDetail","navigate","device","setDevice","telemetry","setTelemetry","logs","setLogs","loading","setLoading","activeTab","setActiveTab","refreshing","setRefreshing","copySuccess","setCopySuccess","expandedApiSection","setExpandedApiSection","showEditModal","setShowEditModal","deleteConfirm","setDeleteConfirm","fetchDeviceData","token","localStorage","getItem","deviceResponse","fetch","headers","ok","deviceData","json","transformedDevice","getDeviceStatus","getBatteryInfo","getSignalInfo","deviceTelemetry","filter","t","deviceLogs","l","foundDevice","find","d","console","error","is_active","lastSeen","diffMinutes","formatDate","dateString","date","toLocaleString","getStatusColor","getBatteryColor","getSignalColor","getLevelColor","handleRefresh","handleCopy","text","label","navigator","clipboard","writeText","setTimeout","err","getApiEndpoints","baseUrl","window","origin","toggleApiSection","section","handleEditDevice","handleCloseEditModal","handleDeviceUpdated","updatedDevice","handleDeleteDevice","confirmDeleteDevice","deleteDevice","alert","cancelDeleteDevice","getApiExamples","request","method","body","device_name","firmware","temp","hum","solar_volt","battery_volt","gps_fixed","satellites","Math","floor","response","humidity","solar_voltage","battery_voltage","device_timestamp","updated_at","metadata","network_type","signal_quality","operator","modem_model","className","children","to","onClick","disabled","center","zoom","style","height","width","attribution","url","position","toFixed","slice","map","log","length","item","toUpperCase","size","JSON","stringify","onSubmit","e","preventDefault","formData","FormData","target","updateData","get","updateDevice","then","data","catch","htmlFor","type","defaultValue","value","defaultChecked","isOpen","onClose","onDeviceUpdated"],"sources":["/home/m3mo/Desktop/temparea/solarbank/frontend/src/pages/DeviceDetail.js"],"sourcesContent":["import React, { useState, useEffect } from 'react';\nimport { useParams, Link, useNavigate } from 'react-router-dom';\nimport { FiArrowLeft, FiEdit, FiTrash2, FiRefreshCw, FiBattery, FiWifi, FiMapPin, FiClock, FiInfo, FiSave, FiCopy, FiServer, FiKey, FiChevronDown, FiChevronUp, FiCode } from 'react-icons/fi';\nimport { MapContainer, TileLayer, Marker, Popup } from 'react-leaflet';\nimport 'leaflet/dist/leaflet.css';\nimport L from 'leaflet';\nimport EditDeviceModal from '../components/EditDeviceModal';\nimport { deviceApi } from '../services/api';\n\n// Fix for Leaflet marker icons\ndelete L.Icon.Default.prototype._getIconUrl;\nL.Icon.Default.mergeOptions({\n iconRetinaUrl: 'https://unpkg.com/leaflet@1.7.1/dist/images/marker-icon-2x.png',\n iconUrl: 'https://unpkg.com/leaflet@1.7.1/dist/images/marker-icon.png',\n shadowUrl: 'https://unpkg.com/leaflet@1.7.1/dist/images/marker-shadow.png',\n});\n\n// Dummy data for demonstration\nconst dummyDevices = [\n {\n id: 'device-001',\n name: 'SIM7000E-001',\n description: 'Solar panel monitoring device',\n model: 'SIM7000E',\n firmware_version: '1.2.3',\n status: 'online',\n battery: { level: 85, status: 'good' },\n signal: { strength: -65, status: 'good' },\n location: { latitude: 47.3769, longitude: 8.5417, altitude: 408 },\n last_seen: new Date().toISOString(),\n created_at: new Date(Date.now() - 7776000000).toISOString() // 90 days ago\n },\n {\n id: 'device-002',\n name: 'SIM7000E-002',\n description: 'Wind turbine monitoring device',\n model: 'SIM7000E',\n firmware_version: '1.2.3',\n status: 'idle',\n battery: { level: 42, status: 'low' },\n signal: { strength: -85, status: 'fair' },\n location: { latitude: 47.3780, longitude: 8.5390, altitude: 410 },\n last_seen: new Date(Date.now() - 3600000).toISOString(), // 1 hour ago\n created_at: new Date(Date.now() - 15552000000).toISOString() // 180 days ago\n }\n];\n\n// Dummy telemetry data\nconst dummyTelemetry = [\n {\n id: 1,\n device_id: 'device-001',\n latitude: 47.3769,\n longitude: 8.5417,\n altitude: 408,\n battery_level: 85,\n signal_strength: -65,\n temperature: 24.5,\n timestamp: new Date().toISOString()\n },\n {\n id: 2,\n device_id: 'device-001',\n latitude: 47.3769,\n longitude: 8.5417,\n altitude: 408,\n battery_level: 86,\n signal_strength: -64,\n temperature: 24.2,\n timestamp: new Date(Date.now() - 3600000).toISOString() // 1 hour ago\n },\n {\n id: 3,\n device_id: 'device-001',\n latitude: 47.3770,\n longitude: 8.5418,\n altitude: 408,\n battery_level: 87,\n signal_strength: -63,\n temperature: 23.8,\n timestamp: new Date(Date.now() - 7200000).toISOString() // 2 hours ago\n }\n];\n\n// Dummy logs data\nconst dummyLogs = [\n {\n id: 1,\n device_id: 'device-001',\n level: 'info',\n message: 'Device connected to network',\n source: 'connection_manager',\n timestamp: new Date().toISOString()\n },\n {\n id: 2,\n device_id: 'device-001',\n level: 'warning',\n message: 'Battery level below 90%',\n source: 'power_monitor',\n timestamp: new Date(Date.now() - 1800000).toISOString() // 30 minutes ago\n },\n {\n id: 3,\n device_id: 'device-001',\n level: 'info',\n message: 'GPS location updated',\n source: 'gps_module',\n timestamp: new Date(Date.now() - 3600000).toISOString() // 1 hour ago\n }\n];\n\nconst DeviceDetail = () => {\n const { id } = useParams();\n const navigate = useNavigate();\n const [device, setDevice] = useState(null);\n const [telemetry, setTelemetry] = useState([]);\n const [logs, setLogs] = useState([]);\n const [loading, setLoading] = useState(true);\n const [activeTab, setActiveTab] = useState('overview');\n const [refreshing, setRefreshing] = useState(false);\n const [copySuccess, setCopySuccess] = useState('');\n const [expandedApiSection, setExpandedApiSection] = useState('');\n const [showEditModal, setShowEditModal] = useState(false);\n const [deleteConfirm, setDeleteConfirm] = useState(false);\n\n useEffect(() => {\n fetchDeviceData();\n }, [id]);\n\n const fetchDeviceData = async () => {\n try {\n setLoading(true);\n const token = localStorage.getItem('token');\n \n // Fetch device data from API\n const deviceResponse = await fetch(`/api/devices/${id}`, {\n headers: {\n 'Authorization': `Bearer ${token}`,\n },\n });\n\n if (deviceResponse.ok) {\n const deviceData = await deviceResponse.json();\n \n // Transform the device data to include frontend display properties\n const transformedDevice = {\n ...deviceData,\n status: getDeviceStatus(deviceData),\n battery: getBatteryInfo(deviceData),\n signal: getSignalInfo(deviceData),\n location: {\n latitude: deviceData.latitude || 47.3769, // Default location if none set\n longitude: deviceData.longitude || 8.5417,\n altitude: deviceData.altitude || 408\n }\n };\n \n setDevice(transformedDevice);\n \n // For now, use dummy telemetry and logs until those APIs are implemented\n const deviceTelemetry = dummyTelemetry.filter(t => t.device_id === id);\n const deviceLogs = dummyLogs.filter(l => l.device_id === id);\n \n setTelemetry(deviceTelemetry);\n setLogs(deviceLogs);\n } else if (deviceResponse.status === 404) {\n // Device not found in API, try dummy data for existing demo devices\n const foundDevice = dummyDevices.find(d => d.id === id);\n if (foundDevice) {\n setDevice(foundDevice);\n \n const deviceTelemetry = dummyTelemetry.filter(t => t.device_id === id);\n const deviceLogs = dummyLogs.filter(l => l.device_id === id);\n \n setTelemetry(deviceTelemetry);\n setLogs(deviceLogs);\n } else {\n setDevice(null); // This will show the \"Device Not Found\" message\n }\n } else {\n console.error('Failed to fetch device:', deviceResponse.status);\n setDevice(null);\n }\n } catch (error) {\n console.error('Error fetching device data:', error);\n // Fall back to dummy data\n const foundDevice = dummyDevices.find(d => d.id === id);\n if (foundDevice) {\n setDevice(foundDevice);\n \n const deviceTelemetry = dummyTelemetry.filter(t => t.device_id === id);\n const deviceLogs = dummyLogs.filter(l => l.device_id === id);\n \n setTelemetry(deviceTelemetry);\n setLogs(deviceLogs);\n } else {\n setDevice(null);\n }\n } finally {\n setLoading(false);\n }\n };\n\n // Helper functions to transform backend data\n const getDeviceStatus = (device) => {\n if (!device.is_active) return 'offline';\n if (!device.last_seen) return 'offline';\n \n const lastSeen = new Date(device.last_seen);\n const now = new Date();\n const diffMinutes = (now - lastSeen) / (1000 * 60);\n \n if (diffMinutes < 5) return 'online';\n if (diffMinutes < 30) return 'idle';\n return 'offline';\n };\n\n const getBatteryInfo = (device) => {\n const level = device.battery_level || 0;\n let status = 'good';\n if (level < 20) status = 'critical';\n else if (level < 50) status = 'low';\n \n return { level, status };\n };\n\n const getSignalInfo = (device) => {\n const strength = device.signal_strength || -100;\n let status = 'poor';\n if (strength > -70) status = 'good';\n else if (strength > -85) status = 'fair';\n \n return { strength, status };\n };\n\n // Helper function to format date\n const formatDate = (dateString) => {\n const date = new Date(dateString);\n return date.toLocaleString();\n };\n\n // Helper function to get status color\n const getStatusColor = (status) => {\n switch (status) {\n case 'online':\n return 'text-success-500';\n case 'idle':\n return 'text-warning-500';\n case 'offline':\n return 'text-danger-500';\n default:\n return 'text-gray-500';\n }\n };\n\n // Helper function to get battery color\n const getBatteryColor = (status) => {\n switch (status) {\n case 'good':\n return 'text-success-500';\n case 'low':\n return 'text-warning-500';\n case 'critical':\n return 'text-danger-500';\n default:\n return 'text-gray-500';\n }\n };\n\n // Helper function to get signal color\n const getSignalColor = (status) => {\n switch (status) {\n case 'good':\n return 'text-success-500';\n case 'fair':\n return 'text-warning-500';\n case 'poor':\n return 'text-danger-500';\n default:\n return 'text-gray-500';\n }\n };\n\n // Helper function to get log level color\n const getLevelColor = (level) => {\n switch (level) {\n case 'debug':\n return 'text-gray-500 bg-gray-100';\n case 'info':\n return 'text-blue-500 bg-blue-100';\n case 'warning':\n return 'text-yellow-500 bg-yellow-100';\n case 'error':\n return 'text-red-500 bg-red-100';\n case 'critical':\n return 'text-white bg-red-500';\n default:\n return 'text-gray-500 bg-gray-100';\n }\n };\n\n // Handle refresh\n const handleRefresh = async () => {\n setRefreshing(true);\n await fetchDeviceData();\n setRefreshing(false);\n };\n\n // Handle copy to clipboard\n const handleCopy = async (text, label) => {\n try {\n await navigator.clipboard.writeText(text);\n setCopySuccess(label);\n setTimeout(() => setCopySuccess(''), 2000);\n } catch (err) {\n console.error('Failed to copy: ', err);\n }\n };\n\n // Generate API endpoints for the device\n const getApiEndpoints = () => {\n const baseUrl = window.location.origin;\n return {\n telemetry: `${baseUrl}/api/data/${device?.id}`,\n status: `${baseUrl}/api/devices/${device?.id}`,\n logs: `${baseUrl}/api/logs/${device?.id}`\n };\n };\n\n // Toggle API documentation sections\n const toggleApiSection = (section) => {\n setExpandedApiSection(expandedApiSection === section ? '' : section);\n };\n\n // Handle edit device\n const handleEditDevice = () => {\n setShowEditModal(true);\n };\n\n const handleCloseEditModal = () => {\n setShowEditModal(false);\n };\n\n const handleDeviceUpdated = (updatedDevice) => {\n // Transform the updated device data\n const transformedDevice = {\n ...updatedDevice,\n status: getDeviceStatus(updatedDevice),\n battery: getBatteryInfo(updatedDevice),\n signal: getSignalInfo(updatedDevice),\n location: {\n latitude: updatedDevice.latitude || 0,\n longitude: updatedDevice.longitude || 0,\n altitude: updatedDevice.altitude || 0\n }\n };\n \n setDevice(transformedDevice);\n };\n\n // Handle delete device\n const handleDeleteDevice = () => {\n setDeleteConfirm(true);\n };\n\n const confirmDeleteDevice = async () => {\n try {\n await deviceApi.deleteDevice(device.id);\n navigate('/devices'); // Redirect to devices list after deletion\n } catch (error) {\n console.error('Error deleting device:', error);\n alert('Failed to delete device. Please try again.');\n setDeleteConfirm(false);\n }\n };\n\n const cancelDeleteDevice = () => {\n setDeleteConfirm(false);\n };\n\n // Generate example API data\n const getApiExamples = () => {\n return {\n telemetry: {\n request: {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n },\n body: {\n device_id: device?.id || 'LILYGO_001',\n device_name: device?.name || 'Zurich_Station_1',\n firmware: '1.1.0',\n temp: 24.3,\n hum: 65.2,\n solar_volt: 12.8,\n battery_volt: 3.8,\n signal: -65,\n gps_fixed: true,\n latitude: 47.3769,\n longitude: 8.5417,\n altitude: 408,\n satellites: 8,\n timestamp: Math.floor(Date.now() / 1000)\n }\n },\n response: {\n status: 201,\n body: {\n id: 123,\n device_id: device?.id || 'LILYGO_001',\n latitude: 47.3769,\n longitude: 8.5417,\n altitude: 408,\n temperature: 24.3,\n humidity: 65.2,\n solar_voltage: 12.8,\n battery_level: 85.5,\n battery_voltage: 3.8,\n signal_strength: -65,\n gps_fixed: true,\n satellites: 8,\n timestamp: new Date().toISOString(),\n device_timestamp: new Date().toISOString()\n }\n }\n },\n status: {\n request: {\n method: 'PUT',\n headers: {\n 'Content-Type': 'application/json',\n 'Authorization': 'Bearer your-token-here'\n },\n body: {\n name: device?.name || 'Your Device Name',\n firmware_version: \"1.1.0\",\n is_active: true,\n battery_level: 87.2,\n signal_strength: -62\n }\n },\n response: {\n status: 200,\n body: {\n id: device?.id || 'your-device-id',\n name: device?.name || 'Your Device Name',\n model: 'LILYGO T-A7670G',\n firmware_version: '1.1.0',\n is_active: true,\n battery_level: 87.2,\n signal_strength: -62,\n last_seen: new Date().toISOString(),\n created_at: new Date().toISOString(),\n updated_at: new Date().toISOString()\n }\n }\n },\n logs: {\n request: {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n 'Authorization': 'Bearer your-token-here'\n },\n body: {\n device_id: device?.id || 'LILYGO_001',\n level: \"info\",\n message: \"Device connected to cellular network\",\n source: \"network_manager\",\n timestamp: new Date().toISOString(),\n metadata: {\n network_type: \"LTE\",\n signal_quality: \"good\",\n operator: \"Swisscom\",\n modem_model: \"A7670G\"\n }\n }\n },\n response: {\n status: 201,\n body: {\n id: 456,\n device_id: device?.id || 'LILYGO_001',\n level: \"info\",\n message: \"Device connected to cellular network\",\n source: \"network_manager\",\n timestamp: new Date().toISOString(),\n metadata: {\n network_type: \"LTE\",\n signal_quality: \"good\",\n operator: \"Swisscom\",\n modem_model: \"A7670G\"\n }\n }\n }\n }\n };\n };\n\n if (loading) {\n return (\n <div className=\"flex items-center justify-center h-full\">\n <div className=\"text-center\">\n <div className=\"w-16 h-16 border-4 border-primary-500 border-t-transparent rounded-full animate-spin mx-auto\"></div>\n <p className=\"mt-4 text-gray-600\">Loading device data...</p>\n </div>\n </div>\n );\n }\n\n if (!device) {\n return (\n <div className=\"text-center py-10\">\n <h2 className=\"text-2xl font-semibold text-gray-800 mb-4\">Device Not Found</h2>\n <p className=\"text-gray-600 mb-6\">The device you are looking for does not exist or has been removed.</p>\n <Link to=\"/devices\" className=\"px-4 py-2 bg-primary-500 text-white rounded-md hover:bg-primary-600 transition-colors\">\n Back to Devices\n </Link>\n </div>\n );\n }\n\n return (\n <div className=\"space-y-6\">\n {/* Header */}\n <div className=\"flex flex-col md:flex-row md:items-center md:justify-between gap-4\">\n <div className=\"flex items-center gap-4\">\n <Link to=\"/devices\" className=\"p-2 text-gray-500 rounded-full hover:bg-gray-100\">\n <FiArrowLeft className=\"w-5 h-5\" />\n </Link>\n <div>\n <h1 className=\"text-2xl font-semibold text-gray-800\">{device.name}</h1>\n <p className=\"text-gray-500\">{device.description || 'No description'}</p>\n </div>\n </div>\n <div className=\"flex items-center gap-2\">\n <button \n className={`flex items-center gap-2 px-4 py-2 border border-gray-300 rounded-md hover:bg-gray-50 transition-colors ${refreshing ? 'opacity-50 cursor-not-allowed' : ''}`}\n onClick={handleRefresh}\n disabled={refreshing}\n >\n <FiRefreshCw className={refreshing ? 'animate-spin' : ''} />\n <span>Refresh</span>\n </button>\n <button \n onClick={handleEditDevice}\n className=\"flex items-center gap-2 px-4 py-2 border border-gray-300 rounded-md hover:bg-gray-50 transition-colors\"\n >\n <FiEdit />\n <span>Edit</span>\n </button>\n <button \n onClick={handleDeleteDevice}\n className=\"flex items-center gap-2 px-4 py-2 bg-danger-500 text-white rounded-md hover:bg-danger-600 transition-colors\"\n >\n <FiTrash2 />\n <span>Delete</span>\n </button>\n </div>\n </div>\n\n {/* Status Card */}\n <div className=\"dashboard-card\">\n <div className=\"grid grid-cols-1 md:grid-cols-4 gap-4\">\n <div className=\"flex items-center p-4 bg-gray-50 rounded-lg\">\n <div className={`h-3 w-3 rounded-full mr-2 ${\n device.status === 'online' ? 'bg-success-500' :\n device.status === 'idle' ? 'bg-warning-500' :\n 'bg-danger-500'\n }`}></div>\n <div>\n <p className=\"text-sm text-gray-500\">Status</p>\n <p className={`text-lg font-semibold capitalize ${getStatusColor(device.status)}`}>{device.status}</p>\n </div>\n </div>\n <div className=\"flex items-center p-4 bg-gray-50 rounded-lg\">\n <FiBattery className={`w-6 h-6 mr-2 ${getBatteryColor(device.battery.status)}`} />\n <div>\n <p className=\"text-sm text-gray-500\">Battery</p>\n <p className={`text-lg font-semibold ${getBatteryColor(device.battery.status)}`}>{device.battery.level}%</p>\n </div>\n </div>\n <div className=\"flex items-center p-4 bg-gray-50 rounded-lg\">\n <FiWifi className={`w-6 h-6 mr-2 ${getSignalColor(device.signal.status)}`} />\n <div>\n <p className=\"text-sm text-gray-500\">Signal</p>\n <p className={`text-lg font-semibold ${getSignalColor(device.signal.status)}`}>{device.signal.strength} dBm</p>\n </div>\n </div>\n <div className=\"flex items-center p-4 bg-gray-50 rounded-lg\">\n <FiClock className=\"w-6 h-6 mr-2 text-gray-500\" />\n <div>\n <p className=\"text-sm text-gray-500\">Last Seen</p>\n <p className=\"text-lg font-semibold text-gray-800\">{formatDate(device.last_seen)}</p>\n </div>\n </div>\n </div>\n </div>\n\n {/* Tabs */}\n <div className=\"border-b border-gray-200\">\n <nav className=\"-mb-px flex space-x-8\">\n <button\n className={`py-4 px-1 border-b-2 font-medium text-sm ${\n activeTab === 'overview'\n ? 'border-primary-500 text-primary-600'\n : 'border-transparent text-gray-500 hover:text-gray-700 hover:border-gray-300'\n }`}\n onClick={() => setActiveTab('overview')}\n >\n Overview\n </button>\n <button\n className={`py-4 px-1 border-b-2 font-medium text-sm ${\n activeTab === 'telemetry'\n ? 'border-primary-500 text-primary-600'\n : 'border-transparent text-gray-500 hover:text-gray-700 hover:border-gray-300'\n }`}\n onClick={() => setActiveTab('telemetry')}\n >\n Telemetry\n </button>\n <button\n className={`py-4 px-1 border-b-2 font-medium text-sm ${\n activeTab === 'logs'\n ? 'border-primary-500 text-primary-600'\n : 'border-transparent text-gray-500 hover:text-gray-700 hover:border-gray-300'\n }`}\n onClick={() => setActiveTab('logs')}\n >\n Logs\n </button>\n <button\n className={`py-4 px-1 border-b-2 font-medium text-sm ${\n activeTab === 'settings'\n ? 'border-primary-500 text-primary-600'\n : 'border-transparent text-gray-500 hover:text-gray-700 hover:border-gray-300'\n }`}\n onClick={() => setActiveTab('settings')}\n >\n Settings\n </button>\n </nav>\n </div>\n\n {/* Tab Content */}\n <div>\n {/* Overview Tab */}\n {activeTab === 'overview' && (\n <div className=\"grid grid-cols-1 md:grid-cols-2 gap-6\">\n <div className=\"dashboard-card\">\n <h2 className=\"text-lg font-semibold text-gray-800 mb-4\">Device Information</h2>\n <div className=\"space-y-4\">\n <div className=\"grid grid-cols-1 sm:grid-cols-2 gap-4\">\n <div>\n <p className=\"text-sm text-gray-500\">Device ID</p>\n <p className=\"font-medium\">{device.id}</p>\n </div>\n <div>\n <p className=\"text-sm text-gray-500\">Model</p>\n <p className=\"font-medium\">{device.model}</p>\n </div>\n <div>\n <p className=\"text-sm text-gray-500\">Firmware Version</p>\n <p className=\"font-medium\">v{device.firmware_version}</p>\n </div>\n <div>\n <p className=\"text-sm text-gray-500\">Created At</p>\n <p className=\"font-medium\">{formatDate(device.created_at)}</p>\n </div>\n </div>\n <div>\n <p className=\"text-sm text-gray-500\">Description</p>\n <p className=\"font-medium\">{device.description || 'No description'}</p>\n </div>\n </div>\n </div>\n\n <div className=\"dashboard-card h-[300px]\">\n <h2 className=\"text-lg font-semibold text-gray-800 mb-4\">Location</h2>\n <MapContainer \n center={[device.location.latitude, device.location.longitude]} \n zoom={15} \n style={{ height: 'calc(100% - 2rem)', width: '100%' }}\n >\n <TileLayer\n attribution='© <a href=\"https://www.openstreetmap.org/copyright\">OpenStreetMap</a> contributors'\n url=\"https://{s}.tile.openstreetmap.org/{z}/{x}/{y}.png\"\n />\n <Marker position={[device.location.latitude, device.location.longitude]}>\n <Popup>\n <div className=\"p-1\">\n <h3 className=\"font-semibold\">{device.name}</h3>\n <p className=\"text-xs text-gray-500\">\n {device.location.latitude.toFixed(6)}, {device.location.longitude.toFixed(6)}\n </p>\n <p className=\"text-xs text-gray-500\">\n Altitude: {device.location.altitude} m\n </p>\n </div>\n </Popup>\n </Marker>\n </MapContainer>\n </div>\n\n <div className=\"dashboard-card md:col-span-2\">\n <h2 className=\"text-lg font-semibold text-gray-800 mb-4\">Recent Activity</h2>\n <div className=\"space-y-4\">\n {logs.slice(0, 5).map((log) => (\n <div key={log.id} className=\"flex items-start gap-3 p-3 bg-gray-50 rounded-lg\">\n <div className={`p-2 rounded-full ${\n log.level === 'info' ? 'bg-blue-100 text-blue-500' :\n log.level === 'warning' ? 'bg-yellow-100 text-yellow-500' :\n log.level === 'error' ? 'bg-red-100 text-red-500' :\n log.level === 'critical' ? 'bg-red-500 text-white' :\n 'bg-gray-100 text-gray-500'\n }`}>\n <FiInfo className=\"w-5 h-5\" />\n </div>\n <div className=\"flex-1\">\n <div className=\"flex justify-between\">\n <p className=\"font-medium text-gray-800\">{log.message}</p>\n <span className=\"text-sm text-gray-500\">{formatDate(log.timestamp)}</span>\n </div>\n <p className=\"text-sm text-gray-500\">Source: {log.source}</p>\n </div>\n </div>\n ))}\n {logs.length === 0 && (\n <p className=\"text-center py-4 text-gray-500\">No recent activity</p>\n )}\n </div>\n </div>\n </div>\n )}\n\n {/* Telemetry Tab */}\n {activeTab === 'telemetry' && (\n <div className=\"dashboard-card\">\n <h2 className=\"text-lg font-semibold text-gray-800 mb-4\">Telemetry Data</h2>\n {telemetry.length === 0 ? (\n <p className=\"text-center py-4 text-gray-500\">No telemetry data available</p>\n ) : (\n <div className=\"overflow-x-auto\">\n <table className=\"min-w-full divide-y divide-gray-200\">\n <thead className=\"bg-gray-50\">\n <tr>\n <th className=\"px-6 py-3 text-left text-xs font-medium text-gray-500 uppercase tracking-wider\">Timestamp</th>\n <th className=\"px-6 py-3 text-left text-xs font-medium text-gray-500 uppercase tracking-wider\">Location</th>\n <th className=\"px-6 py-3 text-left text-xs font-medium text-gray-500 uppercase tracking-wider\">Battery</th>\n <th className=\"px-6 py-3 text-left text-xs font-medium text-gray-500 uppercase tracking-wider\">Signal</th>\n <th className=\"px-6 py-3 text-left text-xs font-medium text-gray-500 uppercase tracking-wider\">Temperature</th>\n </tr>\n </thead>\n <tbody className=\"bg-white divide-y divide-gray-200\">\n {telemetry.map((item) => (\n <tr key={item.id} className=\"hover:bg-gray-50\">\n <td className=\"px-6 py-4 whitespace-nowrap text-sm text-gray-500\">\n {formatDate(item.timestamp)}\n </td>\n <td className=\"px-6 py-4 whitespace-nowrap\">\n <div className=\"flex items-center\">\n <FiMapPin className=\"mr-2 text-gray-500\" />\n <span className=\"text-gray-800\">{item.latitude.toFixed(6)}, {item.longitude.toFixed(6)}</span>\n </div>\n </td>\n <td className=\"px-6 py-4 whitespace-nowrap\">\n <div className=\"flex items-center\">\n <FiBattery className=\"mr-2 text-gray-500\" />\n <span className=\"text-gray-800\">{item.battery_level}%</span>\n </div>\n </td>\n <td className=\"px-6 py-4 whitespace-nowrap\">\n <div className=\"flex items-center\">\n <FiWifi className=\"mr-2 text-gray-500\" />\n <span className=\"text-gray-800\">{item.signal_strength} dBm</span>\n </div>\n </td>\n <td className=\"px-6 py-4 whitespace-nowrap text-gray-800\">\n {item.temperature}°C\n </td>\n </tr>\n ))}\n </tbody>\n </table>\n </div>\n )}\n </div>\n )}\n\n {/* Logs Tab */}\n {activeTab === 'logs' && (\n <div className=\"dashboard-card\">\n <h2 className=\"text-lg font-semibold text-gray-800 mb-4\">Device Logs</h2>\n {logs.length === 0 ? (\n <p className=\"text-center py-4 text-gray-500\">No logs available</p>\n ) : (\n <div className=\"overflow-x-auto\">\n <table className=\"min-w-full divide-y divide-gray-200\">\n <thead className=\"bg-gray-50\">\n <tr>\n <th className=\"px-6 py-3 text-left text-xs font-medium text-gray-500 uppercase tracking-wider\">Timestamp</th>\n <th className=\"px-6 py-3 text-left text-xs font-medium text-gray-500 uppercase tracking-wider\">Level</th>\n <th className=\"px-6 py-3 text-left text-xs font-medium text-gray-500 uppercase tracking-wider\">Message</th>\n <th className=\"px-6 py-3 text-left text-xs font-medium text-gray-500 uppercase tracking-wider\">Source</th>\n </tr>\n </thead>\n <tbody className=\"bg-white divide-y divide-gray-200\">\n {logs.map((log) => (\n <tr key={log.id} className=\"hover:bg-gray-50\">\n <td className=\"px-6 py-4 whitespace-nowrap text-sm text-gray-500\">\n {formatDate(log.timestamp)}\n </td>\n <td className=\"px-6 py-4 whitespace-nowrap\">\n <span className={`px-2 py-1 text-xs font-medium rounded-full ${getLevelColor(log.level)}`}>\n {log.level.toUpperCase()}\n </span>\n </td>\n <td className=\"px-6 py-4 text-sm text-gray-900\">\n {log.message}\n </td>\n <td className=\"px-6 py-4 whitespace-nowrap text-sm text-gray-500\">\n {log.source}\n </td>\n </tr>\n ))}\n </tbody>\n </table>\n </div>\n )}\n </div>\n )}\n\n {/* Settings Tab */}\n {activeTab === 'settings' && (\n <div className=\"space-y-6\">\n {/* API Configuration Section */}\n <div className=\"dashboard-card\">\n <div className=\"flex items-center gap-2 mb-4\">\n <FiServer className=\"w-5 h-5 text-primary-500\" />\n <h2 className=\"text-lg font-semibold text-gray-800\">API Configuration</h2>\n </div>\n <p className=\"text-sm text-gray-600 mb-6\">\n Configure your device to send data to these endpoints. Copy the URLs below and configure them in your IoT device.\n </p>\n \n <div className=\"space-y-4\">\n {/* IoT Device Telemetry Endpoint */}\n <div className=\"p-4 bg-blue-50 border border-blue-200 rounded-lg\">\n <div className=\"flex items-center justify-between mb-2\">\n <h3 className=\"font-medium text-blue-900\">IoT Device Data Endpoint (LILYGO Format)</h3>\n <div className=\"flex items-center gap-2\">\n <span className=\"text-xs bg-blue-100 text-blue-800 px-2 py-1 rounded\">POST</span>\n <button\n onClick={() => toggleApiSection('telemetry')}\n className=\"flex items-center gap-1 px-2 py-1 text-blue-600 hover:text-blue-800 transition-colors\"\n >\n <FiCode size={14} />\n {expandedApiSection === 'telemetry' ? <FiChevronUp size={14} /> : <FiChevronDown size={14} />}\n </button>\n </div>\n </div>\n <p className=\"text-sm text-blue-700 mb-3\">Send LILYGO T-A7670G device data including temperature, humidity, solar voltage, GPS and battery info</p>\n <div className=\"flex items-center gap-2 mb-3\">\n <code className=\"flex-1 p-2 bg-white border border-blue-300 rounded text-sm font-mono text-gray-800 overflow-x-auto\">\n {getApiEndpoints().telemetry}/iot\n </code>\n <button\n onClick={() => handleCopy(getApiEndpoints().telemetry, 'telemetry')}\n className=\"flex items-center gap-1 px-3 py-2 bg-blue-600 text-white rounded hover:bg-blue-700 transition-colors\"\n >\n <FiCopy size={14} />\n {copySuccess === 'telemetry' ? 'Copied!' : 'Copy'}\n </button>\n </div>\n \n {/* Expandable Documentation */}\n {expandedApiSection === 'telemetry' && (\n <div className=\"mt-4 space-y-4\">\n {/* Request Example */}\n <div className=\"bg-white border border-blue-300 rounded-lg p-4\">\n <h4 className=\"font-medium text-gray-800 mb-2 flex items-center gap-2\">\n <span className=\"w-2 h-2 bg-green-500 rounded-full\"></span>\n Request Example\n </h4>\n <div className=\"space-y-3\">\n <div>\n <p className=\"text-xs font-medium text-gray-600 mb-1\">Headers:</p>\n <pre className=\"text-xs bg-gray-50 p-2 rounded border overflow-x-auto\">\n{JSON.stringify(getApiExamples().telemetry.request.headers, null, 2)}\n </pre>\n </div>\n <div>\n <p className=\"text-xs font-medium text-gray-600 mb-1\">Body (JSON):</p>\n <pre className=\"text-xs bg-gray-50 p-2 rounded border overflow-x-auto\">\n{JSON.stringify(getApiExamples().telemetry.request.body, null, 2)}\n </pre>\n </div>\n <div>\n <p className=\"text-xs font-medium text-gray-600 mb-1\">cURL Example:</p>\n <pre className=\"text-xs bg-gray-50 p-2 rounded border overflow-x-auto\">\n{`curl -X POST \"${getApiEndpoints().telemetry}/iot\" \\\\\n -H \"Content-Type: application/json\" \\\\\n -d '${JSON.stringify(getApiExamples().telemetry.request.body)}'`}\n </pre>\n </div>\n <div>\n <p className=\"text-xs font-medium text-gray-600 mb-1\">Arduino/ESP32 Example:</p>\n <pre className=\"text-xs bg-gray-50 p-2 rounded border overflow-x-auto\">\n{`String json = \"{\";\njson += \"\\\\\"device_id\\\\\":\\\\\"${device?.id || 'LILYGO_001'}\\\\\",\";\njson += \"\\\\\"temp\\\\\":\" + String(temperature) + \",\";\njson += \"\\\\\"hum\\\\\":\" + String(humidity) + \",\";\njson += \"\\\\\"solar_volt\\\\\":\" + String(solarVoltage) + \",\";\njson += \"\\\\\"battery_volt\\\\\":\" + String(batteryVoltage) + \",\";\njson += \"\\\\\"signal\\\\\":\" + String(signalStrength) + \",\";\njson += \"\\\\\"gps_fixed\\\\\":\" + (gpsFixed ? \"true\" : \"false\") + \",\";\njson += \"\\\\\"latitude\\\\\":\" + String(latitude, 6) + \",\";\njson += \"\\\\\"longitude\\\\\":\" + String(longitude, 6) + \",\";\njson += \"\\\\\"timestamp\\\\\":\" + String(millis() / 1000);\njson += \"}\";\n\n// Send via HTTP POST to ${getApiEndpoints().telemetry}/iot`}\n </pre>\n </div>\n </div>\n </div>\n \n {/* Response Example */}\n <div className=\"bg-white border border-blue-300 rounded-lg p-4\">\n <h4 className=\"font-medium text-gray-800 mb-2 flex items-center gap-2\">\n <span className=\"w-2 h-2 bg-blue-500 rounded-full\"></span>\n Response Example\n </h4>\n <div className=\"space-y-3\">\n <div>\n <p className=\"text-xs font-medium text-gray-600 mb-1\">Status: {getApiExamples().telemetry.response.status}</p>\n <pre className=\"text-xs bg-gray-50 p-2 rounded border overflow-x-auto\">\n{JSON.stringify(getApiExamples().telemetry.response.body, null, 2)}\n </pre>\n </div>\n </div>\n </div>\n \n {/* Field Descriptions */}\n <div className=\"bg-white border border-blue-300 rounded-lg p-4\">\n <h4 className=\"font-medium text-gray-800 mb-2\">LILYGO Field Descriptions</h4>\n <div className=\"text-xs space-y-1\">\n <div><strong>device_id:</strong> Unique device identifier (required)</div>\n <div><strong>device_name:</strong> Human-readable device name (optional)</div>\n <div><strong>firmware:</strong> Device firmware version (optional)</div>\n <div><strong>temp:</strong> Temperature in Celsius (optional)</div>\n <div><strong>hum:</strong> Humidity percentage (optional)</div>\n <div><strong>solar_volt:</strong> Solar panel voltage (optional)</div>\n <div><strong>battery_volt:</strong> Battery voltage (optional)</div>\n <div><strong>signal:</strong> Cellular signal in dBm (optional)</div>\n <div><strong>gps_fixed:</strong> GPS fix status boolean (optional)</div>\n <div><strong>latitude/longitude:</strong> GPS coordinates (optional)</div>\n <div><strong>altitude:</strong> Elevation in meters (optional)</div>\n <div><strong>satellites:</strong> Number of GPS satellites (optional)</div>\n <div><strong>timestamp:</strong> Unix timestamp from device (optional)</div>\n </div>\n <div className=\"mt-3 p-2 bg-blue-50 rounded text-xs\">\n <strong>Note:</strong> This endpoint automatically converts battery voltage to percentage, \n updates device information, and handles the LILYGO device data format.\n </div>\n </div>\n </div>\n )}\n </div>\n\n {/* Status Update Endpoint */}\n <div className=\"p-4 bg-green-50 border border-green-200 rounded-lg\">\n <div className=\"flex items-center justify-between mb-2\">\n <h3 className=\"font-medium text-green-900\">Device Status Endpoint</h3>\n <div className=\"flex items-center gap-2\">\n <span className=\"text-xs bg-green-100 text-green-800 px-2 py-1 rounded\">PUT</span>\n <button\n onClick={() => toggleApiSection('status')}\n className=\"flex items-center gap-1 px-2 py-1 text-green-600 hover:text-green-800 transition-colors\"\n >\n <FiCode size={14} />\n {expandedApiSection === 'status' ? <FiChevronUp size={14} /> : <FiChevronDown size={14} />}\n </button>\n </div>\n </div>\n <p className=\"text-sm text-green-700 mb-3\">Update device configuration and status information</p>\n <div className=\"flex items-center gap-2 mb-3\">\n <code className=\"flex-1 p-2 bg-white border border-green-300 rounded text-sm font-mono text-gray-800 overflow-x-auto\">\n {getApiEndpoints().status}\n </code>\n <button\n onClick={() => handleCopy(getApiEndpoints().status, 'status')}\n className=\"flex items-center gap-1 px-3 py-2 bg-green-600 text-white rounded hover:bg-green-700 transition-colors\"\n >\n <FiCopy size={14} />\n {copySuccess === 'status' ? 'Copied!' : 'Copy'}\n </button>\n </div>\n \n {/* Expandable Documentation */}\n {expandedApiSection === 'status' && (\n <div className=\"mt-4 space-y-4\">\n {/* Request Example */}\n <div className=\"bg-white border border-green-300 rounded-lg p-4\">\n <h4 className=\"font-medium text-gray-800 mb-2 flex items-center gap-2\">\n <span className=\"w-2 h-2 bg-green-500 rounded-full\"></span>\n Request Example\n </h4>\n <div className=\"space-y-3\">\n <div>\n <p className=\"text-xs font-medium text-gray-600 mb-1\">Headers:</p>\n <pre className=\"text-xs bg-gray-50 p-2 rounded border overflow-x-auto\">\n{JSON.stringify(getApiExamples().status.request.headers, null, 2)}\n </pre>\n </div>\n <div>\n <p className=\"text-xs font-medium text-gray-600 mb-1\">Body (JSON):</p>\n <pre className=\"text-xs bg-gray-50 p-2 rounded border overflow-x-auto\">\n{JSON.stringify(getApiExamples().status.request.body, null, 2)}\n </pre>\n </div>\n <div>\n <p className=\"text-xs font-medium text-gray-600 mb-1\">cURL Example:</p>\n <pre className=\"text-xs bg-gray-50 p-2 rounded border overflow-x-auto\">\n{`curl -X PUT \"${getApiEndpoints().status}\" \\\\\n -H \"Content-Type: application/json\" \\\\\n -H \"Device-ID: ${device?.id || 'your-device-id'}\" \\\\\n -d '${JSON.stringify(getApiExamples().status.request.body)}'`}\n </pre>\n </div>\n </div>\n </div>\n \n {/* Response Example */}\n <div className=\"bg-white border border-green-300 rounded-lg p-4\">\n <h4 className=\"font-medium text-gray-800 mb-2 flex items-center gap-2\">\n <span className=\"w-2 h-2 bg-blue-500 rounded-full\"></span>\n Response Example\n </h4>\n <div className=\"space-y-3\">\n <div>\n <p className=\"text-xs font-medium text-gray-600 mb-1\">Status: {getApiExamples().status.response.status}</p>\n <pre className=\"text-xs bg-gray-50 p-2 rounded border overflow-x-auto\">\n{JSON.stringify(getApiExamples().status.response.body, null, 2)}\n </pre>\n </div>\n </div>\n </div>\n \n {/* Field Descriptions */}\n <div className=\"bg-white border border-green-300 rounded-lg p-4\">\n <h4 className=\"font-medium text-gray-800 mb-2\">Field Descriptions</h4>\n <div className=\"text-xs space-y-1\">\n <div><strong>battery_level:</strong> Current battery percentage (optional)</div>\n <div><strong>signal_strength:</strong> Cellular signal strength in dBm (optional)</div>\n <div><strong>firmware_version:</strong> Current firmware version string (optional)</div>\n <div><strong>is_active:</strong> Device active status boolean (optional)</div>\n <div><strong>last_seen:</strong> Last communication timestamp (optional)</div>\n </div>\n </div>\n </div>\n )}\n </div>\n\n {/* Logs Endpoint */}\n <div className=\"p-4 bg-yellow-50 border border-yellow-200 rounded-lg\">\n <div className=\"flex items-center justify-between mb-2\">\n <h3 className=\"font-medium text-yellow-900\">Device Logs Endpoint</h3>\n <div className=\"flex items-center gap-2\">\n <span className=\"text-xs bg-yellow-100 text-yellow-800 px-2 py-1 rounded\">POST</span>\n <button\n onClick={() => toggleApiSection('logs')}\n className=\"flex items-center gap-1 px-2 py-1 text-yellow-600 hover:text-yellow-800 transition-colors\"\n >\n <FiCode size={14} />\n {expandedApiSection === 'logs' ? <FiChevronUp size={14} /> : <FiChevronDown size={14} />}\n </button>\n </div>\n </div>\n <p className=\"text-sm text-yellow-700 mb-3\">Send device logs, errors, and diagnostic information</p>\n <div className=\"flex items-center gap-2 mb-3\">\n <code className=\"flex-1 p-2 bg-white border border-yellow-300 rounded text-sm font-mono text-gray-800 overflow-x-auto\">\n {getApiEndpoints().logs}\n </code>\n <button\n onClick={() => handleCopy(getApiEndpoints().logs, 'logs')}\n className=\"flex items-center gap-1 px-3 py-2 bg-yellow-600 text-white rounded hover:bg-yellow-700 transition-colors\"\n >\n <FiCopy size={14} />\n {copySuccess === 'logs' ? 'Copied!' : 'Copy'}\n </button>\n </div>\n \n {/* Expandable Documentation */}\n {expandedApiSection === 'logs' && (\n <div className=\"mt-4 space-y-4\">\n {/* Request Example */}\n <div className=\"bg-white border border-yellow-300 rounded-lg p-4\">\n <h4 className=\"font-medium text-gray-800 mb-2 flex items-center gap-2\">\n <span className=\"w-2 h-2 bg-green-500 rounded-full\"></span>\n Request Example\n </h4>\n <div className=\"space-y-3\">\n <div>\n <p className=\"text-xs font-medium text-gray-600 mb-1\">Headers:</p>\n <pre className=\"text-xs bg-gray-50 p-2 rounded border overflow-x-auto\">\n{JSON.stringify(getApiExamples().logs.request.headers, null, 2)}\n </pre>\n </div>\n <div>\n <p className=\"text-xs font-medium text-gray-600 mb-1\">Body (JSON):</p>\n <pre className=\"text-xs bg-gray-50 p-2 rounded border overflow-x-auto\">\n{JSON.stringify(getApiExamples().logs.request.body, null, 2)}\n </pre>\n </div>\n <div>\n <p className=\"text-xs font-medium text-gray-600 mb-1\">cURL Example:</p>\n <pre className=\"text-xs bg-gray-50 p-2 rounded border overflow-x-auto\">\n{`curl -X POST \"${getApiEndpoints().logs}\" \\\\\n -H \"Content-Type: application/json\" \\\\\n -H \"Device-ID: ${device?.id || 'your-device-id'}\" \\\\\n -d '${JSON.stringify(getApiExamples().logs.request.body)}'`}\n </pre>\n </div>\n </div>\n </div>\n \n {/* Response Example */}\n <div className=\"bg-white border border-yellow-300 rounded-lg p-4\">\n <h4 className=\"font-medium text-gray-800 mb-2 flex items-center gap-2\">\n <span className=\"w-2 h-2 bg-blue-500 rounded-full\"></span>\n Response Example\n </h4>\n <div className=\"space-y-3\">\n <div>\n <p className=\"text-xs font-medium text-gray-600 mb-1\">Status: {getApiExamples().logs.response.status}</p>\n <pre className=\"text-xs bg-gray-50 p-2 rounded border overflow-x-auto\">\n{JSON.stringify(getApiExamples().logs.response.body, null, 2)}\n </pre>\n </div>\n </div>\n </div>\n \n {/* Field Descriptions */}\n <div className=\"bg-white border border-yellow-300 rounded-lg p-4\">\n <h4 className=\"font-medium text-gray-800 mb-2\">Field Descriptions</h4>\n <div className=\"text-xs space-y-1\">\n <div><strong>level:</strong> Log level (debug, info, warning, error, critical) - required</div>\n <div><strong>message:</strong> Log message content - required</div>\n <div><strong>source:</strong> Component/module that generated the log - required</div>\n <div><strong>timestamp:</strong> ISO 8601 datetime string - required</div>\n <div><strong>metadata:</strong> Additional structured data object - optional</div>\n </div>\n </div>\n </div>\n )}\n </div>\n\n {/* Authentication Info */}\n <div className=\"p-4 bg-gray-50 border border-gray-200 rounded-lg\">\n <div className=\"flex items-center gap-2 mb-2\">\n <FiKey className=\"w-4 h-4 text-gray-600\" />\n <h3 className=\"font-medium text-gray-900\">Authentication</h3>\n </div>\n <p className=\"text-sm text-gray-600 mb-3\">Include this device ID in your requests for authentication</p>\n <div className=\"flex items-center gap-2\">\n <code className=\"flex-1 p-2 bg-white border border-gray-300 rounded text-sm font-mono text-gray-800\">\n Device-ID: {device?.id}\n </code>\n <button\n onClick={() => handleCopy(device?.id, 'deviceId')}\n className=\"flex items-center gap-1 px-3 py-2 bg-gray-600 text-white rounded hover:bg-gray-700 transition-colors\"\n >\n <FiCopy size={14} />\n {copySuccess === 'deviceId' ? 'Copied!' : 'Copy'}\n </button>\n </div>\n </div>\n </div>\n </div>\n\n {/* Device Settings Section */}\n <div className=\"dashboard-card\">\n <h2 className=\"text-lg font-semibold text-gray-800 mb-4\">Device Settings</h2>\n <form onSubmit={(e) => {\n e.preventDefault();\n const formData = new FormData(e.target);\n const updateData = {\n name: formData.get('deviceName'),\n description: formData.get('deviceDescription'),\n firmware_version: formData.get('firmwareVersion'),\n model: formData.get('deviceModel'),\n is_active: formData.get('status') === 'active'\n };\n \n deviceApi.updateDevice(device.id, updateData)\n .then(response => {\n handleDeviceUpdated(response.data);\n alert('Device settings updated successfully!');\n })\n .catch(error => {\n console.error('Error updating device:', error);\n alert('Failed to update device settings. Please try again.');\n });\n }} className=\"space-y-4\">\n <div className=\"grid grid-cols-1 md:grid-cols-2 gap-4\">\n <div>\n <label htmlFor=\"deviceName\" className=\"block text-sm font-medium text-gray-700 mb-1\">\n Device Name\n </label>\n <input\n type=\"text\"\n id=\"deviceName\"\n name=\"deviceName\"\n className=\"block w-full px-3 py-2 border border-gray-300 rounded-md shadow-sm focus:outline-none focus:ring-primary-500 focus:border-primary-500 sm:text-sm\"\n defaultValue={device.name}\n />\n </div>\n <div>\n <label htmlFor=\"deviceDescription\" className=\"block text-sm font-medium text-gray-700 mb-1\">\n Description\n </label>\n <input\n type=\"text\"\n id=\"deviceDescription\"\n name=\"deviceDescription\"\n className=\"block w-full px-3 py-2 border border-gray-300 rounded-md shadow-sm focus:outline-none focus:ring-primary-500 focus:border-primary-500 sm:text-sm\"\n defaultValue={device.description || ''}\n />\n </div>\n <div>\n <label htmlFor=\"firmwareVersion\" className=\"block text-sm font-medium text-gray-700 mb-1\">\n Firmware Version\n </label>\n <input\n type=\"text\"\n id=\"firmwareVersion\"\n name=\"firmwareVersion\"\n className=\"block w-full px-3 py-2 border border-gray-300 rounded-md shadow-sm focus:outline-none focus:ring-primary-500 focus:border-primary-500 sm:text-sm\"\n defaultValue={device.firmware_version || ''}\n />\n </div>\n <div>\n <label htmlFor=\"deviceModel\" className=\"block text-sm font-medium text-gray-700 mb-1\">\n Model\n </label>\n <select\n id=\"deviceModel\"\n name=\"deviceModel\"\n className=\"block w-full px-3 py-2 border border-gray-300 rounded-md shadow-sm focus:outline-none focus:ring-primary-500 focus:border-primary-500 sm:text-sm\"\n defaultValue={device.model}\n >\n <option value=\"SIM7000E\">SIM7000E</option>\n <option value=\"SIM7000A\">SIM7000A</option>\n <option value=\"SIM7000G\">SIM7000G</option>\n <option value=\"Custom\">Custom</option>\n </select>\n </div>\n </div>\n \n <div>\n <label className=\"block text-sm font-medium text-gray-700 mb-1\">\n Device Status\n </label>\n <div className=\"flex space-x-4\">\n <div className=\"flex items-center\">\n <input\n id=\"status-active\"\n name=\"status\"\n type=\"radio\"\n value=\"active\"\n defaultChecked={device.is_active}\n className=\"h-4 w-4 text-primary-600 focus:ring-primary-500 border-gray-300\"\n />\n <label htmlFor=\"status-active\" className=\"ml-2 block text-sm text-gray-700\">\n Active\n </label>\n </div>\n <div className=\"flex items-center\">\n <input\n id=\"status-inactive\"\n name=\"status\"\n type=\"radio\"\n value=\"inactive\"\n defaultChecked={!device.is_active}\n className=\"h-4 w-4 text-primary-600 focus:ring-primary-500 border-gray-300\"\n />\n <label htmlFor=\"status-inactive\" className=\"ml-2 block text-sm text-gray-700\">\n Inactive\n </label>\n </div>\n </div>\n </div>\n \n <div className=\"pt-4\">\n <button\n type=\"submit\"\n className=\"flex items-center gap-2 px-4 py-2 bg-primary-500 text-white rounded-md hover:bg-primary-600 transition-colors\"\n >\n <FiSave />\n <span>Save Changes</span>\n </button>\n </div>\n </form>\n </div>\n </div>\n )}\n </div>\n\n {/* Edit Device Modal */}\n <EditDeviceModal\n isOpen={showEditModal}\n onClose={handleCloseEditModal}\n device={device}\n onDeviceUpdated={handleDeviceUpdated}\n />\n\n {/* Delete Confirmation Dialog */}\n {deleteConfirm && (\n <div className=\"fixed inset-0 bg-black bg-opacity-50 flex items-center justify-center z-50\">\n <div className=\"bg-white rounded-lg shadow-xl max-w-md w-full mx-4\">\n <div className=\"p-6\">\n <h3 className=\"text-lg font-semibold text-gray-800 mb-4\">Delete Device</h3>\n <p className=\"text-gray-600 mb-6\">\n Are you sure you want to delete \"{device?.name}\"? This action cannot be undone and will remove all associated telemetry data and logs.\n </p>\n <div className=\"flex justify-end gap-3\">\n <button\n onClick={cancelDeleteDevice}\n className=\"px-4 py-2 border border-gray-300 rounded-md text-sm font-medium text-gray-700 hover:bg-gray-50 transition-colors\"\n >\n Cancel\n </button>\n <button\n onClick={confirmDeleteDevice}\n className=\"px-4 py-2 bg-red-500 text-white rounded-md text-sm font-medium hover:bg-red-600 transition-colors\"\n >\n Delete Device\n </button>\n </div>\n </div>\n </div>\n </div>\n )}\n </div>\n );\n};\n\nexport default DeviceDetail;\n"],"mappings":"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","ignoreList":[]},"metadata":{},"sourceType":"module","externalDependencies":[]} |