Skip to content

Commit

Permalink
fix(fixing adminaddresssetter): fixing the adminAddressSetter compone…
Browse files Browse the repository at this point in the history
…nt with simulation issues
  • Loading branch information
Torof committed Nov 8, 2024
1 parent 606bbcf commit 0dab187
Show file tree
Hide file tree
Showing 2 changed files with 55 additions and 22 deletions.
5 changes: 4 additions & 1 deletion src/app/app/[tab]/AppTabs.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -58,7 +58,7 @@ const InnerAppTabs: FC = () => {
<TabsTrigger value="dashboard">Dashboard</TabsTrigger>
<TabsTrigger value="affiliate">Affiliate Program</TabsTrigger>
<TabsTrigger value="swap">Swap</TabsTrigger>
<XSwapWidget />
<TabsTrigger value="bridge">Bridge</TabsTrigger>
</TabsList>
<div className="[&_>_*]:animate-fadeAndMoveIn [&_>_*]:[animation-duration:300ms] sm:px-5 max-w-[100vw]">
<SessionProvider>
Expand All @@ -83,6 +83,9 @@ const InnerAppTabs: FC = () => {
<TabsContent value="swap">
<AppSwap />
</TabsContent>
<TabsContent value="bridge">
<XSwapWidget />
</TabsContent>
</SessionProvider>
</div>
</Tabs>
Expand Down
72 changes: 51 additions & 21 deletions src/components/admin/AdminAddressSetter.tsx
Original file line number Diff line number Diff line change
@@ -1,14 +1,13 @@
import { Address, Input, TxButton } from "@/components/ui";
import { useContractAddress } from "@/hooks/useContractAddress";
import { ChangeEvent, FC, useEffect, useState } from "react";
import { ChangeEvent, FC, useEffect, useCallback, useState } from "react";
import {
UseSimulateContractReturnType,
useBlockNumber,
useReadContract,
useSimulateContract,
UseSimulateContractReturnType,
} from "wagmi";
import { getContractAbi } from "@/lib/getContractAbi";
import { zeroAddress } from "viem";
import { zeroAddress, Abi } from "viem";
import { useContractAbi } from "@/hooks/useContractAbi";
import { useQueryClient } from "@tanstack/react-query";

Expand All @@ -34,23 +33,57 @@ export const AdminAddressSetter: FC<Props> = ({
abi: contractAbi,
functionName: getterFunctionName,
});

const [newAddress, setNewAddress] = useState<string>(zeroAddress);
const preparation = useSimulateContract({
const [hasUserInteracted, setHasUserInteracted] = useState(false);

const simulation = useSimulateContract({
address: contractAddress,
abi: contractAbi,
abi: contractAbi as Abi,
functionName: setterFunctionName,
args: [newAddress],
args: [newAddress] as const,
query: {
enabled: Boolean(contractAddress && contractAbi && newAddress && newAddress !== zeroAddress),
},
});
const [hasUserInteracted, setHasUserInteracted] = useState(false);

// Refresh some data every 5 blocks
const queryKeys = [queryKey];
// Convert simulation to expected type
const preparation = {
...simulation,
data: simulation.data
? {
...simulation.data,
request: {
...simulation.data.request,
__mode: "prepared" as const,
},
}
: undefined,
} as UseSimulateContractReturnType;

// Refresh data every 5 blocks
const { data: blockNumber } = useBlockNumber({ watch: true });
const queryClient = useQueryClient();

const handleRefreshData = useCallback(() => {
if (queryKey) {
queryClient.invalidateQueries({ queryKey });
}
}, [queryClient, queryKey]);

useEffect(() => {
if (blockNumber && blockNumber % 5n === 0n)
queryKeys.forEach((k) => queryClient.invalidateQueries({ queryKey: k }));
}, [blockNumber, ...queryKeys]);
if (blockNumber && blockNumber % 5n === 0n) {
handleRefreshData();
}
}, [blockNumber, handleRefreshData]);

const handleAddressChange = (e: ChangeEvent<HTMLInputElement>) => {
const value = e.target.value;
setNewAddress(value);
setHasUserInteracted(value !== "");
};

if (!contractAddress || !contractAbi) return null;

return (
<div className="flex flex-col gap-5">
Expand All @@ -61,21 +94,18 @@ export const AdminAddressSetter: FC<Props> = ({
<div className="flex justify-center items-end gap-3">
<Input
type="text"
onChange={(e: ChangeEvent<HTMLInputElement>) => {
setNewAddress(e.target.value);
if (hasUserInteracted === false) setHasUserInteracted(true);
if (e.target.value === "") setHasUserInteracted(false);
}}
onChange={handleAddressChange}
placeholder="Enter new address"
/>
<TxButton
size="medium"
preparation={preparation as UseSimulateContractReturnType}
disabled={newAddress === zeroAddress}
preparation={preparation}
disabled={!newAddress || newAddress === zeroAddress}
hasUserInteracted={hasUserInteracted}
>
{txButtonName}
</TxButton>
</div>
</div>
);
};
};

0 comments on commit 0dab187

Please # to comment.