'use client'; import { useEffect } from 'react'; import { resolvePublishedOfferSetSelection, resolvePublishedRuntimeExperiments, useBrowserLocationSearch, useFunnelRuntimeConfig, useRuntimeMode, } from '@funnelsgrove/runtime'; /** Mount once in the funnel shell so lazy checkout screens still collect risk signals. */ export function StripeFraudDetection({ featureFlags }: { featureFlags: Readonly>; }) { const { config } = useFunnelRuntimeConfig(); const [mode] = useRuntimeMode(); const search = useBrowserLocationSearch(); const { paymentProvidersByMode } = resolvePublishedOfferSetSelection({ offerSets: config?.offerSets ?? [], pricingExperiments: resolvePublishedRuntimeExperiments(config).pricingExperiments, featureFlags, search, defaultOfferSetId: config?.defaultOfferSetId ?? undefined, }); const isStripe = paymentProvidersByMode[mode] === 'stripe'; useEffect(() => { if (!isStripe) return; // The official side-effect import loads Stripe.js with advanced signals enabled. // Collection must never gate the quiz; checkout retains its own error handling. void import('@stripe/stripe-js').catch(() => {}); }, [isStripe]); return null; }