Split list editor into components and containers
This commit is contained in:
		
							parent
							
								
									d69f045681
								
							
						
					
					
						commit
						9fbaaefe59
					
				
					 5 changed files with 48 additions and 42 deletions
				
			
		|  | @ -1,38 +1,17 @@ | |||
| import React from 'react'; | ||||
| import PropTypes from 'prop-types'; | ||||
| import { connect } from 'react-redux'; | ||||
| import { makeGetAccount } from 'flavours/glitch/selectors'; | ||||
| import ImmutablePureComponent from 'react-immutable-pure-component'; | ||||
| import ImmutablePropTypes from 'react-immutable-proptypes'; | ||||
| import Avatar from 'flavours/glitch/components/avatar'; | ||||
| import DisplayName from 'flavours/glitch/components/display_name'; | ||||
| import IconButton from 'flavours/glitch/components/icon_button'; | ||||
| import { defineMessages, injectIntl } from 'react-intl'; | ||||
| import { removeFromListEditor, addToListEditor } from 'flavours/glitch/actions/lists'; | ||||
| import { defineMessages } from 'react-intl'; | ||||
| 
 | ||||
| const messages = defineMessages({ | ||||
|   remove: { id: 'lists.account.remove', defaultMessage: 'Remove from 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 { | ||||
| 
 | ||||
|   static propTypes = { | ||||
|  |  | |||
|  | @ -1,26 +1,12 @@ | |||
| import React from 'react'; | ||||
| import PropTypes from 'prop-types'; | ||||
| import { connect } from 'react-redux'; | ||||
| import { defineMessages, injectIntl } from 'react-intl'; | ||||
| import { fetchListSuggestions, clearListSuggestions, changeListSuggestions } from '../../../actions/lists'; | ||||
| import { defineMessages } from 'react-intl'; | ||||
| import classNames from 'classnames'; | ||||
| 
 | ||||
| const messages = defineMessages({ | ||||
|   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 { | ||||
| 
 | ||||
|   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 { injectIntl } from 'react-intl'; | ||||
| import { setupListEditor, clearListSuggestions, resetListEditor } from 'flavours/glitch/actions/lists'; | ||||
| import Account from './components/account'; | ||||
| import Search from './components/search'; | ||||
| import AccountContainer from './containers/account_container'; | ||||
| import SearchContainer from './containers/search_container'; | ||||
| import Motion from 'flavours/glitch/util/optional_motion'; | ||||
| import spring from 'react-motion/lib/spring'; | ||||
| 
 | ||||
|  | @ -56,11 +56,11 @@ export default class ListEditor extends ImmutablePureComponent { | |||
|       <div className='modal-root__modal list-editor'> | ||||
|         <h4>{title}</h4> | ||||
| 
 | ||||
|         <Search /> | ||||
|         <SearchContainer /> | ||||
| 
 | ||||
|         <div className='drawer__pager'> | ||||
|           <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> | ||||
| 
 | ||||
|           {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 }) }}> | ||||
|             {({ x }) => | ||||
|               (<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>) | ||||
|             } | ||||
|           </Motion> | ||||
|  |  | |||
		Loading…
	
		Reference in a new issue