Skip to content

Commit 1ff8771

Browse files
feat(web): query-refetch-hook
1 parent e940260 commit 1ff8771

File tree

7 files changed

+59
-11
lines changed

7 files changed

+59
-11
lines changed

web/src/hooks/useQueryRefetch.ts

+28
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,28 @@
1+
import { useQueryClient } from "@tanstack/react-query";
2+
import { useCallback } from "react";
3+
4+
/**
5+
*
6+
* @required This hook needs to be used within the QueryClientProvider
7+
* @param queryKeys An Array of Query : [ [ "key1" ], [ "key2" ] ]
8+
* @param waitFor Optional - Time to wait before refetching
9+
* @returns refetchQuery - A function that takes in the query keys array to refetch
10+
* @example refetchQuery([["refetchOnBlock","myQuery"],["myOtherQuery"]])
11+
* @warning The order of keys in the query key array matters
12+
*/
13+
export const useQueryRefetch = () => {
14+
const queryClient = useQueryClient();
15+
16+
const refetchQuery = useCallback(
17+
async (queryKeys: string[][], waitFor = 4000) => {
18+
await new Promise((res) => setTimeout(() => res(true), waitFor));
19+
20+
for (const queryKey of queryKeys) {
21+
queryClient.refetchQueries(queryKey);
22+
}
23+
},
24+
[queryClient]
25+
);
26+
27+
return refetchQuery;
28+
};

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

+3
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@ import {
88
usePrepareEscrowUniversalAcceptSettlement,
99
useEscrowUniversalAcceptSettlement,
1010
} from "hooks/contracts/generated";
11+
import { useQueryRefetch } from "hooks/useQueryRefetch";
1112

1213
interface IAcceptButton {
1314
toggleModal?: () => void;
@@ -17,6 +18,7 @@ const AcceptButton: React.FC<IAcceptButton> = ({ toggleModal }) => {
1718
const [isSending, setIsSending] = useState<boolean>(false);
1819
const publicClient = usePublicClient();
1920
const { id } = useTransactionDetailsContext();
21+
const refetchQuery = useQueryRefetch();
2022

2123
const { config: acceptSettlementConfig } = usePrepareEscrowUniversalAcceptSettlement({
2224
args: [BigInt(id)],
@@ -32,6 +34,7 @@ const AcceptButton: React.FC<IAcceptButton> = ({ toggleModal }) => {
3234
if (!wrapResult.status) {
3335
setIsSending(false);
3436
}
37+
refetchQuery([["refetchOnBlock", "useTransactionDetailsQuery"]]);
3538
})
3639
.catch((error) => {
3740
console.error("Error raising dispute as buyer:", error);

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

+5-3
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@ import {
99
usePrepareEscrowUniversalProposeSettlement,
1010
useEscrowUniversalProposeSettlement,
1111
} from "hooks/contracts/generated";
12+
import { useQueryRefetch } from "hooks/useQueryRefetch";
1213

1314
interface IProposeSettlementButton {
1415
toggleModal?: () => void;
@@ -26,6 +27,7 @@ const ProposeSettlementButton: React.FC<IProposeSettlementButton> = ({
2627
const [isSending, setIsSending] = useState<boolean>(false);
2728
const publicClient = usePublicClient();
2829
const { id } = useTransactionDetailsContext();
30+
const refetchQuery = useQueryRefetch();
2931

3032
const { config: proposeSettlementConfig } = usePrepareEscrowUniversalProposeSettlement({
3133
args: [BigInt(id), parseEther(amountProposed)],
@@ -38,9 +40,9 @@ const ProposeSettlementButton: React.FC<IProposeSettlementButton> = ({
3840
setIsSending(true);
3941
wrapWithToast(async () => await proposeSettlement().then((response) => response.hash), publicClient)
4042
.then((wrapResult) => {
41-
if (wrapResult.status && toggleModal) {
42-
toggleModal();
43-
} else if (wrapResult.status) {
43+
if (wrapResult.status) {
44+
toggleModal && toggleModal();
45+
refetchQuery([["refetchOnBlock", "useTransactionDetailsQuery"]]);
4446
} else {
4547
setIsSending(false);
4648
}

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

+13-8
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@ import {
1010
import { isUndefined } from "utils/index";
1111
import { wrapWithToast } from "utils/wrapWithToast";
1212
import { useTransactionDetailsContext } from "context/TransactionDetailsContext";
13+
import { useQueryRefetch } from "hooks/useQueryRefetch";
1314

1415
interface IRaiseDisputeButton {
1516
toggleModal?: () => void;
@@ -23,6 +24,7 @@ const RaiseDisputeButton: React.FC<IRaiseDisputeButton> = ({ toggleModal, button
2324
const publicClient = usePublicClient();
2425
const { buyer, id } = useTransactionDetailsContext();
2526
const isBuyer = useMemo(() => address?.toLowerCase() === buyer?.toLowerCase(), [address, buyer]);
27+
const refetchQuery = useQueryRefetch();
2628

2729
const { config: payArbitrationFeeByBuyerConfig } = usePrepareEscrowUniversalPayArbitrationFeeByBuyer({
2830
args: [BigInt(id)],
@@ -34,17 +36,20 @@ const RaiseDisputeButton: React.FC<IRaiseDisputeButton> = ({ toggleModal, button
3436
value: arbitrationCost,
3537
});
3638

37-
const { writeAsync: payArbitrationFeeByBuyer } = useEscrowUniversalPayArbitrationFeeByBuyer(payArbitrationFeeByBuyerConfig);
38-
const { writeAsync: payArbitrationFeeBySeller } = useEscrowUniversalPayArbitrationFeeBySeller(payArbitrationFeeBySellerConfig);
39+
const { writeAsync: payArbitrationFeeByBuyer } =
40+
useEscrowUniversalPayArbitrationFeeByBuyer(payArbitrationFeeByBuyerConfig);
41+
const { writeAsync: payArbitrationFeeBySeller } = useEscrowUniversalPayArbitrationFeeBySeller(
42+
payArbitrationFeeBySellerConfig
43+
);
3944

4045
const handleRaiseDispute = () => {
4146
if (isBuyer && !isUndefined(payArbitrationFeeByBuyer)) {
4247
setIsSending(true);
4348
wrapWithToast(async () => await payArbitrationFeeByBuyer().then((response) => response.hash), publicClient)
4449
.then((wrapResult) => {
45-
if (wrapResult.status && toggleModal) {
46-
toggleModal();
47-
} else if (wrapResult.status) {
50+
if (wrapResult.status) {
51+
toggleModal && toggleModal();
52+
refetchQuery([["refetchOnBlock", "useTransactionDetailsQuery"]]);
4853
} else {
4954
setIsSending(false);
5055
}
@@ -57,9 +62,9 @@ const RaiseDisputeButton: React.FC<IRaiseDisputeButton> = ({ toggleModal, button
5762
setIsSending(true);
5863
wrapWithToast(async () => await payArbitrationFeeBySeller().then((response) => response.hash), publicClient)
5964
.then((wrapResult) => {
60-
if (wrapResult.status && toggleModal) {
61-
toggleModal();
62-
} else if (wrapResult.status) {
65+
if (wrapResult.status) {
66+
toggleModal && toggleModal();
67+
refetchQuery([["refetchOnBlock", "useTransactionDetailsQuery"]]);
6368
} else {
6469
setIsSending(false);
6570
}

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

+4
Original file line numberDiff line numberDiff line change
@@ -10,13 +10,15 @@ import {
1010
import { isUndefined } from "utils/index";
1111
import { wrapWithToast } from "utils/wrapWithToast";
1212
import { useTransactionDetailsContext } from "context/TransactionDetailsContext";
13+
import { useQueryRefetch } from "hooks/useQueryRefetch";
1314

1415
const TimeOutButton: React.FC = () => {
1516
const { address } = useAccount();
1617
const [isSending, setIsSending] = useState<boolean>(false);
1718
const publicClient = usePublicClient();
1819
const { buyer, id } = useTransactionDetailsContext();
1920
const isBuyer = useMemo(() => address?.toLowerCase() === buyer?.toLowerCase(), [address, buyer]);
21+
const refetchQuery = useQueryRefetch();
2022

2123
const { config: timeOutByBuyerConfig } = usePrepareEscrowUniversalTimeOutByBuyer({
2224
args: [BigInt(id)],
@@ -36,6 +38,7 @@ const TimeOutButton: React.FC = () => {
3638
.then((wrapResult) => {
3739
if (!wrapResult.status) {
3840
setIsSending(false);
41+
refetchQuery([["refetchOnBlock", "useTransactionDetailsQuery"]]);
3942
}
4043
})
4144
.catch((error) => {
@@ -48,6 +51,7 @@ const TimeOutButton: React.FC = () => {
4851
.then((wrapResult) => {
4952
if (!wrapResult.status) {
5053
setIsSending(false);
54+
refetchQuery([["refetchOnBlock", "useTransactionDetailsQuery"]]);
5155
}
5256
})
5357
.catch((error) => {

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

+3
Original file line numberDiff line numberDiff line change
@@ -7,12 +7,14 @@ import { isUndefined } from "utils/index";
77
import { wrapWithToast } from "utils/wrapWithToast";
88
import { usePublicClient } from "wagmi";
99
import { useTransactionDetailsContext } from "context/TransactionDetailsContext";
10+
import { useQueryRefetch } from "hooks/useQueryRefetch";
1011

1112
const ReleasePaymentButton: React.FC = () => {
1213
const [isModalOpen, toggleModal] = useToggle(false);
1314
const [isSending, setIsSending] = useState<boolean>(false);
1415
const publicClient = usePublicClient();
1516
const { id, amount } = useTransactionDetailsContext();
17+
const refetchQuery = useQueryRefetch();
1618

1719
const { config: releaseFullPaymentConfig } = usePrepareEscrowUniversalPay({
1820
args: [id, amount],
@@ -27,6 +29,7 @@ const ReleasePaymentButton: React.FC = () => {
2729
.then((wrapResult) => {
2830
if (wrapResult.status) {
2931
toggleModal();
32+
refetchQuery([["refetchOnBlock", "useTransactionDetailsQuery"]]);
3033
}
3134
})
3235
.catch((error) => {

web/src/pages/NewTransaction/NavigationButtons/DepositPaymentButton.tsx

+3
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@ import { parseEther, parseUnits } from "viem";
2323
import { isUndefined } from "utils/index";
2424
import { wrapWithToast } from "utils/wrapWithToast";
2525
import { ethAddressPattern } from "utils/validateAddress";
26+
import { useQueryRefetch } from "hooks/useQueryRefetch";
2627

2728
const StyledButton = styled(Button)``;
2829

@@ -43,6 +44,7 @@ const DepositPaymentButton: React.FC = () => {
4344
const [finalRecipientAddress, setFinalRecipientAddress] = useState(sellerAddress);
4445
const publicClient = usePublicClient();
4546
const navigate = useNavigate();
47+
const refetchQuery = useQueryRefetch();
4648
const [isSending, setIsSending] = useState(false);
4749
const [isApproved, setIsApproved] = useState(false);
4850
const { address } = useAccount();
@@ -183,6 +185,7 @@ const DepositPaymentButton: React.FC = () => {
183185
publicClient
184186
);
185187
if (wrapResult.status) {
188+
refetchQuery([["refetchOnBlock", "useMyTransactionsQuery"], ["useUserQuery"]]);
186189
resetContext();
187190
navigate("/my-transactions/display/1/desc/all");
188191
}

0 commit comments

Comments
 (0)