"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"; /** * Embeds another thirdweb-supported site for seamless in-app and ecosystem wallet connection. * * Make sure the embedded site includes and supports frame ancestors, see [here](https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Content-Security-Policy/frame-ancestors) for more information. * * The embedded site must support the connected wallet (ecosystem or in-app). * * @param {Object} props - The props to pass to the iframe * @param {String} props.src - The URL of the site to embed * @param {ThirdwebClient} props.client - The current site's thirdweb client * @param {Ecosystem} [props.ecosystem] - The ecosystem to use for the wallet connection in the embedded site * * @example * ```tsx * import { SiteEmbed } from "thirdweb/react"; * * * ``` * @walletConnection */ export function SiteEmbed({ src, client, ecosystem, ...props }: { src: string; client: ThirdwebClient; ecosystem?: Ecosystem; } & React.DetailedHTMLProps< React.IframeHTMLAttributes, HTMLIFrameElement >) { if (!client.clientId) { throw new Error("The SiteEmbed 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-embed", walletId, src, client.clientId, ecosystem], }); const url = new URL(src); 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 (