Skip to content

Commit cc82ea5

Browse files
authored
Merge pull request #116 from HyperloopUPV-H8/ethernet-view/sidebar
[ethernet-view] Navbar and React Router
2 parents c281678 + 5b59fb0 commit cc82ea5

28 files changed

Lines changed: 389 additions & 65 deletions

File tree

common-front/lib/components/Loader/Loader.tsx

Lines changed: 2 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -32,19 +32,15 @@ export const Loader = <T extends Promise<any>[]>({
3232
FailureView,
3333
children,
3434
}: Props<T>) => {
35-
const [state, setState] = useState<
36-
PromiseResult<AwaitedArray<typeof promises>>
37-
>({ state: "pending" });
35+
const [state, setState] = useState<PromiseResult<AwaitedArray<typeof promises>>>({ state: "pending" });
3836
const startTime = useRef(0);
3937

4038
useEffect(() => {
4139
startTime.current = performance.now();
4240
Promise.all(promises)
4341
.then((values) => {
4442
const elapsed = performance.now() - startTime.current;
45-
setTimeout(() => {
46-
setState({ state: "fulfilled", result: values });
47-
}, clamp(MAX_TITLE_TIME - elapsed, 0, MAX_TITLE_TIME));
43+
setTimeout(() => setState({ state: "fulfilled", result: values }), clamp(MAX_TITLE_TIME - elapsed, 0, MAX_TITLE_TIME));
4844
})
4945
.catch(() => setState({ state: "rejected" }));
5046
}, []);

common-front/lib/hooks/index.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,3 +4,4 @@ export * from "./useCameras";
44
export * from "./useToggle";
55
export * from "./useSendOrder";
66
export * from "./useListenKey";
7+
export * from "./useLoadBackend";
Lines changed: 54 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,54 @@
1+
import { useEffect, useState } from "react";
2+
import { WsHandler, createWsHandler, fetchBack, useConfig, useConnectionsStore, useFetchBack, useMeasurementsStore, usePodDataStore } from ".."
3+
4+
type loadBackendResult = {
5+
state: "pending";
6+
} | {
7+
state: "fulfilled";
8+
wsHandler: WsHandler;
9+
} | {
10+
state: "rejected";
11+
error: Error;
12+
};
13+
14+
type UseLoadBackend = (isProduction: boolean) => loadBackendResult;
15+
16+
// Custom hook that initializes the Websocket connection, returning the WsHandler object
17+
// and fetches the podDataDescription from the server, initializing the PodData and Measurements in the store.
18+
export const useLoadBackend : UseLoadBackend = (isProduction) => {
19+
const config = useConfig();
20+
const initPodData = usePodDataStore((state) => state.initPodData);
21+
const initMeasurements = useMeasurementsStore((state) => state.initMeasurements);
22+
const setBackendConnection = useConnectionsStore((state) => state.setBackendConnection);
23+
24+
const [result, setResult] = useState<loadBackendResult>({state: "pending"});
25+
26+
const BACKEND_URL = isProduction
27+
? `${config.prodServer.ip}:${config.prodServer.port}/${config.paths.websocket}`
28+
: `${config.devServer.ip}:${config.devServer.port}/${config.paths.websocket}`;
29+
30+
const POD_DATA_DESCRIPTION_URL = isProduction
31+
? `http://${config.prodServer.ip}:${config.prodServer.port}/${config.paths.podDataDescription}`
32+
: `http://${config.devServer.ip}:${config.devServer.port}/${config.paths.podDataDescription}`;
33+
34+
useEffect(() => {
35+
Promise.all([
36+
createWsHandler(
37+
BACKEND_URL,
38+
true,
39+
() => setBackendConnection(true),
40+
() => setBackendConnection(false)
41+
),
42+
fetch(POD_DATA_DESCRIPTION_URL).then((res) => res.json()).then(
43+
(adapter) => {
44+
initPodData(adapter);
45+
initMeasurements(adapter);
46+
}
47+
),
48+
])
49+
.then(result => setResult({state: "fulfilled", wsHandler: result[0]}))
50+
.catch(error => setResult({state: "rejected", error}));
51+
}, []);
52+
53+
return result;
54+
}

ethernet-view/package-lock.json

Lines changed: 61 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

ethernet-view/package.json

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,7 @@
2424
"react-dom": "^18.2.0",
2525
"react-icons": "^4.6.0",
2626
"react-redux": "^8.0.5",
27+
"react-router-dom": "^6.22.3",
2728
"react-use-measure": "^2.1.1",
2829
"react-virtualized-auto-sizer": "^1.0.7",
2930
"react-window": "^1.8.8",

ethernet-view/src/App.tsx

Lines changed: 13 additions & 46 deletions
Original file line numberDiff line numberDiff line change
@@ -1,58 +1,25 @@
11
import "./App.css";
2-
import {
3-
WsHandlerProvider,
4-
createWsHandler,
5-
useConfig,
6-
useFetchBack,
7-
Loader,
8-
useMeasurementsStore,
9-
usePodDataStore,
10-
useConnectionsStore
11-
} from "common";
12-
import { HomePage } from "pages/HomePage/HomePage";
2+
import { TestingPage } from "pages/TestingPage/TestingPage";
133
import { SplashScreen } from "components/SplashScreen/SplashScreen";
4+
import { WsHandlerProvider } from "common";
5+
import { useLoadBackend } from "common";
146

15-
function App() {
16-
const config = useConfig();
17-
const podDataDescriptionPromise = useFetchBack(
18-
import.meta.env.PROD,
19-
config.paths.podDataDescription
20-
);
217

22-
const initMeasurements = useMeasurementsStore((state) => state.initMeasurements);
23-
const initPodData = usePodDataStore((state) => state.initPodData);
24-
const setBackendConnection = useConnectionsStore((state) => state.setBackendConnection);
8+
function App() {
259

26-
const SERVER_URL = import.meta.env.PROD
27-
? `${config.prodServer.ip}:${config.prodServer.port}/${config.paths.websocket}`
28-
: `${config.devServer.ip}:${config.devServer.port}/${config.paths.websocket}`;
10+
const isProduction = import.meta.env.PROD;
11+
const loadBackend = useLoadBackend(isProduction);
2912

3013
return (
3114
<div className="App">
32-
<Loader
33-
promises={[
34-
createWsHandler(
35-
SERVER_URL,
36-
true,
37-
() => setBackendConnection(true),
38-
() => setBackendConnection(false),
39-
),
40-
podDataDescriptionPromise.then((adapter) => {
41-
initPodData(adapter);
42-
initMeasurements(adapter);
43-
}),
44-
]}
45-
LoadingView={<SplashScreen />}
46-
FailureView={<div>Failure</div>}
47-
>
48-
{([handler]) => (
49-
<WsHandlerProvider handler={handler}>
50-
<HomePage />
51-
</WsHandlerProvider>
52-
)}
53-
</Loader>
15+
{loadBackend.state === "fulfilled" &&
16+
<WsHandlerProvider handler={loadBackend.wsHandler}>
17+
<TestingPage />
18+
</WsHandlerProvider>}
19+
{loadBackend.state === "pending" && <SplashScreen />}
20+
{loadBackend.state === "rejected" && <div>{`${loadBackend.error}`}</div>}
5421
</div>
5522
);
5623
}
5724

58-
export default App;
25+
export default App;
Lines changed: 3 additions & 0 deletions
Loading
Lines changed: 37 additions & 0 deletions
Loading
Lines changed: 5 additions & 0 deletions
Loading
Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,34 @@
1+
@use "../../styles/styles.scss";
2+
3+
.navbarWrapper {
4+
width: fit-content;
5+
display: flex;
6+
flex-direction: column;
7+
justify-content: flex-start;
8+
align-items: center;
9+
gap: 1.4rem;
10+
padding: 2rem 0.8rem;
11+
background-color: white;
12+
border-right: 1px solid styles.getColor(styles.$base-color, 80);
13+
border-radius: styles.$large-border-radius;
14+
}
15+
16+
.logo {
17+
font-size: 3rem;
18+
color: styles.$base-color;
19+
}
20+
21+
.separator {
22+
width: 46%;
23+
height: 0.25rem;
24+
border-radius: 10rem;
25+
background-color: styles.getColor(styles.$base-color, 80);
26+
}
27+
28+
.items {
29+
display: flex;
30+
flex-direction: column;
31+
align-items: center;
32+
font-size: 1.5rem;
33+
gap: 1.5rem;
34+
}

0 commit comments

Comments
 (0)