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>
|
||
);
|
||
}
|
||
}
|