UNPKG

@frak-labs/core-sdk

Version:

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

89 lines (79 loc) 3.08 kB
import { getBackendUrl } from "../config/backendUrl"; import { getClientId } from "../config/clientId"; import { sdkConfigStore } from "../config/sdkConfigStore"; /** * Function used to track the status of a purchase * when a purchase is tracked, the `purchaseCompleted` interactions will be automatically send for the user when we receive the purchase confirmation via webhook. * * @param args.customerId - The customer id that made the purchase (on your side) * @param args.orderId - The order id of the purchase (on your side) * @param args.token - The token of the purchase * @param args.merchantId - Optional explicit merchant id to use for the tracking request * * @description This function will send a request to the backend to listen for the purchase status. * * @example * async function trackPurchase(checkout) { * const payload = { * customerId: checkout.order.customer.id, * orderId: checkout.order.id, * token: checkout.token, * merchantId: "your-merchant-id", * }; * * await trackPurchaseStatus(payload); * } * * @remarks * - Merchant id is resolved in this order: explicit `args.merchantId`, then `sdkConfigStore.resolveMerchantId()` (config store → sessionStorage → backend fetch). * - This function supports anonymous users and will use the `x-frak-client-id` header when available. * - At least one identity source must exist (`frak-wallet-interaction-token` or `x-frak-client-id`), otherwise the tracking request is skipped. * - This function will print a warning if used in a non-browser environment or if no identity / merchant id can be resolved. */ export async function trackPurchaseStatus(args: { customerId: string | number; orderId: string | number; token: string; merchantId?: string; }) { if (typeof window === "undefined") { console.warn("[Frak] No window found, can't track purchase"); return; } const interactionToken = window.sessionStorage.getItem( "frak-wallet-interaction-token" ); const clientId = getClientId(); if (!interactionToken && !clientId) { console.warn("[Frak] No identity found, skipping purchase check"); return; } const merchantId = args.merchantId ?? (await sdkConfigStore.resolveMerchantId()); if (!merchantId) { console.warn("[Frak] No merchant id found, skipping purchase check"); return; } const headers: Record<string, string> = { Accept: "application/json", "Content-Type": "application/json", }; if (interactionToken) { headers["x-wallet-sdk-auth"] = interactionToken; } if (clientId) { headers["x-frak-client-id"] = clientId; } // Submit the listening request const backendUrl = getBackendUrl(); await fetch(`${backendUrl}/user/track/purchase`, { method: "POST", headers, body: JSON.stringify({ customerId: args.customerId, orderId: args.orderId, token: args.token, merchantId, }), }); }