149 lines
4.4 KiB
JavaScript
149 lines
4.4 KiB
JavaScript
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 "../assets/stylesheets/cabledetail.scss";
|
|
|
|
class Cable {
|
|
constructor(cableData) {
|
|
this.partnum = cableData.partnum;
|
|
this.id = cableData.id;
|
|
this.brand = cableData.brand;
|
|
this.position = cableData.position;
|
|
this.description = cableData.description
|
|
? cableData.image
|
|
: "No description available.";
|
|
this.image = cableData.image
|
|
? `http://localhost${cableData.image}`
|
|
: DefaultPartImg;
|
|
this.dynamicProps = {};
|
|
|
|
Object.keys(cableData).forEach((key) => {
|
|
if (!["partnum", "id", "brand", "position", "image"].includes(key)) {
|
|
this.dynamicProps[key] = cableData[key];
|
|
}
|
|
});
|
|
}
|
|
}
|
|
|
|
export default class CableDetailComponent extends Component {
|
|
constructor(props) {
|
|
super(props);
|
|
this.state = {
|
|
cableDetails: null,
|
|
};
|
|
}
|
|
|
|
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);
|
|
}
|
|
|
|
renderTables() {
|
|
const { cableDetails } = this.state;
|
|
if (!cableDetails) return null;
|
|
|
|
return Object.keys(cableDetails.dynamicProps).map((key) => (
|
|
<div key={key}>
|
|
<h2>{key.replace(/([A-Z])/g, " $1").trim()}</h2>
|
|
<table>
|
|
<tbody>
|
|
{Object.entries(cableDetails.dynamicProps[key]).map(
|
|
([propKey, value]) => (
|
|
<tr key={propKey}>
|
|
<td>{propKey}</td>
|
|
<td>{Array.isArray(value) ? value.join(", ") : value}</td>
|
|
</tr>
|
|
)
|
|
)}
|
|
</tbody>
|
|
</table>
|
|
</div>
|
|
));
|
|
}
|
|
|
|
render() {
|
|
const { cableDetails } = this.state;
|
|
|
|
return (
|
|
<div className="cable">
|
|
<div className="cable-image">
|
|
<img src={BeldenLogo} alt="Belden" />
|
|
</div>
|
|
<div className="cable-fieldContainer">
|
|
<div className="cable-actions">
|
|
<NavLink to="/browse" className="cable-actions-back">
|
|
<span>⬅️ Back</span>
|
|
</NavLink>
|
|
</div>
|
|
{cableDetails ? (
|
|
<div className="cable-main">
|
|
<img
|
|
className="cable-main-image"
|
|
src={cableDetails.image}
|
|
alt="Cable"
|
|
/>
|
|
<div className="cable-main-label">
|
|
<div className="cable-main-name">{cableDetails.partnum}</div>
|
|
<div className="cable-main-description">
|
|
{cableDetails.description}
|
|
</div>
|
|
<div className="cable-main-brand">
|
|
<span
|
|
style={{ color: "black", backgroundColor: "transparent" }}
|
|
>
|
|
Brand:{" "}
|
|
</span>
|
|
{cableDetails.brand}
|
|
</div>
|
|
<div className="cable-main-position">
|
|
<span
|
|
style={{ color: "black", backgroundColor: "transparent" }}
|
|
>
|
|
Position:{" "}
|
|
</span>
|
|
{cableDetails.position}
|
|
</div>
|
|
</div>
|
|
</div>
|
|
) : (
|
|
<div className="cable-main"></div>
|
|
)}
|
|
<div className="cable-actions">
|
|
<div className="cable-actions-button">
|
|
<span>➤ Datasheet</span>
|
|
<span>✏️</span>
|
|
</div>
|
|
<div className="cable-actions-button">
|
|
<span>➤ Show</span>
|
|
<span>💡</span>
|
|
</div>
|
|
<div className="cable-actions-button">
|
|
<span>➤ Dispense</span>
|
|
<span>🤲</span>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
);
|
|
}
|
|
}
|