333 lines
9.8 KiB
JavaScript
333 lines
9.8 KiB
JavaScript
import { Layout, theme } from "antd";
|
|
import React, { useEffect, useState, useRef } from "react";
|
|
import { useNavigate } from "react-router-dom/dist";
|
|
import ArrowBackIcon from "@mui/icons-material/ArrowBack";
|
|
import HomeIcon from "@mui/icons-material/Home";
|
|
import { useDispatch, useSelector } from "react-redux";
|
|
import {
|
|
Box,
|
|
Button,
|
|
Card,
|
|
CardContent,
|
|
Typography,
|
|
CircularProgress,
|
|
} from "@mui/material";
|
|
import { updateEvQrcodeList } from "../redux/actions/actions";
|
|
import SystemNumberDialog from "./SystemNumberDialog";
|
|
import { toast, ToastContainer } from "react-toastify";
|
|
import LoadingContainer from "./LoadingContainer";
|
|
|
|
const { Content, Header } = Layout;
|
|
|
|
function EvQrcode() {
|
|
const [isLoading, setIsLoading] = useState(false);
|
|
const [showSystemNoContainer, setShowSystemNoContainer] = useState(false);
|
|
const [anomalyData, setAnomalyData] = useState([]);
|
|
const [currentIndex, setCurrentIndex] = useState(0);
|
|
const inputRef = useRef(null);
|
|
|
|
const navigate = useNavigate();
|
|
|
|
const evQrcodeList = useSelector((state) => state?.evQrcodeList);
|
|
console.log("evQrcodeList = ", evQrcodeList);
|
|
|
|
const reduxSystemNo = useSelector((state) => state?.systemNumber);
|
|
console.log("systemno: ", reduxSystemNo);
|
|
|
|
const dispatch = useDispatch();
|
|
const {
|
|
token: { colorBgContainer },
|
|
} = theme.useToken();
|
|
|
|
useEffect(() => {
|
|
if (!reduxSystemNo) {
|
|
setShowSystemNoContainer(true);
|
|
} else {
|
|
if (evQrcodeList.length > 0) {
|
|
setAnomalyData(evQrcodeList);
|
|
} else {
|
|
fetchAnomalyData();
|
|
}
|
|
}
|
|
}, [reduxSystemNo]);
|
|
|
|
useEffect(() => {
|
|
if (evQrcodeList.length > 0) {
|
|
setAnomalyData(evQrcodeList);
|
|
}
|
|
}, [evQrcodeList]);
|
|
|
|
const handleSystemNoChange = () => {
|
|
console.log("System No Change is called");
|
|
setShowSystemNoContainer(true);
|
|
dispatch(updateEvQrcodeList([]));
|
|
};
|
|
|
|
const updateSystemReservationStatus = async (systemRecords) => {
|
|
const payload = {
|
|
systemRecords,
|
|
sysNo: reduxSystemNo,
|
|
};
|
|
try {
|
|
fetch(
|
|
`${
|
|
import.meta.env.VITE_REACT_APP_BACKEND_URL
|
|
}/updateSystemReservationStatusEvQrcode`,
|
|
{
|
|
method: "POST",
|
|
headers: {
|
|
"Content-Type": "application/json",
|
|
},
|
|
body: JSON.stringify(payload),
|
|
}
|
|
)
|
|
.then((response) => response.json())
|
|
.then((responseData) => {
|
|
console.log("response from updation : ", responseData);
|
|
});
|
|
} catch (error) {
|
|
throw new Error("Error in update system records : ", systemRecords);
|
|
}
|
|
};
|
|
|
|
const fetchAnomalyData = async () => {
|
|
setIsLoading(true);
|
|
try {
|
|
const response = await fetch(
|
|
`${import.meta.env.VITE_REACT_APP_BACKEND_URL}/getEvRecords`,
|
|
{
|
|
method: "POST",
|
|
body: JSON.stringify({
|
|
sysno: reduxSystemNo,
|
|
}),
|
|
headers: {
|
|
"Content-Type": "application/json",
|
|
},
|
|
}
|
|
);
|
|
const responseData = await response.json();
|
|
var systemRecords = responseData?.data;
|
|
console.log("System record ====== ", responseData.systemRecord);
|
|
if (!responseData.systemRecord) {
|
|
systemRecords = getRecordsBySystemId(responseData?.data, reduxSystemNo);
|
|
}
|
|
console.log("System records : ", systemRecords);
|
|
|
|
dispatch(updateEvQrcodeList(systemRecords));
|
|
updateSystemReservationStatus(systemRecords);
|
|
} catch (error) {
|
|
console.error("Error fetching data: ", error);
|
|
} finally {
|
|
setIsLoading(false);
|
|
}
|
|
};
|
|
|
|
function getRecordsBySystemId(records, systemId) {
|
|
const new_data = [];
|
|
for (var i = 0; i < records.length; i++) {
|
|
var count = i % 5;
|
|
if (count === systemId - 1) {
|
|
new_data.push(records[i]);
|
|
}
|
|
}
|
|
return new_data;
|
|
}
|
|
|
|
const handleNext = () => {
|
|
setIsLoading(true);
|
|
setAnomalyData([]);
|
|
setTimeout(() => {
|
|
const newItems = anomalyData.filter((_, index) => index !== currentIndex);
|
|
setAnomalyData(newItems);
|
|
if (currentIndex >= newItems.length) {
|
|
setCurrentIndex(0);
|
|
}
|
|
setIsLoading(false)
|
|
},1000);
|
|
};
|
|
|
|
const handleUpdate = async () => {
|
|
try {
|
|
const inputValue = document.getElementById("qrcodeInput").value;
|
|
console.log("inputvalu = ", inputValue);
|
|
|
|
const payload = {
|
|
imageName: currentItem.image_name,
|
|
qrvalue: inputValue,
|
|
};
|
|
console.log("payload=", payload);
|
|
|
|
const response = await fetch(
|
|
`${import.meta.env.VITE_REACT_APP_BACKEND_URL}/updateEvRecord`,
|
|
{
|
|
method: "POST",
|
|
headers: {
|
|
"Content-Type": "application/json",
|
|
},
|
|
body: JSON.stringify(payload),
|
|
}
|
|
);
|
|
const responseData = await response.json();
|
|
console.log("responsedata: ", responseData);
|
|
if (responseData?.status_code === 200) {
|
|
toast.success("Record Updated Successfully");
|
|
handleNext();
|
|
document.getElementById("qrcodeInput").value = "";
|
|
} else {
|
|
toast.error("Updation Failed");
|
|
}
|
|
} catch (error) {
|
|
console.error("Error fetching data: ", error);
|
|
} finally {
|
|
setIsLoading(false);
|
|
}
|
|
};
|
|
|
|
const handleArrowBack = () => {
|
|
dispatch(updateEvQrcodeList([]));
|
|
navigate(-1);
|
|
};
|
|
|
|
if (isLoading) {
|
|
return <CircularProgress />;
|
|
}
|
|
|
|
const currentItem = anomalyData[currentIndex];
|
|
const imageUrl = currentItem
|
|
? `https://docs.exampaper.vidh.ai/${currentItem.s3_path}`
|
|
: "";
|
|
|
|
const handleKeyDown = (e) => {
|
|
if (e.key === "Enter") {
|
|
console.log("Updating ......");
|
|
handleUpdate();
|
|
}
|
|
};
|
|
|
|
return (
|
|
<Layout style={{ minHeight: "100vh" }}>
|
|
<Layout>
|
|
<ToastContainer />
|
|
<Header style={{ padding: 0, background: colorBgContainer }}>
|
|
<Box className="d-flex justify-content-between h-100 py-1 px-2">
|
|
<Button
|
|
className="bg-primary p-1 text-light"
|
|
onClick={handleArrowBack}
|
|
>
|
|
<ArrowBackIcon />
|
|
</Button>
|
|
<Box className="d-flex justify-content-between gap-2">
|
|
{reduxSystemNo && (
|
|
<Box
|
|
className="h6 p-0 m-0 text-light bg-primary rounded h-100 d-flex align-items-center px-3"
|
|
style={{ cursor: "pointer" }}
|
|
onClick={handleSystemNoChange}
|
|
>
|
|
<b>System No : </b> {reduxSystemNo}
|
|
</Box>
|
|
)}
|
|
<Button
|
|
className="bg-primary p-1 text-light"
|
|
onClick={() => navigate("/")}
|
|
>
|
|
<HomeIcon />
|
|
</Button>
|
|
</Box>
|
|
</Box>
|
|
</Header>
|
|
|
|
<Content>
|
|
{currentItem ? (
|
|
<Box
|
|
className="d-flex justify-content-center align-items-center flex-column"
|
|
style={{ minHeight: "80vh" }}
|
|
>
|
|
<Card
|
|
style={{
|
|
display: "flex",
|
|
flexDirection: "row",
|
|
margin: "20px 20px 20px 20px",
|
|
}}
|
|
>
|
|
<Box
|
|
style={{
|
|
flex: "20%",
|
|
padding: "20px",
|
|
marginTop: "30px",
|
|
textAlign: "left",
|
|
}}
|
|
>
|
|
<Typography variant="h5" style={{ paddingBottom: "20px" }}>
|
|
Records Count: {anomalyData.length}
|
|
</Typography>
|
|
<Typography variant="h6">
|
|
Image Name: {currentItem.image_name}
|
|
</Typography>
|
|
{/* <Typography variant="body2">S3 Path: {currentItem.s3_path}</Typography> */}
|
|
<Typography
|
|
variant="subtitle1"
|
|
style={{ paddingTop: "20px", fontWeight: "bold" }}
|
|
>
|
|
Qrcode Value
|
|
</Typography>
|
|
<input
|
|
type="text"
|
|
id="qrcodeInput"
|
|
placeholder="Enter qrcode value"
|
|
style={{
|
|
marginTop: "10px",
|
|
width: "100%",
|
|
padding: "5px",
|
|
backgroundColor: "transparent",
|
|
color: "#000000", // black text color
|
|
}}
|
|
onKeyDown={handleKeyDown}
|
|
inputRef={inputRef}
|
|
/>
|
|
<Box mt={2}>
|
|
<Button
|
|
variant="contained"
|
|
color="primary"
|
|
onClick={handleNext}
|
|
style={{ marginRight: 10 }}
|
|
>
|
|
Skip
|
|
</Button>
|
|
<Button
|
|
variant="contained"
|
|
color="secondary"
|
|
onClick={handleUpdate}
|
|
style={{ backgroundColor: "green" }}
|
|
>
|
|
Update
|
|
</Button>
|
|
</Box>
|
|
</Box>
|
|
<CardContent style={{ flex: "80%" }}>
|
|
<img
|
|
src={imageUrl}
|
|
alt={currentItem.image_name}
|
|
style={{ minWidth:"1000px",width: "100%", marginTop: "20px" }}
|
|
/>
|
|
</CardContent>
|
|
</Card>
|
|
</Box>
|
|
) : (
|
|
<Typography>No items to display</Typography>
|
|
)}
|
|
</Content>
|
|
|
|
{showSystemNoContainer && (
|
|
<SystemNumberDialog
|
|
setShowSystemNoContainer={setShowSystemNoContainer}
|
|
showSystemNoContainer={showSystemNoContainer}
|
|
/>
|
|
)}
|
|
</Layout>
|
|
{isLoading && <LoadingContainer />}
|
|
</Layout>
|
|
);
|
|
}
|
|
|
|
export default EvQrcode;
|