--- id: 5a24c314108439a4d4036148 title: Connect Redux to the Messages Apps challengeType: 6 isRequired: false videoUrl: '' localeTitle: '' --- ## Description
الآن بعد أن فهمت كيفية استخدام connect للاتصال بـ React to Redux ، يمكنك تطبيق ما تعلمته على مكون React الذي يتعامل مع الرسائل. في الدرس الأخير ، تم تسمية المكون الذي اتصلت به إلى Redux باسم Presentational ، ولم يكن هذا العنصر تعسفياً. يشير هذا المصطلح عمومًا إلى مكونات React غير المتصلة بشكل مباشر بـ Redux. فهم مسؤولون ببساطة عن عرض واجهة المستخدم ويقومون بذلك كدالة للدعائم التي يتلقونها. على النقيض من ذلك ، يتم توصيل مكونات الحاوية إلى Redux. عادة ما تكون هذه مسؤولة عن إرسال إجراءات إلى المخزن وغالبًا ما تتجاوز حالة المخزن إلى مكونات الأطفال كدعامات.
## Instructions undefined ## Tests
```yml tests: - text: يجب أن يتم عرض AppWrapper إلى الصفحة. testString: 'assert((function() { const mockedComponent = Enzyme.mount(React.createElement(AppWrapper)); return mockedComponent.find("AppWrapper").length === 1; })(), "The AppWrapper should render to the page.");' - text: '' testString: 'assert((function() { const mockedComponent = Enzyme.mount(React.createElement(AppWrapper)); return mockedComponent.find("Presentational").length === 1; })(), "The Presentational component should render an h2, input, button, and ul elements.");' - text: '' testString: '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 ); })(), "The Presentational component should render an h2, input, button, and ul elements.");' - text: '' testString: 'assert((function() { const mockedComponent = Enzyme.mount(React.createElement(AppWrapper)); const PresentationalComponent = mockedComponent.find("Presentational"); const props = PresentationalComponent.props(); return Array.isArray(props.messages); })(), "The Presentational component should receive messages from the Redux store as a prop.");' - text: '' testString: 'assert((function() { const mockedComponent = Enzyme.mount(React.createElement(AppWrapper)); const PresentationalComponent = mockedComponent.find("Presentational"); const props = PresentationalComponent.props(); return typeof props.submitNewMessage === "function"; })(), "The Presentational component should receive the submitMessage action creator as a prop.");' ```
## Challenge Seed
```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: 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 (

Type in a new Message:


    {this.state.messages.map( (message, idx) => { return (
  • {message}
  • ) }) }
); } }; // 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: class AppWrapper extends React.Component { constructor(props) { super(props); } render() { // complete the return statement: return (null); } }; ```
### After Test
```js console.info('after the test'); ```
## Solution
```js // solution required ```