Split list editor into components and containers
This commit is contained in:
		
							parent
							
								
									d69f045681
								
							
						
					
					
						commit
						9fbaaefe59
					
				@ -1,38 +1,17 @@
 | 
				
			|||||||
import React from 'react';
 | 
					import React from 'react';
 | 
				
			||||||
import PropTypes from 'prop-types';
 | 
					import PropTypes from 'prop-types';
 | 
				
			||||||
import { connect } from 'react-redux';
 | 
					 | 
				
			||||||
import { makeGetAccount } from 'flavours/glitch/selectors';
 | 
					 | 
				
			||||||
import ImmutablePureComponent from 'react-immutable-pure-component';
 | 
					import ImmutablePureComponent from 'react-immutable-pure-component';
 | 
				
			||||||
import ImmutablePropTypes from 'react-immutable-proptypes';
 | 
					import ImmutablePropTypes from 'react-immutable-proptypes';
 | 
				
			||||||
import Avatar from 'flavours/glitch/components/avatar';
 | 
					import Avatar from 'flavours/glitch/components/avatar';
 | 
				
			||||||
import DisplayName from 'flavours/glitch/components/display_name';
 | 
					import DisplayName from 'flavours/glitch/components/display_name';
 | 
				
			||||||
import IconButton from 'flavours/glitch/components/icon_button';
 | 
					import IconButton from 'flavours/glitch/components/icon_button';
 | 
				
			||||||
import { defineMessages, injectIntl } from 'react-intl';
 | 
					import { defineMessages } from 'react-intl';
 | 
				
			||||||
import { removeFromListEditor, addToListEditor } from 'flavours/glitch/actions/lists';
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
const messages = defineMessages({
 | 
					const messages = defineMessages({
 | 
				
			||||||
  remove: { id: 'lists.account.remove', defaultMessage: 'Remove from list' },
 | 
					  remove: { id: 'lists.account.remove', defaultMessage: 'Remove from list' },
 | 
				
			||||||
  add: { id: 'lists.account.add', defaultMessage: 'Add to list' },
 | 
					  add: { id: 'lists.account.add', defaultMessage: 'Add to list' },
 | 
				
			||||||
});
 | 
					});
 | 
				
			||||||
 | 
					
 | 
				
			||||||
const makeMapStateToProps = () => {
 | 
					 | 
				
			||||||
  const getAccount = makeGetAccount();
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  const mapStateToProps = (state, { accountId, added }) => ({
 | 
					 | 
				
			||||||
    account: getAccount(state, accountId),
 | 
					 | 
				
			||||||
    added: typeof added === 'undefined' ? state.getIn(['listEditor', 'accounts', 'items']).includes(accountId) : added,
 | 
					 | 
				
			||||||
  });
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  return mapStateToProps;
 | 
					 | 
				
			||||||
};
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
const mapDispatchToProps = (dispatch, { accountId }) => ({
 | 
					 | 
				
			||||||
  onRemove: () => dispatch(removeFromListEditor(accountId)),
 | 
					 | 
				
			||||||
  onAdd: () => dispatch(addToListEditor(accountId)),
 | 
					 | 
				
			||||||
});
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
@connect(makeMapStateToProps, mapDispatchToProps)
 | 
					 | 
				
			||||||
@injectIntl
 | 
					 | 
				
			||||||
export default class Account extends ImmutablePureComponent {
 | 
					export default class Account extends ImmutablePureComponent {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  static propTypes = {
 | 
					  static propTypes = {
 | 
				
			||||||
 | 
				
			|||||||
@ -1,26 +1,12 @@
 | 
				
			|||||||
import React from 'react';
 | 
					import React from 'react';
 | 
				
			||||||
import PropTypes from 'prop-types';
 | 
					import PropTypes from 'prop-types';
 | 
				
			||||||
import { connect } from 'react-redux';
 | 
					import { defineMessages } from 'react-intl';
 | 
				
			||||||
import { defineMessages, injectIntl } from 'react-intl';
 | 
					 | 
				
			||||||
import { fetchListSuggestions, clearListSuggestions, changeListSuggestions } from '../../../actions/lists';
 | 
					 | 
				
			||||||
import classNames from 'classnames';
 | 
					import classNames from 'classnames';
 | 
				
			||||||
 | 
					
 | 
				
			||||||
const messages = defineMessages({
 | 
					const messages = defineMessages({
 | 
				
			||||||
  search: { id: 'lists.search', defaultMessage: 'Search among people you follow' },
 | 
					  search: { id: 'lists.search', defaultMessage: 'Search among people you follow' },
 | 
				
			||||||
});
 | 
					});
 | 
				
			||||||
 | 
					
 | 
				
			||||||
const mapStateToProps = state => ({
 | 
					 | 
				
			||||||
  value: state.getIn(['listEditor', 'suggestions', 'value']),
 | 
					 | 
				
			||||||
});
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
const mapDispatchToProps = dispatch => ({
 | 
					 | 
				
			||||||
  onSubmit: value => dispatch(fetchListSuggestions(value)),
 | 
					 | 
				
			||||||
  onClear: () => dispatch(clearListSuggestions()),
 | 
					 | 
				
			||||||
  onChange: value => dispatch(changeListSuggestions(value)),
 | 
					 | 
				
			||||||
});
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
@connect(mapStateToProps, mapDispatchToProps)
 | 
					 | 
				
			||||||
@injectIntl
 | 
					 | 
				
			||||||
export default class Search extends React.PureComponent {
 | 
					export default class Search extends React.PureComponent {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  static propTypes = {
 | 
					  static propTypes = {
 | 
				
			||||||
 | 
				
			|||||||
@ -0,0 +1,24 @@
 | 
				
			|||||||
 | 
					import React from 'react';
 | 
				
			||||||
 | 
					import { connect } from 'react-redux';
 | 
				
			||||||
 | 
					import { makeGetAccount } from 'flavours/glitch/selectors';
 | 
				
			||||||
 | 
					import { injectIntl } from 'react-intl';
 | 
				
			||||||
 | 
					import { removeFromListEditor, addToListEditor } from 'flavours/glitch/actions/lists';
 | 
				
			||||||
 | 
					import Account from '../components/account';
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					const makeMapStateToProps = () => {
 | 
				
			||||||
 | 
					  const getAccount = makeGetAccount();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  const mapStateToProps = (state, { accountId, added }) => ({
 | 
				
			||||||
 | 
					    account: getAccount(state, accountId),
 | 
				
			||||||
 | 
					    added: typeof added === 'undefined' ? state.getIn(['listEditor', 'accounts', 'items']).includes(accountId) : added,
 | 
				
			||||||
 | 
					  });
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  return mapStateToProps;
 | 
				
			||||||
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					const mapDispatchToProps = (dispatch, { accountId }) => ({
 | 
				
			||||||
 | 
					  onRemove: () => dispatch(removeFromListEditor(accountId)),
 | 
				
			||||||
 | 
					  onAdd: () => dispatch(addToListEditor(accountId)),
 | 
				
			||||||
 | 
					});
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					export default injectIntl(connect(makeMapStateToProps, mapDispatchToProps)(Account));
 | 
				
			||||||
@ -0,0 +1,17 @@
 | 
				
			|||||||
 | 
					import React from 'react';
 | 
				
			||||||
 | 
					import { connect } from 'react-redux';
 | 
				
			||||||
 | 
					import { injectIntl } from 'react-intl';
 | 
				
			||||||
 | 
					import { fetchListSuggestions, clearListSuggestions, changeListSuggestions } from '../../../actions/lists';
 | 
				
			||||||
 | 
					import Search from '../components/search';
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					const mapStateToProps = state => ({
 | 
				
			||||||
 | 
					  value: state.getIn(['listEditor', 'suggestions', 'value']),
 | 
				
			||||||
 | 
					});
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					const mapDispatchToProps = dispatch => ({
 | 
				
			||||||
 | 
					  onSubmit: value => dispatch(fetchListSuggestions(value)),
 | 
				
			||||||
 | 
					  onClear: () => dispatch(clearListSuggestions()),
 | 
				
			||||||
 | 
					  onChange: value => dispatch(changeListSuggestions(value)),
 | 
				
			||||||
 | 
					});
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					export default injectIntl(connect(mapStateToProps, mapDispatchToProps)(Search));
 | 
				
			||||||
@ -5,8 +5,8 @@ import { connect } from 'react-redux';
 | 
				
			|||||||
import ImmutablePureComponent from 'react-immutable-pure-component';
 | 
					import ImmutablePureComponent from 'react-immutable-pure-component';
 | 
				
			||||||
import { injectIntl } from 'react-intl';
 | 
					import { injectIntl } from 'react-intl';
 | 
				
			||||||
import { setupListEditor, clearListSuggestions, resetListEditor } from 'flavours/glitch/actions/lists';
 | 
					import { setupListEditor, clearListSuggestions, resetListEditor } from 'flavours/glitch/actions/lists';
 | 
				
			||||||
import Account from './components/account';
 | 
					import AccountContainer from './containers/account_container';
 | 
				
			||||||
import Search from './components/search';
 | 
					import SearchContainer from './containers/search_container';
 | 
				
			||||||
import Motion from 'flavours/glitch/util/optional_motion';
 | 
					import Motion from 'flavours/glitch/util/optional_motion';
 | 
				
			||||||
import spring from 'react-motion/lib/spring';
 | 
					import spring from 'react-motion/lib/spring';
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@ -56,11 +56,11 @@ export default class ListEditor extends ImmutablePureComponent {
 | 
				
			|||||||
      <div className='modal-root__modal list-editor'>
 | 
					      <div className='modal-root__modal list-editor'>
 | 
				
			||||||
        <h4>{title}</h4>
 | 
					        <h4>{title}</h4>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        <Search />
 | 
					        <SearchContainer />
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        <div className='drawer__pager'>
 | 
					        <div className='drawer__pager'>
 | 
				
			||||||
          <div className='drawer__inner list-editor__accounts'>
 | 
					          <div className='drawer__inner list-editor__accounts'>
 | 
				
			||||||
            {accountIds.map(accountId => <Account key={accountId} accountId={accountId} added />)}
 | 
					            {accountIds.map(accountId => <AccountContainer key={accountId} accountId={accountId} added />)}
 | 
				
			||||||
          </div>
 | 
					          </div>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
          {showSearch && <div role='button' tabIndex='-1' className='drawer__backdrop' onClick={onClear} />}
 | 
					          {showSearch && <div role='button' tabIndex='-1' className='drawer__backdrop' onClick={onClear} />}
 | 
				
			||||||
@ -68,7 +68,7 @@ export default class ListEditor extends ImmutablePureComponent {
 | 
				
			|||||||
          <Motion defaultStyle={{ x: -100 }} style={{ x: spring(showSearch ? 0 : -100, { stiffness: 210, damping: 20 }) }}>
 | 
					          <Motion defaultStyle={{ x: -100 }} style={{ x: spring(showSearch ? 0 : -100, { stiffness: 210, damping: 20 }) }}>
 | 
				
			||||||
            {({ x }) =>
 | 
					            {({ x }) =>
 | 
				
			||||||
              (<div className='drawer__inner backdrop' style={{ transform: x === 0 ? null : `translateX(${x}%)`, visibility: x === -100 ? 'hidden' : 'visible' }}>
 | 
					              (<div className='drawer__inner backdrop' style={{ transform: x === 0 ? null : `translateX(${x}%)`, visibility: x === -100 ? 'hidden' : 'visible' }}>
 | 
				
			||||||
                {searchAccountIds.map(accountId => <Account key={accountId} accountId={accountId} />)}
 | 
					                {searchAccountIds.map(accountId => <AccountContainer key={accountId} accountId={accountId} />)}
 | 
				
			||||||
              </div>)
 | 
					              </div>)
 | 
				
			||||||
            }
 | 
					            }
 | 
				
			||||||
          </Motion>
 | 
					          </Motion>
 | 
				
			||||||
 | 
				
			|||||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user