import React from 'react'; import { compose } from 'recompose'; import { connect } from 'react-redux'; import Markdown from 'components/Markdown'; import { proposalActions } from 'modules/proposals'; import { bindActionCreators, Dispatch } from 'redux'; import { AppState } from 'store/reducers'; import { ProposalWithCrowdFund } from 'types'; import { getProposal } from 'modules/proposals/selectors'; import { Spin, Tabs, Icon, Dropdown, Menu, Button } from 'antd'; import CampaignBlock from './CampaignBlock'; import TeamBlock from './TeamBlock'; import Milestones from './Milestones'; import CommentsTab from './Comments'; import UpdatesTab from './Updates'; import GovernanceTab from './Governance'; import ContributorsTab from './Contributors'; // import CommunityTab from './Community'; import UpdateModal from './UpdateModal'; import CancelModal from './CancelModal'; import './style.less'; import classnames from 'classnames'; import { withRouter } from 'react-router'; import Web3Container from 'lib/Web3Container'; import { web3Actions } from 'modules/web3'; import SocialShare from 'components/SocialShare'; interface OwnProps { proposalId: string; isPreview?: boolean; } interface StateProps { proposal: ProposalWithCrowdFund | null; } interface DispatchProps { fetchProposal: proposalActions.TFetchProposal; } interface Web3Props { account: string; } type Props = StateProps & DispatchProps & Web3Props & OwnProps; interface State { isBodyExpanded: boolean; isBodyOverflowing: boolean; isUpdateOpen: boolean; isCancelOpen: boolean; bodyId: string; } export class ProposalDetail extends React.Component { state: State = { isBodyExpanded: false, isBodyOverflowing: false, isUpdateOpen: false, isCancelOpen: false, bodyId: `body-${Math.floor(Math.random() * 1000000)}`, }; componentDidMount() { if (!this.props.proposal) { this.props.fetchProposal(this.props.proposalId); } else { this.checkBodyOverflow(); } window.addEventListener('resize', this.checkBodyOverflow); } componentWillUnmount() { window.removeEventListener('resize', this.checkBodyOverflow); } componentDidUpdate() { if (this.props.proposal) { this.checkBodyOverflow(); } } render() { const { proposal, isPreview, account } = this.props; const { isBodyExpanded, isBodyOverflowing, isCancelOpen, isUpdateOpen, bodyId } = this.state; const showExpand = !isBodyExpanded && isBodyOverflowing; if (!proposal) { return ; } else { const { crowdFund } = proposal; const isTrustee = crowdFund.trustees.includes(account); const isContributor = !!crowdFund.contributors.find(c => c.address === account); const hasBeenFunded = crowdFund.isRaiseGoalReached; const isProposalActive = !hasBeenFunded && crowdFund.deadline > Date.now(); const canRefund = (hasBeenFunded || isProposalActive) && !crowdFund.isFrozen; const adminMenu = isTrustee && ( Post an Update alert('Sorry, not yet implemented!')} disabled={!isProposalActive} > Edit proposal {hasBeenFunded ? 'Refund contributors' : 'Cancel proposal'} ); return (

{proposal ? proposal.title :  }

{proposal ? : }
{showExpand && ( )}
{isTrustee && (
)}
{proposal && (
{isContributor && ( )}
)} {isTrustee && ( <> )}
); } } private expandBody = () => { this.setState({ isBodyExpanded: true }); }; private checkBodyOverflow = () => { const { isBodyExpanded, bodyId, isBodyOverflowing } = this.state; if (isBodyExpanded) { return; } // Use id instead of ref because styled component ref doesn't return html element const bodyEl = document.getElementById(bodyId); if (!bodyEl) { return; } if (isBodyOverflowing && bodyEl.scrollHeight <= bodyEl.clientHeight) { this.setState({ isBodyOverflowing: false }); } else if (!isBodyOverflowing && bodyEl.scrollHeight > bodyEl.clientHeight) { this.setState({ isBodyOverflowing: true }); } }; private openUpdateModal = () => this.setState({ isUpdateOpen: true }); private closeUpdateModal = () => this.setState({ isUpdateOpen: false }); private openCancelModal = () => this.setState({ isCancelOpen: true }); private closeCancelModal = () => this.setState({ isCancelOpen: false }); } function mapStateToProps(state: AppState, ownProps: OwnProps) { return { proposal: getProposal(state, ownProps.proposalId), }; } function mapDispatchToProps(dispatch: Dispatch) { return bindActionCreators({ ...proposalActions, ...web3Actions }, dispatch); } const withConnect = connect( mapStateToProps, mapDispatchToProps, ); const ConnectedProposal = compose( withRouter, withConnect, )(ProposalDetail); export default (props: OwnProps) => ( (
)} render={({ accounts }) => } /> );