From 86870c4d2af5ece3d711add526765f57ee1ae50c Mon Sep 17 00:00:00 2001 From: James Pace Date: Sat, 7 Mar 2026 21:47:10 +0000 Subject: [PATCH] Add lat long. Refactor. --- src/App.tsx | 11 +++- src/AppNav.tsx | 7 ++- src/Autonomy.tsx | 97 +++++++++++++++++++++++++++++++++ src/Home.tsx | 62 +-------------------- src/{Network.tsx => WhoAmI.tsx} | 2 +- 5 files changed, 112 insertions(+), 67 deletions(-) create mode 100644 src/Autonomy.tsx rename src/{Network.tsx => WhoAmI.tsx} (89%) diff --git a/src/App.tsx b/src/App.tsx index 07598d1..9e45280 100644 --- a/src/App.tsx +++ b/src/App.tsx @@ -2,8 +2,9 @@ import { useState } from "react"; import { createBrowserRouter, RouterProvider } from "react-router-dom"; import { Provider as JotaiProvider } from "jotai"; import { Home } from "./Home.tsx"; +import { Autonomy } from "./Autonomy.tsx"; import { Version } from "./Version.tsx"; -import { Network } from "./Network.tsx"; +import { WhoAmI } from "./WhoAmI.tsx"; import "./App.css"; function App() { @@ -26,13 +27,17 @@ const router = createBrowserRouter([ element: , }, { - path: "/network", - element: , + path: "/whoami", + element: , }, { path: "/version", element: , }, + { + path: "/autonomy", + element: , + }, ]); export default App; diff --git a/src/AppNav.tsx b/src/AppNav.tsx index 4ad09c9..ad904e9 100644 --- a/src/AppNav.tsx +++ b/src/AppNav.tsx @@ -17,8 +17,11 @@ export function AppNav() { Version - - Network + + WhoAmI + + + Autonomy diff --git a/src/Autonomy.tsx b/src/Autonomy.tsx new file mode 100644 index 0000000..a24ab50 --- /dev/null +++ b/src/Autonomy.tsx @@ -0,0 +1,97 @@ +import { AppNav, Footer } from "./AppNav.tsx"; +import { Container, Row, Col, Image, Card } from "react-bootstrap"; +import { atom, useAtomValue } from "jotai"; +import { atomWithQuery } from "jotai-tanstack-query"; + +const costmapImageQuery = async () => { + const resp = await fetch("api/costmap_image"); + if (!resp.ok) { + throw new Error("Network response was not ok"); + } + const blob = await resp.blob(); + return URL.createObjectURL(blob); +}; +const costmapImageQueryAtom = atomWithQuery(() => ({ + queryKey: ["costmap_image"], + queryFn: costmapImageQuery, + refetchInterval: 1000, // 1s +})); +const costmapImageAtom = atom((get) => { + const response = get(costmapImageQueryAtom); + if (response.isPending) { + return

"Loading..."

; + } + if (response.isError) { + return

"Error loading!"

; + } + const costmapStyle = { + minHeight: "65svb", + }; + return ; +}); + +const statusStringQuery = async () => { + const resp = await fetch("api/status"); + if (!resp.ok) { + throw new Error("Network response was not ok"); + } + return resp.json(); +}; +const statusStringQueryAtom = atomWithQuery(() => ({ + queryKey: ["status_string"], + queryFn: statusStringQuery, + refetchInterval: 500, // 0.5s +})); +const statusStringAtom = atom((get) => { + const response = get(statusStringQueryAtom); + if (response.isPending || response.isError || !response.data.status) { + return "N/A"; + } + return response.data.message; +}); + +const latLongQuery = async () => { + const resp = await fetch("api/position"); + if (!resp.ok) { + throw new Error("Network response was not ok"); + } + return resp.json(); +}; +const latLongQueryAtom = atomWithQuery(() => ({ + queryKey: ["latlong"], + queryFn: latLongQuery, + refetchInterval: 500, // 0.5s +})); +const latLongAtom = atom((get) => { + const response = get(latLongQueryAtom); + if (response.isPending || response.isError || !response.data.status) { + return "N/A"; + } + return `(${response.data.latitude}, ${response.data.longitude})`; +}); + +export function Autonomy() { + const costmapImage = useAtomValue(costmapImageAtom); + const statusString = useAtomValue(statusStringAtom); + const latLong = useAtomValue(latLongAtom); + + return ( +
+ + + + + {costmapImage} + +

Status:

+
{statusString}
+

Latitude, Longitude:

+
{latLong}
+ +
+
+
+
+
+ ); +} diff --git a/src/Home.tsx b/src/Home.tsx index b944640..bc4c68f 100644 --- a/src/Home.tsx +++ b/src/Home.tsx @@ -3,74 +3,14 @@ import { Container, Row, Col, Image, Card } from "react-bootstrap"; import { atom, useAtomValue } from "jotai"; import { atomWithQuery } from "jotai-tanstack-query"; -const costmapImageQuery = async () => { - const resp = await fetch("api/costmap_image"); - if (!resp.ok) { - throw new Error("Network response was not ok"); - } - const blob = await resp.blob(); - return URL.createObjectURL(blob); -}; -const costmapImageQueryAtom = atomWithQuery(() => ({ - queryKey: ["costmap_image"], - queryFn: costmapImageQuery, - refetchInterval: 1000, // 1s -})); -const costmapImageAtom = atom((get) => { - const response = get(costmapImageQueryAtom); - if (response.isPending) { - return

"Loading..."

; - } - if (response.isError) { - return

"Error loading!"

; - } - const costmapStyle = { - minHeight: "65svb", - }; - return ; -}); - -const statusStringQuery = async () => { - const resp = await fetch("api/status"); - if (!resp.ok) { - throw new Error("Network response was not ok"); - } - return resp.json(); -}; -const statusStringQueryAtom = atomWithQuery(() => ({ - queryKey: ["status_string"], - queryFn: statusStringQuery, - refetchInterval: 500, // 0.5s -})); -const statusStringAtom = atom((get) => { - const response = get(statusStringQueryAtom); - if (response.isPending) { - return "Loading..."; - } - if (response.isError) { - return "Error loading!"; - } - if (!response.data.status) { - return "N/A"; - } - return response.data.message; -}); - export function Home() { - const costmapImage = useAtomValue(costmapImageAtom); - const statusString = useAtomValue(statusStringAtom); - return (
- {costmapImage} - -

Status:

-
{statusString}
- +

Hello World!

diff --git a/src/Network.tsx b/src/WhoAmI.tsx similarity index 89% rename from src/Network.tsx rename to src/WhoAmI.tsx index f4e7009..705e9c8 100644 --- a/src/Network.tsx +++ b/src/WhoAmI.tsx @@ -1,7 +1,7 @@ import { AppNav, Footer } from "./AppNav.tsx"; import { Container, Row, Col, Image } from "react-bootstrap"; -export function Network() { +export function WhoAmI() { return (