2021-02-06 04:42:36 +00:00 
										
									 
								 
							 
							
								
							 
							
								 
							 
							
							
								---
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								id: 5a24c314108439a4d4036149
							 
						 
					
						
							
								
									
										
										
										
											2021-07-19 22:22:21 +05:30 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								title: Extrae el estado local en Redux
							 
						 
					
						
							
								
									
										
										
										
											2021-02-06 04:42:36 +00:00 
										
									 
								 
							 
							
								
							 
							
								 
							 
							
							
								challengeType: 6
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								forumTopicId: 301428
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								dashedName: extract-local-state-into-redux
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								---
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								# --description--
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2021-07-19 22:22:21 +05:30 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								¡Ya casi terminas! Recuerda que escribiste todo el código Redux para que Redux pudiera controlar la gestión del estado de tu aplicación de mensajes React. Ahora que Redux está conectado, necesitas extraer la gestión del estado de `Presentational`  y añadirlo a Redux. Actualmente, tienes Redux conectado, pero estás manejando el estado localmente dentro del componente `Presentational` .
							 
						 
					
						
							
								
									
										
										
										
											2021-02-06 04:42:36 +00:00 
										
									 
								 
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								# --instructions--
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2021-07-19 22:22:21 +05:30 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								En el componente `Presentational` , primero elimina la propiedad `messages`  del local `state` . Estos mensajes serán gestionados por Redux. A continuación, modifica el método `submitMessage()`  para que `submitNewMessage()`  trabaje desde `this.props`  y pase la entrada del mensaje actual desde el `state`  local como un argumento. Ya que eliminaste `messages`  desde el estado local, elimina también la propiedad `messages`  de la llamada a `this.setState()` . Finalmente, modifica el método `render()`  para que asigne los mensajes recibidos desde `props`  en lugar de `state` .
							 
						 
					
						
							
								
									
										
										
										
											2021-02-06 04:42:36 +00:00 
										
									 
								 
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2021-07-19 22:22:21 +05:30 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								Una vez realizados estos cambios, la aplicación seguirá funcionando igual, salvo que Redux gestiona el estado. Este ejemplo también ilustra cómo un componente puede tener un `state`  local: tu componente aún registra la entrada del usuario localmente en su propio `state` . Puedes ver cómo Redux proporciona un framework útil de gestión de estados sobre React. Alcanzaste el mismo resultado usando solo el estado local de React al principio, y esto es generalmente posible con aplicaciones simples. Sin embargo, cuanto más complejas y grandes se vuelve tus aplicaciones, más lo hará la gestión del estado, y esto es el problema que Redux resuelve.
							 
						 
					
						
							
								
									
										
										
										
											2021-02-06 04:42:36 +00:00 
										
									 
								 
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								# --hints--
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2021-09-13 07:13:43 -07:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								El `AppWrapper`  debe renderizarse.
							 
						 
					
						
							
								
									
										
										
										
											2021-02-06 04:42:36 +00:00 
										
									 
								 
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								```js
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								assert(
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								  (function () {
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								    const mockedComponent = Enzyme.mount(React.createElement(AppWrapper));
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								    return mockedComponent.find('AppWrapper').length === 1;
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								  })()
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								);
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								```
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2021-07-19 22:22:21 +05:30 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								El componente `Presentational`  debe renderizarse.
							 
						 
					
						
							
								
									
										
										
										
											2021-02-06 04:42:36 +00:00 
										
									 
								 
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								```js
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								assert(
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								  (function () {
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								    const mockedComponent = Enzyme.mount(React.createElement(AppWrapper));
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								    return mockedComponent.find('Presentational').length === 1;
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								  })()
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								);
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								```
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2021-09-13 07:13:43 -07:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								El componente `Presentational`  debe renderizar los siguientes elementos: un `h2` , `input` , `button` , y `ul` .
							 
						 
					
						
							
								
									
										
										
										
											2021-02-06 04:42:36 +00:00 
										
									 
								 
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								```js
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								assert(
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								  (function () {
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								    const mockedComponent = Enzyme.mount(React.createElement(AppWrapper));
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								    const PresentationalComponent = mockedComponent.find('Presentational');
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								    return (
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								      PresentationalComponent.find('div').length === 1 & & 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								      PresentationalComponent.find('h2').length === 1 & & 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								      PresentationalComponent.find('button').length === 1 & & 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								      PresentationalComponent.find('ul').length === 1
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								    );
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								  })()
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								);
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								```
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2021-09-13 07:13:43 -07:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								El componente `Presentational`  debe recibir `messages`  desde el store Redux como una prop.
							 
						 
					
						
							
								
									
										
										
										
											2021-02-06 04:42:36 +00:00 
										
									 
								 
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								```js
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								assert(
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								  (function () {
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								    const mockedComponent = Enzyme.mount(React.createElement(AppWrapper));
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								    const PresentationalComponent = mockedComponent.find('Presentational');
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								    const props = PresentationalComponent.props();
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								    return Array.isArray(props.messages);
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								  })()
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								);
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								```
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2021-09-13 07:13:43 -07:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								El componente `Presentational`  debe recibir la acción `submitMessage`  como una prop.
							 
						 
					
						
							
								
									
										
										
										
											2021-02-06 04:42:36 +00:00 
										
									 
								 
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								```js
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								assert(
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								  (function () {
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								    const mockedComponent = Enzyme.mount(React.createElement(AppWrapper));
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								    const PresentationalComponent = mockedComponent.find('Presentational');
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								    const props = PresentationalComponent.props();
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								    return typeof props.submitNewMessage === 'function';
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								  })()
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								);
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								```
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2021-07-19 22:22:21 +05:30 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								El estado del componente `Presentational`  debe contener una propiedad, `input` , que está inicializada a una cadena vacía.
							 
						 
					
						
							
								
									
										
										
										
											2021-02-06 04:42:36 +00:00 
										
									 
								 
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								```js
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								assert(
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								  (function () {
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								    const mockedComponent = Enzyme.mount(React.createElement(AppWrapper));
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								    const PresentationalState = mockedComponent
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								      .find('Presentational')
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								      .instance().state;
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								    return (
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								      typeof PresentationalState.input === 'string' & & 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								      Object.keys(PresentationalState).length === 1
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								    );
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								  })()
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								);
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								```
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2021-07-19 22:22:21 +05:30 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								Escribir el elemento `input`  debe actualizar el estado del componente `Presentational` .
							 
						 
					
						
							
								
									
										
										
										
											2021-02-06 04:42:36 +00:00 
										
									 
								 
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								```js
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								async () => {
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								  const mockedComponent = Enzyme.mount(React.createElement(AppWrapper));
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								  const testValue = '__MOCK__INPUT__';
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								  const waitForIt = (fn) =>
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								    new Promise((resolve, reject) => setTimeout(() => resolve(fn()), 100));
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								  const causeChange = (c, v) =>
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								    c.find('input').simulate('change', { target: { value: v } });
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								  let initialInput = mockedComponent.find('Presentational').find('input');
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								  const changed = () => {
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								    causeChange(mockedComponent, testValue);
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								    return waitForIt(() => mockedComponent);
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								  };
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								  const updated = await changed();
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								  const updatedInput = updated.find('Presentational').find('input');
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								  assert(
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								    initialInput.props().value === '' & & 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								      updatedInput.props().value === '__MOCK__INPUT__'
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								  );
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								};
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								```
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2021-07-19 22:22:21 +05:30 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								`submitMessage`  del componente `Presentational`  debe actualizar el almacenamiento de Redux y vaciar la entrada en el estado local.
							 
						 
					
						
							
								
									
										
										
										
											2021-02-06 04:42:36 +00:00 
										
									 
								 
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								```js
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								async () => {
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								  const mockedComponent = Enzyme.mount(React.createElement(AppWrapper));
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								  const waitForIt = (fn) =>
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								    new Promise((resolve, reject) => setTimeout(() => resolve(fn()), 100));
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								  let beforeProps = mockedComponent.find('Presentational').props();
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								  const testValue = '__TEST__EVENT__INPUT__';
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								  const causeChange = (c, v) =>
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								    c.find('input').simulate('change', { target: { value: v } });
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								  const changed = () => {
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								    causeChange(mockedComponent, testValue);
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								    return waitForIt(() => mockedComponent);
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								  };
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								  const clickButton = () => {
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								    mockedComponent.find('button').simulate('click');
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								    return waitForIt(() => mockedComponent);
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								  };
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								  const afterChange = await changed();
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								  const afterChangeInput = afterChange.find('input').props().value;
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								  const afterClick = await clickButton();
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								  const afterProps = mockedComponent.find('Presentational').props();
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								  assert(
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								    beforeProps.messages.length === 0 & & 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								      afterChangeInput === testValue & & 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								      afterProps.messages.pop() === testValue & & 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								      afterClick.find('input').props().value === ''
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								  );
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								};
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								```
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2021-07-19 22:22:21 +05:30 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								El componente `Presentational`  debe renderizar `messages`  desde el almacenamiento de Redux.
							 
						 
					
						
							
								
									
										
										
										
											2021-02-06 04:42:36 +00:00 
										
									 
								 
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								```js
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								async () => {
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								  const mockedComponent = Enzyme.mount(React.createElement(AppWrapper));
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								  const waitForIt = (fn) =>
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								    new Promise((resolve, reject) => setTimeout(() => resolve(fn()), 100));
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								  let beforeProps = mockedComponent.find('Presentational').props();
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								  const testValue = '__TEST__EVENT__INPUT__';
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								  const causeChange = (c, v) =>
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								    c.find('input').simulate('change', { target: { value: v } });
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								  const changed = () => {
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								    causeChange(mockedComponent, testValue);
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								    return waitForIt(() => mockedComponent);
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								  };
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								  const clickButton = () => {
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								    mockedComponent.find('button').simulate('click');
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								    return waitForIt(() => mockedComponent);
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								  };
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								  const afterChange = await changed();
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								  const afterChangeInput = afterChange.find('input').props().value;
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								  const afterClick = await clickButton();
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								  const afterProps = mockedComponent.find('Presentational').props();
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								  assert(
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								    beforeProps.messages.length === 0 & & 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								      afterChangeInput === testValue & & 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								      afterProps.messages.pop() === testValue & & 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								      afterClick.find('input').props().value === '' & & 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								      afterClick.find('ul').childAt(0).text() === testValue
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								  );
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								};
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								```
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								# --seed--
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								## --after-user-code--
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								```jsx
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								ReactDOM.render(< AppWrapper  / > , document.getElementById('root'))
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								```
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								## --seed-contents--
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								```jsx
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								// Redux:
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								const ADD = 'ADD';
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								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:
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								const Provider = ReactRedux.Provider;
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								const connect = ReactRedux.connect;
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								// Change code below this line
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								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() {
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								    this.setState((state) => ({
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								      input: '',
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								      messages: state.messages.concat(state.input)
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								    }));
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								  }
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								  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 > 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								    );
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								  }
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								};
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								// Change code above this line
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								const mapStateToProps = (state) => {
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								  return {messages: state}
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								};
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								const mapDispatchToProps = (dispatch) => {
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								  return {
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								    submitNewMessage: (message) => {
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								      dispatch(addMessage(message))
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								    }
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								  }
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								};
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								const Container = connect(mapStateToProps, mapDispatchToProps)(Presentational);
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								class AppWrapper extends React.Component {
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								  render() {
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								    return (
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								      < Provider  store = {store} > 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								        < Container / > 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								      < / Provider > 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								    );
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								  }
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								};
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								```
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								# --solutions--
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								```jsx
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								// Redux:
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								const ADD = 'ADD';
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								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:
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								const Provider = ReactRedux.Provider;
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								const connect = ReactRedux.connect;
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								// Change code below this line
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								class Presentational extends React.Component {
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								  constructor(props) {
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								    super(props);
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								    this.state = {
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								      input: ''
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								    }
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								 this.handleChange = this.handleChange.bind(this);
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								 this.submitMessage = this.submitMessage.bind(this);
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								  }
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								  handleChange(event) {
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								    this.setState({
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								      input: event.target.value
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								    });
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								  }
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								  submitMessage() {
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								    this.props.submitNewMessage(this.state.input);
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								    this.setState({
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								      input: ''
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								    });
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								  }
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								  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.props.messages.map( (message, idx) => {
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								              return (
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								                 < li  key = {idx} > {message}< / li > 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								              )
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								            })
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								          }
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								        < / ul > 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								      < / div > 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								    );
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								  }
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								};
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								// Change code above this line
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								const mapStateToProps = (state) => {
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								  return {messages: state}
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								};
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								const mapDispatchToProps = (dispatch) => {
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								  return {
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								    submitNewMessage: (message) => {
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								      dispatch(addMessage(message))
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								    }
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								  }
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								};
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								const Container = connect(mapStateToProps, mapDispatchToProps)(Presentational);
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								class AppWrapper extends React.Component {
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								  render() {
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								    return (
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								      < Provider  store = {store} > 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								        < Container / > 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								      < / Provider > 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								    );
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								  }
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								};
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								```