"use client";
import { useQuery } from "@tanstack/react-query";
import type { ThirdwebClient } from "../../../client/client.js";
import { getLastAuthProvider } from "../../../react/core/utils/storage.js";
import { webLocalStorage } from "../../../utils/storage/webStorage.js";
import { isEcosystemWallet } from "../../../wallets/ecosystem/is-ecosystem-wallet.js";
import { ClientScopedStorage } from "../../../wallets/in-app/core/authentication/client-scoped-storage.js";
import type { Ecosystem } from "../../../wallets/in-app/core/wallet/types.js";
import { useActiveWallet } from "../../core/hooks/wallets/useActiveWallet.js";
/**
* Creates a link to another thirdweb-supported site with wallet connection parameters.
*
* The target site must support the connected wallet (ecosystem or in-app).
*
* @param {Object} props - The props to pass to the anchor tag
* @param {String} props.href - The URL of the site to link to
* @param {ThirdwebClient} props.client - The current site's thirdweb client
* @param {Ecosystem} [props.ecosystem] - The ecosystem to use for the wallet connection in the target site
* @param {React.ReactNode} props.children - The content to render inside the link
*
* @example
* ```tsx
* import { SiteLink } from "thirdweb/react";
*
*
* Visit Site
*
* ```
* @walletConnection
*/
export function SiteLink({
href,
client,
ecosystem,
children,
...props
}: {
href: string;
client: ThirdwebClient;
ecosystem?: Ecosystem;
children: React.ReactNode;
} & Omit, "href">) {
if (!client.clientId) {
throw new Error("The SiteLink client must have a clientId");
}
const activeWallet = useActiveWallet();
const walletId = activeWallet?.id;
const { data: { authProvider, authCookie } = {} } = useQuery({
enabled:
activeWallet &&
(isEcosystemWallet(activeWallet) ||
walletId === "inApp" ||
walletId === "smart"),
queryFn: async () => {
const storage = new ClientScopedStorage({
clientId: client.clientId,
ecosystem,
storage: webLocalStorage,
});
const authProvider = await getLastAuthProvider(webLocalStorage);
const authCookie = await storage.getAuthCookie();
return { authCookie, authProvider };
},
queryKey: ["site-link", walletId, href, client.clientId, ecosystem],
});
const url = new URL(href);
if (walletId) {
url.searchParams.set("walletId", walletId === "smart" ? "inApp" : walletId);
}
if (authProvider) {
url.searchParams.set("authProvider", authProvider);
}
if (authCookie) {
url.searchParams.set("authCookie", authCookie);
}
return (
{children}
);
}