import { useCurrentAccount, useSignAndExecuteTransaction, useSuiClient, useSuiClientQuery, } from "@onelabs/dapp-kit"; import type { SuiObjectData } from "@onelabs/sui/client"; import { Transaction } from "@onelabs/sui/transactions"; import { Button, Flex, Heading, Text } from "@radix-ui/themes"; import { useNetworkVariable } from "./networkConfig"; import { useState } from "react"; import ClipLoader from "react-spinners/ClipLoader"; export function Counter({ id }: { id: string }) { const counterPackageId = useNetworkVariable("counterPackageId"); const suiClient = useSuiClient(); const currentAccount = useCurrentAccount(); const { mutate: signAndExecute } = useSignAndExecuteTransaction(); const { data, isPending, error, refetch } = useSuiClientQuery("getObject", { id, options: { showContent: true, showOwner: true, }, }); const [waitingForTxn, setWaitingForTxn] = useState(""); const executeMoveCall = (method: "increment" | "reset") => { setWaitingForTxn(method); const tx = new Transaction(); if (method === "reset") { tx.moveCall({ arguments: [tx.object(id), tx.pure.u64(0)], target: `${counterPackageId}::counter::set_value`, }); } else { tx.moveCall({ arguments: [tx.object(id)], target: `${counterPackageId}::counter::increment`, }); } signAndExecute( { transaction: tx, }, { onSuccess: (tx) => { suiClient.waitForTransaction({ digest: tx.digest }).then(async () => { await refetch(); setWaitingForTxn(""); }); }, }, ); }; if (isPending) return Loading...; if (error) return Error: {error.message}; if (!data.data) return Not found; const ownedByCurrentAccount = getCounterFields(data.data)?.owner === currentAccount?.address; return ( <> Counter {id} Count: {getCounterFields(data.data)?.value} {ownedByCurrentAccount ? ( ) : null} ); } function getCounterFields(data: SuiObjectData) { if (data.content?.dataType !== "moveObject") { return null; } return data.content.fields as { value: number; owner: string }; }