import React from 'react'; import { connect } from 'react-redux'; import { Timeline } from 'antd'; import { getCreateErrors, KeyOfForm, FIELD_NAME_MAP } from 'modules/create/utils'; import Markdown from 'components/Markdown'; import UserAvatar from 'components/UserAvatar'; import { AppState } from 'store/reducers'; import { CREATE_STEP } from './index'; import { ProposalDraft } from 'types'; import { formatUsd } from 'utils/formatters'; import './Review.less'; interface OwnProps { setStep(step: CREATE_STEP): void; } interface StateProps { form: ProposalDraft; } type Props = OwnProps & StateProps; interface Field { key: KeyOfForm; content: React.ReactNode; error: string | Falsy; isHide?: boolean; } interface Section { step: CREATE_STEP; name: string; fields: Field[]; } class CreateReview extends React.Component { render() { const { form } = this.props; const errors = getCreateErrors(this.props.form); const sections: Section[] = [ { step: CREATE_STEP.BASICS, name: 'Basics', fields: [ { key: 'title', content:

{form.title}

, error: errors.title, }, { key: 'rfpOptIn', content:
{form.rfpOptIn ? 'Accepted' : 'Declined'}
, error: errors.rfpOptIn, }, { key: 'brief', content: form.brief, error: errors.brief, }, { key: 'target', content:
{formatUsd(form.target)}
, error: errors.target, }, ], }, { step: CREATE_STEP.TEAM, name: 'Team', fields: [ { key: 'team', content: , error: errors.team && errors.team.join(' '), }, ], }, { step: CREATE_STEP.DETAILS, name: 'Details', fields: [ { key: 'content', content: , error: errors.content, }, ], }, { step: CREATE_STEP.MILESTONES, name: 'Milestones', fields: [ { key: 'milestones', content: , error: errors.milestones && errors.milestones.join(' '), }, ], }, { step: CREATE_STEP.PAYMENT, name: 'Payment', fields: [ { key: 'payoutAddress', content: {form.payoutAddress}, error: errors.payoutAddress, }, ], }, { step: CREATE_STEP.PAYMENT, name: 'Tipping', fields: [ { key: 'tipJarAddress', content: {form.tipJarAddress}, error: errors.tipJarAddress, }, ], }, ]; return (
{sections.map((s, i) => (
{s.fields.map( f => !f.isHide && (
{FIELD_NAME_MAP[f.key]} {f.error && (
{f.error}
)}
{this.isEmpty(form[f.key]) ? (
N/A
) : ( f.content )}
), )}
))}
); } private setStep = (step: CREATE_STEP) => { this.props.setStep(step); }; private isEmpty(value: any) { if (typeof value === 'boolean') { return false; // defined booleans are never empty } return !value || value.length === 0; } } export default connect(state => ({ form: state.create.form as ProposalDraft, }))(CreateReview); const ReviewMilestones = ({ milestones, }: { milestones: ProposalDraft['milestones']; }) => ( {milestones.map(m => (
{m.title || No title}
{m.immediatePayout || !m.daysEstimated ? '0' : m.daysEstimated} days {' – '} {m.payoutPercent || '0'}% of funds
{m.content || No description}
))}
); const ReviewTeam: React.SFC<{ team: ProposalDraft['team']; invites: ProposalDraft['invites']; }> = ({ team, invites }) => { const pendingInvites = invites.filter(inv => inv.accepted === null).length; return (
{team.map((u, idx) => (
{u.displayName}
{u.title}
))} {!!pendingInvites && (
+ {pendingInvites} invite(s) pending
)}
); };