diff options
Diffstat (limited to 'app/javascript/flavours/glitch/features/drawer/index.js')
-rw-r--r-- | app/javascript/flavours/glitch/features/drawer/index.js | 137 |
1 files changed, 137 insertions, 0 deletions
diff --git a/app/javascript/flavours/glitch/features/drawer/index.js b/app/javascript/flavours/glitch/features/drawer/index.js new file mode 100644 index 000000000..e6a689575 --- /dev/null +++ b/app/javascript/flavours/glitch/features/drawer/index.js @@ -0,0 +1,137 @@ +// 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 = { + onChange: changeSearch, + onClear: clearSearch, + onClickElefriend: cycleElefriendCompose, + onShow: showSearch, + onSubmit: submitSearch, + onOpenSettings: openModal.bind(null, '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); |