public/js/components/Header/EditHeader.js (165 lines of code) (raw):

import React from 'react'; import {PropTypes} from 'prop-types'; import { Link } from 'react-router'; import { atomPropType } from '../../constants/atomPropType'; import publishState from '../../util/publishState'; import PresenceIndicator from '../Utilities/PresenceIndicator'; import { saveStateVals } from '../../constants/saveStateVals'; import distanceInWords from 'date-fns/distance_in_words'; import DeleteAtom from './DeleteAtom'; import flattenFormErrors from '../../util/flattenFormErrors'; import HoverExpander from '../Utilities/HoverExpander'; import List from '../List/List'; class EditHeader extends React.Component { static propTypes = { atom: atomPropType, presence: PropTypes.bool, saveState: PropTypes.object, formErrors: PropTypes.array, atomActions: PropTypes.shape({ publishAtom: PropTypes.func.isRequired, takeDownAtom: PropTypes.func.isRequired, deleteAtom: PropTypes.func.isRequired, }).isRequired, config: PropTypes.shape({ isEmbedded: PropTypes.bool.isRequired, embeddedMode: PropTypes.string, }), }; publishAtom = () => { this.props.atomActions.publishAtom(this.props.atom); }; takeDownAtom = () => { this.props.atomActions.takeDownAtom(this.props.atom); }; isEditor = () => { return location.pathname.search(new RegExp('/atoms/.*/.*/edit', 'g')) >= 0; }; timeSinceLastModified = () => { if ( this.props.atom.contentChangeDetails.created || this.props.atom.contentChangeDetails.lastModified ) { const dateNow = Date.now(); const lastModified = this.props.atom.contentChangeDetails.lastModified ? this.props.atom.contentChangeDetails.lastModified.date : this.props.atom.contentChangeDetails.created.date; return distanceInWords(dateNow, lastModified, { addSuffix: true }); } return false; }; renderSaveState = () => { if (this.props.saveState.saving === saveStateVals.inprogress) { return <span className="loader save-state__loader">Saving</span>; } return ( <span> <span className="save-state">Saved</span> {this.timeSinceLastModified()} </span> ); }; renderPublishedState = () => { const atomPublishState = publishState(this.props.atom); return ( <span className={`publish-state publish-state--${atomPublishState.id}`}> {atomPublishState.text} </span> ); }; renderTakeDownButton = atomPublishState => { if (atomPublishState.id !== 'draft') { return ( <button type="button" disabled={atomPublishState.id === 'taken-down'} onClick={this.takeDownAtom} className="btn btn--red btn--margin" > Take down </button> ); } return false; }; isPublishingDisabled = () => { const atomPublishState = publishState(this.props.atom); return ( atomPublishState.id === 'published' || this.props.formErrors.length > 0 ); }; renderHeaderRight = () => { const atomPublishState = publishState(this.props.atom); return ( <div className="toolbar__container"> {this.props.presence ? ( <PresenceIndicator presence={this.props.presence} /> ) : ( false )} <HoverExpander proxy={ <button disabled={this.isPublishingDisabled()} type="button" onClick={this.publishAtom} className="btn btn--green btn--margin" > Publish </button> } > <List items={this.props.formErrors.map(({ title, message }) => ({ title, body: message, type: 'error', }))} /> </HoverExpander> {this.renderTakeDownButton(atomPublishState)} <DeleteAtom atom={this.props.atom} deleteAtom={this.props.atomActions.deleteAtom} /> </div> ); }; renderAtomStates = () => { return ( <div className="toolbar__container"> <div className="toolbar__item">{this.renderPublishedState()}</div> <div className="toolbar__item">{this.renderSaveState()}</div> </div> ); }; renderEmbeddedheader = () => { if (this.props.config.embeddedMode === 'edit') { return false; } return ( <Link to="/find" className="toolbar__button"> Back to Atom Search </Link> ); }; render() { if (this.props.config.isEmbedded) { return <div>{this.renderEmbeddedheader()}</div>; } if (this.props.atom) { return ( <div className="toolbar__container toolbar__container--main"> {this.renderAtomStates()} {this.renderHeaderRight()} </div> ); } return false; } } //REDUX CONNECTIONS import { connect } from 'react-redux'; import { bindActionCreators } from 'redux'; import * as publishAtomActions from '../../actions/AtomActions/publishAtom.js'; import * as takeDownAtomActions from '../../actions/AtomActions/takeDownAtom.js'; import * as deleteAtomActions from '../../actions/AtomActions/deleteAtom.js'; function mapStateToProps(state) { return { formErrors: flattenFormErrors(state.formErrors), saveState: state.saveState, config: state.config, presence: state.presence, }; } function mapDispatchToProps(dispatch) { return { atomActions: bindActionCreators( Object.assign( {}, publishAtomActions, takeDownAtomActions, deleteAtomActions ), dispatch ), }; } export default connect( mapStateToProps, mapDispatchToProps )(EditHeader);