@usdctofiat/offramp 4.4.7 → 4.4.9
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +10 -0
- package/dist/{chunk-4DUIEYWQ.js → chunk-QOVUUH5L.js} +2 -2
- package/dist/{chunk-4DUIEYWQ.js.map → chunk-QOVUUH5L.js.map} +1 -1
- package/dist/index.cjs +2 -2
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +1 -1
- package/dist/index.d.ts +1 -1
- package/dist/index.js +2 -2
- package/dist/index.js.map +1 -1
- package/dist/react.cjs +5 -5
- package/dist/react.cjs.map +1 -1
- package/dist/react.js +5 -5
- package/dist/react.js.map +1 -1
- package/package.json +1 -1
package/dist/react.js
CHANGED
|
@@ -10,7 +10,7 @@ import {
|
|
|
10
10
|
isPeerExtensionMetadataBridgeAvailable,
|
|
11
11
|
offramp,
|
|
12
12
|
peerExtensionSdk
|
|
13
|
-
} from "./chunk-
|
|
13
|
+
} from "./chunk-QOVUUH5L.js";
|
|
14
14
|
|
|
15
15
|
// src/hooks/useOfframp.ts
|
|
16
16
|
import { useCallback, useRef, useState } from "react";
|
|
@@ -241,8 +241,8 @@ function usePeerExtensionRegistration(platform, options = {}) {
|
|
|
241
241
|
[startRegistrationCapture]
|
|
242
242
|
);
|
|
243
243
|
const completeRegistration = useCallback2(
|
|
244
|
-
async (walletClient, params,
|
|
245
|
-
const metadata =
|
|
244
|
+
async (walletClient, params, registrationOptions = {}) => {
|
|
245
|
+
const metadata = registrationOptions.capturedMetadata ?? capturedMetadata;
|
|
246
246
|
if (!metadata) {
|
|
247
247
|
const message = "No Peer metadata captured yet. Start registration first.";
|
|
248
248
|
setError(message);
|
|
@@ -256,7 +256,7 @@ function usePeerExtensionRegistration(platform, options = {}) {
|
|
|
256
256
|
identifier: params.identifier,
|
|
257
257
|
capturedMetadata: metadata
|
|
258
258
|
});
|
|
259
|
-
return await offramp(walletClient, params,
|
|
259
|
+
return await offramp(walletClient, params, registrationOptions.onProgress);
|
|
260
260
|
} catch (err) {
|
|
261
261
|
setError(
|
|
262
262
|
err instanceof Error ? err.message : "Couldn't complete Peer extension registration. Try capturing metadata again."
|
|
@@ -266,7 +266,7 @@ function usePeerExtensionRegistration(platform, options = {}) {
|
|
|
266
266
|
if (mountedRef.current) setBusy(false);
|
|
267
267
|
}
|
|
268
268
|
},
|
|
269
|
-
[
|
|
269
|
+
[capturedMetadata]
|
|
270
270
|
);
|
|
271
271
|
return {
|
|
272
272
|
phase,
|
package/dist/react.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/hooks/useOfframp.ts","../src/hooks/usePeerExtensionRegistration.ts"],"sourcesContent":["import { useCallback, useRef, useState } from \"react\";\nimport type { WalletClient } from \"viem\";\nimport type {\n OfframpCreateOptions,\n OfframpParams,\n OfframpResult,\n OfframpState,\n OfframpStep,\n DepositInfo,\n} from \"../types\";\nimport { createOfframp } from \"../offramp\";\nimport { deposits as depositsFn, close as closeFn } from \"../queries\";\nimport { OfframpError } from \"../errors\";\n\nexport interface UseOfframpReturn {\n state: OfframpState;\n step: OfframpStep | null;\n txHash: string | null;\n depositId: string | null;\n lastError: OfframpError | null;\n /** @deprecated Use `lastError` instead. */\n error: OfframpError | null;\n isLoading: boolean;\n offramp: (walletClient: WalletClient, params: OfframpParams) => Promise<OfframpResult>;\n deposits: (walletAddress: string) => Promise<DepositInfo[]>;\n close: (walletClient: WalletClient, depositId: string, escrowAddress?: string) => Promise<string>;\n reset: () => void;\n}\n\nfunction mapStepToState(step: OfframpStep): OfframpState {\n if (step === \"resuming\" || step === \"restricting\") return \"delegating\";\n if (step === \"done\") return \"done\";\n return step;\n}\n\nexport function useOfframp(defaultOptions: OfframpCreateOptions = {}): UseOfframpReturn {\n const [state, setState] = useState<OfframpState>(\"idle\");\n const [step, setStep] = useState<OfframpStep | null>(null);\n const [txHash, setTxHash] = useState<string | null>(null);\n const [depositId, setDepositId] = useState<string | null>(null);\n const [lastError, setLastError] = useState<OfframpError | null>(null);\n const [isLoading, setIsLoading] = useState(false);\n const lockRef = useRef(false);\n\n const reset = useCallback(() => {\n setState(\"idle\");\n setStep(null);\n setTxHash(null);\n setDepositId(null);\n setLastError(null);\n setIsLoading(false);\n lockRef.current = false;\n }, []);\n\n const offramp = useCallback(\n async (walletClient: WalletClient, params: OfframpParams): Promise<OfframpResult> => {\n if (lockRef.current) throw new OfframpError(\"Deposit already in progress\", \"VALIDATION\");\n lockRef.current = true;\n setIsLoading(true);\n setState(\"idle\");\n setLastError(null);\n setStep(null);\n setTxHash(null);\n setDepositId(null);\n\n try {\n const sdk = createOfframp({\n walletClient,\n integratorId: params.integratorId ?? defaultOptions.integratorId,\n referralId: params.referralId ?? defaultOptions.referralId,\n telemetry: defaultOptions.telemetry,\n });\n const result = await sdk.createDeposit(params, (progress) => {\n setStep(progress.step);\n setState(mapStepToState(progress.step));\n if (progress.txHash) setTxHash(progress.txHash);\n if (progress.depositId) setDepositId(progress.depositId);\n });\n setState(\"done\");\n setDepositId(result.depositId);\n setTxHash(result.txHash);\n return result;\n } catch (err) {\n const offrampError =\n err instanceof OfframpError\n ? err\n : new OfframpError(\n err instanceof Error ? err.message : \"Offramp failed\",\n \"DEPOSIT_FAILED\",\n );\n setLastError(offrampError);\n setState(\"error\");\n throw offrampError;\n } finally {\n setIsLoading(false);\n lockRef.current = false;\n }\n },\n [defaultOptions.integratorId, defaultOptions.referralId, defaultOptions.telemetry],\n );\n\n return {\n state,\n step,\n txHash,\n depositId,\n lastError,\n error: lastError,\n isLoading,\n offramp,\n deposits: depositsFn,\n close: closeFn,\n reset,\n };\n}\n","import { useCallback, useEffect, useMemo, useRef, useState } from \"react\";\nimport type { WalletClient } from \"viem\";\nimport { offramp as createDeposit } from \"../deposit\";\nimport {\n peerExtensionSdk,\n isPeerExtensionMetadataBridgeAvailable,\n type PeerExtensionState,\n DEFAULT_EXTENSION_INSTALL_URL,\n type PeerMetadataMessage,\n} from \"../extension\";\nimport {\n completePeerExtensionRegistration,\n getPeerExtensionRegistrationAuthParams,\n getPeerExtensionRegistrationInfo,\n type PeerExtensionRegistrationInfo,\n type PlatformEntry,\n} from \"../platforms\";\nimport type { OfframpParams, OfframpResult, OnProgress } from \"../types\";\n\n/**\n * Phase surfaced to callers:\n * - `checking` — polling the extension state on mount\n * - `needs_install` — the Peer extension is not installed; call\n * `installExtension()` or surface the install URL\n * - `needs_connection` — the extension is installed but this origin is not\n * yet approved; call `connectExtension()` to trigger the Peer approval\n * prompt\n * - `ready` — extension installed and origin approved; call\n * `startRegistrationCapture()` to launch headless metadata capture, or just\n * retry the `offramp(...)` call\n * - `unsupported` — the provided platform does not require extension\n * registration; the hook is a no-op for it\n */\nexport type PeerExtensionRegistrationPhase =\n | \"checking\"\n | \"needs_install\"\n | \"needs_connection\"\n | \"ready\"\n | \"unsupported\";\n\nexport interface UsePeerExtensionRegistrationReturn {\n /** Current handshake phase. */\n phase: PeerExtensionRegistrationPhase;\n /**\n * Registration metadata for this platform (prompt copy, CTA label, min\n * extension version). `null` for platforms that don't require extension\n * registration, in which case `phase === \"unsupported\"`.\n */\n info: PeerExtensionRegistrationInfo | null;\n /** True while a `requestConnection()` or initial state check is in flight. */\n busy: boolean;\n /** Last error from `requestConnection()` / `authenticate()`, if any. */\n error: string | null;\n /** Last metadata payload captured for this platform. */\n capturedMetadata: PeerMetadataMessage | null;\n /** Re-poll `peerExtensionSdk.getState()`. Call after the user finishes metadata capture. */\n refresh: () => Promise<void>;\n /**\n * Open the Chrome Web Store listing for the Peer extension. Falls back to\n * `window.open(DEFAULT_EXTENSION_INSTALL_URL)` outside of browsers where\n * `openInstallPage()` would throw.\n */\n installExtension: () => void;\n /**\n * Request an origin connection. Triggers the Peer extension's approval\n * prompt. Returns `true` if the user approved, `false` otherwise.\n */\n connectExtension: () => Promise<boolean>;\n /**\n * Launch headless Peer metadata capture for this provider. Safe to call from\n * any phase — the hook will fall back to install/connect if those steps\n * aren't done yet.\n */\n startRegistrationCapture: () => Promise<void>;\n /**\n * Deprecated compatibility alias for `startRegistrationCapture()`.\n */\n openVerifySidebar: () => Promise<void>;\n completeRegistration: (\n walletClient: WalletClient,\n params: OfframpParams,\n options?: {\n capturedMetadata?: PeerMetadataMessage;\n onProgress?: OnProgress;\n attestationServiceUrl?: string | null;\n },\n ) => Promise<OfframpResult>;\n}\n\n/**\n * React hook that drives the Peer extension handshake required for PayPal\n * and Wise makers.\n *\n * ```tsx\n * import { PLATFORMS } from \"@usdctofiat/offramp\";\n * import { useOfframp, usePeerExtensionRegistration } from \"@usdctofiat/offramp/react\";\n *\n * function PayPalSellButton() {\n * const { offramp, lastError } = useOfframp();\n * const peer = usePeerExtensionRegistration(PLATFORMS.PAYPAL);\n *\n * const needsExtension = lastError?.code === \"EXTENSION_REGISTRATION_REQUIRED\";\n *\n * return (\n * <>\n * <button onClick={() => offramp(walletClient, params)}>Sell USDC</button>\n * {needsExtension && peer.phase === \"needs_install\" && (\n * <button onClick={peer.installExtension}>Install Peer Extension</button>\n * )}\n * {needsExtension && peer.phase === \"needs_connection\" && (\n * <button onClick={peer.connectExtension} disabled={peer.busy}>\n * Connect Peer Extension\n * </button>\n * )}\n * {needsExtension && peer.phase === \"ready\" && (\n * <button onClick={peer.startRegistrationCapture}>Register with Peer</button>\n * )}\n * </>\n * );\n * }\n * ```\n */\nexport function usePeerExtensionRegistration(\n platform: PlatformEntry | null | undefined,\n options: { callerAddress?: string | null; attestationServiceUrl?: string | null } = {},\n): UsePeerExtensionRegistrationReturn {\n const platformId = platform?.id ?? null;\n const info = platformId ? getPeerExtensionRegistrationInfo(platformId) : null;\n const callerAddress = options.callerAddress?.trim() || null;\n const attestationServiceUrl = options.attestationServiceUrl ?? null;\n const authParams = useMemo(\n () =>\n platformId\n ? getPeerExtensionRegistrationAuthParams(platformId, {\n attestationServiceUrl,\n callerAddress,\n })\n : null,\n [attestationServiceUrl, callerAddress, platformId],\n );\n const [phase, setPhase] = useState<PeerExtensionRegistrationPhase>(\n info ? \"checking\" : \"unsupported\",\n );\n const [busy, setBusy] = useState(false);\n const [error, setError] = useState<string | null>(null);\n const [capturedMetadata, setCapturedMetadata] = useState<PeerMetadataMessage | null>(null);\n const mountedRef = useRef(true);\n const providerId = info?.providerId ?? null;\n const metadataPlatform = authParams?.platform ?? null;\n\n const refresh = useCallback(async () => {\n if (!providerId) {\n setPhase(\"unsupported\");\n return;\n }\n try {\n const state = await peerExtensionSdk.getState();\n if (!mountedRef.current) return;\n if (state === \"ready\" && !isPeerExtensionMetadataBridgeAvailable()) {\n setPhase(\"needs_install\");\n return;\n }\n setPhase(mapSdkState(state));\n } catch {\n if (!mountedRef.current) return;\n setPhase(\"needs_install\");\n }\n }, [providerId]);\n\n useEffect(() => {\n mountedRef.current = true;\n setError(null);\n setBusy(false);\n setCapturedMetadata(null);\n if (!providerId) {\n setPhase(\"unsupported\");\n } else {\n setPhase(\"checking\");\n refresh();\n }\n return () => {\n mountedRef.current = false;\n };\n }, [providerId, refresh]);\n\n useEffect(() => {\n setCapturedMetadata(null);\n if (!metadataPlatform) return;\n\n try {\n return peerExtensionSdk.onMetadataMessage((message) => {\n if (!mountedRef.current || message.platform !== metadataPlatform) return;\n setCapturedMetadata(message);\n if (message.errorMessage) {\n setError(message.errorMessage);\n }\n });\n } catch {\n return;\n }\n }, [metadataPlatform, phase]);\n\n const installExtension = useCallback(() => {\n setError(null);\n try {\n peerExtensionSdk.openInstallPage();\n } catch {\n if (typeof window !== \"undefined\") {\n window.open(DEFAULT_EXTENSION_INSTALL_URL, \"_blank\", \"noopener,noreferrer\");\n }\n }\n }, []);\n\n const connectExtension = useCallback(async (): Promise<boolean> => {\n if (!authParams) return false;\n setError(null);\n setBusy(true);\n try {\n const approved = await peerExtensionSdk.requestConnection();\n if (!mountedRef.current) return approved;\n if (approved) {\n setPhase(isPeerExtensionMetadataBridgeAvailable() ? \"ready\" : \"needs_install\");\n } else {\n setError(\"Connection was not approved. Try again once you've approved Peer.\");\n }\n return approved;\n } catch (err) {\n if (!mountedRef.current) return false;\n setError(\n err instanceof Error\n ? err.message\n : \"Couldn't request a Peer extension connection. Make sure Peer is installed and enabled.\",\n );\n refresh();\n return false;\n } finally {\n if (mountedRef.current) setBusy(false);\n }\n }, [authParams, refresh]);\n\n const startRegistrationCapture = useCallback(async () => {\n if (!authParams) return;\n setError(null);\n setBusy(true);\n try {\n const state = await peerExtensionSdk.getState().catch(() => \"needs_install\" as const);\n if (!mountedRef.current) return;\n const nextPhase =\n state === \"ready\" && !isPeerExtensionMetadataBridgeAvailable()\n ? \"needs_install\"\n : mapSdkState(state);\n setPhase(nextPhase);\n if (nextPhase === \"needs_install\") {\n installExtension();\n return;\n }\n if (nextPhase === \"needs_connection\") {\n const approved = await peerExtensionSdk.requestConnection();\n if (!mountedRef.current) return;\n if (!approved) {\n setError(\"Connection was not approved. Try again once you've approved Peer.\");\n return;\n }\n if (!isPeerExtensionMetadataBridgeAvailable()) {\n setPhase(\"needs_install\");\n installExtension();\n return;\n }\n setPhase(\"ready\");\n }\n setCapturedMetadata(null);\n peerExtensionSdk.authenticate(authParams);\n } catch (err) {\n setError(\n err instanceof Error\n ? err.message\n : \"Couldn't start Peer extension registration. Make sure Peer is enabled.\",\n );\n refresh();\n } finally {\n if (mountedRef.current) setBusy(false);\n }\n }, [authParams, installExtension, refresh]);\n\n const openVerifySidebar = useCallback(\n async () => startRegistrationCapture(),\n [startRegistrationCapture],\n );\n\n const completeRegistration = useCallback(\n async (\n walletClient: WalletClient,\n params: OfframpParams,\n options: {\n capturedMetadata?: PeerMetadataMessage;\n onProgress?: OnProgress;\n attestationServiceUrl?: string | null;\n } = {},\n ): Promise<OfframpResult> => {\n const metadata = options.capturedMetadata ?? capturedMetadata;\n if (!metadata) {\n const message = \"No Peer metadata captured yet. Start registration first.\";\n setError(message);\n throw new Error(message);\n }\n\n setError(null);\n setBusy(true);\n try {\n await completePeerExtensionRegistration({\n platform: params.platform,\n identifier: params.identifier,\n capturedMetadata: metadata,\n });\n return await createDeposit(walletClient, params, options.onProgress);\n } catch (err) {\n setError(\n err instanceof Error\n ? err.message\n : \"Couldn't complete Peer extension registration. Try capturing metadata again.\",\n );\n throw err;\n } finally {\n if (mountedRef.current) setBusy(false);\n }\n },\n [callerAddress, capturedMetadata],\n );\n\n return {\n phase,\n info,\n busy,\n error,\n capturedMetadata,\n refresh,\n installExtension,\n connectExtension,\n startRegistrationCapture,\n openVerifySidebar,\n completeRegistration,\n };\n}\n\nfunction mapSdkState(state: PeerExtensionState): PeerExtensionRegistrationPhase {\n if (state === \"needs_install\") return \"needs_install\";\n if (state === \"needs_connection\") return \"needs_connection\";\n return \"ready\";\n}\n"],"mappings":"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","names":["offramp","useCallback","useRef","useState","useState","useRef","useCallback","options"]}
|
|
1
|
+
{"version":3,"sources":["../src/hooks/useOfframp.ts","../src/hooks/usePeerExtensionRegistration.ts"],"sourcesContent":["import { useCallback, useRef, useState } from \"react\";\nimport type { WalletClient } from \"viem\";\nimport type {\n OfframpCreateOptions,\n OfframpParams,\n OfframpResult,\n OfframpState,\n OfframpStep,\n DepositInfo,\n} from \"../types\";\nimport { createOfframp } from \"../offramp\";\nimport { deposits as depositsFn, close as closeFn } from \"../queries\";\nimport { OfframpError } from \"../errors\";\n\nexport interface UseOfframpReturn {\n state: OfframpState;\n step: OfframpStep | null;\n txHash: string | null;\n depositId: string | null;\n lastError: OfframpError | null;\n /** @deprecated Use `lastError` instead. */\n error: OfframpError | null;\n isLoading: boolean;\n offramp: (walletClient: WalletClient, params: OfframpParams) => Promise<OfframpResult>;\n deposits: (walletAddress: string) => Promise<DepositInfo[]>;\n close: (walletClient: WalletClient, depositId: string, escrowAddress?: string) => Promise<string>;\n reset: () => void;\n}\n\nfunction mapStepToState(step: OfframpStep): OfframpState {\n if (step === \"resuming\" || step === \"restricting\") return \"delegating\";\n if (step === \"done\") return \"done\";\n return step;\n}\n\nexport function useOfframp(defaultOptions: OfframpCreateOptions = {}): UseOfframpReturn {\n const [state, setState] = useState<OfframpState>(\"idle\");\n const [step, setStep] = useState<OfframpStep | null>(null);\n const [txHash, setTxHash] = useState<string | null>(null);\n const [depositId, setDepositId] = useState<string | null>(null);\n const [lastError, setLastError] = useState<OfframpError | null>(null);\n const [isLoading, setIsLoading] = useState(false);\n const lockRef = useRef(false);\n\n const reset = useCallback(() => {\n setState(\"idle\");\n setStep(null);\n setTxHash(null);\n setDepositId(null);\n setLastError(null);\n setIsLoading(false);\n lockRef.current = false;\n }, []);\n\n const offramp = useCallback(\n async (walletClient: WalletClient, params: OfframpParams): Promise<OfframpResult> => {\n if (lockRef.current) throw new OfframpError(\"Deposit already in progress\", \"VALIDATION\");\n lockRef.current = true;\n setIsLoading(true);\n setState(\"idle\");\n setLastError(null);\n setStep(null);\n setTxHash(null);\n setDepositId(null);\n\n try {\n const sdk = createOfframp({\n walletClient,\n integratorId: params.integratorId ?? defaultOptions.integratorId,\n referralId: params.referralId ?? defaultOptions.referralId,\n telemetry: defaultOptions.telemetry,\n });\n const result = await sdk.createDeposit(params, (progress) => {\n setStep(progress.step);\n setState(mapStepToState(progress.step));\n if (progress.txHash) setTxHash(progress.txHash);\n if (progress.depositId) setDepositId(progress.depositId);\n });\n setState(\"done\");\n setDepositId(result.depositId);\n setTxHash(result.txHash);\n return result;\n } catch (err) {\n const offrampError =\n err instanceof OfframpError\n ? err\n : new OfframpError(\n err instanceof Error ? err.message : \"Offramp failed\",\n \"DEPOSIT_FAILED\",\n );\n setLastError(offrampError);\n setState(\"error\");\n throw offrampError;\n } finally {\n setIsLoading(false);\n lockRef.current = false;\n }\n },\n [defaultOptions.integratorId, defaultOptions.referralId, defaultOptions.telemetry],\n );\n\n return {\n state,\n step,\n txHash,\n depositId,\n lastError,\n error: lastError,\n isLoading,\n offramp,\n deposits: depositsFn,\n close: closeFn,\n reset,\n };\n}\n","import { useCallback, useEffect, useMemo, useRef, useState } from \"react\";\nimport type { WalletClient } from \"viem\";\nimport { offramp as createDeposit } from \"../deposit\";\nimport {\n peerExtensionSdk,\n isPeerExtensionMetadataBridgeAvailable,\n type PeerExtensionState,\n DEFAULT_EXTENSION_INSTALL_URL,\n type PeerMetadataMessage,\n} from \"../extension\";\nimport {\n completePeerExtensionRegistration,\n getPeerExtensionRegistrationAuthParams,\n getPeerExtensionRegistrationInfo,\n type PeerExtensionRegistrationInfo,\n type PlatformEntry,\n} from \"../platforms\";\nimport type { OfframpParams, OfframpResult, OnProgress } from \"../types\";\n\n/**\n * Phase surfaced to callers:\n * - `checking` — polling the extension state on mount\n * - `needs_install` — the Peer extension is not installed; call\n * `installExtension()` or surface the install URL\n * - `needs_connection` — the extension is installed but this origin is not\n * yet approved; call `connectExtension()` to trigger the Peer approval\n * prompt\n * - `ready` — extension installed and origin approved; call\n * `startRegistrationCapture()` to launch headless metadata capture, or just\n * retry the `offramp(...)` call\n * - `unsupported` — the provided platform does not require extension\n * registration; the hook is a no-op for it\n */\nexport type PeerExtensionRegistrationPhase =\n | \"checking\"\n | \"needs_install\"\n | \"needs_connection\"\n | \"ready\"\n | \"unsupported\";\n\nexport interface UsePeerExtensionRegistrationReturn {\n /** Current handshake phase. */\n phase: PeerExtensionRegistrationPhase;\n /**\n * Registration metadata for this platform (prompt copy, CTA label, min\n * extension version). `null` for platforms that don't require extension\n * registration, in which case `phase === \"unsupported\"`.\n */\n info: PeerExtensionRegistrationInfo | null;\n /** True while a `requestConnection()` or initial state check is in flight. */\n busy: boolean;\n /** Last error from `requestConnection()` / `authenticate()`, if any. */\n error: string | null;\n /** Last metadata payload captured for this platform. */\n capturedMetadata: PeerMetadataMessage | null;\n /** Re-poll `peerExtensionSdk.getState()`. Call after the user finishes metadata capture. */\n refresh: () => Promise<void>;\n /**\n * Open the Chrome Web Store listing for the Peer extension. Falls back to\n * `window.open(DEFAULT_EXTENSION_INSTALL_URL)` outside of browsers where\n * `openInstallPage()` would throw.\n */\n installExtension: () => void;\n /**\n * Request an origin connection. Triggers the Peer extension's approval\n * prompt. Returns `true` if the user approved, `false` otherwise.\n */\n connectExtension: () => Promise<boolean>;\n /**\n * Launch headless Peer metadata capture for this provider. Safe to call from\n * any phase — the hook will fall back to install/connect if those steps\n * aren't done yet.\n */\n startRegistrationCapture: () => Promise<void>;\n /**\n * Deprecated compatibility alias for `startRegistrationCapture()`.\n */\n openVerifySidebar: () => Promise<void>;\n completeRegistration: (\n walletClient: WalletClient,\n params: OfframpParams,\n options?: {\n capturedMetadata?: PeerMetadataMessage;\n onProgress?: OnProgress;\n attestationServiceUrl?: string | null;\n },\n ) => Promise<OfframpResult>;\n}\n\n/**\n * React hook that drives the Peer extension handshake required for PayPal\n * and Wise makers.\n *\n * ```tsx\n * import { PLATFORMS } from \"@usdctofiat/offramp\";\n * import { useOfframp, usePeerExtensionRegistration } from \"@usdctofiat/offramp/react\";\n *\n * function PayPalSellButton() {\n * const { offramp, lastError } = useOfframp();\n * const peer = usePeerExtensionRegistration(PLATFORMS.PAYPAL);\n *\n * const needsExtension = lastError?.code === \"EXTENSION_REGISTRATION_REQUIRED\";\n *\n * return (\n * <>\n * <button onClick={() => offramp(walletClient, params)}>Sell USDC</button>\n * {needsExtension && peer.phase === \"needs_install\" && (\n * <button onClick={peer.installExtension}>Install Peer Extension</button>\n * )}\n * {needsExtension && peer.phase === \"needs_connection\" && (\n * <button onClick={peer.connectExtension} disabled={peer.busy}>\n * Connect Peer Extension\n * </button>\n * )}\n * {needsExtension && peer.phase === \"ready\" && (\n * <button onClick={peer.startRegistrationCapture}>Register with Peer</button>\n * )}\n * </>\n * );\n * }\n * ```\n */\nexport function usePeerExtensionRegistration(\n platform: PlatformEntry | null | undefined,\n options: { callerAddress?: string | null; attestationServiceUrl?: string | null } = {},\n): UsePeerExtensionRegistrationReturn {\n const platformId = platform?.id ?? null;\n const info = platformId ? getPeerExtensionRegistrationInfo(platformId) : null;\n const callerAddress = options.callerAddress?.trim() || null;\n const attestationServiceUrl = options.attestationServiceUrl ?? null;\n const authParams = useMemo(\n () =>\n platformId\n ? getPeerExtensionRegistrationAuthParams(platformId, {\n attestationServiceUrl,\n callerAddress,\n })\n : null,\n [attestationServiceUrl, callerAddress, platformId],\n );\n const [phase, setPhase] = useState<PeerExtensionRegistrationPhase>(\n info ? \"checking\" : \"unsupported\",\n );\n const [busy, setBusy] = useState(false);\n const [error, setError] = useState<string | null>(null);\n const [capturedMetadata, setCapturedMetadata] = useState<PeerMetadataMessage | null>(null);\n const mountedRef = useRef(true);\n const providerId = info?.providerId ?? null;\n const metadataPlatform = authParams?.platform ?? null;\n\n const refresh = useCallback(async () => {\n if (!providerId) {\n setPhase(\"unsupported\");\n return;\n }\n try {\n const state = await peerExtensionSdk.getState();\n if (!mountedRef.current) return;\n if (state === \"ready\" && !isPeerExtensionMetadataBridgeAvailable()) {\n setPhase(\"needs_install\");\n return;\n }\n setPhase(mapSdkState(state));\n } catch {\n if (!mountedRef.current) return;\n setPhase(\"needs_install\");\n }\n }, [providerId]);\n\n useEffect(() => {\n mountedRef.current = true;\n setError(null);\n setBusy(false);\n setCapturedMetadata(null);\n if (!providerId) {\n setPhase(\"unsupported\");\n } else {\n setPhase(\"checking\");\n refresh();\n }\n return () => {\n mountedRef.current = false;\n };\n }, [providerId, refresh]);\n\n useEffect(() => {\n setCapturedMetadata(null);\n if (!metadataPlatform) return;\n\n try {\n return peerExtensionSdk.onMetadataMessage((message) => {\n if (!mountedRef.current || message.platform !== metadataPlatform) return;\n setCapturedMetadata(message);\n if (message.errorMessage) {\n setError(message.errorMessage);\n }\n });\n } catch {\n return;\n }\n }, [metadataPlatform, phase]);\n\n const installExtension = useCallback(() => {\n setError(null);\n try {\n peerExtensionSdk.openInstallPage();\n } catch {\n if (typeof window !== \"undefined\") {\n window.open(DEFAULT_EXTENSION_INSTALL_URL, \"_blank\", \"noopener,noreferrer\");\n }\n }\n }, []);\n\n const connectExtension = useCallback(async (): Promise<boolean> => {\n if (!authParams) return false;\n setError(null);\n setBusy(true);\n try {\n const approved = await peerExtensionSdk.requestConnection();\n if (!mountedRef.current) return approved;\n if (approved) {\n setPhase(isPeerExtensionMetadataBridgeAvailable() ? \"ready\" : \"needs_install\");\n } else {\n setError(\"Connection was not approved. Try again once you've approved Peer.\");\n }\n return approved;\n } catch (err) {\n if (!mountedRef.current) return false;\n setError(\n err instanceof Error\n ? err.message\n : \"Couldn't request a Peer extension connection. Make sure Peer is installed and enabled.\",\n );\n refresh();\n return false;\n } finally {\n if (mountedRef.current) setBusy(false);\n }\n }, [authParams, refresh]);\n\n const startRegistrationCapture = useCallback(async () => {\n if (!authParams) return;\n setError(null);\n setBusy(true);\n try {\n const state = await peerExtensionSdk.getState().catch(() => \"needs_install\" as const);\n if (!mountedRef.current) return;\n const nextPhase =\n state === \"ready\" && !isPeerExtensionMetadataBridgeAvailable()\n ? \"needs_install\"\n : mapSdkState(state);\n setPhase(nextPhase);\n if (nextPhase === \"needs_install\") {\n installExtension();\n return;\n }\n if (nextPhase === \"needs_connection\") {\n const approved = await peerExtensionSdk.requestConnection();\n if (!mountedRef.current) return;\n if (!approved) {\n setError(\"Connection was not approved. Try again once you've approved Peer.\");\n return;\n }\n if (!isPeerExtensionMetadataBridgeAvailable()) {\n setPhase(\"needs_install\");\n installExtension();\n return;\n }\n setPhase(\"ready\");\n }\n setCapturedMetadata(null);\n peerExtensionSdk.authenticate(authParams);\n } catch (err) {\n setError(\n err instanceof Error\n ? err.message\n : \"Couldn't start Peer extension registration. Make sure Peer is enabled.\",\n );\n refresh();\n } finally {\n if (mountedRef.current) setBusy(false);\n }\n }, [authParams, installExtension, refresh]);\n\n const openVerifySidebar = useCallback(\n async () => startRegistrationCapture(),\n [startRegistrationCapture],\n );\n\n const completeRegistration = useCallback(\n async (\n walletClient: WalletClient,\n params: OfframpParams,\n registrationOptions: {\n capturedMetadata?: PeerMetadataMessage;\n onProgress?: OnProgress;\n attestationServiceUrl?: string | null;\n } = {},\n ): Promise<OfframpResult> => {\n const metadata = registrationOptions.capturedMetadata ?? capturedMetadata;\n if (!metadata) {\n const message = \"No Peer metadata captured yet. Start registration first.\";\n setError(message);\n throw new Error(message);\n }\n\n setError(null);\n setBusy(true);\n try {\n await completePeerExtensionRegistration({\n platform: params.platform,\n identifier: params.identifier,\n capturedMetadata: metadata,\n });\n return await createDeposit(walletClient, params, registrationOptions.onProgress);\n } catch (err) {\n setError(\n err instanceof Error\n ? err.message\n : \"Couldn't complete Peer extension registration. Try capturing metadata again.\",\n );\n throw err;\n } finally {\n if (mountedRef.current) setBusy(false);\n }\n },\n [capturedMetadata],\n );\n\n return {\n phase,\n info,\n busy,\n error,\n capturedMetadata,\n refresh,\n installExtension,\n connectExtension,\n startRegistrationCapture,\n openVerifySidebar,\n completeRegistration,\n };\n}\n\nfunction mapSdkState(state: PeerExtensionState): PeerExtensionRegistrationPhase {\n if (state === \"needs_install\") return \"needs_install\";\n if (state === \"needs_connection\") return \"needs_connection\";\n return \"ready\";\n}\n"],"mappings":"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","names":["offramp","useCallback","useRef","useState","useState","useRef","useCallback"]}
|