| 
									
										
										
										
											2018-10-12 15:37:13 -04:00
										 |  |  | --- | 
					
						
							|  |  |  | title: Connect Redux to the Messages App | 
					
						
							|  |  |  | --- | 
					
						
							|  |  |  | ## Connect Redux to the Messages App
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-05-09 06:27:06 -07:00
										 |  |  | ### Solution
 | 
					
						
							|  |  |  | <details> | 
					
						
							|  |  |  |   <summary>Spoiler!</summary> | 
					
						
							| 
									
										
										
										
											2018-10-12 15:37:13 -04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-05-09 06:27:06 -07:00
										 |  |  | ```jsx | 
					
						
							|  |  |  | // Redux: | 
					
						
							|  |  |  | const ADD = 'ADD'; | 
					
						
							| 
									
										
										
										
											2018-10-12 15:37:13 -04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-05-09 06:27:06 -07:00
										 |  |  | const addMessage = (message) => { | 
					
						
							|  |  |  |   return { | 
					
						
							|  |  |  |     type: ADD, | 
					
						
							|  |  |  |     message: message | 
					
						
							|  |  |  |   } | 
					
						
							|  |  |  | }; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | const messageReducer = (state = [], action) => { | 
					
						
							|  |  |  |   switch (action.type) { | 
					
						
							|  |  |  |     case ADD: | 
					
						
							|  |  |  |       return [ | 
					
						
							|  |  |  |         ...state, | 
					
						
							|  |  |  |         action.message | 
					
						
							|  |  |  |       ]; | 
					
						
							|  |  |  |     default: | 
					
						
							|  |  |  |       return state; | 
					
						
							|  |  |  |   } | 
					
						
							|  |  |  | }; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | const store = Redux.createStore(messageReducer); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | // React: | 
					
						
							|  |  |  | class Presentational extends React.Component { | 
					
						
							|  |  |  |   constructor(props) { | 
					
						
							|  |  |  |     super(props); | 
					
						
							|  |  |  |     this.state = { | 
					
						
							|  |  |  |       input: '', | 
					
						
							|  |  |  |       messages: [] | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  |     this.handleChange = this.handleChange.bind(this); | 
					
						
							|  |  |  |     this.submitMessage = this.submitMessage.bind(this); | 
					
						
							|  |  |  |   } | 
					
						
							|  |  |  |   handleChange(event) { | 
					
						
							|  |  |  |     this.setState({ | 
					
						
							|  |  |  |       input: event.target.value | 
					
						
							|  |  |  |     }); | 
					
						
							|  |  |  |   } | 
					
						
							|  |  |  |   submitMessage() { | 
					
						
							|  |  |  |     const currentMessage = this.state.input; | 
					
						
							|  |  |  |     this.setState({ | 
					
						
							|  |  |  |       input: '', | 
					
						
							|  |  |  |       messages: this.state.messages.concat(currentMessage) | 
					
						
							|  |  |  |     }); | 
					
						
							|  |  |  |   } | 
					
						
							|  |  |  |   render() { | 
					
						
							|  |  |  |     return ( | 
					
						
							|  |  |  |       <div> | 
					
						
							|  |  |  |         <h2>Type in a new Message:</h2> | 
					
						
							|  |  |  |         <input | 
					
						
							|  |  |  |           value={this.state.input} | 
					
						
							|  |  |  |           onChange={this.handleChange}/><br/> | 
					
						
							|  |  |  |         <button onClick={this.submitMessage}>Submit</button> | 
					
						
							|  |  |  |         <ul> | 
					
						
							|  |  |  |           {this.state.messages.map( (message, idx) => { | 
					
						
							|  |  |  |               return ( | 
					
						
							|  |  |  |                  <li key={idx}>{message}</li> | 
					
						
							|  |  |  |               ) | 
					
						
							|  |  |  |             }) | 
					
						
							|  |  |  |           } | 
					
						
							|  |  |  |         </ul> | 
					
						
							|  |  |  |       </div> | 
					
						
							|  |  |  |     ); | 
					
						
							|  |  |  |   } | 
					
						
							|  |  |  | }; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | // React-Redux: | 
					
						
							|  |  |  | const mapStateToProps = (state) => { | 
					
						
							|  |  |  |   return { messages: state } | 
					
						
							|  |  |  | }; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | const mapDispatchToProps = (dispatch) => { | 
					
						
							|  |  |  |   return { | 
					
						
							|  |  |  |     submitNewMessage: (newMessage) => { | 
					
						
							|  |  |  |        dispatch(addMessage(newMessage)) | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  |   } | 
					
						
							|  |  |  | }; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | const Provider = ReactRedux.Provider; | 
					
						
							|  |  |  | const connect = ReactRedux.connect; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | // define the Container component here: | 
					
						
							|  |  |  | const Container = connect(mapStateToProps,mapDispatchToProps)(Presentational) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | class AppWrapper extends React.Component { | 
					
						
							|  |  |  |   constructor(props) { | 
					
						
							|  |  |  |     super(props); | 
					
						
							|  |  |  |   } | 
					
						
							|  |  |  |   render() { | 
					
						
							|  |  |  |     // complete the return statement: | 
					
						
							|  |  |  |     return ( | 
					
						
							|  |  |  |       <Provider store={store}> | 
					
						
							|  |  |  |         <Container /> | 
					
						
							|  |  |  |       </Provider> | 
					
						
							|  |  |  |       ); | 
					
						
							|  |  |  |   } | 
					
						
							|  |  |  | }; | 
					
						
							|  |  |  | ``` | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | </details> |