diff --git a/src/error-page.jsx b/src/error-page.jsx
new file mode 100644
index 0000000000000000000000000000000000000000..9d0a9302c42ab6491870f5ab080ad1df6f121520
--- /dev/null
+++ b/src/error-page.jsx
@@ -0,0 +1,17 @@
+import { useRouteError } from "react-router-dom";
+import styles from "./index.module.css";
+import {Link} from "react-router-dom";
+
+export default function ErrorPage() {
+ const error = useRouteError();
+ console.error(error);
+
+ return (
+
+
Oops!
+
Erreur 404 - Page non trouvée
+
La donnée que vous recherchez n'existe pas.
+
Retour à la page d'accueil
+
+ );
+}
\ No newline at end of file
diff --git a/src/index.module.css b/src/index.module.css
index 33059c83aacd22ca2f2cd3ecca4cd97d366ad9db..af3e50bbff00d33a6a487996c3365dd87b44326a 100644
--- a/src/index.module.css
+++ b/src/index.module.css
@@ -119,6 +119,47 @@ nav li a:hover {
.mqtt {
font-weight: normal;
}
+
+.errorPage {
+ display: flex;
+ flex-direction: column;
+ align-items: center;
+ justify-content: center;
+ height: 100vh;
+ font-family: Arial, sans-serif;
+ text-align: center;
+}
+
+.errorPage>h1 {
+ font-size: 3em;
+ margin-bottom: 0.5em;
+}
+
+.errorPage>h2 {
+ font-size: 2em;
+ margin-bottom: 1em;
+}
+
+.errorPage>p {
+ font-size: 1.2em;
+ margin-bottom: 1.5em;
+}
+
+.errorPage>a {
+ display: inline-block;
+ padding: 0.8em 1.5em;
+ background-color: #6c6e71;
+ color: #fff;
+ font-size: 1.2em;
+ text-decoration: none;
+ border-radius: 4px;
+ transition: background-color 0.3s ease;
+}
+
+.errorPage>a:hover {
+ background-color: #302f31;
+}
+
.historique {
max-height: 300px;
overflow-y: scroll;
@@ -130,3 +171,4 @@ nav li a:hover {
.listItem:nth-child(odd) {
background-color: #ffffff;
}
+
diff --git a/src/main.jsx b/src/main.jsx
index e75a2bbbb9a4b5408e501ae6275e71c899ed479e..f6e1603b16f58947522374ab646bec017d7ad33a 100644
--- a/src/main.jsx
+++ b/src/main.jsx
@@ -1,21 +1,34 @@
import React from 'react';
import ReactDOM from 'react-dom/client';
-import Sensor from "./routes/sensor";
-import Root from "./routes/rout";
+import Sensor, { sensorLoader, loaderLastValueSensor} from "./routes/sensor";
+import Root, { loader as rootLoader } from "./routes/rout";
+import ErrorPage from "./error-page";
import {
createBrowserRouter,
RouterProvider,
} from "react-router-dom";
-
+function combineLoaders(loaders) {
+ return async function combinedLoader(params) {
+ const data = {};
+ for (const loader of loaders) {
+ const result = await loader(params);
+ Object.assign(data, result);
+ }
+ return data;
+ }
+}
const router = createBrowserRouter([
{
path: "/",
element: ,
+ errorElement: ,
+ loader: rootLoader,
children: [
{
path: "/:sensorName",
element: ,
+ loader: combineLoaders([sensorLoader, loaderLastValueSensor]),
},
],
},
diff --git a/src/routes/rout.jsx b/src/routes/rout.jsx
index 3ade942ccd0b3fcb1c4f0d2d9ae59324e42279c3..5156af71e1e4e53a9ba4e4ed5c5c10829f2c2e91 100644
--- a/src/routes/rout.jsx
+++ b/src/routes/rout.jsx
@@ -1,13 +1,18 @@
import styles from "../index.module.css";
import React, { useState} from 'react';
-import { Outlet, Link} from "react-router-dom";
+import { Outlet, Link, useLoaderData} from "react-router-dom";
import mqtt from 'precompiled-mqtt';
-import {creerSensor, existSensor, updateSensor} from '../sensor.js';
+import {creerSensor, existSensor, updateSensor, Sensors} from '../sensor.js';
+export async function loader() {
+ const contacts = Sensors;
+ return { contacts };
+}
export default function Root() {
const [sensors, setSensors] = useState([]);
const [brokerUrl, setBrokerUrl] = useState('');
+ const { contacts } = useLoaderData();
const topic = 'value/#';
const [client, setClient] = useState(null);
@@ -45,7 +50,6 @@ export default function Root() {
const sensorData = JSON.parse(message.toString());
const name = sensorData.name;
const data = sensorData.value;
- console.log(sensorData);
if(existSensor(name)){
updateSensor(name, data);
}else {
diff --git a/src/routes/sensor.jsx b/src/routes/sensor.jsx
index 2d65d155fbd2d710413e9c84b7889de4b9223210..f6a4faa1e46cd02456e3a93e80a732c8590be0a0 100644
--- a/src/routes/sensor.jsx
+++ b/src/routes/sensor.jsx
@@ -1,23 +1,25 @@
import styles from "../index.module.css";
-import Root from "./rout.jsx";
-import {useEffect} from "react";
-import { useParams } from 'react-router-dom';
+import { useParams, useLoaderData } from 'react-router-dom';
import {getSensor, getLastValue} from '../sensor.js';
+export function sensorLoader({params}) {
+ const sensor = getSensor(params.sensorName);
+ return {sensor};
+}
+export function loaderLastValueSensor({params}) {
+ const last_value = getLastValue(params.sensorName);
+ return {last_value};
+}
export default function Sensor(){
const { sensorName } = useParams();
- const sensor = {
- name: "Exemple sensor name",
- type: "PERCENT",
- value: 0.2,
- };
+ const sensor = useLoaderData();
return(
{sensorName}
Valeur actuelle
- {getLastValue(sensorName)}
+ {sensor.last_value}
Historique