zcash-grant-system/frontend/client/components/Proposals/ProposalCard/index.tsx

146 lines
4.1 KiB
TypeScript

import React, { CSSProperties } from 'react';
import { Redirect } from 'react-router-dom';
import classnames from 'classnames';
import { Progress, Tag } from 'antd';
import { Proposal, STATUS } from 'types';
import Card from 'components/Card';
import UserAvatar from 'components/UserAvatar';
import UnitDisplay from 'components/UnitDisplay';
import { formatUsd } from 'utils/formatters';
import './style.less';
export class ProposalCard extends React.Component<Proposal> {
state = { redirect: '' };
render() {
if (this.state.redirect) {
return <Redirect push to={this.state.redirect} />;
}
const {
title,
proposalAddress,
proposalUrlId,
datePublished,
dateCreated,
team,
target,
contributionMatching,
isVersionTwo,
funded,
percentFunded,
acceptedWithFunding,
status,
fundedByZomg,
} = this.props;
// pulled from `variables.less`
const infoColor = '#1890ff';
const secondaryColor = '#2D2A26';
let tagColor = '';
let tagMessage = '';
if (isVersionTwo && status === STATUS.DISCUSSION) {
tagColor = infoColor;
tagMessage = 'Open for Public Review';
}
if (isVersionTwo && status === STATUS.LIVE) {
if (acceptedWithFunding) {
tagColor = secondaryColor;
if (!fundedByZomg) {
tagMessage = 'Funded by ZF';
} else {
tagMessage = 'Funded by ZOMG';
}
} else {
tagColor = infoColor;
tagMessage = 'Not Funded';
}
}
const tagStyle: CSSProperties = {
marginRight: 0,
lineHeight: '1.25rem',
height: '1.35rem',
fontSize: '0.75rem',
...(!tagMessage ? { opacity: 0 } : {}),
};
const cardTitle = (
<div className="ProposalCard-title">
<div>{title}</div>
<div className="ProposalCard-team-avatars">
{[...team].reverse().map((u, idx) => (
<UserAvatar
key={idx}
className={`ProposalCard-team-avatars-avatar${isVersionTwo ? '' : '-v1'}`}
user={u}
/>
))}
</div>
</div>
);
return (
<Card className="ProposalCard" to={`/proposals/${proposalUrlId}`} title={cardTitle}>
{contributionMatching > 0 && (
<div className="ProposalCard-ribbon">
<span>
x2
<small>matching</small>
</span>
</div>
)}
{isVersionTwo && (
<div className="ProposalCard-funding">
<div className="ProposalCard-funding-raised">
{formatUsd(target.toString(10))}
</div>
</div>
)}
{!isVersionTwo && (
<>
<div className="ProposalCard-funding-v1">
<div className="ProposalCard-funding-v1-raised">
<UnitDisplay value={funded} symbol="ZEC" /> <small>raised</small> of{' '}
<UnitDisplay value={target} symbol="ZEC" /> goal
</div>
<div
className={classnames({
['ProposalCard-funding-percent']: true,
['is-funded']: percentFunded >= 100,
})}
>
{percentFunded}%
</div>
</div>
<Progress
percent={percentFunded}
status={percentFunded >= 100 ? 'success' : 'active'}
showInfo={false}
/>
</>
)}
<div className="ProposalCard-team">
<div className={`ProposalCard-team-name${isVersionTwo ? '' : '-v1'}`}>
{team[0].displayName}{' '}
{team.length > 1 && <small>+{team.length - 1} other</small>}
</div>
{isVersionTwo && (
<Tag color={tagColor} style={tagStyle}>
{tagMessage}
</Tag>
)}
</div>
<div className="ProposalCard-address">{proposalAddress}</div>
<Card.Info proposal={this.props} time={(datePublished || dateCreated) * 1000} />
</Card>
);
}
}
export default ProposalCard;