You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
Readarr/frontend/src/Bookshelf/BookshelfConnector.js

90 lines
2.3 KiB

import PropTypes from 'prop-types';
import React, { Component } from 'react';
import { connect } from 'react-redux';
import { createSelector } from 'reselect';
import { saveBookshelf, setBookshelfFilter, setBookshelfSort } from 'Store/Actions/bookshelfActions';
import createAuthorClientSideCollectionItemsSelector from 'Store/Selectors/createAuthorClientSideCollectionItemsSelector';
import createDimensionsSelector from 'Store/Selectors/createDimensionsSelector';
import Bookshelf from './Bookshelf';
function createBookFetchStateSelector() {
return createSelector(
(state) => state.books.items.length,
(state) => state.books.isFetching,
(state) => state.books.isPopulated,
(length, isFetching, isPopulated) => {
const bookCount = (!isFetching && isPopulated) ? length : 0;
return {
bookCount,
isFetching,
isPopulated
};
}
);
}
function createMapStateToProps() {
return createSelector(
createBookFetchStateSelector(),
createAuthorClientSideCollectionItemsSelector('bookshelf'),
createDimensionsSelector(),
(books, author, dimensionsState) => {
const isPopulated = books.isPopulated && author.isPopulated;
const isFetching = author.isFetching || books.isFetching;
return {
...author,
isPopulated,
isFetching,
bookCount: books.bookCount,
isSmallScreen: dimensionsState.isSmallScreen
};
}
);
}
const mapDispatchToProps = {
setBookshelfSort,
setBookshelfFilter,
saveBookshelf
};
class BookshelfConnector extends Component {
//
// Listeners
onSortPress = (sortKey) => {
this.props.setBookshelfSort({ sortKey });
};
onFilterSelect = (selectedFilterKey) => {
this.props.setBookshelfFilter({ selectedFilterKey });
};
onUpdateSelectedPress = (payload) => {
this.props.saveBookshelf(payload);
};
//
// Render
render() {
return (
<Bookshelf
{...this.props}
onSortPress={this.onSortPress}
onFilterSelect={this.onFilterSelect}
onUpdateSelectedPress={this.onUpdateSelectedPress}
/>
);
}
}
BookshelfConnector.propTypes = {
setBookshelfSort: PropTypes.func.isRequired,
setBookshelfFilter: PropTypes.func.isRequired,
saveBookshelf: PropTypes.func.isRequired
};
export default connect(createMapStateToProps, mapDispatchToProps)(BookshelfConnector);