2018-09-15 23:46:40 -07:00
|
|
|
import React from 'react';
|
2019-01-09 12:48:41 -08:00
|
|
|
import { connect } from 'react-redux';
|
|
|
|
import UserRow from 'components/UserRow';
|
2018-09-17 08:55:20 -07:00
|
|
|
import Placeholder from 'components/Placeholder';
|
|
|
|
import UnitDisplay from 'components/UnitDisplay';
|
2019-01-09 12:48:41 -08:00
|
|
|
import { toZat } from 'utils/units';
|
|
|
|
import { fetchProposalContributions } from 'modules/proposals/actions';
|
|
|
|
import {
|
|
|
|
getProposalContributions,
|
|
|
|
getIsFetchingContributions,
|
|
|
|
getFetchContributionsError,
|
|
|
|
} from 'modules/proposals/selectors';
|
|
|
|
import { ContributionWithUser } from 'types';
|
|
|
|
import { AppState } from 'store/reducers';
|
|
|
|
import './index.less';
|
2018-09-15 23:46:40 -07:00
|
|
|
|
2019-01-09 12:48:41 -08:00
|
|
|
interface OwnProps {
|
|
|
|
proposalId: number;
|
|
|
|
}
|
|
|
|
|
|
|
|
interface StateProps {
|
|
|
|
contributions: ReturnType<typeof getProposalContributions>;
|
|
|
|
isFetchingContributions: ReturnType<typeof getIsFetchingContributions>;
|
|
|
|
fetchContributionsError: ReturnType<typeof getFetchContributionsError>;
|
|
|
|
}
|
|
|
|
|
|
|
|
interface DispatchProps {
|
|
|
|
fetchProposalContributions: typeof fetchProposalContributions;
|
|
|
|
}
|
|
|
|
|
|
|
|
type Props = OwnProps & StateProps & DispatchProps;
|
|
|
|
|
|
|
|
class ProposalContributors extends React.Component<Props> {
|
|
|
|
componentDidMount() {
|
|
|
|
if (this.props.proposalId) {
|
|
|
|
this.props.fetchProposalContributions(this.props.proposalId);
|
2018-09-16 12:59:32 -07:00
|
|
|
}
|
2018-09-15 23:46:40 -07:00
|
|
|
}
|
|
|
|
|
2019-01-09 12:48:41 -08:00
|
|
|
componentWillReceiveProps(nextProps: Props) {
|
|
|
|
if (nextProps.proposalId && nextProps.proposalId !== this.props.proposalId) {
|
|
|
|
this.props.fetchProposalContributions(nextProps.proposalId);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
render() {
|
|
|
|
const { contributions, fetchContributionsError } = this.props;
|
|
|
|
|
|
|
|
let content;
|
|
|
|
if (contributions) {
|
|
|
|
if (contributions.top.length && contributions.latest.length) {
|
|
|
|
const makeContributionRow = (c: ContributionWithUser) => (
|
|
|
|
<div className="ProposalContributors-block-contributor" key={c.id}>
|
|
|
|
<UserRow
|
|
|
|
user={c.user}
|
2019-03-14 20:26:28 -07:00
|
|
|
extra={
|
|
|
|
<>
|
|
|
|
+<UnitDisplay value={toZat(c.amount)} symbol="ZEC" />
|
|
|
|
</>
|
|
|
|
}
|
2019-01-09 12:48:41 -08:00
|
|
|
/>
|
|
|
|
</div>
|
2019-03-14 20:26:28 -07:00
|
|
|
);
|
|
|
|
content = (
|
|
|
|
<>
|
|
|
|
<div className="ProposalContributors-block">
|
|
|
|
<h3 className="ProposalContributors-block-title">Latest contributors</h3>
|
|
|
|
{contributions.latest.map(makeContributionRow)}
|
|
|
|
</div>
|
|
|
|
<div className="ProposalContributors-block">
|
|
|
|
<h3 className="ProposalContributors-block-title">Top contributors</h3>
|
|
|
|
{contributions.top.map(makeContributionRow)}
|
|
|
|
</div>
|
|
|
|
</>
|
|
|
|
);
|
2019-01-09 12:48:41 -08:00
|
|
|
} else {
|
|
|
|
content = (
|
|
|
|
<Placeholder
|
|
|
|
style={{ minHeight: '220px' }}
|
|
|
|
title="No contributors found"
|
|
|
|
subtitle={`
|
|
|
|
No contributions have been made to this proposal.
|
|
|
|
Check back later once there's been at least one contribution.
|
|
|
|
`}
|
|
|
|
/>
|
|
|
|
);
|
|
|
|
}
|
|
|
|
} else if (fetchContributionsError) {
|
2019-03-14 20:26:28 -07:00
|
|
|
content = (
|
|
|
|
<Placeholder title="Something went wrong" subtitle={fetchContributionsError} />
|
|
|
|
);
|
2019-01-09 12:48:41 -08:00
|
|
|
} else {
|
2019-03-14 20:26:28 -07:00
|
|
|
content = <Placeholder loading={true} />;
|
2019-01-09 12:48:41 -08:00
|
|
|
}
|
|
|
|
|
2019-03-14 20:26:28 -07:00
|
|
|
return <div className="ProposalContributors">{content}</div>;
|
2019-01-09 12:48:41 -08:00
|
|
|
}
|
2019-03-14 20:26:28 -07:00
|
|
|
}
|
2018-09-15 23:46:40 -07:00
|
|
|
|
2019-01-09 12:48:41 -08:00
|
|
|
export default connect(
|
|
|
|
(state: AppState, ownProps: OwnProps) => ({
|
|
|
|
contributions: getProposalContributions(state, ownProps.proposalId),
|
|
|
|
isFetchingContributions: getIsFetchingContributions(state),
|
|
|
|
fetchContributionsError: getFetchContributionsError(state),
|
|
|
|
}),
|
|
|
|
{
|
|
|
|
fetchProposalContributions,
|
|
|
|
},
|
|
|
|
)(ProposalContributors);
|