/* eslint max-params: 0 */ import PropTypes from 'prop-types'; import React, { Component } from 'react'; import { connect } from 'react-redux'; import { createSelector } from 'reselect'; import * as commandNames from 'Commands/commandNames'; import withScrollPosition from 'Components/withScrollPosition'; import { saveBookEditor, setBookFilter, setBookSort, setBookTableOption, setBookView } from 'Store/Actions/bookIndexActions'; import { executeCommand } from 'Store/Actions/commandActions'; import scrollPositions from 'Store/scrollPositions'; import createBookClientSideCollectionItemsSelector from 'Store/Selectors/createBookClientSideCollectionItemsSelector'; import createCommandExecutingSelector from 'Store/Selectors/createCommandExecutingSelector'; import createDimensionsSelector from 'Store/Selectors/createDimensionsSelector'; import BookIndex from './BookIndex'; function createMapStateToProps() { return createSelector( createBookClientSideCollectionItemsSelector('bookIndex'), createCommandExecutingSelector(commandNames.REFRESH_AUTHOR), createCommandExecutingSelector(commandNames.REFRESH_BOOK), createCommandExecutingSelector(commandNames.RSS_SYNC), createCommandExecutingSelector(commandNames.CUTOFF_UNMET_BOOK_SEARCH), createCommandExecutingSelector(commandNames.MISSING_BOOK_SEARCH), createDimensionsSelector(), ( book, isRefreshingAuthorCommand, isRefreshingBookCommand, isRssSyncExecuting, isCutoffBooksSearch, isMissingBooksSearch, dimensionsState ) => { const isRefreshingBook = isRefreshingBookCommand || isRefreshingAuthorCommand; return { ...book, isRefreshingBook, isRssSyncExecuting, isSearching: isCutoffBooksSearch || isMissingBooksSearch, isSmallScreen: dimensionsState.isSmallScreen }; } ); } function createMapDispatchToProps(dispatch, props) { return { onTableOptionChange(payload) { dispatch(setBookTableOption(payload)); }, onSortSelect(sortKey) { dispatch(setBookSort({ sortKey })); }, onFilterSelect(selectedFilterKey) { dispatch(setBookFilter({ selectedFilterKey })); }, dispatchSetBookView(view) { dispatch(setBookView({ view })); }, dispatchSaveBookEditor(payload) { dispatch(saveBookEditor(payload)); }, onRefreshBookPress(items) { dispatch(executeCommand({ name: commandNames.BULK_REFRESH_BOOK, bookIds: items })); }, onRssSyncPress() { dispatch(executeCommand({ name: commandNames.RSS_SYNC })); }, onSearchPress(items) { dispatch(executeCommand({ name: commandNames.BOOK_SEARCH, bookIds: items })); } }; } class BookIndexConnector extends Component { // // Listeners onViewSelect = (view) => { this.props.dispatchSetBookView(view); }; onSaveSelected = (payload) => { this.props.dispatchSaveBookEditor(payload); }; onScroll = ({ scrollTop }) => { scrollPositions.bookIndex = scrollTop; }; // // Render render() { return ( ); } } BookIndexConnector.propTypes = { isSmallScreen: PropTypes.bool.isRequired, view: PropTypes.string.isRequired, dispatchSetBookView: PropTypes.func.isRequired, dispatchSaveBookEditor: PropTypes.func.isRequired }; export default withScrollPosition( connect(createMapStateToProps, createMapDispatchToProps)(BookIndexConnector), 'bookIndex' );