We finished the last chapter with a static prototype. We learned about React, composed the components, but didn't provide them with any state. Now, we will start binding the state of the application window to the Header component. As the state concept clarified, we will move to the chat services. After getting a brief introduction to the WebSockets technology, we will implement both the server and client. We will bind the service events to the application state. Finally, we will have a fully working chat. We won't stop on it, but will take care of the technical debt. So, we will set up the Jest testing framework and unit-test both the stateless and stateful components. Afterward, we will package the application and publish releases though a basic HTTP server. We will extend the...




















































