152 lines
		
	
	
		
			3.6 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
			
		
		
	
	
			152 lines
		
	
	
		
			3.6 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
| //  Package imports.
 | |
| import PropTypes from 'prop-types';
 | |
| import React from 'react';
 | |
| import ImmutablePropTypes from 'react-immutable-proptypes';
 | |
| import classNames from 'classnames';
 | |
| 
 | |
| //  Actions.
 | |
| import { openModal } from 'flavours/glitch/actions/modal';
 | |
| import {
 | |
|   changeSearch,
 | |
|   clearSearch,
 | |
|   showSearch,
 | |
|   submitSearch,
 | |
| } from 'flavours/glitch/actions/search';
 | |
| import { cycleElefriendCompose } from 'flavours/glitch/actions/compose';
 | |
| 
 | |
| //  Components.
 | |
| import Composer from 'flavours/glitch/features/composer';
 | |
| import DrawerAccount from './account';
 | |
| import DrawerHeader from './header';
 | |
| import DrawerResults from './results';
 | |
| import DrawerSearch from './search';
 | |
| 
 | |
| //  Utils.
 | |
| import { me } from 'flavours/glitch/util/initial_state';
 | |
| import { wrap } from 'flavours/glitch/util/redux_helpers';
 | |
| 
 | |
| //  State mapping.
 | |
| const mapStateToProps = state => ({
 | |
|   account: state.getIn(['accounts', me]),
 | |
|   columns: state.getIn(['settings', 'columns']),
 | |
|   elefriend: state.getIn(['compose', 'elefriend']),
 | |
|   results: state.getIn(['search', 'results']),
 | |
|   searchHidden: state.getIn(['search', 'hidden']),
 | |
|   searchValue: state.getIn(['search', 'value']),
 | |
|   submitted: state.getIn(['search', 'submitted']),
 | |
| });
 | |
| 
 | |
| //  Dispatch mapping.
 | |
| const mapDispatchToProps = (dispatch, { intl }) => ({
 | |
|   onChange (value) {
 | |
|     dispatch(changeSearch(value));
 | |
|   },
 | |
|   onClear () {
 | |
|     dispatch(clearSearch());
 | |
|   },
 | |
|   onClickElefriend () {
 | |
|     dispatch(cycleElefriendCompose());
 | |
|   },
 | |
|   onShow () {
 | |
|     dispatch(showSearch());
 | |
|   },
 | |
|   onSubmit () {
 | |
|     dispatch(submitSearch());
 | |
|   },
 | |
|   onOpenSettings (e) {
 | |
|     e.preventDefault();
 | |
|     e.stopPropagation();
 | |
|     dispatch(openModal('SETTINGS', {}));
 | |
|   },
 | |
| });
 | |
| 
 | |
| //  The component.
 | |
| class Drawer extends React.Component {
 | |
| 
 | |
|   //  Constructor.
 | |
|   constructor (props) {
 | |
|     super(props);
 | |
|   }
 | |
| 
 | |
|   //  Rendering.
 | |
|   render () {
 | |
|     const {
 | |
|       account,
 | |
|       columns,
 | |
|       elefriend,
 | |
|       intl,
 | |
|       multiColumn,
 | |
|       onChange,
 | |
|       onClear,
 | |
|       onClickElefriend,
 | |
|       onOpenSettings,
 | |
|       onShow,
 | |
|       onSubmit,
 | |
|       results,
 | |
|       searchHidden,
 | |
|       searchValue,
 | |
|       submitted,
 | |
|     } = this.props;
 | |
|     const computedClass = classNames('drawer', `mbstobon-${elefriend}`);
 | |
| 
 | |
|     //  The result.
 | |
|     return (
 | |
|       <div className={computedClass}>
 | |
|         {multiColumn ? (
 | |
|           <DrawerHeader
 | |
|             columns={columns}
 | |
|             intl={intl}
 | |
|             onSettingsClick={onOpenSettings}
 | |
|           />
 | |
|         ) : null}
 | |
|         <DrawerSearch
 | |
|           intl={intl}
 | |
|           onChange={onChange}
 | |
|           onClear={onClear}
 | |
|           onShow={onShow}
 | |
|           onSubmit={onSubmit}
 | |
|           submitted={submitted}
 | |
|           value={searchValue}
 | |
|         />
 | |
|         <div className='contents'>
 | |
|           <DrawerAccount account={account} />
 | |
|           <Composer />
 | |
|           {multiColumn && <button className='mastodon' onClick={onClickElefriend} />}
 | |
|           <DrawerResults
 | |
|             results={results}
 | |
|             visible={submitted && !searchHidden}
 | |
|           />
 | |
|         </div>
 | |
|       </div>
 | |
|     );
 | |
|   }
 | |
| 
 | |
| }
 | |
| 
 | |
| //  Props.
 | |
| Drawer.propTypes = {
 | |
|   intl: PropTypes.object.isRequired,
 | |
|   multiColumn: PropTypes.bool,
 | |
| 
 | |
|   //  State props.
 | |
|   account: ImmutablePropTypes.map,
 | |
|   columns: ImmutablePropTypes.list,
 | |
|   results: ImmutablePropTypes.map,
 | |
|   elefriend: PropTypes.number,
 | |
|   searchHidden: PropTypes.bool,
 | |
|   searchValue: PropTypes.string,
 | |
|   submitted: PropTypes.bool,
 | |
| 
 | |
|   //  Dispatch props.
 | |
|   onChange: PropTypes.func,
 | |
|   onClear: PropTypes.func,
 | |
|   onClickElefriend: PropTypes.func,
 | |
|   onShow: PropTypes.func,
 | |
|   onSubmit: PropTypes.func,
 | |
|   onOpenSettings: PropTypes.func,
 | |
| };
 | |
| 
 | |
| //  Connecting and export.
 | |
| export { Drawer as WrappedComponent };
 | |
| export default wrap(Drawer, mapStateToProps, mapDispatchToProps, true);
 |