import React from 'react'; import mapbox from 'mapbox-gl'; import { FiMapPin, FiXCircle } from 'react-icons/fi'; import { Marker } from '@app/components/Map/Marker'; import type { Node } from '@app/core/slices/meshtasticSlice.js'; import { Drawer } from '@components/generic/Drawer'; import { Map } from '@components/Map'; import { useAppSelector } from '@hooks/useAppSelector'; import { useBreakpoint } from '@hooks/useBreakpoint'; import { IconButton } from '@meshtastic/components'; import { NodeCard } from './NodeCard'; import { Sidebar } from './Sidebar'; export const Nodes = (): JSX.Element => { const myNodeInfo = useAppSelector((state) => state.meshtastic.radio.hardware); const nodes = useAppSelector((state) => state.meshtastic.nodes) .slice() .sort((a, b) => a.number === myNodeInfo.myNodeNum ? 1 : b?.lastHeard.getTime() - a?.lastHeard.getTime(), ); const myNode = nodes.find((node) => node.number === myNodeInfo.myNodeNum); const [navOpen, setNavOpen] = React.useState(false); const { breakpoint } = useBreakpoint(); const [sidebarOpen, setSidebarOpen] = React.useState(false); const [selectedNode, setSelectedNode] = React.useState(); return (
{ setNavOpen(!navOpen); }} >
Nodes
} onClick={(): void => { setNavOpen(false); }} />
{!nodes.length && ( No nodes found. )} {myNode && ( { setSelectedNode(myNode); setSidebarOpen(true); }} /> )} {nodes .filter((node) => node.number !== myNodeInfo.myNodeNum) .map((node) => ( { setSelectedNode(node); setSidebarOpen(true); }} /> ))}
{nodes.map((node) => { return ( node.currentPosition && (
{ setSelectedNode(node); setSidebarOpen(true); }} className="z-50 bg-blue-500 border-2 border-blue-500 rounded-full bg-opacity-30" >
) ); })} {sidebarOpen && selectedNode && ( { setSidebarOpen(false); }} node={selectedNode} /> )}
); };