/** * Transak API utilities — shared across rFlows and rCart. * * Builds Transak widget URLs using direct query parameters. * The gateway session API has auth issues, so we use the direct * URL approach which Transak still supports. * * Environment: TRANSAK_ENV controls staging vs production. * API keys are split: TRANSAK_API_KEY_STAGING / TRANSAK_API_KEY_PRODUCTION * (falls back to legacy TRANSAK_API_KEY if per-env keys aren't set). */ const TRANSAK_WIDGET_BASE = 'https://global.transak.com'; const TRANSAK_WIDGET_BASE_STG = 'https://global-stg.transak.com'; export type TransakEnv = 'STAGING' | 'PRODUCTION'; /** Get the current Transak environment */ export function getTransakEnv(): TransakEnv { return (process.env.TRANSAK_ENV as TransakEnv) || 'STAGING'; } /** Get the API key for the current Transak environment */ export function getTransakApiKey(): string { const env = getTransakEnv(); return (env === 'PRODUCTION' ? process.env.TRANSAK_API_KEY_PRODUCTION : process.env.TRANSAK_API_KEY_STAGING ) || process.env.TRANSAK_API_KEY || ''; } /** Get the webhook secret for the current Transak environment */ export function getTransakWebhookSecret(): string { const env = getTransakEnv(); return (env === 'PRODUCTION' ? process.env.TRANSAK_WEBHOOK_SECRET_PRODUCTION : process.env.TRANSAK_WEBHOOK_SECRET_STAGING ) || process.env.TRANSAK_WEBHOOK_SECRET || ''; } /** Extract root domain from a hostname (e.g. "demo.rspace.online" → "rspace.online") */ export function extractRootDomain(host: string): string { const parts = host.replace(/:\d+$/, '').split('.'); return parts.length > 2 ? parts.slice(-2).join('.') : parts.join('.'); } export function createTransakWidgetUrl(params: Record): string { const env = getTransakEnv(); const base = env === 'PRODUCTION' ? TRANSAK_WIDGET_BASE : TRANSAK_WIDGET_BASE_STG; const url = new URL(base); for (const [key, value] of Object.entries(params)) { if (value != null && value !== '') { url.searchParams.set(key, value); } } return url.toString(); }