import React, { Component } from "react";
import BeldenLogo from "../assets/images/belden-white.png";
import DefaultPartImg from "../assets/images/part.png";
import { NavLink } from "react-router-dom";
import Modal from "react-modal";
import "../assets/stylesheets/cabledetail.scss";
Modal.setAppElement("#root");
class Cable {
constructor(cableData) {
this.partnum = cableData.partnum;
this.id = cableData.id;
this.brand = cableData.brand;
this.position = cableData.position;
this.image = cableData.image
? `http://localhost${cableData.image}`
: DefaultPartImg;
this.dynamicProps = {};
this.horizontal = [];
this.vertical = [];
this.orderedKeys = [];
this.description = cableData.description;
this.short_description = cableData.short_description;
this.application = cableData.application;
this.category = cableData.category;
if (this.description === undefined) {
if (this.short_description !== undefined) {
this.description = this.short_description;
} else if (this.application !== undefined) {
this.description = this.application;
} else if (this.category !== undefined) {
this.description = this.category;
} else {
this.description = "";
}
}
if (this.description !== undefined) {
this.description =
this.description.charAt(0).toUpperCase() + this.description.slice(1);
if (this.description.length > 200) {
this.description = this.description.substring(0, 200) + "...";
}
}
Object.keys(cableData).forEach((key) => {
if (
![
"partnum",
"id",
"brand",
"position",
"image",
"short_description",
"description",
"application",
"category",
].includes(key)
) {
this.dynamicProps[key] = cableData[key];
}
});
for (let key in this.dynamicProps) {
let data = this.dynamicProps[key];
let first = Object.keys(data)[0];
if (typeof data[first] === "object") {
this.horizontal.push(key);
} else {
this.vertical.push(key);
}
}
this.orderedKeys = this.orderedKeys.concat(this.vertical);
this.orderedKeys = this.orderedKeys.concat(this.horizontal);
for (let i = 0; i < this.orderedKeys.length; i++) {
let key = this.orderedKeys[i];
if (!isNaN(key)) {
this.orderedKeys.splice(i, 1);
i--;
}
try {
let data = this.dynamicProps[key];
let first = Object.keys(data)[0];
if (data[first] !== undefined) {
if (typeof data[first] === "string") {
if (first === "" || data[first] === "") {
this.orderedKeys.splice(i, 1);
i--;
}
}
}
} catch (error) {}
}
}
}
export default class CableDetailComponent extends Component {
constructor(props) {
super(props);
this.state = {
cableDetails: null,
modalOpen_dispense: false,
modalOpen_show: false,
modalOpen_datasheet: false,
modalOpacity: 0,
};
this.openModal = this.openModal.bind(this);
this.closeModal = this.closeModal.bind(this);
}
openModal = (modal) => {
this.setState({ [modal]: true }, () => {
setTimeout(() => this.setState({ modalOpacity: 1 }), 10);
});
if (modal === "modalOpen_dispense") {
this.props.socket.send(
`{"type": "cable_get","call": "send","data": {"position": ${this.state.cableDetails.position}}}`
);
} else if (modal === "modalOpen_show") {
this.props.socket.send(
`{"type": "cable_get","call": "request","data": {"position": ${this.state.cableDetails.position}}}`
);
}
};
closeModal = (modal) => {
this.setState({ modalOpacity: 0 }, () => {
setTimeout(() => this.setState({ [modal]: false }), 300);
});
};
componentDidMount() {
const cablePos = window.location.href.split("/").pop();
this.props.socket.send(
`{"type":"cable_details","call":"request","data":{"position":["${cablePos}"]}}`
);
this.props.socket.addEventListener("message", this.handleMessage);
}
handleMessage = (event) => {
try {
console.log("Message from server", event.data);
const message = JSON.parse(event.data);
const cableDetails = new Cable(message.data.cables[0]);
this.setState({ cableDetails });
} catch (error) {
console.error("Error parsing message from server:", error);
}
};
componentWillUnmount() {
this.props.socket.removeEventListener("message", this.handleMessage);
}
renderHorizontalTable(title, object) {
let data;
try {
data = JSON.parse(object);
} catch (error) {
console.error("Error parsing JSON data:", error);
return
Error loading data...
;
}
const validKeys = Object.keys(data).filter((key) =>
Array.isArray(data[key])
);
const maxRows = Math.max(...validKeys.map((key) => data[key].length));
const rows = Array.from({ length: maxRows }).map((_, rowIndex) => {
return (
{validKeys.map((key, index) => (
{data[key][rowIndex] || ""}
|
))}
);
});
return (
{title}
{validKeys.map((key, index) => (
{key}
|
))}
{rows}
);
}
renderVerticalTable(title, object) {
let data;
try {
data = JSON.parse(object);
} catch (error) {
console.error("Error parsing JSON data:", error);
return Error loading data...
;
}
return (
{title}
{Object.entries(data).map(([key, value], index) => (
{key} |
{value} |
))}
);
}
render() {
const {
modalOpen_dispense,
modalOpen_show,
modalOpen_datasheet,
modalOpacity,
cableDetails,
} = this.state;
const modalStyle = {
content: {
opacity: modalOpacity,
transition: "opacity 300ms ease-in-out",
top: "50%",
left: "50%",
right: "auto",
bottom: "auto",
marginRight: "-50%",
width: "30%",
height: "30%",
transform: "translate(-50%, -50%)",
overflow: "hidden",
display: "flex",
flexDirection: "column",
justifyContent: "center",
alignItems: "center",
borderRadius: "20px",
background:
"linear-gradient(-30deg, rgb(187, 194, 236) 0%, rgba(255, 255, 255, 1) 100%)",
boxShadow: "0 0 20px rgba(0, 0, 0, 0.5)",
},
overlay: {
opacity: modalOpacity,
transition: "opacity 300ms ease-in-out",
backgroundColor: "rgba(255, 255, 255, 0.15)",
backdropFilter: "blur(5px)",
},
};
return (
⬅️ Back
{cableDetails ? (
{cableDetails.partnum}
{cableDetails.description}
{cableDetails.category ? (
Category:{" "}
{cableDetails.category}
) : null}
Brand:{" "}
{cableDetails.brand}
Position:{" "}
{cableDetails.position}
) : (
)}
this.openModal("modalOpen_datasheet")}
>
➤ Datasheet
✏️
this.closeModal("modalOpen_datasheet")}
contentLabel="show"
style={modalStyle}
>
✏️
Datasheet
Datasheet coming soon...
this.closeModal("modalOpen_datasheet")}
>
Close
this.openModal("modalOpen_show")}
>
➤ Show
💡
this.closeModal("modalOpen_show")}
contentLabel="show"
style={modalStyle}
>
💡
Showing Item
The item will now be illuminated.
this.closeModal("modalOpen_show")}
>
Close
this.openModal("modalOpen_dispense")}
>
➤ Dispense
🤖
this.closeModal("modalOpen_dispense")}
contentLabel="Dispense"
style={modalStyle}
>
🤖
Dispensing Item
Please wait for your item to be dispensed.
this.closeModal("modalOpen_dispense")}
>
Close
{cableDetails ? (
{cableDetails.orderedKeys.map((key, index) => {
if (cableDetails.horizontal.includes(key)) {
return this.renderHorizontalTable(
key,
JSON.stringify(cableDetails.dynamicProps[key])
);
} else {
return this.renderVerticalTable(
key,
JSON.stringify(cableDetails.dynamicProps[key])
);
}
})}
) : (
)}
);
}
}