<!-- start pr-codex -->
## PR-Codex overview
This PR updates loading states in various components to use `isPending` instead of `isLoading`.
### Detailed summary
- Replaced `isLoading` with `isPending` in multiple components for loading state handling.
> The following files were skipped due to too many changes: `apps/dashboard/src/contract-ui/tabs/manage/components/InstalledModulesTable.tsx`, `apps/dashboard/src/components/pay/PayAnalytics/hooks/usePayCustomers.ts`, `apps/dashboard/src/components/pay/PayConfig.tsx`, `apps/dashboard/src/app/(dashboard)/(chain)/[chain_id]/(chainPage)/components/server/chain-header.tsx`, `apps/dashboard/src/app/(dashboard)/dashboard/connect/ecosystem/[slug]/(active)/components/client/add-partner-form.client.tsx`, `apps/dashboard/src/components/pay/PayAnalytics/components/PaymentHistory.tsx`, `apps/dashboard/src/contract-ui/tabs/split/components/distribute-button.tsx`, `apps/dashboard/src/components/onboarding/LinkWallet.tsx`, `apps/dashboard/src/components/pay/PayAnalytics/components/TotalVolumePieChart.tsx`, `apps/dashboard/package.json`, `apps/dashboard/src/components/pay/PayAnalytics/hooks/usePayPurchases.ts`, `apps/dashboard/src/components/engine/configuration/local-config.tsx.tsx`, `apps/dashboard/src/components/settings/ApiKeys/Create/index.tsx`, `apps/dashboard/src/app/(dashboard)/dashboard/connect/ecosystem/[slug]/(active)/components/server/partners-table.tsx`, `apps/dashboard/src/contract-ui/components/solidity-inputs/string-input.tsx`, `apps/dashboard/src/components/settings/Account/Billing/index.tsx`, `apps/dashboard/src/app/(dashboard)/dashboard/connect/ecosystem/[slug]/(active)/components/client/update-partner-form.client.tsx`, `apps/dashboard/src/contract-ui/tabs/nfts/page.tsx`, `apps/dashboard/src/components/configure-networks/Form/IconUpload.tsx`, `apps/dashboard/src/app/(dashboard)/dashboard/connect/ecosystem/create/hooks/use-create-ecosystem.ts`, `apps/dashboard/src/app/(dashboard)/dashboard/connect/ecosystem/create/components/client/create-ecosystem-form.client.tsx`, `apps/dashboard/src/components/engine/engine-instances-table.tsx`, `apps/dashboard/src/components/engine/contract-subscription/contract-subscriptions-table.tsx`, `apps/dashboard/src/components/pay/PayAnalytics/components/PayCustomersTable.tsx`, `apps/dashboard/src/pages/api/revalidate/publish.ts`, `apps/dashboard/src/app/(dashboard)/dashboard/connect/ecosystem/[slug]/(active)/hooks/use-update-ecosystem.ts`, `apps/dashboard/src/app/(dashboard)/dashboard/connect/ecosystem/[slug]/(active)/hooks/use-add-partner.ts`, `apps/dashboard/src/app/(dashboard)/dashboard/connect/ecosystem/[slug]/(active)/hooks/use-delete-partner.ts`, `apps/dashboard/src/app/(dashboard)/dashboard/connect/ecosystem/[slug]/(active)/hooks/use-update-partner.ts`, `apps/dashboard/src/app/(dashboard)/(chain)/[chain_id]/(chainPage)/components/client/live-stats.tsx`, `apps/dashboard/src/contract-ui/tabs/shared-components/marketplace-table.tsx`, `apps/dashboard/src/@3rdweb-sdk/react/hooks/query/useQueryWithNetwork.ts`, `apps/dashboard/src/app/(dashboard)/dashboard/connect/pay/components/webhooks.client.tsx`, `apps/dashboard/src/components/contract-components/tables/deployed-contracts.tsx`, `apps/dashboard/src/contract-ui/tabs/proposals/components/proposal.tsx`, `apps/dashboard/src/components/app-layouts/app.tsx`, `apps/dashboard/src/app/(dashboard)/dashboard/connect/ecosystem/[slug]/(active)/components/client/integration-permissions-toggle.client.tsx`, `apps/dashboard/src/app/account/settings/AccountSettingsPageUI.tsx`, `apps/dashboard/src/components/cmd-k-search/index.tsx`, `apps/dashboard/src/@3rdweb-sdk/react/hooks/useLoggedInUser.ts`, `apps/dashboard/src/components/contract-components/hooks.ts`, `apps/dashboard/src/@3rdweb-sdk/react/hooks/useRegistry.ts`, `apps/dashboard/src/contract-ui/tabs/manage/components/ModuleForm.tsx`, `apps/dashboard/src/app/team/[team_slug]/(team)/~/settings/general/GeneralSettingsPage.tsx`, `apps/dashboard/src/components/storage/your-files.tsx`, `apps/dashboard/src/components/contract-functions/interactive-abi-function.tsx`, `apps/dashboard/src/components/ipfs-upload/dropzone.tsx`, `apps/dashboard/src/core-ui/nft-drawer/useNftDrawerTabs.tsx`, `apps/dashboard/src/@3rdweb-sdk/react/hooks/useApi.ts`, `pnpm-lock.yaml`, `apps/dashboard/src/contract-ui/hooks/useRouteConfig.tsx`, `apps/dashboard/src/@3rdweb-sdk/react/hooks/useEngine.ts`
> ✨ Ask PR-Codex anything about this PR by commenting with `/codex {your question}`
<!-- end pr-codex -->
154 lines
4.4 KiB
TypeScript
154 lines
4.4 KiB
TypeScript
import { useMutation, useQuery, useQueryClient } from "@tanstack/react-query";
|
|
import { addContractToMultiChainRegistry } from "components/contract-components/utils";
|
|
import { MULTICHAIN_REGISTRY_CONTRACT } from "constants/contracts";
|
|
import {
|
|
DASHBOARD_ENGINE_RELAYER_URL,
|
|
DASHBOARD_FORWARDER_ADDRESS,
|
|
} from "constants/misc";
|
|
import type { BasicContract } from "contract-ui/types/types";
|
|
import { getAllMultichainRegistry } from "dashboard-extensions/common/read/getAllMultichainRegistry";
|
|
import { useAllChainsData } from "hooks/chains/allChains";
|
|
import { useSupportedChainsRecord } from "hooks/chains/configureChains";
|
|
import { useMemo } from "react";
|
|
import { sendAndConfirmTransaction } from "thirdweb";
|
|
import { remove } from "thirdweb/extensions/thirdweb";
|
|
import { useActiveAccount } from "thirdweb/react";
|
|
import invariant from "tiny-invariant";
|
|
|
|
function useMultiChainRegContractList(walletAddress?: string) {
|
|
return useQuery({
|
|
queryKey: ["dashboard-registry", walletAddress, "multichain-contract-list"],
|
|
queryFn: async () => {
|
|
invariant(walletAddress, "walletAddress is required");
|
|
const contracts = await getAllMultichainRegistry({
|
|
contract: MULTICHAIN_REGISTRY_CONTRACT,
|
|
address: walletAddress,
|
|
});
|
|
|
|
return contracts;
|
|
},
|
|
|
|
enabled: !!walletAddress,
|
|
});
|
|
}
|
|
|
|
interface Options {
|
|
onlyMainnet?: boolean;
|
|
}
|
|
|
|
export const useAllContractList = (
|
|
walletAddress: string | undefined,
|
|
{ onlyMainnet }: Options = { onlyMainnet: false },
|
|
) => {
|
|
const multiChainQuery = useMultiChainRegContractList(walletAddress);
|
|
|
|
const configuredChainsRecord = useSupportedChainsRecord();
|
|
const contractList = useMemo(() => {
|
|
const data = multiChainQuery.data || [];
|
|
|
|
const mainnets: BasicContract[] = [];
|
|
const testnets: BasicContract[] = [];
|
|
|
|
// biome-ignore lint/complexity/noForEach: FIXME
|
|
data.forEach((net) => {
|
|
if (net.chainId in configuredChainsRecord) {
|
|
const chainRecord = configuredChainsRecord[net.chainId];
|
|
if (chainRecord.status !== "deprecated") {
|
|
if (chainRecord.testnet) {
|
|
testnets.push(net);
|
|
} else {
|
|
mainnets.push(net);
|
|
}
|
|
}
|
|
}
|
|
});
|
|
|
|
mainnets.sort((a, b) => a.chainId - b.chainId);
|
|
|
|
if (onlyMainnet) {
|
|
return mainnets;
|
|
}
|
|
|
|
testnets.sort((a, b) => a.chainId - b.chainId);
|
|
return mainnets.concat(testnets);
|
|
}, [multiChainQuery.data, onlyMainnet, configuredChainsRecord]);
|
|
|
|
return {
|
|
...multiChainQuery,
|
|
data: contractList,
|
|
};
|
|
};
|
|
|
|
type RemoveContractParams = {
|
|
contractAddress: string;
|
|
chainId: number;
|
|
};
|
|
|
|
export function useRemoveContractMutation() {
|
|
const { chainIdToChainRecord } = useAllChainsData();
|
|
const queryClient = useQueryClient();
|
|
const account = useActiveAccount();
|
|
return useMutation({
|
|
mutationFn: async (data: RemoveContractParams) => {
|
|
invariant(chainIdToChainRecord, "chains not initialzed yet");
|
|
invariant(data.chainId, "chainId not provided");
|
|
invariant(account, "No wallet connected");
|
|
const { contractAddress, chainId } = data;
|
|
const transaction = remove({
|
|
contract: MULTICHAIN_REGISTRY_CONTRACT,
|
|
deployer: account.address,
|
|
deployment: contractAddress,
|
|
chainId: BigInt(chainId),
|
|
});
|
|
return await sendAndConfirmTransaction({
|
|
transaction,
|
|
account,
|
|
gasless: {
|
|
experimentalChainlessSupport: true,
|
|
provider: "engine",
|
|
relayerUrl: DASHBOARD_ENGINE_RELAYER_URL,
|
|
relayerForwarderAddress: DASHBOARD_FORWARDER_ADDRESS,
|
|
},
|
|
});
|
|
},
|
|
|
|
onSettled: () => {
|
|
return queryClient.invalidateQueries({
|
|
queryKey: ["dashboard-registry"],
|
|
});
|
|
},
|
|
});
|
|
}
|
|
|
|
type AddContractParams = {
|
|
contractAddress: string;
|
|
chainId: number;
|
|
};
|
|
|
|
export function useAddContractMutation() {
|
|
const account = useActiveAccount();
|
|
|
|
const queryClient = useQueryClient();
|
|
|
|
return useMutation({
|
|
mutationFn: async (data: AddContractParams) => {
|
|
invariant(account, "cannot add a contract without an address");
|
|
|
|
return await addContractToMultiChainRegistry(
|
|
{
|
|
address: data.contractAddress,
|
|
chainId: data.chainId,
|
|
},
|
|
account,
|
|
300000n,
|
|
);
|
|
},
|
|
|
|
onSettled: () => {
|
|
return queryClient.invalidateQueries({
|
|
queryKey: ["dashboard-registry"],
|
|
});
|
|
},
|
|
});
|
|
}
|