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 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…
	
		Reference in a new issue