UNPKG

@frak-labs/react-sdk

Version:

React SDK of the Frak wallet, low level library to interact directly with the frak ecosystem.

59 lines (56 loc) 2.02 kB
import type { PrepareSsoParamsType } from "@frak-labs/core-sdk"; import { prepareSsoUrl } from "@frak-labs/core-sdk/actions"; import { ClientNotFound } from "@frak-labs/frame-connector"; import { useQuery } from "@tanstack/react-query"; import { useFrakClient } from "./useFrakClient"; /** * Hook that builds the SSO popup URL ahead of the user's click. * * Wraps {@link @frak-labs/core-sdk!actions.prepareSsoUrl | `prepareSsoUrl()`} * in a {@link @tanstack/react-query!useQuery | `useQuery()`}, so the URL is * resolved while the page is idle. Handing the result to `useOpenSso()` as * `{ ssoUrl }` lets the popup open in the same tick as the click, which is * what keeps popup blockers out of the flow. * * @param params - SSO parameters for URL generation * * @group hooks * * @returns The query wrapping the `prepareSsoUrl()` action, resolving to * `{ ssoUrl }` * * @example * ```tsx * const { data } = usePrepareSsoUrl({ metadata }); * const { mutate: openSso } = useOpenSso(); * * <button * disabled={!data} * onClick={() => data && openSso({ ssoUrl: data.ssoUrl })} * > * Login * </button> * ``` * * @remarks * The URL embeds a proof-of-possession valid for 10 minutes. Past that the SSO * still opens and the user still logs in — only the anonymous-to-wallet * identity link is lost. On a page that can sit open for a long time, refetch * rather than holding one URL indefinitely. * * @see {@link @frak-labs/core-sdk!actions.prepareSsoUrl | `prepareSsoUrl()`} for the underlying action * @see {@link useOpenSso | `useOpenSso()`} for opening the prepared URL */ export function usePrepareSsoUrl(params: PrepareSsoParamsType) { const client = useFrakClient(); return useQuery({ queryKey: ["frak-sdk", "prepare-sso-url", params], queryFn: async () => { if (!client) { throw new ClientNotFound(); } return prepareSsoUrl(client, params); }, enabled: !!client, }); }