From 1919b7ac3e27481401db3306d7ee26b2ff4e3bc7 Mon Sep 17 00:00:00 2001 From: Vadim Date: Sun, 21 Oct 2018 05:57:25 +0300 Subject: [PATCH 1/4] done HT3 --- src/ac/index.js | 21 ++++++++++++++- src/components/article-list.js | 9 ++++--- src/components/filters/date-range.js | 19 ++++++++------ src/components/filters/index.js | 13 +++++++--- src/components/filters/select.js | 26 ++++++++++++++----- src/constants/index.js | 2 ++ src/reducer/filters.js | 39 ++++++++++++++++++++++++++++ src/reducer/index.js | 8 +++--- src/selectors/date.js | 1 + src/selectors/filters.js | 31 ++++++++++++++++++++++ src/selectors/index.js | 3 +++ src/store/index.js | 12 +++++---- 12 files changed, 152 insertions(+), 32 deletions(-) create mode 100644 src/reducer/filters.js create mode 100644 src/selectors/date.js create mode 100644 src/selectors/filters.js create mode 100644 src/selectors/index.js diff --git a/src/ac/index.js b/src/ac/index.js index 9ea3761..0558916 100644 --- a/src/ac/index.js +++ b/src/ac/index.js @@ -1,4 +1,9 @@ -import { INCREMENT, DELETE_ARTICLE } from '../constants' +import { + INCREMENT, + DELETE_ARTICLE, + FILTER_ARTICLE, + FILTER_DATE +} from '../constants' export function increment() { return { @@ -12,3 +17,17 @@ export function deleteArticle(id) { payload: { id } } } + +export function filterArticle(payload) { + return { + type: FILTER_ARTICLE, + payload + } +} + +export function filterDate(date) { + return { + type: FILTER_DATE, + payload: { date } + } +} diff --git a/src/components/article-list.js b/src/components/article-list.js index 8ee9d8e..c84c958 100644 --- a/src/components/article-list.js +++ b/src/components/article-list.js @@ -3,6 +3,7 @@ import PropTypes from 'prop-types' import { connect } from 'react-redux' import Article from './article' import accordionDecorator from '../decorators/accordion' +import filterArticles from '../selectors' export class ArticleList extends Component { static propTypes = { @@ -20,6 +21,7 @@ export class ArticleList extends Component { get items() { const { articles, openItemId, toggleOpenItem } = this.props + return articles.map((article) => (
  • ({ - articles: state.articles -}))(ArticleListWithAccordion) + articles: filterArticles(state) +}))(accordionDecorator(ArticleList)) diff --git a/src/components/filters/date-range.js b/src/components/filters/date-range.js index 3a81b1e..5148305 100644 --- a/src/components/filters/date-range.js +++ b/src/components/filters/date-range.js @@ -1,21 +1,21 @@ import React, { Component } from 'react' import DayPicker, { DateUtils } from 'react-day-picker' +import { filterDate } from '../../ac' +import { getDate } from '../../selectors' +import { connect } from 'react-redux' import 'react-day-picker/lib/style.css' class DateRange extends Component { - state = { - from: null, - to: null - } - handleDayClick = (day) => - this.setState(DateUtils.addDayToRange(day, this.state)) + this.props.filterDate(DateUtils.addDayToRange(day, this.props.date)) render() { - const { from, to } = this.state + const { from, to } = this.props.date + const selectedRange = from && to && `${from.toDateString()} - ${to.toDateString()}` + return (
    ({ date: getDate(state) }), + { filterDate } +)(DateRange) diff --git a/src/components/filters/index.js b/src/components/filters/index.js index c61bc78..793f7a7 100644 --- a/src/components/filters/index.js +++ b/src/components/filters/index.js @@ -1,18 +1,23 @@ import React, { Component } from 'react' import DateRange from './date-range' import SelectFilter from './select' +import { connect } from 'react-redux' class Filters extends Component { - static propTypes = {} - render() { return (
    - +
    ) } } -export default Filters +export default connect((state) => ({ + articles: state.articles, + filters: state.filters +}))(Filters) diff --git a/src/components/filters/select.js b/src/components/filters/select.js index c9a8512..80595d1 100644 --- a/src/components/filters/select.js +++ b/src/components/filters/select.js @@ -1,15 +1,24 @@ import React, { Component } from 'react' import Select from 'react-select' +import { connect } from 'react-redux' +import { filterArticle } from '../../ac' class SelectFilter extends Component { - state = { - selected: null - } + handleChange = (selected) => { + const { filterArticle } = this.props + const filtersArr = [] + + selected.map((item) => { + return filtersArr.push(item) + }) - handleChange = (selected) => this.setState({ selected }) + return filterArticle(filtersArr) + } get options() { - return this.props.articles.map((article) => ({ + const { articles } = this.props + + return articles.map((article) => ({ label: article.title, value: article.id })) @@ -19,7 +28,7 @@ class SelectFilter extends Component { return (