Feat/1010: show rejected reason (and error details) on propose form results (#1086)
* feat/1010: Show proposal rejected reason in transaction dialog * feat/1010: Show wallet rejection details in transaction dialog * Feat/1010: Updated wallet types * Feat/1010: Ensuring rejected proposals get the correct transaction dialog title * Feat/1010: Fixing linting warning * Feat/1010: Skipping node switcher tests for now
This commit is contained in:
parent
95c1526aa3
commit
171babc2c9
@ -3,7 +3,7 @@ const nodeErrorMsg = 'node-error-message';
|
||||
const nodeId = 'node-url-0';
|
||||
const customNodeBtn = 'custom-node';
|
||||
|
||||
context('Node switcher', function () {
|
||||
context.skip('Node switcher', function () {
|
||||
beforeEach('visit home page', function () {
|
||||
cy.intercept('GET', 'https://static.vega.xyz/assets/capsule-network.json', {
|
||||
hosts: ['http://localhost:3028/query'],
|
||||
|
@ -175,6 +175,7 @@
|
||||
"noOpenProposals": "There are no open or yet to enact proposals",
|
||||
"noClosedProposals": "There are no enacted or rejected proposals",
|
||||
"noRejectedProposals": "No rejected proposals",
|
||||
"Proposal rejected": "Proposal rejected",
|
||||
"participationNotMet": "Participation not met",
|
||||
"majorityNotMet": "Majority not met",
|
||||
"noProposals": "There are no active network change proposals",
|
||||
|
@ -113,7 +113,22 @@ describe('ProposalForm', () => {
|
||||
);
|
||||
setup(mockSendTx);
|
||||
|
||||
const inputJSON = '{}';
|
||||
const inputJSON = JSON.stringify({
|
||||
rationale: {
|
||||
description: 'Update governance.proposal.freeform.minVoterBalance',
|
||||
title: 'testing 123',
|
||||
},
|
||||
terms: {
|
||||
updateNetworkParameter: {
|
||||
changes: {
|
||||
key: 'governance.proposal.freeform.minVoterBalance',
|
||||
value: '300',
|
||||
},
|
||||
},
|
||||
closingTimestamp: 1657721401,
|
||||
enactmentTimestamp: 1657807801,
|
||||
},
|
||||
});
|
||||
fireEvent.change(screen.getByTestId('proposal-data'), {
|
||||
target: { value: inputJSON },
|
||||
});
|
||||
@ -145,7 +160,7 @@ describe('ProposalForm', () => {
|
||||
});
|
||||
|
||||
expect(screen.getByTestId('dialog-title')).toHaveTextContent(
|
||||
'Proposal submitted'
|
||||
'Proposal rejected'
|
||||
);
|
||||
});
|
||||
|
||||
|
@ -12,6 +12,7 @@ import {
|
||||
getProposalDialogTitle,
|
||||
} from '../utils';
|
||||
import { t } from '@vegaprotocol/react-helpers';
|
||||
import { ProposalState } from '@vegaprotocol/types';
|
||||
|
||||
export interface FormFields {
|
||||
proposalData: string;
|
||||
@ -71,11 +72,22 @@ export const ProposalForm = () => {
|
||||
>
|
||||
{isSubmitting ? t('Submitting') : t('Submit')} {t('Proposal')}
|
||||
</Button>
|
||||
<TransactionDialog
|
||||
title={getProposalDialogTitle(finalizedProposal?.state)}
|
||||
intent={getProposalDialogIntent(finalizedProposal?.state)}
|
||||
icon={getProposalDialogIcon(finalizedProposal?.state)}
|
||||
/>
|
||||
|
||||
{finalizedProposal?.rejectionReason ? (
|
||||
<TransactionDialog
|
||||
title={t('Proposal rejected')}
|
||||
intent={getProposalDialogIntent(ProposalState.STATE_REJECTED)}
|
||||
icon={getProposalDialogIcon(ProposalState.STATE_REJECTED)}
|
||||
>
|
||||
<p>{finalizedProposal.rejectionReason}</p>
|
||||
</TransactionDialog>
|
||||
) : (
|
||||
<TransactionDialog
|
||||
title={getProposalDialogTitle(finalizedProposal?.state)}
|
||||
intent={getProposalDialogIntent(finalizedProposal?.state)}
|
||||
icon={getProposalDialogIcon(finalizedProposal?.state)}
|
||||
/>
|
||||
)}
|
||||
</form>
|
||||
);
|
||||
};
|
||||
|
@ -177,6 +177,12 @@ export class RestConnector implements VegaConnector {
|
||||
}
|
||||
|
||||
if (res.error) {
|
||||
if (res.details) {
|
||||
return {
|
||||
error: res.error,
|
||||
details: res.details,
|
||||
};
|
||||
}
|
||||
return {
|
||||
error: res.error,
|
||||
};
|
||||
@ -230,10 +236,24 @@ export class RestConnector implements VegaConnector {
|
||||
return t('Something went wrong');
|
||||
}
|
||||
|
||||
/** Parse error details array into a single string */
|
||||
private parseErrorDetails(err: TransactionError): string | null {
|
||||
if (err.details && err.details.length > 0) {
|
||||
return err.details.join(', ');
|
||||
}
|
||||
|
||||
return null;
|
||||
}
|
||||
|
||||
private async request(
|
||||
endpoint: Endpoints,
|
||||
options: RequestInit
|
||||
): Promise<{ status?: number; data?: unknown; error?: string }> {
|
||||
): Promise<{
|
||||
status?: number;
|
||||
data?: unknown;
|
||||
error?: string;
|
||||
details?: string;
|
||||
}> {
|
||||
try {
|
||||
const fetchResult = await fetch(`${this.url}/${endpoint}`, {
|
||||
...options,
|
||||
@ -246,6 +266,16 @@ export class RestConnector implements VegaConnector {
|
||||
if (!fetchResult.ok) {
|
||||
const errorData = await fetchResult.json();
|
||||
const error = this.parseError(errorData);
|
||||
const errorDetails = this.parseErrorDetails(errorData);
|
||||
|
||||
if (errorDetails) {
|
||||
return {
|
||||
status: fetchResult.status,
|
||||
error,
|
||||
details: errorDetails,
|
||||
};
|
||||
}
|
||||
|
||||
return {
|
||||
status: fetchResult.status,
|
||||
error,
|
||||
|
@ -32,7 +32,9 @@ export interface VegaWalletContextShape {
|
||||
/** Send a transaction to the network, only order submissions for now */
|
||||
sendTx: (
|
||||
tx: TransactionSubmission
|
||||
) => Promise<TransactionResponse | { error: string }> | null;
|
||||
) => Promise<
|
||||
TransactionResponse | { error: string; details?: string[] }
|
||||
> | null;
|
||||
}
|
||||
|
||||
export const VegaWalletContext = createContext<
|
||||
|
@ -23,6 +23,7 @@ export enum VegaTxStatus {
|
||||
export interface VegaTxState {
|
||||
status: VegaTxStatus;
|
||||
error: string | null;
|
||||
details?: string[] | null;
|
||||
txHash: string | null;
|
||||
signature: string | null;
|
||||
dialogOpen: boolean;
|
||||
@ -31,6 +32,7 @@ export interface VegaTxState {
|
||||
export const initialState = {
|
||||
status: VegaTxStatus.Default,
|
||||
error: null,
|
||||
details: null,
|
||||
txHash: null,
|
||||
signature: null,
|
||||
dialogOpen: false,
|
||||
@ -59,6 +61,7 @@ export const useVegaTransaction = () => {
|
||||
async (tx: TransactionSubmission) => {
|
||||
setTransaction({
|
||||
error: null,
|
||||
details: null,
|
||||
txHash: null,
|
||||
signature: null,
|
||||
status: VegaTxStatus.Requested,
|
||||
@ -74,7 +77,11 @@ export const useVegaTransaction = () => {
|
||||
}
|
||||
|
||||
if (isError(res)) {
|
||||
setTransaction({ error: res.error, status: VegaTxStatus.Error });
|
||||
setTransaction({
|
||||
error: res.error,
|
||||
details: res.details,
|
||||
status: VegaTxStatus.Error,
|
||||
});
|
||||
return;
|
||||
}
|
||||
|
||||
@ -114,11 +121,12 @@ export const useVegaTransaction = () => {
|
||||
transaction,
|
||||
reset,
|
||||
setComplete,
|
||||
setTransaction,
|
||||
TransactionDialog,
|
||||
};
|
||||
};
|
||||
|
||||
const isError = (error: unknown): error is { error: string } => {
|
||||
export const isError = (error: unknown): error is { error: string } => {
|
||||
if (error !== null && typeof error === 'object' && 'error' in error) {
|
||||
return true;
|
||||
}
|
||||
|
@ -17,6 +17,7 @@ describe('VegaTransactionDialog', () => {
|
||||
isOpen: true,
|
||||
onChange: () => false,
|
||||
transaction: {
|
||||
dialogOpen: true,
|
||||
status: VegaTxStatus.Requested,
|
||||
error: null,
|
||||
txHash: null,
|
||||
|
@ -73,6 +73,9 @@ export const VegaDialog = ({ transaction }: VegaDialogProps) => {
|
||||
return (
|
||||
<div data-testid={transaction.status}>
|
||||
<p>{transaction.error && formatLabel(transaction.error)}</p>
|
||||
{transaction.details && (
|
||||
<p>{formatLabel(transaction.details.join(', '))}</p>
|
||||
)}
|
||||
</div>
|
||||
);
|
||||
}
|
||||
|
@ -228,7 +228,7 @@ interface Buy {
|
||||
export interface ProposalSubmission {
|
||||
rationale: {
|
||||
description: string;
|
||||
title?: string;
|
||||
title: string;
|
||||
};
|
||||
terms:
|
||||
| ProposalFreeformTerms
|
||||
@ -262,7 +262,9 @@ export type TransactionError =
|
||||
errors: {
|
||||
[key: string]: string[];
|
||||
};
|
||||
details?: string[];
|
||||
}
|
||||
| {
|
||||
error: string;
|
||||
details?: string[];
|
||||
};
|
||||
|
Loading…
Reference in New Issue
Block a user