6 changed files with 110 additions and 52 deletions
@ -0,0 +1,37 @@ |
|||||
|
import React from 'react'; |
||||
|
|
||||
|
export interface DrawerProps { |
||||
|
open: boolean; |
||||
|
onClose: () => void; |
||||
|
children: React.ReactNode; |
||||
|
} |
||||
|
|
||||
|
export const Drawer = ({ |
||||
|
open, |
||||
|
onClose, |
||||
|
children, |
||||
|
}: DrawerProps): JSX.Element => { |
||||
|
return ( |
||||
|
<> |
||||
|
{open && ( |
||||
|
<div |
||||
|
className="z-10 fixed inset-0 transition-opacity" |
||||
|
onClick={onClose} |
||||
|
> |
||||
|
<div |
||||
|
className="absolute inset-0 bg-black opacity-50" |
||||
|
tabIndex={0} |
||||
|
></div> |
||||
|
</div> |
||||
|
)} |
||||
|
|
||||
|
<aside |
||||
|
className={`transform top-0 left-0 w-64 bg-white dark:bg-secondaryDark fixed h-full overflow-auto ease-in-out transition-all duration-300 z-30 ${ |
||||
|
open ? 'translate-x-0' : '-translate-x-full' |
||||
|
}`}
|
||||
|
> |
||||
|
{children} |
||||
|
</aside> |
||||
|
</> |
||||
|
); |
||||
|
}; |
||||
@ -0,0 +1,23 @@ |
|||||
|
import React from 'react'; |
||||
|
|
||||
|
import Avatar from 'boring-avatars'; |
||||
|
|
||||
|
import type { Protobuf } from '@meshtastic/meshtasticjs'; |
||||
|
|
||||
|
export interface NodeProps { |
||||
|
node: Protobuf.NodeInfo; |
||||
|
} |
||||
|
|
||||
|
export const Node = ({ node }: NodeProps): JSX.Element => { |
||||
|
return ( |
||||
|
<div className="flex space-x-4 items-center w-full rounded-md dark:bg-primaryDark shadow-md border dark:border-gray-600 p-2 mt-6 dark:text-white hover:bg-gray-200 dark:hover:bg-gray-900"> |
||||
|
<Avatar |
||||
|
size={30} |
||||
|
name={node.user?.longName ?? 'UNK'} |
||||
|
variant="beam" |
||||
|
colors={['#213435', '#46685B', '#648A64', '#A6B985', '#E1E3AC']} |
||||
|
/> |
||||
|
<div>{node.user?.longName}</div> |
||||
|
</div> |
||||
|
); |
||||
|
}; |
||||
@ -1,11 +1,17 @@ |
|||||
import React from 'react'; |
import React from 'react'; |
||||
|
|
||||
|
import { Node } from '../components/nodes/Node'; |
||||
import { PrimaryTemplate } from '../components/templates/PrimaryTemplate'; |
import { PrimaryTemplate } from '../components/templates/PrimaryTemplate'; |
||||
|
import { useAppSelector } from '../hooks/redux'; |
||||
|
|
||||
export const Nodes = (): JSX.Element => { |
export const Nodes = (): JSX.Element => { |
||||
|
const nodes = useAppSelector((state) => state.meshtastic.nodes); |
||||
|
|
||||
return ( |
return ( |
||||
<PrimaryTemplate title="Administration" tagline="Node"> |
<PrimaryTemplate title="Administration" tagline="Node"> |
||||
<p>Nodes</p> |
{nodes.map((node) => ( |
||||
|
<Node key={node.num} node={node} /> |
||||
|
))} |
||||
</PrimaryTemplate> |
</PrimaryTemplate> |
||||
); |
); |
||||
}; |
}; |
||||
|
|||||
Loading…
Reference in new issue