1 line
32 KiB
JSON
1 line
32 KiB
JSON
{"ast":null,"code":"import React,{useState,useEffect}from'react';import{MapContainer,TileLayer,Marker,Popup}from'react-leaflet';import{FiBattery,FiWifi,FiClock}from'react-icons/fi';import'leaflet/dist/leaflet.css';import L from'leaflet';import{Link}from'react-router-dom';// 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'});// Custom marker icons\nconst createCustomIcon=status=>{let iconUrl;switch(status){case'online':iconUrl='https://raw.githubusercontent.com/pointhi/leaflet-color-markers/master/img/marker-icon-green.png';break;case'idle':iconUrl='https://raw.githubusercontent.com/pointhi/leaflet-color-markers/master/img/marker-icon-yellow.png';break;case'offline':iconUrl='https://raw.githubusercontent.com/pointhi/leaflet-color-markers/master/img/marker-icon-red.png';break;default:iconUrl='https://raw.githubusercontent.com/pointhi/leaflet-color-markers/master/img/marker-icon-blue.png';}return L.icon({iconUrl,shadowUrl:'https://cdnjs.cloudflare.com/ajax/libs/leaflet/1.7.1/images/marker-shadow.png',iconSize:[25,41],iconAnchor:[12,41],popupAnchor:[1,-34],shadowSize:[41,41]});};// Dummy data for demonstration\nconst dummyDevices=[{id:'device-001',name:'SIM7000E-001',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()},{id:'device-002',name:'SIM7000E-002',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\n},{id:'device-003',name:'SIM7000E-003',status:'offline',battery:{level:12,status:'critical'},signal:{strength:-105,status:'poor'},location:{latitude:47.3750,longitude:8.5430,altitude:405},last_seen:new Date(Date.now()-86400000).toISOString()// 1 day ago\n},{id:'device-004',name:'SIM7000E-004',status:'online',battery:{level:78,status:'good'},signal:{strength:-72,status:'good'},location:{latitude:47.3790,longitude:8.5450,altitude:412},last_seen:new Date().toISOString()},{id:'device-005',name:'SIM7000E-005',status:'idle',battery:{level:35,status:'low'},signal:{strength:-90,status:'fair'},location:{latitude:47.3730,longitude:8.5380,altitude:407},last_seen:new Date(Date.now()-7200000).toISOString()// 2 hours ago\n}];const MapView=()=>{const[devices,setDevices]=useState([]);const[loading,setLoading]=useState(true);const[filter,setFilter]=useState('all');const[mapCenter,setMapCenter]=useState([47.3769,8.5417]);// Zurich coordinates\nconst[mapZoom,setMapZoom]=useState(13);useEffect(()=>{// Simulate API call\nconst fetchData=async()=>{try{// In a real app, you would fetch data from your API\n// const response = await fetch('/api/status/devices');\n// const data = await response.json();\n// Using dummy data for now\nsetTimeout(()=>{setDevices(dummyDevices);setLoading(false);},1000);}catch(error){console.error('Error fetching data:',error);setLoading(false);}};fetchData();},[]);// Helper function to format date\nconst formatDate=dateString=>{const date=new Date(dateString);return date.toLocaleString();};// Filter devices based on status\nconst filteredDevices=filter==='all'?devices:devices.filter(device=>device.status===filter);// 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';}};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 map data...\"})]})});}return/*#__PURE__*/_jsxs(\"div\",{className:\"space-y-6\",children:[/*#__PURE__*/_jsxs(\"div\",{className:\"flex justify-between items-center\",children:[/*#__PURE__*/_jsx(\"h1\",{className:\"text-2xl font-semibold text-gray-800\",children:\"Device Map\"}),/*#__PURE__*/_jsxs(\"div\",{className:\"flex space-x-2\",children:[/*#__PURE__*/_jsx(\"button\",{className:`px-3 py-1 rounded-md text-sm ${filter==='all'?'bg-primary-500 text-white':'bg-gray-200 text-gray-700'}`,onClick:()=>setFilter('all'),children:\"All\"}),/*#__PURE__*/_jsx(\"button\",{className:`px-3 py-1 rounded-md text-sm ${filter==='online'?'bg-success-500 text-white':'bg-gray-200 text-gray-700'}`,onClick:()=>setFilter('online'),children:\"Online\"}),/*#__PURE__*/_jsx(\"button\",{className:`px-3 py-1 rounded-md text-sm ${filter==='idle'?'bg-warning-500 text-white':'bg-gray-200 text-gray-700'}`,onClick:()=>setFilter('idle'),children:\"Idle\"}),/*#__PURE__*/_jsx(\"button\",{className:`px-3 py-1 rounded-md text-sm ${filter==='offline'?'bg-danger-500 text-white':'bg-gray-200 text-gray-700'}`,onClick:()=>setFilter('offline'),children:\"Offline\"})]})]}),/*#__PURE__*/_jsx(\"div\",{className:\"dashboard-card h-[600px]\",children:/*#__PURE__*/_jsxs(MapContainer,{center:mapCenter,zoom:mapZoom,style:{height:'100%',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\"}),filteredDevices.map(device=>/*#__PURE__*/_jsx(Marker,{position:[device.location.latitude,device.location.longitude],icon:createCustomIcon(device.status),children:/*#__PURE__*/_jsx(Popup,{children:/*#__PURE__*/_jsxs(\"div\",{className:\"p-1\",children:[/*#__PURE__*/_jsx(\"h3\",{className:\"font-semibold text-lg mb-2\",children:/*#__PURE__*/_jsx(Link,{to:`/devices/${device.id}`,className:\"text-primary-600 hover:text-primary-700\",children:device.name})}),/*#__PURE__*/_jsxs(\"div\",{className:\"space-y-2 text-sm\",children:[/*#__PURE__*/_jsxs(\"div\",{className:\"flex items-center\",children:[/*#__PURE__*/_jsx(FiBattery,{className:`mr-2 ${getBatteryColor(device.battery.status)}`}),/*#__PURE__*/_jsxs(\"span\",{children:[\"Battery: \",/*#__PURE__*/_jsxs(\"span\",{className:getBatteryColor(device.battery.status),children:[device.battery.level,\"%\"]})]})]}),/*#__PURE__*/_jsxs(\"div\",{className:\"flex items-center\",children:[/*#__PURE__*/_jsx(FiWifi,{className:`mr-2 ${getSignalColor(device.signal.status)}`}),/*#__PURE__*/_jsxs(\"span\",{children:[\"Signal: \",/*#__PURE__*/_jsxs(\"span\",{className:getSignalColor(device.signal.status),children:[device.signal.strength,\" dBm\"]})]})]}),/*#__PURE__*/_jsxs(\"div\",{className:\"flex items-center\",children:[/*#__PURE__*/_jsx(FiClock,{className:\"mr-2 text-gray-500\"}),/*#__PURE__*/_jsxs(\"span\",{children:[\"Last seen: \",formatDate(device.last_seen)]})]}),/*#__PURE__*/_jsxs(\"div\",{className:\"text-xs text-gray-500 mt-1\",children:[\"Coordinates: \",device.location.latitude.toFixed(6),\", \",device.location.longitude.toFixed(6)]}),/*#__PURE__*/_jsxs(\"div\",{className:\"text-xs text-gray-500\",children:[\"Altitude: \",device.location.altitude,\" m\"]})]})]})})},device.id))]})}),/*#__PURE__*/_jsxs(\"div\",{className:\"dashboard-card\",children:[/*#__PURE__*/_jsx(\"h2\",{className:\"text-lg font-semibold text-gray-800 mb-4\",children:\"Device List\"}),/*#__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:\"Device\"}),/*#__PURE__*/_jsx(\"th\",{className:\"px-6 py-3 text-left text-xs font-medium text-gray-500 uppercase tracking-wider\",children:\"Status\"}),/*#__PURE__*/_jsx(\"th\",{className:\"px-6 py-3 text-left text-xs font-medium text-gray-500 uppercase tracking-wider\",children:\"Coordinates\"}),/*#__PURE__*/_jsx(\"th\",{className:\"px-6 py-3 text-left text-xs font-medium text-gray-500 uppercase tracking-wider\",children:\"Last Seen\"})]})}),/*#__PURE__*/_jsx(\"tbody\",{className:\"bg-white divide-y divide-gray-200\",children:filteredDevices.map(device=>/*#__PURE__*/_jsxs(\"tr\",{className:\"hover:bg-gray-50\",children:[/*#__PURE__*/_jsx(\"td\",{className:\"px-6 py-4 whitespace-nowrap\",children:/*#__PURE__*/_jsx(Link,{to:`/devices/${device.id}`,className:\"text-primary-600 hover:text-primary-700\",children:device.name})}),/*#__PURE__*/_jsx(\"td\",{className:\"px-6 py-4 whitespace-nowrap\",children:/*#__PURE__*/_jsxs(\"div\",{className:\"flex items-center\",children:[/*#__PURE__*/_jsx(\"div\",{className:`h-2.5 w-2.5 rounded-full mr-2 ${device.status==='online'?'bg-success-500':device.status==='idle'?'bg-warning-500':'bg-danger-500'}`}),/*#__PURE__*/_jsx(\"span\",{className:`capitalize ${device.status==='online'?'text-success-500':device.status==='idle'?'text-warning-500':'text-danger-500'}`,children:device.status})]})}),/*#__PURE__*/_jsxs(\"td\",{className:\"px-6 py-4 whitespace-nowrap text-gray-500\",children:[device.location.latitude.toFixed(6),\", \",device.location.longitude.toFixed(6)]}),/*#__PURE__*/_jsx(\"td\",{className:\"px-6 py-4 whitespace-nowrap text-gray-500\",children:formatDate(device.last_seen)})]},device.id))})]})})]})]});};export default MapView;","map":{"version":3,"names":["React","useState","useEffect","MapContainer","TileLayer","Marker","Popup","FiBattery","FiWifi","FiClock","L","Link","jsx","_jsx","jsxs","_jsxs","Icon","Default","prototype","_getIconUrl","mergeOptions","iconRetinaUrl","iconUrl","shadowUrl","createCustomIcon","status","icon","iconSize","iconAnchor","popupAnchor","shadowSize","dummyDevices","id","name","battery","level","signal","strength","location","latitude","longitude","altitude","last_seen","Date","toISOString","now","MapView","devices","setDevices","loading","setLoading","filter","setFilter","mapCenter","setMapCenter","mapZoom","setMapZoom","fetchData","setTimeout","error","console","formatDate","dateString","date","toLocaleString","filteredDevices","device","getBatteryColor","getSignalColor","className","children","onClick","center","zoom","style","height","width","attribution","url","map","position","to","toFixed"],"sources":["/home/m3mo/Desktop/temparea/solarbank/frontend/src/pages/MapView.js"],"sourcesContent":["import React, { useState, useEffect } from 'react';\nimport { MapContainer, TileLayer, Marker, Popup } from 'react-leaflet';\nimport { FiBattery, FiWifi, FiClock } from 'react-icons/fi';\nimport 'leaflet/dist/leaflet.css';\nimport L from 'leaflet';\nimport { Link } from 'react-router-dom';\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// Custom marker icons\nconst createCustomIcon = (status) => {\n let iconUrl;\n \n switch (status) {\n case 'online':\n iconUrl = 'https://raw.githubusercontent.com/pointhi/leaflet-color-markers/master/img/marker-icon-green.png';\n break;\n case 'idle':\n iconUrl = 'https://raw.githubusercontent.com/pointhi/leaflet-color-markers/master/img/marker-icon-yellow.png';\n break;\n case 'offline':\n iconUrl = 'https://raw.githubusercontent.com/pointhi/leaflet-color-markers/master/img/marker-icon-red.png';\n break;\n default:\n iconUrl = 'https://raw.githubusercontent.com/pointhi/leaflet-color-markers/master/img/marker-icon-blue.png';\n }\n \n return L.icon({\n iconUrl,\n shadowUrl: 'https://cdnjs.cloudflare.com/ajax/libs/leaflet/1.7.1/images/marker-shadow.png',\n iconSize: [25, 41],\n iconAnchor: [12, 41],\n popupAnchor: [1, -34],\n shadowSize: [41, 41]\n });\n};\n\n// Dummy data for demonstration\nconst dummyDevices = [\n {\n id: 'device-001',\n name: 'SIM7000E-001',\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 },\n {\n id: 'device-002',\n name: 'SIM7000E-002',\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 },\n {\n id: 'device-003',\n name: 'SIM7000E-003',\n status: 'offline',\n battery: { level: 12, status: 'critical' },\n signal: { strength: -105, status: 'poor' },\n location: { latitude: 47.3750, longitude: 8.5430, altitude: 405 },\n last_seen: new Date(Date.now() - 86400000).toISOString() // 1 day ago\n },\n {\n id: 'device-004',\n name: 'SIM7000E-004',\n status: 'online',\n battery: { level: 78, status: 'good' },\n signal: { strength: -72, status: 'good' },\n location: { latitude: 47.3790, longitude: 8.5450, altitude: 412 },\n last_seen: new Date().toISOString()\n },\n {\n id: 'device-005',\n name: 'SIM7000E-005',\n status: 'idle',\n battery: { level: 35, status: 'low' },\n signal: { strength: -90, status: 'fair' },\n location: { latitude: 47.3730, longitude: 8.5380, altitude: 407 },\n last_seen: new Date(Date.now() - 7200000).toISOString() // 2 hours ago\n }\n];\n\nconst MapView = () => {\n const [devices, setDevices] = useState([]);\n const [loading, setLoading] = useState(true);\n const [filter, setFilter] = useState('all');\n const [mapCenter, setMapCenter] = useState([47.3769, 8.5417]); // Zurich coordinates\n const [mapZoom, setMapZoom] = useState(13);\n\n useEffect(() => {\n // Simulate API call\n const fetchData = async () => {\n try {\n // In a real app, you would fetch data from your API\n // const response = await fetch('/api/status/devices');\n // const data = await response.json();\n \n // Using dummy data for now\n setTimeout(() => {\n setDevices(dummyDevices);\n setLoading(false);\n }, 1000);\n } catch (error) {\n console.error('Error fetching data:', error);\n setLoading(false);\n }\n };\n\n fetchData();\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 // Filter devices based on status\n const filteredDevices = filter === 'all' \n ? devices \n : devices.filter(device => device.status === filter);\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 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 map data...</p>\n </div>\n </div>\n );\n }\n\n return (\n <div className=\"space-y-6\">\n <div className=\"flex justify-between items-center\">\n <h1 className=\"text-2xl font-semibold text-gray-800\">Device Map</h1>\n <div className=\"flex space-x-2\">\n <button \n className={`px-3 py-1 rounded-md text-sm ${filter === 'all' ? 'bg-primary-500 text-white' : 'bg-gray-200 text-gray-700'}`}\n onClick={() => setFilter('all')}\n >\n All\n </button>\n <button \n className={`px-3 py-1 rounded-md text-sm ${filter === 'online' ? 'bg-success-500 text-white' : 'bg-gray-200 text-gray-700'}`}\n onClick={() => setFilter('online')}\n >\n Online\n </button>\n <button \n className={`px-3 py-1 rounded-md text-sm ${filter === 'idle' ? 'bg-warning-500 text-white' : 'bg-gray-200 text-gray-700'}`}\n onClick={() => setFilter('idle')}\n >\n Idle\n </button>\n <button \n className={`px-3 py-1 rounded-md text-sm ${filter === 'offline' ? 'bg-danger-500 text-white' : 'bg-gray-200 text-gray-700'}`}\n onClick={() => setFilter('offline')}\n >\n Offline\n </button>\n </div>\n </div>\n\n <div className=\"dashboard-card h-[600px]\">\n <MapContainer center={mapCenter} zoom={mapZoom} style={{ height: '100%', width: '100%' }}>\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 \n {filteredDevices.map(device => (\n <Marker \n key={device.id} \n position={[device.location.latitude, device.location.longitude]}\n icon={createCustomIcon(device.status)}\n >\n <Popup>\n <div className=\"p-1\">\n <h3 className=\"font-semibold text-lg mb-2\">\n <Link to={`/devices/${device.id}`} className=\"text-primary-600 hover:text-primary-700\">\n {device.name}\n </Link>\n </h3>\n <div className=\"space-y-2 text-sm\">\n <div className=\"flex items-center\">\n <FiBattery className={`mr-2 ${getBatteryColor(device.battery.status)}`} />\n <span>Battery: <span className={getBatteryColor(device.battery.status)}>{device.battery.level}%</span></span>\n </div>\n <div className=\"flex items-center\">\n <FiWifi className={`mr-2 ${getSignalColor(device.signal.status)}`} />\n <span>Signal: <span className={getSignalColor(device.signal.status)}>{device.signal.strength} dBm</span></span>\n </div>\n <div className=\"flex items-center\">\n <FiClock className=\"mr-2 text-gray-500\" />\n <span>Last seen: {formatDate(device.last_seen)}</span>\n </div>\n <div className=\"text-xs text-gray-500 mt-1\">\n Coordinates: {device.location.latitude.toFixed(6)}, {device.location.longitude.toFixed(6)}\n </div>\n <div className=\"text-xs text-gray-500\">\n Altitude: {device.location.altitude} m\n </div>\n </div>\n </div>\n </Popup>\n </Marker>\n ))}\n </MapContainer>\n </div>\n\n <div className=\"dashboard-card\">\n <h2 className=\"text-lg font-semibold text-gray-800 mb-4\">Device List</h2>\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\">Device</th>\n <th className=\"px-6 py-3 text-left text-xs font-medium text-gray-500 uppercase tracking-wider\">Status</th>\n <th className=\"px-6 py-3 text-left text-xs font-medium text-gray-500 uppercase tracking-wider\">Coordinates</th>\n <th className=\"px-6 py-3 text-left text-xs font-medium text-gray-500 uppercase tracking-wider\">Last Seen</th>\n </tr>\n </thead>\n <tbody className=\"bg-white divide-y divide-gray-200\">\n {filteredDevices.map((device) => (\n <tr key={device.id} className=\"hover:bg-gray-50\">\n <td className=\"px-6 py-4 whitespace-nowrap\">\n <Link to={`/devices/${device.id}`} className=\"text-primary-600 hover:text-primary-700\">\n {device.name}\n </Link>\n </td>\n <td className=\"px-6 py-4 whitespace-nowrap\">\n <div className=\"flex items-center\">\n <div className={`h-2.5 w-2.5 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 <span className={`capitalize ${\n device.status === 'online' ? 'text-success-500' :\n device.status === 'idle' ? 'text-warning-500' :\n 'text-danger-500'\n }`}>{device.status}</span>\n </div>\n </td>\n <td className=\"px-6 py-4 whitespace-nowrap text-gray-500\">\n {device.location.latitude.toFixed(6)}, {device.location.longitude.toFixed(6)}\n </td>\n <td className=\"px-6 py-4 whitespace-nowrap text-gray-500\">\n {formatDate(device.last_seen)}\n </td>\n </tr>\n ))}\n </tbody>\n </table>\n </div>\n </div>\n </div>\n );\n};\n\nexport default MapView;\n"],"mappings":"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","ignoreList":[]},"metadata":{},"sourceType":"module","externalDependencies":[]} |