import * as React from "react";
import { compose } from "redux";
import { BigNumber, TxHash } from "@joincivil/typescript-types";
import { TwoStepEthTransaction } from "@joincivil/core";
import {
CreateProposal as CreateProposalComponent,
CreateProposalProps as CreateProposalComponentProps,
ModalContent,
ModalUnorderedList,
ModalListItem,
} from "@joincivil/components";
import { CivilHelper, CivilHelperContext } from "../../apis/CivilHelper";
import { InjectedTransactionStatusModalProps, hasTransactionStatusModals } from "../utility/TransactionStatusModalsHOC";
import { amountParams } from "./constants";
export interface CreateProposalProps extends CreateProposalComponentProps {
createProposalParameterName: string;
}
enum TransactionTypes {
APPROVE_FOR_REPARAMETERIZATION = "APPROVE_FOR_REPARAMETERIZATION",
PROPOSE_REPARAMETERIZATION = "PROPOSE_REPARAMETERIZATION",
}
const transactionLabels = {
[TransactionTypes.APPROVE_FOR_REPARAMETERIZATION]: "Approve For New Parameterizer Proposal",
[TransactionTypes.PROPOSE_REPARAMETERIZATION]: "Propose New Parameter Value",
};
const multiStepTransactionLabels = {
[TransactionTypes.APPROVE_FOR_REPARAMETERIZATION]: "1 of 2",
[TransactionTypes.PROPOSE_REPARAMETERIZATION]: "2 of 2",
};
const transactionSuccessContent = {
[TransactionTypes.APPROVE_FOR_REPARAMETERIZATION]: [undefined, undefined],
[TransactionTypes.PROPOSE_REPARAMETERIZATION]: [
"Your proposal was submitted!",
<>
>,
],
};
const transactionRejectionContent = {
[TransactionTypes.APPROVE_FOR_REPARAMETERIZATION]: [
"There was a problem with your proposal",
"Before propossing a new value, you need to confirm the approval of your proposal token deposit in your MetaMask wallet.",
],
[TransactionTypes.PROPOSE_REPARAMETERIZATION]: [
"Your proposal was not submitted",
"To submit a proposal, you need to confirm the transaction in your MetaMask wallet.",
],
};
const transactionErrorContent = {
[TransactionTypes.APPROVE_FOR_REPARAMETERIZATION]: [
"There was a problem with your proposal",
<>
Please check the following and retry your transaction
You have sufficient CVL in your account for the Parameter Proposal Deposit
>,
],
[TransactionTypes.PROPOSE_REPARAMETERIZATION]: [
"The was an problem with submitting your proposal",
<>
Please retry your transaction
>,
],
};
const transactionStatusModalConfig = {
transactionLabels,
multiStepTransactionLabels,
transactionSuccessContent,
transactionRejectionContent,
transactionErrorContent,
};
class CreateProposal extends React.Component {
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.onProposeReparameterizationSuccess,
};
return ;
}
private getTransactions = (): any[] => {
return [
{
transaction: async () => {
this.props.updateTransactionStatusModalsState({
isWaitingTransactionModalOpen: true,
isTransactionProgressModalOpen: false,
isTransactionSuccessModalOpen: false,
isTransactionErrorModalOpen: false,
isTransactionRejectionModalOpen: false,
transactionType: TransactionTypes.APPROVE_FOR_REPARAMETERIZATION,
});
return this.context.approveForProposeReparameterization();
},
handleTransactionHash: (txHash: TxHash) => {
this.props.updateTransactionStatusModalsState({
isWaitingTransactionModalOpen: false,
isTransactionProgressModalOpen: true,
});
},
handleTransactionError: this.props.handleTransactionError,
},
{
transaction: async () => {
this.props.updateTransactionStatusModalsState({
isWaitingTransactionModalOpen: true,
isTransactionProgressModalOpen: false,
isTransactionSuccessModalOpen: false,
transactionType: TransactionTypes.PROPOSE_REPARAMETERIZATION,
});
return this.proposeReparameterization();
},
handleTransactionHash: (txHash: TxHash) => {
this.props.updateTransactionStatusModalsState({
isWaitingTransactionModalOpen: true,
isTransactionProgressModalOpen: false,
});
},
handleTransactionError: this.props.handleTransactionError,
},
];
};
private onProposeReparameterizationSuccess = (): void => {
this.props.updateTransactionStatusModalsState({
isWaitingTransactionModalOpen: false,
isTransactionProgressModalOpen: false,
isTransactionSuccessModalOpen: true,
});
this.props.handleClose();
};
private proposeReparameterization = async (): Promise | void> => {
let newValue: BigNumber = new BigNumber(this.props.parameterProposalValue!);
if (amountParams.includes(this.props.createProposalParameterName!)) {
newValue = newValue.mul(1e18);
}
return this.context.proposeReparameterization(this.props.createProposalParameterName!, newValue);
};
}
export default compose>(
hasTransactionStatusModals(transactionStatusModalConfig),
)(CreateProposal);