import * as React from "react"; import { compose } from "redux"; import { TxHash } from "@joincivil/typescript-types"; import { TwoStepEthTransaction } from "@joincivil/core"; import { ResolveChallengeProposal as ResolveChallengeProposalComponent, ResolveChallengeProposalProps as ResolveChallengeProposalComponentProps, ChallengeResultsProps, ModalContent, } from "@joincivil/components"; import { CivilHelper, CivilHelperContext } from "../../apis/CivilHelper"; import { InjectedTransactionStatusModalProps, hasTransactionStatusModals } from "../utility/TransactionStatusModalsHOC"; export interface ChallegeProposalResolveProps extends ResolveChallengeProposalComponentProps, ChallengeResultsProps { propID: number; parameterDisplayName: string | JSX.Element; parameterCurrentValue: string; parameterNewValue: string; isGovtProposal?: boolean; handleClose(): void; } enum TransactionTypes { RESOLVE_CHALLENGE = "RESOLVE_CHALLENGE", } const transactionLabels = { [TransactionTypes.RESOLVE_CHALLENGE]: "Resolve Challenge", }; const transactionSuccessContent = { [TransactionTypes.RESOLVE_CHALLENGE]: [ "Thanks for resolving this challenge.", Voters can now collect rewards from their votes on this challenge, if they are available. , ], }; const transactionRejectionContent = { [TransactionTypes.RESOLVE_CHALLENGE]: [ "The challenge was not resolved", "To resolve the challenge, you need to confirm the transaction in your MetaMask wallet.", ], }; const transactionErrorContent = { [TransactionTypes.RESOLVE_CHALLENGE]: [ "The was an problem with resolving this challenge", Please retry your transaction, ], }; const transactionStatusModalConfig = { transactionLabels, transactionSuccessContent, transactionRejectionContent, transactionErrorContent, }; class ChallengeProposalResolve extends React.Component< ChallegeProposalResolveProps & InjectedTransactionStatusModalProps > { public static contextType = CivilHelperContext; public context: CivilHelper; public componentWillMount(): void { this.props.setTransactions(this.getTransactions()); this.props.setHandleTransactionSuccessButtonClick(this.props.handleClose); } public render(): JSX.Element { const createProposalProps = { ...this.props, transactions: this.getTransactions(), postExecuteTransactions: this.onChallengeProposalResolveSuccess, }; return ; } private getTransactions = (): any[] => { return [ { transaction: async () => { this.props.updateTransactionStatusModalsState({ isWaitingTransactionModalOpen: true, isTransactionProgressModalOpen: false, isTransactionSuccessModalOpen: false, isTransactionErrorModalOpen: false, isTransactionRejectionModalOpen: false, transactionType: TransactionTypes.RESOLVE_CHALLENGE, }); return this.resolveChallenge(); }, handleTransactionHash: (txHash: TxHash) => { this.props.updateTransactionStatusModalsState({ isWaitingTransactionModalOpen: false, isTransactionProgressModalOpen: true, }); }, handleTransactionError: this.props.handleTransactionError, }, ]; }; private onChallengeProposalResolveSuccess = (): void => { this.props.updateTransactionStatusModalsState({ isWaitingTransactionModalOpen: false, isTransactionProgressModalOpen: false, isTransactionSuccessModalOpen: true, }); this.props.handleClose(); }; private resolveChallenge = async (): Promise | void> => { if (this.props.isGovtProposal) { return this.context.updateGovernmentProposal(this.props.propID.toString()); } else { return this.context.resolveReparameterizationChallenge(this.props.propID!.toString()); } }; } export default compose>( hasTransactionStatusModals(transactionStatusModalConfig), )(ChallengeProposalResolve);