Browse page, UI redesign, Websockets, Navigation, and more!
This commit is contained in:
		
							
								
								
									
										28
									
								
								src/assets/classes/SocketHandler.js
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										28
									
								
								src/assets/classes/SocketHandler.js
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,28 @@ | ||||
| export default class socketHandler { | ||||
|   constructor(socket) { | ||||
|     this.socket = socket; | ||||
|  | ||||
|     this.socket.addEventListener("message", (event) => { | ||||
|       try { | ||||
|         console.log("Message from server", event.data); | ||||
|         let messages = document.getElementById("messages"); | ||||
|         let message = document.createElement("li"); | ||||
|         message.textContent = "Received: " + event.data; | ||||
|         messages.appendChild(message); | ||||
|       } catch (error) { | ||||
|         console.log("Error", error); | ||||
|       } | ||||
|     }); | ||||
|   } | ||||
|  | ||||
|   sendMessage(message) { | ||||
|     this.socket.send(message); | ||||
|     console.log("Message sent", message); | ||||
|   } | ||||
|  | ||||
|   ping() { | ||||
|     let message = `{ "call": "send", "type": "log", "data": "This is a ping!!" }`; | ||||
|     this.socket.send(message); | ||||
|     console.log("Message sent", message); | ||||
|   } | ||||
| } | ||||
							
								
								
									
										
											BIN
										
									
								
								src/assets/fonts/goth_bold.ttf
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										
											BIN
										
									
								
								src/assets/fonts/goth_bold.ttf
									
									
									
									
									
										Normal file
									
								
							
										
											Binary file not shown.
										
									
								
							
							
								
								
									
										
											BIN
										
									
								
								src/assets/fonts/goth_book.ttf
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										
											BIN
										
									
								
								src/assets/fonts/goth_book.ttf
									
									
									
									
									
										Normal file
									
								
							
										
											Binary file not shown.
										
									
								
							
							
								
								
									
										
											BIN
										
									
								
								src/assets/fonts/goth_cond_medium.otf
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										
											BIN
										
									
								
								src/assets/fonts/goth_cond_medium.otf
									
									
									
									
									
										Normal file
									
								
							
										
											Binary file not shown.
										
									
								
							
							
								
								
									
										
											BIN
										
									
								
								src/assets/fonts/goth_light.ttf
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										
											BIN
										
									
								
								src/assets/fonts/goth_light.ttf
									
									
									
									
									
										Normal file
									
								
							
										
											Binary file not shown.
										
									
								
							
							
								
								
									
										
											BIN
										
									
								
								src/assets/fonts/goth_medium.ttf
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										
											BIN
										
									
								
								src/assets/fonts/goth_medium.ttf
									
									
									
									
									
										Normal file
									
								
							
										
											Binary file not shown.
										
									
								
							
							
								
								
									
										
											BIN
										
									
								
								src/assets/images/belden-white.png
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										
											BIN
										
									
								
								src/assets/images/belden-white.png
									
									
									
									
									
										Normal file
									
								
							
										
											Binary file not shown.
										
									
								
							| After Width: | Height: | Size: 28 KiB | 
							
								
								
									
										
											BIN
										
									
								
								src/assets/images/part.png
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										
											BIN
										
									
								
								src/assets/images/part.png
									
									
									
									
									
										Normal file
									
								
							
										
											Binary file not shown.
										
									
								
							| After Width: | Height: | Size: 16 KiB | 
							
								
								
									
										125
									
								
								src/components/BrowseComponent.js
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										125
									
								
								src/components/BrowseComponent.js
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,125 @@ | ||||
| import React, { Component } from "react"; | ||||
| import BeldenLogo from "../assets/images/belden-white.png"; | ||||
| import DefaultPartImg from "../assets/images/part.png"; | ||||
| import "../assets/stylesheets/browse.scss"; | ||||
|  | ||||
| class cable { | ||||
|   constructor( | ||||
|     part_number, | ||||
|     position, | ||||
|     name, | ||||
|     brand, | ||||
|     description, | ||||
|     short_description, | ||||
|     image | ||||
|   ) { | ||||
|     this.part_number = part_number; | ||||
|     this.position = position; | ||||
|     this.name = name; | ||||
|     this.brand = brand; | ||||
|     this.description = description; | ||||
|     this.short_description = short_description; | ||||
|     if (image === undefined) { | ||||
|       this.image = DefaultPartImg; | ||||
|     } else { | ||||
|       this.image = image; | ||||
|     } | ||||
|   } | ||||
|  | ||||
|   returnDiv() { | ||||
|     return ( | ||||
|       <div className="browse-cable"> | ||||
|         <img className="browse-cable-image" src={this.image} alt="Cable" /> | ||||
|         <div className="browse-cable-label"> | ||||
|           <div className="browse-cable-name">{this.name}</div> | ||||
|           <div className="browse-cable-brand"> | ||||
|             <span style={{ color: "#007cbe" }}>Brand: </span> | ||||
|             {this.brand} | ||||
|           </div> | ||||
|           <div className="browse-cable-description"> | ||||
|             <span style={{ color: "#007cbe" }}>About: </span> | ||||
|             {this.description} | ||||
|           </div> | ||||
|         </div> | ||||
|         <span className="browse-cable-arrow">{">"}</span> | ||||
|       </div> | ||||
|     ); | ||||
|   } | ||||
| } | ||||
|  | ||||
| export default class BrowseComponent extends Component { | ||||
|   constructor(props) { | ||||
|     super(props); | ||||
|     this.state = { | ||||
|       cableList: [], | ||||
|     }; | ||||
|   } | ||||
|  | ||||
|   componentDidMount() { | ||||
|     this.props.socketHandler.sendMessage( | ||||
|       '{"type":"cable_map","call":"request","data":{}}' | ||||
|     ); | ||||
|  | ||||
|     this.props.socketHandler.socket.addEventListener( | ||||
|       "message", | ||||
|       this.handleMessage | ||||
|     ); | ||||
|   } | ||||
|  | ||||
|   handleMessage = (event) => { | ||||
|     try { | ||||
|       console.log("Message from server", event.data); | ||||
|       const message = JSON.parse(event.data); | ||||
|       const cableList = this.browseParse(message); | ||||
|       this.setState({ cableList }); | ||||
|     } catch (error) { | ||||
|       console.error("Error parsing message from server:", error); | ||||
|     } | ||||
|   }; | ||||
|  | ||||
|   browseParse(message) { | ||||
|     let cableList = []; | ||||
|     let map = message.data.map; | ||||
|     for (let i = 0; i < map.length; i++) { | ||||
|       let part_number = map[i].part_number; | ||||
|       let position = map[i].position; | ||||
|       let name = map[i].name; | ||||
|       let brand = map[i].brand; | ||||
|       let description = map[i].description; | ||||
|       let short_description = map[i].short_description; | ||||
|       cableList.push( | ||||
|         new cable( | ||||
|           part_number, | ||||
|           position, | ||||
|           name, | ||||
|           brand, | ||||
|           description, | ||||
|           short_description | ||||
|         ) | ||||
|       ); | ||||
|     } | ||||
|     return cableList; | ||||
|   } | ||||
|  | ||||
|   componentWillUnmount() { | ||||
|     this.props.socketHandler.socket.removeEventListener( | ||||
|       "message", | ||||
|       this.handleMessage | ||||
|     ); | ||||
|   } | ||||
|  | ||||
|   render() { | ||||
|     return ( | ||||
|       <div className="browse"> | ||||
|         <div className="browse-image"> | ||||
|           <img src={BeldenLogo} alt="Belden" /> | ||||
|         </div> | ||||
|         <div className="browse-fieldContainer"> | ||||
|           {this.state.cableList.map((cableObj, index) => ( | ||||
|             <React.Fragment key={index}>{cableObj.returnDiv()}</React.Fragment> | ||||
|           ))} | ||||
|         </div> | ||||
|       </div> | ||||
|     ); | ||||
|   } | ||||
| } | ||||
| @@ -1,12 +0,0 @@ | ||||
| import React, { Component } from "react"; | ||||
| import "../assets/stylesheets/home.scss"; | ||||
|  | ||||
| export default class HomeComponent extends Component { | ||||
|   // constructor(props) { | ||||
|   //     super(props); | ||||
|   // } | ||||
|  | ||||
|   render() { | ||||
|     return <div className="home"></div>; | ||||
|   } | ||||
| } | ||||
							
								
								
									
										14
									
								
								src/components/MapComponent.js
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										14
									
								
								src/components/MapComponent.js
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,14 @@ | ||||
| import React, { Component } from "react"; | ||||
| import BeldenLogo from "../assets/images/belden-white.png"; | ||||
| import "../assets/stylesheets/map.scss"; | ||||
|  | ||||
| export default class MapComponent extends Component { | ||||
|   render() { | ||||
|     return ( | ||||
|       <div className="map"> | ||||
|         <img className="map-image" src={BeldenLogo} alt="Belden" /> | ||||
|         <div className="map-fieldContainer"></div> | ||||
|       </div> | ||||
|     ); | ||||
|   } | ||||
| } | ||||
| @@ -1,30 +1,57 @@ | ||||
| import React, { Component } from "react"; | ||||
| import { NavLink } from "react-router-dom"; | ||||
| import BeldenLogo from "../assets/images/belden-logo.png"; | ||||
| import "../assets/stylesheets/navbar.scss"; | ||||
|  | ||||
| export default class NavBar extends Component { | ||||
|   constructor(props) { | ||||
|     super(props); | ||||
|   componentDidMount() { | ||||
|     let path = window.location.pathname; | ||||
|     if (path.includes("browse")) { | ||||
|       document.getElementById("browse").style.backgroundColor = "#007CBE"; | ||||
|       document.getElementById("browse-s").style.color = "white"; | ||||
|     } else if (path.includes("settings")) { | ||||
|       document.getElementById("settings").style.backgroundColor = "#007CBE"; | ||||
|       document.getElementById("settings-s").style.color = "white"; | ||||
|     } else if (path.includes("map")) { | ||||
|       document.getElementById("map").style.backgroundColor = "#007CBE"; | ||||
|       document.getElementById("map-s").style.color = "white"; | ||||
|     } else { | ||||
|       document.getElementById("home").style.backgroundColor = "#007CBE"; | ||||
|       document.getElementById("home-s").style.color = "white"; | ||||
|     } | ||||
|   } | ||||
|  | ||||
|   render() { | ||||
|     return ( | ||||
|       <div className="navbar"> | ||||
|         <div className="navbar-top"> | ||||
|           <img className="navbar-top-logo" src={BeldenLogo} alt="Belden" /> | ||||
|           <div className="navbar-top-hamburger">≡</div> | ||||
|           <h1>Jukebox</h1> | ||||
|           <div className="navbar-search"> | ||||
|             <input type="text" placeholder="Search" /> | ||||
|             <button>🔍</button> | ||||
|           </div> | ||||
|           <ol className="navbar-list"> | ||||
|             <NavLink | ||||
|               style={this.upper} | ||||
|               id="home" | ||||
|               className="navbar-list-item" | ||||
|               to="/" | ||||
|             > | ||||
|               <span id="home-s" style={this.lower}> | ||||
|                 ❤️ Summary | ||||
|               </span> | ||||
|             </NavLink> | ||||
|             <NavLink className="navbar-list-item" id="browse" to="/browse"> | ||||
|               <span id="browse-s">🛍️ Browse</span> | ||||
|             </NavLink> | ||||
|             <NavLink className="navbar-list-item" id="map" to="/map"> | ||||
|               <span id="map-s">🗺️ Map</span> | ||||
|             </NavLink> | ||||
|             <NavLink className="navbar-list-item" id="settings" to="/settings"> | ||||
|               <span id="settings-s">⚙️ Settings</span> | ||||
|             </NavLink> | ||||
|           </ol> | ||||
|         </div> | ||||
|         <ol className="navbar-list"> | ||||
|           <NavLink className="navbar-list-item" to="/"> | ||||
|             <span className="navbar-list-item-label">Home</span> | ||||
|           </NavLink> | ||||
|           <NavLink className="navbar-list-item" to="/search"> | ||||
|             <span className="navbar-list-item-label">Search</span> | ||||
|           </NavLink> | ||||
|           <NavLink className="navbar-list-item" to="/settings"> | ||||
|             <span className="navbar-list-item-label">Settings</span> | ||||
|           </NavLink> | ||||
|         </ol> | ||||
|       </div> | ||||
|     ); | ||||
|   } | ||||
|   | ||||
							
								
								
									
										14
									
								
								src/components/SettingsComponent.js
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										14
									
								
								src/components/SettingsComponent.js
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,14 @@ | ||||
| import React, { Component } from "react"; | ||||
| import BeldenLogo from "../assets/images/belden-white.png"; | ||||
| import "../assets/stylesheets/settings.scss"; | ||||
|  | ||||
| export default class SettingsComponent extends Component { | ||||
|   render() { | ||||
|     return ( | ||||
|       <div className="settings"> | ||||
|         <img className="settings-image" src={BeldenLogo} alt="Belden" /> | ||||
|         <div className="settings-fieldContainer"></div> | ||||
|       </div> | ||||
|     ); | ||||
|   } | ||||
| } | ||||
							
								
								
									
										14
									
								
								src/components/SummaryComponent.js
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										14
									
								
								src/components/SummaryComponent.js
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,14 @@ | ||||
| import React, { Component } from "react"; | ||||
| import BeldenLogo from "../assets/images/belden-white.png"; | ||||
| import "../assets/stylesheets/summary.scss"; | ||||
|  | ||||
| export default class SummaryComponent extends Component { | ||||
|   render() { | ||||
|     return ( | ||||
|       <div className="summary"> | ||||
|         <img className="summary-image" src={BeldenLogo} alt="Belden" /> | ||||
|         <div className="summary-fieldContainer"></div> | ||||
|       </div> | ||||
|     ); | ||||
|   } | ||||
| } | ||||
							
								
								
									
										93
									
								
								src/index.js
									
									
									
									
									
								
							
							
						
						
									
										93
									
								
								src/index.js
									
									
									
									
									
								
							| @@ -1,57 +1,54 @@ | ||||
| import React from "react"; | ||||
| import ReactDOM from "react-dom/client"; | ||||
| import { createBrowserRouter, RouterProvider } from "react-router-dom"; | ||||
| import HomeRoute from "./routes/HomeRoute"; | ||||
| import SearchRoute from "./routes/SearchRoute"; | ||||
| import SummaryRoute from "./routes/SummaryRoute"; | ||||
| import BrowseRoute from "./routes/BrowseRoute"; | ||||
| import SettingsRoute from "./routes/SettingsRoute"; | ||||
| import SocketHandler from "./assets/classes/SocketHandler"; | ||||
| import MapRoute from "./routes/MapRoute"; | ||||
|  | ||||
| // Root | ||||
| const root = ReactDOM.createRoot(document.getElementById("root")); | ||||
|  | ||||
| const router = createBrowserRouter([ | ||||
|   { | ||||
|     path: "/", | ||||
|     element: <HomeRoute></HomeRoute>, | ||||
|     // errorElement: <ErrorRoute></ErrorRoute>, | ||||
|   }, | ||||
|   { | ||||
|     path: "/home", | ||||
|     element: <HomeRoute></HomeRoute>, | ||||
|     // errorElement: <ErrorRoute></ErrorRoute>, | ||||
|   }, | ||||
|   { | ||||
|     path: "/search", | ||||
|     element: <SearchRoute></SearchRoute>, | ||||
|     // errorElement: <ErrorRoute></ErrorRoute>, | ||||
|   }, | ||||
|   { | ||||
|     path: "/settings", | ||||
|     element: <SettingsRoute></SettingsRoute>, | ||||
|     // errorElement: <ErrorRoute></ErrorRoute>, | ||||
|   }, | ||||
| ]); | ||||
| // Socket handler | ||||
| console.log("Connecting to WebSocket server."); | ||||
| const socket = new WebSocket("ws://localhost:9000"); | ||||
| socket.addEventListener("open", function (event) { | ||||
|   console.log("Websocket connected."); | ||||
|   console.log("Welcome to Belden Jukebox!"); | ||||
|   init(); | ||||
| }); | ||||
|  | ||||
| root.render( | ||||
|   <React.StrictMode> | ||||
|     <RouterProvider router={router} /> | ||||
| // Initialize the app | ||||
| const init = () => { | ||||
|   const socketHandler = new SocketHandler(socket); | ||||
|  | ||||
|     <span | ||||
|       style={{ | ||||
|         position: "absolute", | ||||
|         top: "95%", | ||||
|         left: "0%", | ||||
|         color: "red", | ||||
|         backgroundImage: "none", | ||||
|         width: "270px", | ||||
|         height: "30px", | ||||
|         backgroundColor: "white", | ||||
|         borderRadius: "20px", | ||||
|         textAlign: "center", | ||||
|         padding: "5px 0 0px 0", | ||||
|         outline: "solid black 1px", | ||||
|       }} | ||||
|     > | ||||
|       Jukebox Draft UI (not styled yet) | ||||
|     </span> | ||||
|      | ||||
|   </React.StrictMode> | ||||
| ); | ||||
|   const router = createBrowserRouter([ | ||||
|     { | ||||
|       path: "/", | ||||
|       element: <SummaryRoute socketHandler={socketHandler}></SummaryRoute>, | ||||
|       // errorElement: <ErrorRoute></ErrorRoute>, | ||||
|     }, | ||||
|     { | ||||
|       path: "/browse", | ||||
|       element: <BrowseRoute socketHandler={socketHandler}></BrowseRoute>, | ||||
|       // errorElement: <ErrorRoute></ErrorRoute>, | ||||
|     }, | ||||
|     { | ||||
|       path: "/settings", | ||||
|       element: <SettingsRoute socketHandler={socketHandler}></SettingsRoute>, | ||||
|       // errorElement: <ErrorRoute></ErrorRoute>, | ||||
|     }, | ||||
|     { | ||||
|       path: "/map", | ||||
|       element: <MapRoute socketHandler={socketHandler}></MapRoute>, | ||||
|       // errorElement: <ErrorRoute></ErrorRoute>, | ||||
|     }, | ||||
|   ]); | ||||
|  | ||||
|   root.render( | ||||
|     <div> | ||||
|       <RouterProvider router={router} /> | ||||
|     </div> | ||||
|   ); | ||||
| }; | ||||
|   | ||||
							
								
								
									
										20
									
								
								src/routes/BrowseRoute.js
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										20
									
								
								src/routes/BrowseRoute.js
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,20 @@ | ||||
| import React, { Component } from "react"; | ||||
| import NavBar from "../components/NavBar"; | ||||
| import BrowseComponent from "../components/BrowseComponent"; | ||||
| import "../assets/stylesheets/app.scss"; | ||||
|  | ||||
| export default class BrowseRoute extends Component { | ||||
|   constructor(props) { | ||||
|     super(props); | ||||
|     document.title = "Browse"; | ||||
|   } | ||||
|  | ||||
|   render() { | ||||
|     return ( | ||||
|       <div className="container"> | ||||
|         <NavBar /> | ||||
|         <BrowseComponent socketHandler={this.props.socketHandler} /> | ||||
|       </div> | ||||
|     ); | ||||
|   } | ||||
| } | ||||
| @@ -1,17 +1,19 @@ | ||||
| import React, { Component } from "react"; | ||||
| import NavBar from "../components/NavBar"; | ||||
| import MapComponent from "../components/MapComponent"; | ||||
| import "../assets/stylesheets/app.scss"; | ||||
| 
 | ||||
| export default class SearchRoute extends Component { | ||||
| export default class MapRoute extends Component { | ||||
|   constructor(props) { | ||||
|     super(props); | ||||
|     document.title = "ITR - Search"; | ||||
|     document.title = "Map"; | ||||
|   } | ||||
| 
 | ||||
|   render() { | ||||
|     return ( | ||||
|       <div className="container"> | ||||
|         <NavBar /> | ||||
|         <MapComponent socketHandler={this.props.socketHandler} /> | ||||
|       </div> | ||||
|     ); | ||||
|   } | ||||
| @@ -1,17 +1,19 @@ | ||||
| import React, { Component } from "react"; | ||||
| import NavBar from "../components/NavBar"; | ||||
| import SettingsComponent from "../components/SettingsComponent"; | ||||
| import "../assets/stylesheets/app.scss"; | ||||
|  | ||||
| export default class SettingsRoute extends Component { | ||||
|   constructor(props) { | ||||
|     super(props); | ||||
|     document.title = "ITR - Settings"; | ||||
|     document.title = "Settings"; | ||||
|   } | ||||
|  | ||||
|   render() { | ||||
|     return ( | ||||
|       <div className="container"> | ||||
|         <NavBar /> | ||||
|         <SettingsComponent socketHandler={this.props.socketHandler} /> | ||||
|       </div> | ||||
|     ); | ||||
|   } | ||||
|   | ||||
| @@ -1,19 +1,19 @@ | ||||
| import React, { Component } from "react"; | ||||
| import NavBar from "../components/NavBar"; | ||||
| import HomeComponent from "../components/HomeComponent"; | ||||
| import SummaryComponent from "../components/SummaryComponent"; | ||||
| import "../assets/stylesheets/app.scss"; | ||||
| 
 | ||||
| export default class HomeRoute extends Component { | ||||
|   constructor(props) { | ||||
|     super(props); | ||||
|     document.title = "ITR - Home"; | ||||
|     document.title = "Summary"; | ||||
|   } | ||||
| 
 | ||||
|   render() { | ||||
|     return ( | ||||
|       <div className="container"> | ||||
|         <NavBar /> | ||||
|         <HomeComponent /> | ||||
|         <SummaryComponent socketHandler={this.props.socketHandler} /> | ||||
|       </div> | ||||
|     ); | ||||
|   } | ||||
		Reference in New Issue
	
	Block a user