import * as React from "react";
import { compose } from "redux";
import { TxHash } from "@joincivil/typescript-types";
import { TwoStepEthTransaction } from "@joincivil/core";
import { getFormattedTokenBalance, urlConstants as links } from "@joincivil/utils";
import {
AppealAwaitingDecisionCard as AppealAwaitingDecisionCardComponent,
AppealAwaitingDecisionCardProps,
ModalContent,
} from "@joincivil/components";
import { CivilHelper, CivilHelperContext } from "../../apis/CivilHelper";
import {
ChallengeContainerProps,
connectChallengePhase,
connectChallengeResults,
} from "../utility/HigherOrderComponents";
import { InjectedTransactionStatusModalProps, hasTransactionStatusModals } from "../utility/TransactionStatusModalsHOC";
import { AppealDetailProps } from "./AppealDetail";
enum TransactionTypes {
GRANT_APPEAL = "GRANT_APPEAL",
CONFIRM_APPEAL = "CONFIRM_APPEAL",
}
const transactionLabels = {
[TransactionTypes.GRANT_APPEAL]: "Grant Appeal",
[TransactionTypes.CONFIRM_APPEAL]: "Confirm Appeal",
};
const denialSuffix = ", you need to confirm the transaction in your MetaMask wallet.";
const transactionRejectionContent = {
[TransactionTypes.GRANT_APPEAL]: ["The appeal was not granted", `To grant the appeal${denialSuffix}`],
[TransactionTypes.CONFIRM_APPEAL]: ["The appeal was not confirmed", `To confirm the appeal${denialSuffix}`],
};
const transactionErrorContent = {
[TransactionTypes.GRANT_APPEAL]: [
"There was a problem granting the appeal",
Please retry your transaction,
],
[TransactionTypes.CONFIRM_APPEAL]: [
"There was a problem confirming the appeal",
Please retry your transaction,
],
};
const transactionSuccessContent = {
[TransactionTypes.GRANT_APPEAL]: ["The grant appeal transaction has been sent to the council multisig", undefined],
[TransactionTypes.CONFIRM_APPEAL]: [
"The grant appeal transaction was confirmed. If enough council members have confirmed, it will execute and grant the appeal.",
undefined,
],
};
const transactionStatusModalConfig = {
transactionLabels,
transactionSuccessContent,
transactionRejectionContent,
transactionErrorContent,
};
const AppealAwaitingDecisionCard = compose<
React.ComponentClass>
>(
connectChallengePhase,
connectChallengeResults,
)(AppealAwaitingDecisionCardComponent);
interface AwaitingAppealDecisionState {
uriValue: string;
}
class AwaitingAppealDecision extends React.Component<
AppealDetailProps & InjectedTransactionStatusModalProps,
AwaitingAppealDecisionState
> {
public static contextType = CivilHelperContext;
public context: CivilHelper;
constructor(props: AppealDetailProps & InjectedTransactionStatusModalProps) {
super(props);
this.state = {
uriValue: "",
};
}
public render(): JSX.Element {
const appeal = this.props.appeal;
const requester = appeal.requester.toString();
const appealFeePaid = getFormattedTokenBalance(appeal.appealFeePaid);
const phaseLength = this.props.govtParameters.judgeAppealLen;
const transactions = this.getTransactions();
const endTime = parseInt(appeal.appealPhaseExpiry.toString(), 10);
if (transactions) {
this.props.setTransactions(transactions);
}
return (
<>
>
);
}
private onURIChange = (name: string, value: string) => {
this.setState({ uriValue: value });
};
private getTransactions = (): any[] | undefined => {
const { isAwaitingAppealJudgement } = this.props.challengeState;
let transactions;
if (isAwaitingAppealJudgement && this.props.isMemberOfAppellate) {
if (this.props.txIdToConfirm) {
transactions = [
{
transaction: async () => {
this.props.updateTransactionStatusModalsState({
isWaitingTransactionModalOpen: true,
isTransactionProgressModalOpen: false,
isTransactionSuccessModalOpen: false,
transactionType: TransactionTypes.CONFIRM_APPEAL,
});
return this.confirmAppeal();
},
handleTransactionHash: (txHash: TxHash) => {
this.props.updateTransactionStatusModalsState({
isWaitingTransactionModalOpen: false,
isTransactionProgressModalOpen: true,
});
},
postTransaction: () => {
this.props.updateTransactionStatusModalsState({
isWaitingTransactionModalOpen: false,
isTransactionProgressModalOpen: false,
isTransactionSuccessModalOpen: true,
});
},
handleTransactionError: this.props.handleTransactionError,
},
];
} else {
transactions = [
{
transaction: async () => {
this.props.updateTransactionStatusModalsState({
isWaitingTransactionModalOpen: true,
isTransactionProgressModalOpen: false,
isTransactionSuccessModalOpen: false,
transactionType: TransactionTypes.GRANT_APPEAL,
});
return this.grantAppeal(this.state.uriValue);
},
handleTransactionHash: (txHash: TxHash) => {
this.props.updateTransactionStatusModalsState({
isWaitingTransactionModalOpen: false,
isTransactionProgressModalOpen: true,
});
},
postTransaction: () => {
this.props.updateTransactionStatusModalsState({
isWaitingTransactionModalOpen: false,
isTransactionProgressModalOpen: false,
isTransactionSuccessModalOpen: true,
});
},
handleTransactionError: this.props.handleTransactionError,
},
];
}
}
return transactions;
};
private grantAppeal = async (uri: string): Promise> => {
return this.context.grantAppeal(this.props.listingAddress, uri);
};
private confirmAppeal = async (): Promise> => {
return this.context.confirmAppeal(this.props.txIdToConfirm!);
};
}
export default compose>(
hasTransactionStatusModals(transactionStatusModalConfig),
)(AwaitingAppealDecision);