diff --git a/frontend/src/App.js b/frontend/src/App.js index 37845757234ccb68531c10cf7a2ffc589c47e342..a510572457c1e92ec1272de34ca6571e81238384 100644 --- a/frontend/src/App.js +++ b/frontend/src/App.js @@ -1,25 +1,66 @@ -import logo from './logo.svg'; -import './App.css'; - -function App() { - return ( - <div className="App"> - <header className="App-header"> - <img src={logo} className="App-logo" alt="logo" /> - <p> - Edit <code>src/App.js</code> and save to reload. - </p> - <a - className="App-link" - href="https://reactjs.org" - target="_blank" - rel="noopener noreferrer" - > - Learn React - </a> - </header> - </div> - ); +import React, { Component } from "react"; +import Counters from "./components/counters"; +import "./App.css"; +import logo from "./ZRoom_Logo.png"; + +//import { render } from "@testing-library/react"; + +class App extends Component { + state = { + counters: [ + { id: 1, value: "Frage?" }, + { id: 2, value: 0 }, + { id: 3, value: 0 }, + ], + }; + constructor() { + super(); + console.log("App - Constructor"); + } + + componentDidMount() { + console.log("App - Mounted"); + } + + handleIncrement = (counter) => { + const counters = [...this.state.counters]; + const index = counters.indexOf(counter); + counters[index] = { ...counter }; + counters[index].value++; + const requestURL = "http://localhost:5000/lamp/" + counters[index].id + "/activate" + fetch(requestURL) + this.setState({ counters }); + }; + + handleReset = () => { + const counters = this.state.counters.map((c) => { + c.value = 0; + return c; + }); + this.setState({ counters }); + }; + + handleDelete = (counterId) => { + const counters = this.state.counters.filter((c) => c.id !== counterId); + this.setState({ counters }); + }; + + render() { + console.log("App - Rendered"); + return ( + <React.Fragment> + <main className="container"> + <img src={logo} alt="ZRoom Logo" class="rounded mx-auto d-block m-5" /> + <Counters + counters={this.state.counters} + onReset={this.handleReset} + onIncrement={this.handleIncrement} + onDelete={this.handleDelete} + /> + </main> + </React.Fragment> + ); + } } export default App; diff --git a/frontend/src/ZRoom_Logo.png b/frontend/src/ZRoom_Logo.png new file mode 100644 index 0000000000000000000000000000000000000000..e2dfd6f44e34069ab2f81540d856e6d65ceb3039 Binary files /dev/null and b/frontend/src/ZRoom_Logo.png differ diff --git a/frontend/src/components/counter.jsx b/frontend/src/components/counter.jsx new file mode 100644 index 0000000000000000000000000000000000000000..273044934276a7cd7c6d7c41b2b9f2c150bcee14 --- /dev/null +++ b/frontend/src/components/counter.jsx @@ -0,0 +1,53 @@ +import React, { Component } from "react"; + +class Counter extends Component { + getBadgeClasses() { + let classes = "badge m-2 bg-"; + classes += this.props.counter.value === 0 ? "warning text-dark" : "primary"; + return classes; + } + + formatCount() { + const { value } = this.props.counter; + return value === 0 ? "Zero" : value; + } + + componentDidUpdate(prevProps, prevState) { + console.log("prevProps", prevProps); + console.log("prevState", prevState); + if (prevProps.counter.value !== this.props.counter.value) { + // Ajax call and get new data from the server + } + } + + componentWillUnmount() { + console.log("Counter - Unmount"); + } + render() { + console.log("Counter - Rendered"); + return ( + <div> + <span className={this.getBadgeClasses()}>{this.formatCount()}</span> + <button + onClick={() => this.props.onIncrement(this.props.counter)} + className="btn btn-secondary btn-sm" + > + Increment + </button> + <button + onClick={() => this.props.onDelete(this.props.counter.id)} + className="btn btn-danger btn-sm m-2" + > + Delete + </button> + </div> + ); + } +} + +// constructor() { +// super(); +// this.handleIncrement = this.handleIncrement.bind(this); +// } + +export default Counter; diff --git a/frontend/src/components/counters.jsx b/frontend/src/components/counters.jsx new file mode 100644 index 0000000000000000000000000000000000000000..63e8793a24a9b2fbafc8e9cc496e1611a919841a --- /dev/null +++ b/frontend/src/components/counters.jsx @@ -0,0 +1,27 @@ +import React, { Component } from "react"; +import Counter from "./counter"; + +class Counters extends Component { + render() { + console.log("Counters - Rendered"); + const { onReset, counters, onDelete, onIncrement } = this.props; + return ( + <div> + <button onClick={onReset} className="btn btn-primary btn-sm m-2"> + Reset + </button> + {counters.map((counter) => ( + <Counter + key={counter.id} + onDelete={onDelete} + onIncrement={onIncrement} + counter={counter} + /> + ))} + </div> + ); + } +} + +export default Counters; +<div></div>; diff --git a/frontend/src/index.js b/frontend/src/index.js index ef2edf8ea3fc42258464231e29140c8723458c1e..43b98751f7ca894f9a0a588ac4c8333bcfc90a29 100644 --- a/frontend/src/index.js +++ b/frontend/src/index.js @@ -1,15 +1,11 @@ -import React from 'react'; -import ReactDOM from 'react-dom'; -import './index.css'; -import App from './App'; -import reportWebVitals from './reportWebVitals'; +import React from "react"; +import ReactDOM from "react-dom"; +import "./index.css"; +import App from "./App"; +import reportWebVitals from "./reportWebVitals"; +import "bootstrap/dist/css/bootstrap.css"; -ReactDOM.render( - <React.StrictMode> - <App /> - </React.StrictMode>, - document.getElementById('root') -); +ReactDOM.render(<App />, document.getElementById("root")); // If you want to start measuring performance in your app, pass a function // to log results (for example: reportWebVitals(console.log))