/** * useDynamicPricing Hook * * Extracts and centralizes all dynamic pricing related calculations * for the checkout summary component. * * Final Freeze Architecture: Quotes are created at Submit time only. * This hook handles preview-time display calculations. */ import type { TCheckoutSession, TLineItemExpanded, TPaymentCurrency, TPaymentIntent } from '@blocklet/payment-types'; export interface LiveRateInfo { rate?: string; provider_id?: string; provider_name?: string; provider_display?: string; base_currency?: string; timestamp_ms?: number; fetched_at?: number; } export interface LiveQuoteSnapshot { id: string; quoted_amount: string; exchange_rate: string; expires_at: number; rate_timestamp_ms?: number | null; renewed?: boolean; } export interface DiscountInfo { promotion_code?: string; coupon?: string; discount_amount?: string; coupon_details?: { percent_off?: number; amount_off?: string; currency_id?: string; currency_options?: Record; }; } export interface DynamicPricingOptions { items: TLineItemExpanded[]; currency: TPaymentCurrency; liveRate?: LiveRateInfo; liveQuoteSnapshot?: LiveQuoteSnapshot; checkoutSession?: TCheckoutSession; paymentIntent?: TPaymentIntent | null; locale?: string; isStripePayment?: boolean; isSubscription?: boolean; slippageConfig?: { mode?: 'percent' | 'rate'; percent?: number | null; min_acceptable_rate?: string; base_currency?: string; }; trialInDays?: number; trialEnd?: number; discounts?: DiscountInfo[]; } export interface RateInfo { exchangeRate: string | null; baseCurrency: string; providerName: string | null; providerId: string | null; timestampMs: number | null; fetchedAt: number | null; } export interface QuoteMeta { exchangeRate: string | null; baseCurrency: string; expiresAt: number | null; providerName: string | null; providerId: string | null; rateTimestampMs: number | null; slippagePercent: number | null; } /** * Custom hook for dynamic pricing calculations */ export declare function useDynamicPricing(options: DynamicPricingOptions): { hasDynamicPricing: boolean; isPriceLocked: boolean; lockExpired: boolean; quoteMeta: QuoteMeta | null; rateInfo: RateInfo; quoteLockedAt: number | null; calculatedTokenAmount: string | null; calculatedDiscountAmount: any; currentSlippagePercent: number; rateDisplay: string | null; providerDisplay: string; formatTotalDisplay: (totalAmountValue: string, fallback?: string) => string; calculateUsdDisplay: (totalAmountValue: string) => string | null; buildQuoteDetailRows: (t: (key: string) => string) => { label: string; value: string | React.ReactNode; isSlippage?: boolean; tooltip?: string; }[]; }; export default useDynamicPricing;