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.

73 lines
2.0 KiB

  1. import React from 'react';
  2. import PropTypes from 'prop-types';
  3. import ImmutablePropTypes from 'react-immutable-proptypes';
  4. import { connect } from 'react-redux';
  5. import ImmutablePureComponent from 'react-immutable-pure-component';
  6. import { injectIntl } from 'react-intl';
  7. import { setupListAdder, resetListAdder } from '../../actions/lists';
  8. import { createSelector } from 'reselect';
  9. import List from './components/list';
  10. import Account from './components/account';
  11. import NewListForm from '../lists/components/new_list_form';
  12. // hack
  13. const getOrderedLists = createSelector([state => state.get('lists')], lists => {
  14. if (!lists) {
  15. return lists;
  16. }
  17. return lists.toList().filter(item => !!item).sort((a, b) => a.get('title').localeCompare(b.get('title')));
  18. });
  19. const mapStateToProps = state => ({
  20. listIds: getOrderedLists(state).map(list=>list.get('id')),
  21. });
  22. const mapDispatchToProps = dispatch => ({
  23. onInitialize: accountId => dispatch(setupListAdder(accountId)),
  24. onReset: () => dispatch(resetListAdder()),
  25. });
  26. class ListAdder extends ImmutablePureComponent {
  27. static propTypes = {
  28. accountId: PropTypes.string.isRequired,
  29. onClose: PropTypes.func.isRequired,
  30. intl: PropTypes.object.isRequired,
  31. onInitialize: PropTypes.func.isRequired,
  32. onReset: PropTypes.func.isRequired,
  33. listIds: ImmutablePropTypes.list.isRequired,
  34. };
  35. componentDidMount () {
  36. const { onInitialize, accountId } = this.props;
  37. onInitialize(accountId);
  38. }
  39. componentWillUnmount () {
  40. const { onReset } = this.props;
  41. onReset();
  42. }
  43. render () {
  44. const { accountId, listIds } = this.props;
  45. return (
  46. <div className='modal-root__modal list-adder'>
  47. <div className='list-adder__account'>
  48. <Account accountId={accountId} />
  49. </div>
  50. <NewListForm />
  51. <div className='list-adder__lists'>
  52. {listIds.map(ListId => <List key={ListId} listId={ListId} />)}
  53. </div>
  54. </div>
  55. );
  56. }
  57. }
  58. export default connect(mapStateToProps, mapDispatchToProps)(injectIntl(ListAdder));