Skip to content

Commit 6969b21

Browse files
authored
Merge pull request #80 from kleros/fix-disable-button-if-insufficient-balance
fix: disable button when user has insufficient native balance
2 parents 9f353a8 + caa750e commit 6969b21

File tree

14 files changed

+246
-70
lines changed

14 files changed

+246
-70
lines changed

web/src/pages/MyTransactions/Modal/RaiseDisputeModal/FeeRequired.tsx

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -37,7 +37,7 @@ const FeeRequired: React.FC<IFeeRequired> = ({ arbitrationCost }) => {
3737
return (
3838
<StyledCard>
3939
<StyledHeader>Arbitration fee required</StyledHeader>
40-
<StyledQuantity>{formatEther(arbitrationCost)} ETH</StyledQuantity>
40+
{arbitrationCost ? <StyledQuantity>{formatEther(arbitrationCost)} ETH</StyledQuantity> : null}
4141
</StyledCard>
4242
);
4343
};

web/src/pages/MyTransactions/TransactionDetails/PreviewCardButtons/AcceptSettlementButton.tsx

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@ const AcceptButton: React.FC = () => {
1616
const { id } = useTransactionDetailsContext();
1717
const refetchQuery = useQueryRefetch();
1818

19-
const { data: acceptSettlementConfig } = useSimulateEscrowUniversalAcceptSettlement({
19+
const { data: acceptSettlementConfig, isLoading, isError } = useSimulateEscrowUniversalAcceptSettlement({
2020
args: [BigInt(id)],
2121
});
2222

@@ -39,7 +39,14 @@ const AcceptButton: React.FC = () => {
3939
}
4040
};
4141

42-
return <Button isLoading={isSending} disabled={isSending} text="Accept" onClick={handleAcceptSettlement} />;
42+
return (
43+
<Button
44+
isLoading={isSending || isLoading}
45+
disabled={isSending || isLoading || isError}
46+
text="Accept"
47+
onClick={handleAcceptSettlement}
48+
/>
49+
);
4350
};
4451

4552
export default AcceptButton;

web/src/pages/MyTransactions/TransactionDetails/PreviewCardButtons/ExecuteTransactionButton.tsx

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@ const ExecuteTransactionButton: React.FC = () => {
1616
const { id } = useTransactionDetailsContext();
1717
const refetchQuery = useQueryRefetch();
1818

19-
const { data: executeTransactionConfig } = useSimulateEscrowUniversalExecuteTransaction({
19+
const { data: executeTransactionConfig, isLoading, isError } = useSimulateEscrowUniversalExecuteTransaction({
2020
args: [BigInt(id)],
2121
});
2222

@@ -41,7 +41,12 @@ const ExecuteTransactionButton: React.FC = () => {
4141
};
4242

4343
return (
44-
<Button isLoading={isSending} disabled={isSending} text="Execute Transaction" onClick={handleExecuteTransaction} />
44+
<Button
45+
isLoading={isSending || isLoading}
46+
disabled={isSending || isLoading || isError}
47+
text="Execute Transaction"
48+
onClick={handleExecuteTransaction}
49+
/>
4550
);
4651
};
4752

web/src/pages/MyTransactions/TransactionDetails/PreviewCardButtons/ProposeSettlementButton.tsx

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,7 @@ const ProposeSettlementButton: React.FC<IProposeSettlementButton> = ({
2929
const { id } = useTransactionDetailsContext();
3030
const refetchQuery = useQueryRefetch();
3131

32-
const { data: proposeSettlementConfig } = useSimulateEscrowUniversalProposeSettlement({
32+
const { data: proposeSettlementConfig, isLoading, isError } = useSimulateEscrowUniversalProposeSettlement({
3333
args: [BigInt(id), parseEther(amountProposed)],
3434
});
3535

@@ -56,9 +56,9 @@ const ProposeSettlementButton: React.FC<IProposeSettlementButton> = ({
5656

5757
return (
5858
<Button
59-
isLoading={isSending}
60-
disabled={isSending || !isAmountValid}
61-
text={buttonText}
59+
isLoading={isSending || isLoading}
60+
disabled={isSending || !isAmountValid || isLoading || isError}
61+
text={buttonText}
6262
onClick={handleProposeSettlement}
6363
/>
6464
);

web/src/pages/MyTransactions/TransactionDetails/PreviewCardButtons/RaiseDisputeButton.tsx

Lines changed: 49 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
import React, { useMemo, useState } from "react";
22
import { Button } from "@kleros/ui-components-library";
3-
import { useAccount, usePublicClient } from "wagmi";
3+
import { useAccount, useBalance, usePublicClient } from "wagmi";
44
import {
55
useWriteEscrowUniversalPayArbitrationFeeByBuyer,
66
useWriteEscrowUniversalPayArbitrationFeeBySeller,
@@ -11,6 +11,8 @@ import { isUndefined } from "utils/index";
1111
import { wrapWithToast } from "utils/wrapWithToast";
1212
import { useTransactionDetailsContext } from "context/TransactionDetailsContext";
1313
import { useQueryRefetch } from "hooks/useQueryRefetch";
14+
import ClosedCircleIcon from "components/StyledIcons/ClosedCircleIcon";
15+
import { ErrorButtonMessage } from "pages/NewTransaction/NavigationButtons/DepositPaymentButton";
1416

1517
interface IRaiseDisputeButton {
1618
toggleModal?: () => void;
@@ -26,12 +28,34 @@ const RaiseDisputeButton: React.FC<IRaiseDisputeButton> = ({ toggleModal, button
2628
const isBuyer = useMemo(() => address?.toLowerCase() === buyer?.toLowerCase(), [address, buyer]);
2729
const refetchQuery = useQueryRefetch();
2830

29-
const { data: payArbitrationFeeByBuyerConfig } = useSimulateEscrowUniversalPayArbitrationFeeByBuyer({
31+
const { data: balanceData } = useBalance({
32+
address: address as `0x${string}` | undefined,
33+
});
34+
35+
const insufficientBalance = useMemo(() => {
36+
return balanceData && BigInt(arbitrationCost.toString()) > BigInt(balanceData.value.toString());
37+
}, [arbitrationCost, balanceData]);
38+
39+
const {
40+
data: payArbitrationFeeByBuyerConfig,
41+
isLoading: isLoadingBuyerConfig,
42+
isError: isErrorBuyerConfig,
43+
} = useSimulateEscrowUniversalPayArbitrationFeeByBuyer({
44+
query: {
45+
enabled: isBuyer && !insufficientBalance,
46+
},
3047
args: [BigInt(id)],
3148
value: arbitrationCost,
3249
});
3350

34-
const { data: payArbitrationFeeBySellerConfig } = useSimulateEscrowUniversalPayArbitrationFeeBySeller({
51+
const {
52+
data: payArbitrationFeeBySellerConfig,
53+
isLoading: isLoadingSellerConfig,
54+
isError: isErrorSellerConfig,
55+
} = useSimulateEscrowUniversalPayArbitrationFeeBySeller({
56+
query: {
57+
enabled: !isBuyer && !insufficientBalance,
58+
},
3559
args: [BigInt(id)],
3660
value: arbitrationCost,
3761
});
@@ -76,7 +100,28 @@ const RaiseDisputeButton: React.FC<IRaiseDisputeButton> = ({ toggleModal, button
76100
}
77101
};
78102

79-
return <Button isLoading={isSending} disabled={isSending} text={buttonText} onClick={handleRaiseDispute} />;
103+
return (
104+
<div>
105+
<Button
106+
isLoading={!insufficientBalance && (isSending || isLoadingBuyerConfig || isLoadingSellerConfig)}
107+
disabled={
108+
isSending ||
109+
insufficientBalance ||
110+
isLoadingBuyerConfig ||
111+
isLoadingSellerConfig ||
112+
isErrorBuyerConfig ||
113+
isErrorSellerConfig
114+
}
115+
text={buttonText}
116+
onClick={handleRaiseDispute}
117+
/>
118+
{insufficientBalance && (
119+
<ErrorButtonMessage>
120+
<ClosedCircleIcon /> Insufficient balance
121+
</ErrorButtonMessage>
122+
)}
123+
</div>
124+
);
80125
};
81126

82127
export default RaiseDisputeButton;

web/src/pages/MyTransactions/TransactionDetails/PreviewCardButtons/TimeOutButton.tsx

Lines changed: 16 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -20,11 +20,11 @@ const TimeOutButton: React.FC = () => {
2020
const isBuyer = useMemo(() => address?.toLowerCase() === buyer?.toLowerCase(), [address, buyer]);
2121
const refetchQuery = useQueryRefetch();
2222

23-
const { data: timeOutByBuyerConfig } = useSimulateEscrowUniversalTimeOutByBuyer({
23+
const { data: timeOutByBuyerConfig, isLoading: isLoadingBuyerConfig, isError: isErrorBuyerConfig } = useSimulateEscrowUniversalTimeOutByBuyer({
2424
args: [BigInt(id)],
2525
});
2626

27-
const { data: timeOutBySellerConfig } = useSimulateEscrowUniversalTimeOutBySeller({
27+
const { data: timeOutBySellerConfig, isLoading: isLoadingSellerConfig, isError: isErrorSellerConfig } = useSimulateEscrowUniversalTimeOutBySeller({
2828
args: [BigInt(id)],
2929
});
3030

@@ -61,7 +61,20 @@ const TimeOutButton: React.FC = () => {
6161
}
6262
};
6363

64-
return <Button isLoading={isSending} disabled={isSending} text="Claim full payment back" onClick={handleTimeout} />;
64+
return (
65+
<Button
66+
isLoading={isSending || isLoadingBuyerConfig || isLoadingSellerConfig}
67+
disabled={
68+
isSending ||
69+
isLoadingBuyerConfig ||
70+
isLoadingSellerConfig ||
71+
isErrorBuyerConfig ||
72+
isErrorSellerConfig
73+
}
74+
text="Claim full payment back"
75+
onClick={handleTimeout}
76+
/>
77+
);
6578
};
6679

6780
export default TimeOutButton;

web/src/pages/MyTransactions/TransactionDetails/WasItFulfilled/Buttons/ClaimFullPaymentButton.tsx

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@ const ClaimFullPaymentButton: React.FC = () => {
1717
const publicClient = usePublicClient();
1818
const { id } = useTransactionDetailsContext();
1919

20-
const { data: executeTransactionConfig } = useSimulateEscrowUniversalExecuteTransaction({
20+
const { data: executeTransactionConfig, isLoading, isError } = useSimulateEscrowUniversalExecuteTransaction({
2121
args: [id],
2222
});
2323

@@ -46,8 +46,8 @@ const ClaimFullPaymentButton: React.FC = () => {
4646
return (
4747
<>
4848
<Button
49-
isLoading={isSending}
50-
disabled={isSending}
49+
isLoading={isSending || isLoading}
50+
disabled={isSending || isLoading || isError}
5151
text={"No. Claim full payment"}
5252
onClick={handleExecuteTransaction}
5353
/>

web/src/pages/MyTransactions/TransactionDetails/WasItFulfilled/Buttons/ReleasePaymentButton.tsx

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@ const ReleasePaymentButton: React.FC = () => {
1616
const { id, amount } = useTransactionDetailsContext();
1717
const refetchQuery = useQueryRefetch();
1818

19-
const { data: releaseFullPaymentConfig } = useSimulateEscrowUniversalPay({
19+
const { data: releaseFullPaymentConfig, isLoading, isError } = useSimulateEscrowUniversalPay({
2020
args: [id, amount],
2121
});
2222

@@ -44,8 +44,8 @@ const ReleasePaymentButton: React.FC = () => {
4444
return (
4545
<>
4646
<Button
47-
isLoading={isSending}
48-
disabled={isSending}
47+
isLoading={isSending || isLoading}
48+
disabled={isSending || isLoading || isError}
4949
text={"Yes. Release full payment"}
5050
onClick={handleReleasePayment}
5151
/>

0 commit comments

Comments
 (0)