2 changed files with 89 additions and 2 deletions
@ -0,0 +1,62 @@ |
|||
import { useDevice } from "@app/core/stores/deviceStore"; |
|||
import { |
|||
Dialog, |
|||
DialogContent, |
|||
DialogDescription, |
|||
DialogHeader, |
|||
DialogTitle, |
|||
} from "@components/UI/Dialog"; |
|||
import type { Protobuf, Types } from "@meshtastic/js"; |
|||
import { numberToHexUnpadded } from "@noble/curves/abstract/utils"; |
|||
import type { JSX } from "react"; |
|||
|
|||
export interface LocationResponseDialogProps { |
|||
location: Types.PacketMetadata<Protobuf.Mesh.location> | undefined; |
|||
open: boolean; |
|||
onOpenChange: () => void; |
|||
} |
|||
|
|||
export const LocationResponseDialog = ({ |
|||
location, |
|||
open, |
|||
onOpenChange, |
|||
}: LocationResponseDialogProps): JSX.Element => { |
|||
const { nodes } = useDevice(); |
|||
|
|||
const from = nodes.get(location?.from ?? 0); |
|||
const longName = |
|||
from?.user?.longName ?? |
|||
(from ? `!${numberToHexUnpadded(from?.num)}` : "Unknown"); |
|||
const shortName = |
|||
from?.user?.shortName ?? |
|||
(from ? `${numberToHexUnpadded(from?.num).substring(0, 4)}` : "UNK"); |
|||
|
|||
return ( |
|||
<Dialog open={open} onOpenChange={onOpenChange}> |
|||
<DialogContent> |
|||
<DialogHeader> |
|||
<DialogTitle>{`Location: ${longName} (${shortName})`}</DialogTitle> |
|||
</DialogHeader> |
|||
<DialogDescription> |
|||
<div className="ml-5 flex"> |
|||
<span className="ml-4 border-l-2 border-l-backgroundPrimary pl-2 text-textPrimary"> |
|||
<p> |
|||
Coordinates:{" "} |
|||
<a |
|||
className="text-blue-500 dark:text-blue-400" |
|||
href={`https://www.openstreetmap.org/?mlat=${location?.data.latitudeI / 1e7}&mlon=${location?.data.longitudeI / 1e7}&layers=N`} |
|||
target="_blank" |
|||
rel="noreferrer" |
|||
> |
|||
{location?.data.latitudeI / 1e7},{" "} |
|||
{location?.data.longitudeI / 1e7} |
|||
</a> |
|||
</p> |
|||
<p>Altitude: {location?.data.altitude}m</p> |
|||
</span> |
|||
</div> |
|||
</DialogDescription> |
|||
</DialogContent> |
|||
</Dialog> |
|||
); |
|||
}; |
|||
Loading…
Reference in new issue