{
const transactionSuccessContent = this.getTransactionSuccessContent();
this.props.setTransactions(this.getTransactions());
this.props.setTransactionStatusModalConfig({
transactionSuccessContent,
});
this.props.setHandleTransactionSuccessButtonClick(this.redirectToListingPage);
const { civil } = this.context;
if (civil && civil.currentProvider) {
await civil.currentProviderEnable();
}
}
public render(): JSX.Element {
const transactions = this.getTransactions();
const { listingURI, newsroomName, governanceGuideURI, appealFee, judgeAppealLen, balance: balanceBN } = this.props;
const displayAppealFee = getFormattedParameterValue(GovernmentParameters.appealFee, appealFee);
const displayJudgeAppealLen = getFormattedParameterValue(GovernmentParameters.judgeAppealLen, judgeAppealLen);
const balance = balanceBN === undefined ? new BigNumber(0) : balanceBN;
const isInsufficientBalance = balance.lt(appealFee);
const props: RequestAppealStatementProps = {
listingURI,
newsroomName,
constitutionURI: links.CONSTITUTION,
governanceGuideURI,
appealFee: displayAppealFee,
judgeAppealLen: displayJudgeAppealLen,
updateStatementValue: this.updateStatement,
transactions,
postExecuteTransactions: this.onSubmitAppealSuccess,
};
return (
<>
{isInsufficientBalance && appealFee && (
)}
>
);
}
private updateStatement = (key: string, value: any): void => {
const stateKey = `appealStatement${key.charAt(0).toUpperCase()}${key.substring(1)}Value`;
this.setState(() => ({ [stateKey]: value }));
};
private getTransactions = (): any[] => {
return [
{
transaction: async () => {
this.props.updateTransactionStatusModalsState({
isWaitingTransactionModalOpen: true,
isTransactionProgressModalOpen: false,
isTransactionSuccessModalOpen: false,
isTransactionErrorModalOpen: false,
isTransactionRejectionModalOpen: false,
isIPFSUploadModalOpen: false,
transactionType: TransactionTypes.APPROVE_FOR_APPEAL_REQUEST,
});
return this.context.approveForAppeal();
},
handleTransactionHash: (txHash: TxHash) => {
this.props.updateTransactionStatusModalsState({
isWaitingTransactionModalOpen: false,
isTransactionProgressModalOpen: true,
});
},
handleTransactionError: this.props.handleTransactionError,
},
{
transaction: async () => {
this.props.updateTransactionStatusModalsState({
isWaitingTransactionModalOpen: false,
isIPFSUploadModalOpen: true,
isTransactionProgressModalOpen: false,
isTransactionSuccessModalOpen: false,
transactionType: TransactionTypes.PUBLISH_CONTENT,
});
return this.postAppealStatement();
},
postTransaction: async (receipt: any) => {
this.setState({ appealStatementUri: receipt.uri });
},
},
{
transaction: async () => {
this.props.updateTransactionStatusModalsState({
isWaitingTransactionModalOpen: true,
isTransactionProgressModalOpen: false,
isTransactionSuccessModalOpen: false,
isTransactionErrorModalOpen: false,
isTransactionRejectionModalOpen: false,
isIPFSUploadModalOpen: false,
transactionType: TransactionTypes.REQUEST_APPEAL,
});
return this.appeal();
},
handleTransactionHash: (txHash: TxHash) => {
this.props.updateTransactionStatusModalsState({
isWaitingTransactionModalOpen: true,
isTransactionProgressModalOpen: false,
});
},
handleTransactionError: this.props.handleTransactionError,
},
];
};
private onSubmitAppealSuccess = (): void => {
this.props.updateTransactionStatusModalsState({
isWaitingTransactionModalOpen: false,
isTransactionProgressModalOpen: false,
isTransactionSuccessModalOpen: true,
});
};
private getTransactionSuccessContent = (): TransactionStatusModalContentMap => {
return {
[TransactionTypes.APPROVE_FOR_APPEAL_REQUEST]: [undefined, undefined],
[TransactionTypes.REQUEST_APPEAL]: [
<>
Your Request for Appeal was Submitted
>,
<>
The Civil Council has{" "}
{getFormattedParameterValue(GovernmentParameters.judgeAppealLen, this.props.judgeAppealLen)} to review the
vote. They will publish at least one public document outlining the Constitutional rationale for their
decision. Please check back for their decision.
>,
],
};
};
private redirectToListingPage = (): void => {
const listingURI = formatRoute(routes.LISTING, { listingAddress: this.props.listingAddress });
this.props.closeAllModals();
this.props.history.push(listingURI);
};
// Transactions
private postAppealStatement = async (): Promise => {
const { appealStatementSummaryValue, appealStatementDetailsValue } = this.state;
const jsonToSave = {
summary: appealStatementSummaryValue,
details: appealStatementDetailsValue.toString("html"),
};
return this.context.publishContent(JSON.stringify(jsonToSave));
};
private appeal = async (): Promise> => {
return this.context.requestAppealWithUri(this.props.listingAddress, this.state.appealStatementUri!);
};
}
interface InsufficientBalanceSnackBarProps {
buyCVLURL: string;
minDeposit: string;
}
const InsufficientBalanceSnackBar: React.FunctionComponent = props => {
return (
);
};
const mapStateToProps = (state: State, ownProps: RequestAppealProps): RequestAppealProps & RequestAppealReduxProps => {
const { newsrooms } = state;
const newsroom = newsrooms.get(ownProps.listingAddress);
let newsroomName = "";
if (newsroom) {
newsroomName = newsroom.wrapper.data.name;
}
const { govtParameters, user } = state.networkDependent;
let appealFee = new BigNumber(0);
let judgeAppealLen = new BigNumber(0);
if (govtParameters && Object.keys(govtParameters).length) {
appealFee = govtParameters[GovernmentParameters.appealFee];
judgeAppealLen = govtParameters[GovernmentParameters.judgeAppealLen];
}
let balance = new BigNumber(0);
if (user) {
balance = user.account.balance;
}
return {
newsroomName,
appealFee,
judgeAppealLen,
balance,
...ownProps,
};
};
const RequestAppeal = compose(
connect(mapStateToProps),
hasTransactionStatusModals(transactionStatusModalConfig),
)(RequestAppealComponent) as React.ComponentClass;
const RequestAppealPage = (props: RequestAppealPageProps) => {
const listingAddress = props.match.params.listingAddress;
const listingURI = formatRoute(routes.LISTING, { listingAddress });
const governanceGuideURI = links.FAQ_REGISTRY;
return (
);
};
export default RequestAppealPage;