import { ArrowLeftOutlined, ArrowRightOutlined } from "@ant-design/icons"; import { Button, Card, Col, ConfigProvider, Divider, Form, Grid, InputNumber, Progress, Row, Select, Slider, Space, } from "antd"; import { useForm } from "antd/es/form/Form"; import useMessage from "antd/es/message/useMessage"; import { useEffect, useRef, useState } from "react"; import { myFetch } from "./utils"; const { useBreakpoint } = Grid; const Constants = { DISTANCE: { MIN: 0, MAX: 100, }, ACCELERATION: { MIN: 0, MAX: 100, }, DURATION: { MIN: 1, MAX: 60, }, }; function App() { const screens = useBreakpoint(); const [form] = useForm(); const [messageApi, messageContextHolder] = useMessage(); const [distance, setDistance] = useState([20, 50]); const [acceleration, setAcceleration] = useState(0); const [direction, setDirection] = useState(0); const [durationUnit, setDurationUnit] = useState("seconds"); const remainingTimeRef = useRef(0); const [remainingTime, setRemainingTime] = useState(0); const [procesStatus, setProcessStatus] = useState(""); const intervalRef = useRef(null); const setRemainingTimeProgress = (time) => { remainingTimeRef.current = time; setRemainingTime(time); }; const showErrorMessage = () => { messageApi.error({ type: "error", content: "Ein Fehler ist aufgetreten", }); }; useEffect(() => { myFetch({ url: "/status", method: "GET", showNotification: messageApi, }) .then((response) => { console.log(response); setRemainingTimeProgress(response.runningUntil); setProcessStatus(response.status); }) .catch((error) => { console.error(error); showErrorMessage(); }); }, []); useEffect(() => { intervalRef.current = setInterval(() => { if (remainingTimeRef.current <= 0) { clearInterval(intervalRef.current); return; } setRemainingTime((prev) => { const newTime = prev - 1000; if (newTime <= 0) { remainingTimeRef.current = 0; clearInterval(intervalRef.current); } return newTime; }); }, 1000); return () => { clearInterval(intervalRef.current); }; }, [remainingTimeRef.current]); const sendControlRequest = (urlPath) => { form .validateFields() .then((values) => { myFetch({ url: urlPath, method: "POST", body: { distance: distance, acceleration: acceleration, direction: direction, duration: values.duration * (durationUnit === "seconds" ? 1 : 60), }, showNotification: messageApi, }) .then((response) => { console.log(response); setRemainingTimeProgress(response.runningUntil); setProcessStatus(response.status); }) .catch((error) => { console.error(error); showErrorMessage(); setProcessStatus(""); setRemainingTimeProgress(0); }); }) .catch((err) => console.error(err)); }; return (
{messageContextHolder}
sendControlRequest("/start")} > setDistance((newDistance) => { const newData = [...newDistance]; newData[0] = value; return newData; }) } /> setDistance(values)} /> setDistance((newDistance) => { const newData = [...newDistance]; newData[1] = value; return newData; }) } /> setDurationUnit(value)} > Sekunden Minuten } /> setAcceleration(value)} /> setAcceleration(value)} />
); } export default App;