import React from 'react'; import { FaSatellite } from 'react-icons/fa'; import { FiCode } from 'react-icons/fi'; import { GiLightningFrequency } from 'react-icons/gi'; import { MdAccountCircle, MdArrowDropDown, MdArrowDropUp, MdGpsFixed, MdGpsNotFixed, MdGpsOff, MdSdStorage, MdSignalCellularAlt, } from 'react-icons/md'; import TimeAgo from 'timeago-react'; import { IconButton } from '@components/generic/IconButton'; import type { Node } from '@core/slices/meshtasticSlice'; import { Disclosure } from '@headlessui/react'; import { Protobuf } from '@meshtastic/meshtasticjs'; export interface NodeCardProps { node: Node; myNodeInfo?: Protobuf.MyNodeInfo; } export const NodeCard = ({ node, myNodeInfo }: NodeCardProps): JSX.Element => { const [snrAverage, setSnrAverage] = React.useState(0); const [satsAverage, setSatsAverage] = React.useState(0); React.useEffect(() => { setSnrAverage( node.snr .slice(node.snr.length - 3, node.snr.length) .reduce((a, b) => a + b) / (node.snr.length > 3 ? 3 : node.snr.length), ); }, [node.snr]); // React.useEffect(() => { // setSatsAverage( // node.positions // .filter((pos) => pos.satsInView !== 0) // .slice(node.positions.length - 3, node.positions.length) // .reduce((a, b) => { // return a.satsInView + b.satsInView; // }).satsInView / (node.positions.length > 3 ? 3 : node.positions.length), // ); // }, [node.positions]); return ( {myNodeInfo ? ( ) : (
new Date(Date.now() - 1000 * 60 * 15) ? 'bg-green-500' : node.lastHeard > new Date(Date.now() - 1000 * 60 * 30) ? 'bg-yellow-500' : node.lastHeard > new Date(Date.now() - 1000 * 60 * 60) ? 'bg-red-500' : 'bg-gray-500' }`} /> )}
{node.user?.longName}
{!myNodeInfo && ( {node.lastHeard.getTime() ? ( ) : ( 'Never' )} )}
{node.currentPosition ? ( new Date(node.positions[0].posTimestamp * 1000) > new Date(new Date().getTime() - 1000 * 60 * 30) ? ( } /> ) : ( } /> ) ) : ( } /> )} {myNodeInfo && (
Firmware Ver: {myNodeInfo.firmwareVersion}
Freq Bands: {myNodeInfo.numBands}
)}
{Protobuf.HardwareModel[node.user?.hwModel ?? 0]}
} />
SNR: {node.snr[node.snr.length - 1] < snrAverage ? ( ) : ( )} {node.snr[node.snr.length - 1]}, Average: {snrAverage}
Sats: {(node.currentPosition?.satsInView ?? 0) < satsAverage ? ( ) : ( )} {node.currentPosition?.satsInView ?? 0}, Average: {satsAverage}
); };