mirror of
https://github.com/wassname/talk.git
synced 2026-06-29 00:40:27 +08:00
57 lines
1.6 KiB
JavaScript
57 lines
1.6 KiB
JavaScript
import React from 'react';
|
|
import { connect } from 'plugin-api/beta/client/hocs';
|
|
import { bindActionCreators } from 'redux';
|
|
import {
|
|
sortOrderSelector,
|
|
sortBySelector,
|
|
} from 'plugin-api/beta/client/selectors/stream';
|
|
import { setSort } from 'plugin-api/beta/client/actions/stream';
|
|
import hoistStatics from 'recompose/hoistStatics';
|
|
import { closeMenu } from 'plugins/talk-plugin-viewing-options/client/actions';
|
|
|
|
const mapStateToProps = state => ({
|
|
sortOrder: sortOrderSelector(state),
|
|
sortBy: sortBySelector(state),
|
|
});
|
|
|
|
const mapDispatchToProps = dispatch =>
|
|
bindActionCreators(
|
|
{
|
|
setSort,
|
|
closeMenu,
|
|
},
|
|
dispatch
|
|
);
|
|
|
|
/**
|
|
* A HOC providing props to implement a sort option.
|
|
* Provides the props `active`, `setSort`, `label`.
|
|
* @param {Object} sort
|
|
* @param {Object} sort.sortBy
|
|
* @param {string} sort.sortOrder
|
|
* @return {Object} HOC
|
|
*/
|
|
export default ({ sortBy = 'created_at', sortOrder = 'DESC', label }) =>
|
|
hoistStatics(WrappedComponent => {
|
|
class WithSortOption extends React.Component {
|
|
setSort = () => {
|
|
this.props.closeMenu();
|
|
this.props.setSort({ sortBy, sortOrder });
|
|
};
|
|
|
|
render() {
|
|
const active =
|
|
this.props.sortOrder === sortOrder && this.props.sortBy === sortBy;
|
|
const resolvedLabel = typeof label === 'function' ? label() : label;
|
|
return (
|
|
<WrappedComponent
|
|
active={active}
|
|
setSort={this.setSort}
|
|
label={resolvedLabel}
|
|
/>
|
|
);
|
|
}
|
|
}
|
|
return connect(mapStateToProps, mapDispatchToProps)(WithSortOption);
|
|
});
|