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) => ( ))} {rows}
{key}
); } 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 (
Belden
⬅️ Back
{cableDetails ? (
Cable
{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]) ); } })}
) : (
)}
); } }