435d3f78d7
Closes tootsuite/mastodon#1349 This is my first PR and I’m only checking in the source JSX file. Please let me know if it should be checked in after being built also.
85 lines
3.5 KiB
JavaScript
85 lines
3.5 KiB
JavaScript
import ComposeFormContainer from './containers/compose_form_container';
|
|
import UploadFormContainer from './containers/upload_form_container';
|
|
import NavigationContainer from './containers/navigation_container';
|
|
import PropTypes from 'prop-types';
|
|
import { connect } from 'react-redux';
|
|
import { mountCompose, unmountCompose } from '../../actions/compose';
|
|
import { Link } from 'react-router';
|
|
import { injectIntl, defineMessages } from 'react-intl';
|
|
import SearchContainer from './containers/search_container';
|
|
import { Motion, spring } from 'react-motion';
|
|
import SearchResultsContainer from './containers/search_results_container';
|
|
|
|
const messages = defineMessages({
|
|
start: { id: 'getting_started.heading', defaultMessage: 'Getting started' },
|
|
public: { id: 'navigation_bar.public_timeline', defaultMessage: 'Federated timeline' },
|
|
community: { id: 'navigation_bar.community_timeline', defaultMessage: 'Local timeline' },
|
|
preferences: { id: 'navigation_bar.preferences', defaultMessage: 'Preferences' },
|
|
logout: { id: 'navigation_bar.logout', defaultMessage: 'Logout' }
|
|
});
|
|
|
|
const mapStateToProps = state => ({
|
|
showSearch: state.getIn(['search', 'submitted']) && !state.getIn(['search', 'hidden'])
|
|
});
|
|
|
|
class Compose extends React.PureComponent {
|
|
|
|
componentDidMount () {
|
|
this.props.dispatch(mountCompose());
|
|
}
|
|
|
|
componentWillUnmount () {
|
|
this.props.dispatch(unmountCompose());
|
|
}
|
|
|
|
render () {
|
|
const { withHeader, showSearch, intl } = this.props;
|
|
|
|
let header = '';
|
|
|
|
if (withHeader) {
|
|
header = (
|
|
<div className='drawer__header'>
|
|
<Link to='/getting-started' className='drawer__tab' title={intl.formatMessage(messages.start)}><i role="img" aria-label={intl.formatMessage(messages.start)} className='fa fa-fw fa-asterisk' /></Link>
|
|
<Link to='/timelines/public/local' className='drawer__tab' title={intl.formatMessage(messages.community)}><i role="img" aria-label={intl.formatMessage(messages.community)} className='fa fa-fw fa-users' /></Link>
|
|
<Link to='/timelines/public' className='drawer__tab' title={intl.formatMessage(messages.public)}><i role="img" aria-label={intl.formatMessage(messages.public)} className='fa fa-fw fa-globe' /></Link>
|
|
<a href='/settings/preferences' className='drawer__tab' title={intl.formatMessage(messages.preferences)}><i role="img" aria-label={intl.formatMessage(messages.preferences)} className='fa fa-fw fa-cog' /></a>
|
|
<a href='/auth/sign_out' className='drawer__tab' data-method='delete' title={intl.formatMessage(messages.logout)}><i role="img" aria-label={intl.formatMessage(messages.logout)} className='fa fa-fw fa-sign-out' /></a>
|
|
</div>
|
|
);
|
|
}
|
|
|
|
return (
|
|
<div className='drawer'>
|
|
{header}
|
|
|
|
<SearchContainer />
|
|
|
|
<div className='drawer__pager'>
|
|
<div className='drawer__inner'>
|
|
<NavigationContainer />
|
|
<ComposeFormContainer />
|
|
</div>
|
|
|
|
<Motion defaultStyle={{ x: -100 }} style={{ x: spring(showSearch ? 0 : -100, { stiffness: 210, damping: 20 }) }}>
|
|
{({ x }) =>
|
|
<div className='drawer__inner darker' style={{ transform: `translateX(${x}%)`, visibility: x === -100 ? 'hidden' : 'visible' }}>
|
|
<SearchResultsContainer />
|
|
</div>
|
|
}
|
|
</Motion>
|
|
</div>
|
|
</div>
|
|
);
|
|
}
|
|
|
|
}
|
|
|
|
Compose.propTypes = {
|
|
dispatch: PropTypes.func.isRequired,
|
|
withHeader: PropTypes.bool,
|
|
showSearch: PropTypes.bool,
|
|
intl: PropTypes.object.isRequired
|
|
};
|
|
|
|
export default connect(mapStateToProps)(injectIntl(Compose));
|