import React from 'react'; import { Link } from 'react-router-dom'; import { connect } from 'react-redux'; import moment from 'moment'; import Placeholder from 'components/Placeholder'; import { AppState } from 'store/reducers'; import { Proposal, Revision, RevisionChange, REVISION_CHANGE_TYPES } from 'types'; import { fetchProposalRevisions } from 'modules/proposals/actions'; import { getProposalRevisions, getIsFetchingRevisions, getRevisionsError, } from 'modules/proposals/selectors'; import { Icon } from 'antd'; import './index.less'; interface OwnProps { proposalId: Proposal['proposalId']; } interface StateProps { revisions: ReturnType; isFetchingRevisions: ReturnType; revisionsError: ReturnType; } interface DispatchProps { fetchProposalRevisions: typeof fetchProposalRevisions; } type Props = DispatchProps & OwnProps & StateProps; export class ProposalRevision extends React.Component { componentDidMount() { if (this.props.proposalId) { this.props.fetchProposalRevisions(this.props.proposalId); } } componentWillReceiveProps(nextProps: Props) { if (nextProps.proposalId && nextProps.proposalId !== this.props.proposalId) { this.props.fetchProposalRevisions(nextProps.proposalId); } } render() { const { revisions, isFetchingRevisions, revisionsError } = this.props; let content = null; if (isFetchingRevisions) { content = ; } else if (revisionsError) { content = ; } else if (revisions) { if (revisions.length >= 2) { revisions.reverse(); content = revisions.map((revision, index) => (
{index === revisions.length - 1 ? ( <>

Original Proposal

View archived
) : ( <>

{moment(revision.dateCreated * 1000).format('MMMM Do, YYYY')}

{`Revision ${revision.revisionIndex}`}
{this.renderRevisionBody(revision)}
{index !== 0 && ( View archived )}
)}
)); } else { content = ( ); } } return
{content}
; } renderRevisionBody = (revision: Revision) => { return (
{revision.changes.map((change, index) => (
{this.renderChangeIcon(change)}
{this.renderChangeMsg(change)}
))}
); }; renderChangeIcon = (change: RevisionChange) => { if (change.type === 'MILESTONE_ADD') { return ; } if (change.type === 'MILESTONE_REMOVE') { return ; } return ; }; renderChangeMsg = (change: RevisionChange) => { const msMsg = change.milestoneIndex !== undefined ? `Milestone ${change.milestoneIndex + 1}` : 'Milestone'; switch (change.type) { case REVISION_CHANGE_TYPES.PROPOSAL_EDIT_BRIEF: return 'Proposal brief edited'; case REVISION_CHANGE_TYPES.PROPOSAL_EDIT_CONTENT: return 'Proposal content edited'; case REVISION_CHANGE_TYPES.PROPOSAL_EDIT_TARGET: return 'Proposal target edited'; case REVISION_CHANGE_TYPES.PROPOSAL_EDIT_TITLE: return 'Proposal title edited'; case REVISION_CHANGE_TYPES.MILESTONE_ADD: return `${msMsg} added`; case REVISION_CHANGE_TYPES.MILESTONE_REMOVE: return `${msMsg} removed`; case REVISION_CHANGE_TYPES.MILESTONE_EDIT_AMOUNT: return `${msMsg} amount edited`; case REVISION_CHANGE_TYPES.MILESTONE_EDIT_DAYS: return `${msMsg} estimated days edited`; case REVISION_CHANGE_TYPES.MILESTONE_EDIT_IMMEDIATE_PAYOUT: return `${msMsg} immediate payout edited`; case REVISION_CHANGE_TYPES.MILESTONE_EDIT_PERCENT: return `${msMsg} payout percent edited`; case REVISION_CHANGE_TYPES.MILESTONE_EDIT_CONTENT: return `${msMsg} content edited`; case REVISION_CHANGE_TYPES.MILESTONE_EDIT_TITLE: return `${msMsg} title edited`; default: return ''; } }; } export default connect( (state: AppState, ownProps: OwnProps) => ({ revisions: getProposalRevisions(state, ownProps.proposalId), isFetchingRevisions: getIsFetchingRevisions(state), revisionsError: getRevisionsError(state), }), { fetchProposalRevisions, }, )(ProposalRevision);