{"version":3,"file":"js/251.js","mappings":"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","sources":["webpack://nocodenodeweb/./src/client/typings/Common.ts","webpack://nocodenodeweb/./src/client/components/layout/PaymentWrapper.tsx","webpack://nocodenodeweb/./src/client/components/ButtonsStack/Container.tsx","webpack://nocodenodeweb/./src/client/components/payment/ErrorMessage.tsx","webpack://nocodenodeweb/./src/client/components/payment/DisclaimerPolicy.tsx","webpack://nocodenodeweb/./src/client/components/payment/index.tsx","webpack://nocodenodeweb/./src/client/components/Paywall/prefillData.ts","webpack://nocodenodeweb/./src/client/components/Paywall/styles.ts","webpack://nocodenodeweb/./src/client/components/Paywall/index.tsx","webpack://nocodenodeweb/./src/client/components/notfound/styles.ts","webpack://nocodenodeweb/./src/client/components/notfound/index.tsx","webpack://nocodenodeweb/./src/client/bootstraps/bootstrap.tsx","webpack://nocodenodeweb/./src/client/bootstraps/bootstrapPayment.ts","webpack://nocodenodeweb/./src/client/components/App/index.tsx","webpack://nocodenodeweb/./src/client/components/buttons/serverClientPayloadKeyMapper.ts","webpack://nocodenodeweb/./src/client/components/buttons/types.ts","webpack://nocodenodeweb/./src/client/components/common/commonStyles.ts","webpack://nocodenodeweb/./src/client/contexts/AppContext.tsx","webpack://nocodenodeweb/./src/client/contexts/PreviewContext.tsx","webpack://nocodenodeweb/./src/client/contexts/WorldReadyContext.tsx","webpack://nocodenodeweb/./src/client/helpers/ucpConfig.ts","webpack://nocodenodeweb/./src/client/utils/beaverLogger.ts","webpack://nocodenodeweb/./src/client/utils/constants.ts","webpack://nocodenodeweb/./src/client/utils/localeHelper.ts","webpack://nocodenodeweb/./src/client/utils/server-data.ts","webpack://nocodenodeweb/./src/client/utils/utils.ts","webpack://nocodenodeweb/./src/common/analytics.ts","webpack://nocodenodeweb/./src/common/buttonConfigValidations.ts","webpack://nocodenodeweb/./src/common/constants.ts","webpack://nocodenodeweb/./src/common/fpti.ts"],"sourcesContent":["import {\n CheckoutButtonColor,\n CheckoutButtonLayout,\n CheckoutButtonShape,\n CheckoutButtonTagline,\n CheckoutPaypalButtonText\n} from '@components/buttons/types';\nimport type { PayPalButtonsComponentProps } from '@paypal/react-paypal-js';\n\n/*\n U is union of all single key-value pairs in type T\n Therefore U[key of U] is any single key value pair\n*/\ntype AtLeastOne }> = Partial & U[keyof U];\n\ninterface LatmConf {\n trackSprigEvent: (event_name, properties) => void;\n}\n\ndeclare global {\n interface Window {\n __initialState__: any;\n ApplePaySession: typeof ApplePaySession | undefined;\n ApplePayError: typeof ApplePayError | undefined;\n PAYPAL?: {\n analytics?: {\n instance?: {\n recordClick: Function;\n recordImpression: Function;\n recordError: Function;\n logActivity: Function;\n };\n startCPLTracking: Function;\n endCPLTracking: Function;\n };\n };\n latmconf: LatmConf;\n }\n}\nexport interface ServerData {\n requestURI: string;\n worldReady: object;\n locality: {\n locale: string;\n language: string;\n timezone: {\n value: string;\n determiner: string;\n };\n directionality: string;\n };\n fpti: object;\n csrfToken: string;\n nonce: string;\n sdkUrl: string;\n sdkClientId: string;\n multiAccountData?: {\n isMultiAcct?: boolean;\n accounts?: {\n current?: boolean;\n accountIdentifier?: string;\n accountNumber?: string;\n alias?: string;\n businessName?: string;\n }[];\n user?: {\n accountNumber?: string;\n email?: string;\n isPrimaryUser?: boolean;\n accountType: string;\n };\n enterpriseData?: {\n isEnterpriseAdmin?: boolean;\n isInTenantHierarchy?: boolean;\n hasAdminView?: boolean;\n operationalAccount?: object;\n };\n };\n timezone?: string;\n accountCurrencies?: string[];\n}\n\nexport interface UseRequestResult {\n data: null | T;\n initialDataHasLoaded?: boolean;\n errors: unknown;\n pending: boolean;\n}\n\nexport interface UseRequestOptions {\n url: string;\n query?: any;\n method?: string;\n methodPath?: string; // needed for additional info to be sent with PATCH/PUT\n methodOp?: string; // needed for additional info to be sent with PATCH/PUT\n listBased?: boolean;\n}\n\nexport interface UseRequestCallbackOptions {\n query?: object;\n requestBody?: any;\n isClear?: boolean;\n}\n\nexport type UseRequestCallbackFunction = (requestOptions?: UseRequestCallbackOptions) => void;\n\nexport interface MakeRequestOptions {\n method?: string;\n methodPath?: string; // needed for additional info to be sent with PATCH/PUT\n methodOp?: string; // needed for additional info to be sent with PATCH/PUT\n requestBody?: any;\n csrf?: string;\n}\n\nexport type HostedButtonDetails = {\n id: string;\n link_variables?: Array<{ name: string; value: string }>;\n country_code?: string;\n language?: string;\n status?: string;\n business_name?: string;\n option_details?: Array;\n create_time: string;\n update_time?: string;\n eligibility?: boolean;\n};\n\nexport type OptionDetail = {\n currency_code: string;\n name: string;\n selection_details: Array;\n};\n\nexport type OptionItem = {\n primaryText: string;\n value: string;\n price: string;\n};\n\nexport type QuantityOption = {\n primaryText: string;\n value: string;\n};\n\nexport type SelectionDetail = {\n price: string;\n option_selection: string;\n};\n\nexport interface OrderDetailsV2 extends OrderDetails {\n description?: string; // This property is for 'memo' in order\n memoLabel?: string;\n invoiceLabel?: string;\n invoice_id?: string;\n}\n\nexport type AmountDetails = {\n currency_code: string;\n value: string;\n breakdown: {\n item_total: Breakdown;\n shipping: Breakdown;\n handling: Breakdown;\n tax_total: Breakdown;\n insurance: Breakdown;\n shipping_discount: Breakdown;\n discount: Breakdown;\n };\n};\n\nexport type OrderDetails = {\n buttonType?: 'FIXED_PRICE' | 'SINGLE_SELECT_LIST' | 'VARIABLE_PRICE';\n name?: string;\n error?: boolean;\n link_id?: string;\n merchant_id?: string;\n context_id?: string;\n transaction_id?: string;\n status?: string;\n merchant_name?: string;\n payment_status?: string;\n payer?: {\n name?: {\n given_name: string;\n surname: string;\n };\n email_address: string;\n payer_id: string;\n };\n shipping?: {\n name?: {\n full_name?: string;\n };\n address?: Address;\n };\n description?: string;\n amount?: AmountDetails;\n funding_method?: string;\n items?: Array<{\n description: string;\n name: string;\n quantity: string;\n tax: Breakdown;\n unit_amount: Breakdown;\n }>;\n returnURL: string;\n shippingPreference?: string;\n checkoutButtonTextType?: string;\n};\n\nexport type Breakdown = {\n currency_code: string;\n value: string;\n};\n\nexport type ServerError = {\n error: boolean;\n name: string;\n message: string;\n status: number;\n details?: Array<{\n description?: string;\n field?: string;\n issue?: string;\n location?: string;\n value?: string;\n }>;\n};\n\nexport type FormErrorMessageType = {\n isFormValid: boolean;\n isFocused: boolean;\n amount?: string;\n memo?: string;\n invoice?: string;\n item?: string;\n quantity?: string;\n msgVariables: {\n min?: number;\n max?: number;\n currencySymbol?: string;\n };\n};\n\nexport type UserInputsType = {\n quantity?: string;\n item?: string;\n amount?: string;\n memo?: string;\n invoice?: string;\n currency?: string;\n currencySymbol?: string;\n};\n\nexport enum PaymentSource {\n PAYPAL = 'paypal',\n CARD = 'card',\n VENMO = 'venmo',\n PAYLATER = 'paylater'\n}\n\nexport type Address = {\n address_line_1: string;\n admin_area_2: string;\n admin_area_1: string;\n postal_code: string;\n country_code: string;\n};\n\nexport type CreatedOrder = {\n context_id: string;\n link_id: string;\n merchant_id: string;\n status: string;\n};\n\nexport type CapturedOrder = {\n context_id: string;\n link_id: string;\n merchant_id: string;\n payment_status: string;\n status: string;\n};\n\nexport type HostedButton = {\n id: string;\n type?: string;\n button_variables?: Array<{ name: string; value: string }>;\n country_code?: string;\n language?: string;\n status?: string;\n option_details?: Array;\n time_created: string;\n time_updated?: string;\n};\n\nexport enum ButtonWrapperVariation {\n PAYWALL = 'paywall',\n HOSTED_BUTTONS = 'hosted_buttons'\n}\n\nexport type ButtonStyleConfig = {\n layout: `${CheckoutButtonLayout}`;\n shape: `${CheckoutButtonShape}`;\n color: `${CheckoutButtonColor}`;\n button_text: `${CheckoutPaypalButtonText}`;\n tagline: `${CheckoutButtonTagline}` | boolean;\n};\n\nexport type SDKButtonStyle = PayPalButtonsComponentProps['style'];\n\nexport type PaymentMethodConfig = {\n enabled: boolean;\n supportedCountries?: string[];\n supportedCurrencies?: string[];\n};\n\nexport type UcpConfig = {\n enablePhase2SlowRamp: boolean;\n enablePhase2BuyerExperience: boolean;\n disablePhase2BuyerCountries: string[];\n disablePhase2ButtonCountries: string[];\n applepay: PaymentMethodConfig;\n venmo: PaymentMethodConfig;\n paylater: PaymentMethodConfig;\n card: PaymentMethodConfig;\n sprigFeedbackEventName: string;\n featureFlags: {\n doNotCollectShipping?: boolean;\n shippingFromProfile?: boolean;\n taxFromProfile?: boolean;\n shippingTaxExpansion?: boolean;\n singleButton?: boolean;\n jsSDKThreeButtonExp?: boolean;\n customizeYourCheckout?: boolean;\n };\n};\n\nexport type OrderShipping = {\n context_id: string;\n amount: {\n breakdown: {\n item_total: Breakdown;\n shipping: Breakdown | undefined;\n tax_total: Breakdown | undefined;\n };\n currency_code: Breakdown['currency_code'];\n value: Breakdown['value'];\n };\n shipping_options:\n | Array<{\n amount: Breakdown;\n id: string;\n label: string;\n selected: boolean;\n type: string;\n }>\n | undefined;\n};\n\nexport type PaymentAmountDetails = {\n itemPrice: string;\n quantity: number;\n shipping: string;\n taxRate: string;\n};\n\nexport type PaymentBreakdownAmount = {\n subtotal: number;\n shipping: number;\n taxAmount: number;\n total: number;\n};\n\nexport enum DeployEnvironment {\n PRODUCTION = 'production',\n SANDBOX = 'sandbox',\n STAGING = 'staging',\n DEVELOPMENT = 'development'\n}\n\nexport type MerchantInfo = {\n businessName: string;\n merchantId: string;\n primaryCurrencyCode: string | null;\n};\n\nexport type PaymentPrefillData = {\n memo?: string;\n amount?: string;\n invoice?: string;\n quantity?: string;\n item?: string;\n};\n","import React from 'react';\nimport { Container } from '@paypalcorp/pp-react';\nimport { css } from '@emotion/react';\n\ntype PaymentLayoutProps = {\n children: React.ReactNode | undefined;\n};\n\nconst containerStyles = css`\n width: auto;\n margin-top: 4.5rem;\n max-width: 28.25rem;\n box-sizing: border-box;\n padding: 0 1rem;\n\n @media (min-width: 47rem) {\n max-width: 28.25rem;\n }\n`;\n\nconst PaymentWrapper = ({ children }: PaymentLayoutProps) => {\n return (\n \n {children}\n \n );\n};\n\nexport default PaymentWrapper;\n","import React, { memo, useContext } from 'react';\nimport { Context as WorldReadyContext } from '@paypalcorp/worldready-react';\nimport { PayPalScriptProvider, ReactPayPalScriptOptions } from '@paypal/react-paypal-js';\nimport commonStyles from '@components/common/commonStyles';\nimport { HostedButtonDetails, ButtonWrapperVariation } from '@client/typings/Common';\nimport {\n CheckoutButtonColor,\n CheckoutButtonLayout,\n CheckoutButtonShape,\n CheckoutButtonTagline,\n CheckoutPaypalButtonText\n} from '@components/buttons/types';\nimport {\n getAllowedPaymentMethodsFromConfigs,\n transButtonStyleFromButtonVariables,\n transformButtonVariables,\n transSDKFundingConfig,\n sdkLocaleMapper\n} from '@client/utils/utils';\nimport { WorldReadyProps } from '@client/utils/localeHelper';\nimport serverData from '@client/utils/server-data';\nimport { useAppContext } from '@client/contexts/AppContext';\nimport StackedPayPalButtons from './StackedPayPalButtons';\nimport PaywallHostedButtons from './PaywallHostedButtons';\nimport { SDKButtonWrapperProps } from './types';\n\ninterface ContainerProps {\n hostedButtonId: string;\n buttonDetails: HostedButtonDetails;\n /** paywall or stacked buttons */\n variation: ButtonWrapperVariation;\n}\n\nexport default memo(({ hostedButtonId, buttonDetails, variation }: ContainerProps) => {\n const appContext = useAppContext();\n const merchantCountryCode = buttonDetails.country_code;\n const buttonVariables = transformButtonVariables(buttonDetails.link_variables);\n const {\n business: merchantId,\n currency_code: currencyCode,\n button_type: buttonType,\n shipping_preference: shippingPreference,\n tax_rate_preference: taxRatePreference,\n open_venmo: openVenmo,\n open_paylater: openPayLater,\n open_applepay: openApplePay,\n no_shipping: noShipping\n } = buttonVariables;\n const worldReady = useContext(WorldReadyContext);\n const allowedPaymentMethods = getAllowedPaymentMethodsFromConfigs(\n appContext?.app?.context?.locality?.country,\n appContext?.app?.config,\n currencyCode as string,\n // If button do not have these properties (like phase 1 button),\n // we should default them all to open and let our button enablement logic\n // within `getAllowedPaymentMethodsFromConfigs` handle whether or not to show them.\n {\n openVenmo: (openVenmo && openVenmo === 'true') || !openVenmo,\n openPayLater: (openPayLater && openPayLater === 'true') || !openPayLater,\n openApplePay: (openApplePay && openApplePay === 'true') || !openApplePay\n },\n {\n enableApplePay: Boolean(appContext?.enableApplePay)\n }\n );\n const sdkOptions: ReactPayPalScriptOptions = {\n clientId: serverData.sdkClientId,\n merchantId,\n components: 'buttons,funding-eligibility',\n currency: currencyCode,\n sdkBaseUrl: serverData.sdkUrl,\n dataCspNonce: serverData.nonce,\n locale: sdkLocaleMapper(worldReady.locale),\n ...transSDKFundingConfig(allowedPaymentMethods)\n };\n\n const styleForStackedButtons = transButtonStyleFromButtonVariables({\n layout: buttonVariables.layout as CheckoutButtonLayout,\n shape: buttonVariables.shape as CheckoutButtonShape,\n color: buttonVariables.color as CheckoutButtonColor,\n button_text: buttonVariables.button_text as CheckoutPaypalButtonText,\n tagline: buttonVariables.tagline as CheckoutButtonTagline | boolean\n });\n const commonSDKWrapperProps: SDKButtonWrapperProps = {\n merchantId,\n hostedButtonId,\n buttonType,\n currencyCode,\n shippingPreference,\n taxRatePreference,\n notCollectShippingAddr: noShipping === '1',\n // TODO: Will need to clean up the above wrapper props at a later time\n buttonVariables\n };\n return (\n
\n \n {variation === ButtonWrapperVariation.PAYWALL && (\n \n )}\n {variation === ButtonWrapperVariation.HOSTED_BUTTONS && (\n \n )}\n \n
\n );\n});\n","import React, { useContext } from 'react';\nimport { Alert } from '@paypalcorp/pp-react';\nimport { Context as WorldReadyContext } from '@paypalcorp/worldready-react';\nimport { getLocalizedString, WorldReadyProps } from '@client/utils/localeHelper';\nimport { CaptureStatus } from '@client/utils/constants';\nimport commonStyles from '@components/common/commonStyles';\n\ninterface ErrorMessageProps {\n captureStatus: string;\n errorMessage: string;\n}\nconst ErrorMessage = ({ captureStatus, errorMessage }: ErrorMessageProps) => {\n const worldReady = useContext(WorldReadyContext);\n let message: string | null = null;\n if (captureStatus === CaptureStatus.FAILED) {\n message = errorMessage || getLocalizedString(worldReady, 'error.text.default');\n } else if (captureStatus === CaptureStatus.AUTH_FAILED) {\n message = getLocalizedString(worldReady, 'error.text.refreshPage');\n }\n\n if (!message) {\n return null;\n }\n\n return (\n
\n {message}\n
\n );\n};\n\nexport default ErrorMessage;\n","import React, { useContext } from 'react';\nimport { CaptionText, Link } from '@paypalcorp/pp-react';\nimport { Context as WorldReadyContext } from '@paypalcorp/worldready-react';\nimport { css } from '@emotion/react';\nimport { getLocalizedString, WorldReadyProps } from '@client/utils/localeHelper';\nimport { recordClick } from '@common/analytics';\nimport commonStyles from '@components/common/commonStyles';\n\nconst style = css`\n ${commonStyles.Row()};\n display: flex;\n flex-direction: column;\n justify-content: center;\n align-items: center;\n margin-top: 2rem;\n row-gap: 2rem;\n`;\n\nconst DisclaimerPolicy = () => {\n const worldReady = useContext(WorldReadyContext);\n\n return (\n
\n \n {`${getLocalizedString(worldReady, 'payment.text.disclaimerPolicy')}`}\n \n {\n recordClick({\n eventName: 'disclaimer_link_clicked',\n pageName: 'payment'\n });\n }}\n >\n {`${getLocalizedString(worldReady, 'payment.text.reportThisLink')}`}\n \n
\n );\n};\n\nexport default DisclaimerPolicy;\n","import React, { useEffect } from 'react';\nimport { useParams } from 'react-router-dom';\nimport { Col } from '@paypalcorp/pp-react';\nimport { buildAdditionalTags, recordImpression } from '@common/analytics';\nimport {\n ButtonWrapperVariation,\n HostedButtonDetails as HostedButtonDetailsType\n} from '@customTypes/client/Common';\nimport PaymentWrapper from '@components/layout/PaymentWrapper';\nimport { useAppContext } from '@client/contexts/AppContext';\nimport { CaptureStatus } from '@client/utils/constants';\nimport commonStyles from '@components/common/commonStyles';\nimport StackedButtonsContainer from '@components/ButtonsStack/Container';\nimport {\n PaymentContextProvider,\n PaymentContextValuesGenerator\n} from '@client/contexts/PaymentContext';\nimport { extractSourceAndFlowType } from '@common/fpti';\nimport ErrorMessage from './ErrorMessage';\nimport HostedButtonDetails from './HostedButtonDetails';\nimport DisclaimerPolicy from './DisclaimerPolicy';\n\nexport const useOnCaptureFailEffect = (\n captureStatus: string,\n fptiAdditionalTags: ReturnType,\n errorMessage: string\n) => {\n useEffect(() => {\n if (captureStatus === CaptureStatus.FAILED || captureStatus === CaptureStatus.AUTH_FAILED) {\n recordImpression({\n ...fptiAdditionalTags,\n pageName: 'payment',\n eventName: 'payment_failed_alert_shown',\n error_message: errorMessage || 'default'\n });\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [captureStatus]);\n};\n\nconst Payment = () => {\n const { hostedButtonId } = useParams();\n const appContext = useAppContext();\n const enablePaywall = appContext?.enablePaywall;\n const hostedButtonDetails = appContext?.hostedButtonDetails as HostedButtonDetailsType;\n const { sourceType, flowType } = extractSourceAndFlowType(appContext?.fptiData);\n const fptiAdditionalTags = buildAdditionalTags(\n hostedButtonDetails,\n sourceType,\n flowType,\n enablePaywall\n );\n const paymentContextValues = PaymentContextValuesGenerator(fptiAdditionalTags);\n\n useOnCaptureFailEffect(\n paymentContextValues.captureStatus,\n fptiAdditionalTags,\n paymentContextValues.errorMessage\n );\n\n return (\n \n \n \n \n \n {!!hostedButtonId && (\n \n )}\n \n \n \n \n );\n};\n\nexport default Payment;\n","import { IAppContext } from '@client/contexts/AppContext';\nimport { ButtonType, INVALID_OPTION_CONTENT_KEY } from '@client/utils/constants';\nimport { HostedButtonDetails, PaymentPrefillData } from '@client/typings/Common';\nimport { transformButtonVariables } from '@client/utils/utils';\nimport { PaymentContextPrefillData } from '@client/contexts/PaymentContext';\nimport { checkForDecimalErrors } from '@common/buttonConfigValidations';\nimport { WorldReadyProps } from '@client/utils/localeHelper';\n\nexport type PaywallPrefillData = PaymentContextPrefillData & {\n loggingErrors: PaymentPrefillData;\n};\n\nconst VALID_FIELDS_MAP = {\n [ButtonType.FIXED_PRICE]: {\n quantity: true,\n memo: true\n },\n [ButtonType.SINGLE_SELECT_LIST]: {\n quantity: true,\n item: true,\n memo: true\n },\n [ButtonType.VARIABLE_PRICE]: {\n amount: true,\n invoice: true,\n memo: true\n }\n};\n\nconst getQuantityData = (\n paymentContextPrefillData: PaymentContextPrefillData,\n shouldCheckQuantity: boolean,\n prefillData: PaymentPrefillData,\n quantityOption: string | undefined\n) => {\n if (!shouldCheckQuantity) {\n return {};\n }\n\n const quantityOptionNumber = Number(quantityOption);\n\n // We need to do the hasOwnProperty check to account for empty strings and any other false-y values.\n // We will be showing an error for the dropdown when these false-y values are sent in.\n const isQuantityRelevant = Object.prototype.hasOwnProperty.call(prefillData, 'quantity');\n const isQuantityOptionEnabled = quantityOption && !Number.isNaN(quantityOptionNumber);\n\n if (!isQuantityRelevant || !isQuantityOptionEnabled) {\n return {};\n }\n\n const prefillQuantity = Number(prefillData.quantity);\n if (\n Number.isNaN(prefillQuantity) ||\n !prefillQuantity ||\n !Number.isInteger(prefillQuantity) ||\n prefillQuantity < 1 ||\n prefillQuantity > quantityOptionNumber\n ) {\n paymentContextPrefillData.errors.quantity = INVALID_OPTION_CONTENT_KEY;\n return {\n errors: {\n quantity: INVALID_OPTION_CONTENT_KEY\n }\n };\n }\n\n return {\n values: {\n quantity: prefillData.quantity\n }\n };\n};\n\nconst doesPrefillItemExist = (\n buttonDetails: HostedButtonDetails,\n prefillItem: string | undefined\n) => {\n const items =\n buttonDetails?.option_details?.find((_) => _.name === 'items')?.selection_details ?? [];\n return !!items.find((item) => item.option_selection === prefillItem);\n};\n\nconst getAmountData = (\n shouldCheckAmount: boolean,\n hasAmountLabel: boolean,\n prefillAmount: string | undefined,\n worldReady: WorldReadyProps,\n currencyCode: string = 'USD'\n) => {\n if (!shouldCheckAmount || !hasAmountLabel) {\n return {};\n }\n\n // Currently merchant hosted does not support decimal separators and only supports comma separators\n // so we will do these checks with that assumption in mind.\n const prefilledAmountNumber = Number(prefillAmount);\n if (\n Number.isNaN(prefilledAmountNumber) ||\n prefilledAmountNumber < 0 ||\n checkForDecimalErrors(worldReady, prefilledAmountNumber, currencyCode).hasError\n ) {\n // We do not have an associated error message for this since we aren't prefilling the value.\n // We let the default form validations take care of it. However, we still want to log\n // that some error occurred so we pass this into the loggingErrors.\n return {\n loggingErrors: {\n amount: INVALID_OPTION_CONTENT_KEY\n }\n };\n }\n\n return {\n values: {\n amount: prefillAmount\n }\n };\n};\n\n// To figure out what data we should pre-fill from the merchant hosted fields for 3-buttons\nexport const getPrefillData = (\n appContext: IAppContext | null,\n buttonDetails: HostedButtonDetails,\n worldReady: WorldReadyProps\n) => {\n const prefillData = appContext?.paymentPrefillData;\n const buttonVariables = transformButtonVariables(buttonDetails.link_variables);\n const buttonType = buttonVariables.button_type?.toUpperCase();\n\n const paymentContextPrefillData: PaywallPrefillData = {\n values: {},\n errors: {},\n loggingErrors: {}\n };\n\n if (!buttonType || !prefillData || !Object.keys(prefillData).length) {\n return paymentContextPrefillData;\n }\n\n const validFields = VALID_FIELDS_MAP[buttonType] || {};\n\n const { errors: quantityErrors, values: quantityValues } = getQuantityData(\n paymentContextPrefillData,\n validFields.quantity,\n prefillData,\n buttonVariables.quantity_option\n );\n\n // We need to do the hasOwnProperty check to account for empty strings and any other false-y values.\n // We will be showing an error for the dropdown when these false-y values are sent in.\n if (validFields.item && Object.prototype.hasOwnProperty.call(prefillData, 'item')) {\n if (doesPrefillItemExist(buttonDetails, prefillData?.item)) {\n paymentContextPrefillData.values.item = prefillData.item;\n } else {\n paymentContextPrefillData.errors.item = INVALID_OPTION_CONTENT_KEY;\n }\n }\n\n const { values: amountValues, loggingErrors: amountLoggingErrors } = getAmountData(\n validFields.amount && Object.prototype.hasOwnProperty.call(prefillData, 'amount'),\n !!buttonVariables.amount_label,\n prefillData?.amount,\n worldReady,\n buttonVariables.currency_code\n );\n\n if (validFields.invoice && buttonVariables.invoice_label) {\n paymentContextPrefillData.values.invoice = prefillData.invoice;\n }\n\n if (validFields.memo && buttonVariables.memo_label) {\n paymentContextPrefillData.values.memo = prefillData.memo;\n }\n\n paymentContextPrefillData.values = {\n ...paymentContextPrefillData.values,\n ...quantityValues,\n ...amountValues\n };\n\n paymentContextPrefillData.errors = {\n ...paymentContextPrefillData.errors,\n ...quantityErrors\n };\n\n paymentContextPrefillData.loggingErrors = {\n ...paymentContextPrefillData.loggingErrors,\n ...amountLoggingErrors\n };\n\n return paymentContextPrefillData;\n};\n","import { css } from '@emotion/react';\n\nconst styles = {\n backgroundWrapper: css`\n min-height: 100vh;\n padding-top: 4.5rem;\n background-color: #f1f2f3;\n box-sizing: border-box;\n overflow: hidden;\n\n @media (max-width: 47rem) {\n padding-bottom: 5rem;\n }\n\n @media (max-width: 36rem) {\n padding-top: 0;\n }\n `,\n disclaimerPolicyStyle: css`\n justify-content: center;\n margin: 0 auto;\n text-align: center;\n `\n};\n\nexport default styles;\n","import React, { useEffect } from 'react';\nimport { useParams } from 'react-router-dom';\nimport { Container, Row, LoadingSpinner, CaptionText } from '@paypalcorp/pp-react';\nimport cx from 'classnames';\nimport ButtonContainer from '@components/ButtonsStack/Container';\nimport { useAppContext } from '@client/contexts/AppContext';\nimport DisclaimerPolicy from '@components/payment/DisclaimerPolicy';\nimport { getLocalizedString } from '@client/utils/localeHelper';\nimport { useWorldReadyContext } from '@client/contexts/WorldReadyContext';\nimport { CaptureStatus } from '@client/utils/constants';\nimport {\n ButtonWrapperVariation,\n HostedButtonDetails as HostedButtonDetailsType\n} from '@client/typings/Common';\nimport HostedButtonDetails from '@components/payment/HostedButtonDetails';\nimport { buildAdditionalTags, recordImpression } from '@common/analytics';\nimport commonStyles from '@components/common/commonStyles';\nimport ErrorMessage from '@components/payment/ErrorMessage';\nimport {\n PaymentContextProvider,\n PaymentContextValuesGenerator\n} from '@client/contexts/PaymentContext';\nimport { getPrefillData, PaywallPrefillData } from '@components/Paywall/prefillData';\nimport useDeepEqualMemo from '@client/hooks/useDeepEqualMemo';\nimport { logInfoClient } from '@client/utils/beaverLogger';\nimport { extractSourceAndFlowType } from '@common/fpti';\nimport styles from './styles';\n\nexport const useOnCaptureFailEffect = (\n captureStatus: string,\n fptiAdditionalTags: ReturnType,\n errorMessage: string\n) => {\n useEffect(() => {\n if (captureStatus === CaptureStatus.FAILED || captureStatus === CaptureStatus.AUTH_FAILED) {\n recordImpression({\n ...fptiAdditionalTags,\n pageName: 'paywall',\n eventName: 'payment_failed_alert_shown',\n error_message: errorMessage || 'default'\n });\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [captureStatus]);\n};\n\nconst useOnPrefillDataPopulatedEffect = (\n prefillData: PaywallPrefillData,\n fptiAdditionalTags: ReturnType\n) => {\n useEffect(() => {\n const prefillErrorKeys = Object.keys(prefillData.errors);\n const errorKeysForLogging = Object.keys(prefillData.loggingErrors);\n const hasValues = !!Object.keys(prefillData.values).length;\n const hasErrors = !!prefillErrorKeys.length || !!errorKeysForLogging.length;\n if (hasValues || hasErrors) {\n const prefillDataToLog = {\n values: prefillData.values,\n errors: [...prefillErrorKeys, ...errorKeysForLogging]\n };\n logInfoClient('paywall prefilled values and errors', prefillDataToLog);\n recordImpression(\n {\n ...fptiAdditionalTags,\n pageName: 'paywall',\n eventName: 'payment_data_prefilled'\n },\n { prefill: prefillDataToLog.values, int_error_desc: prefillDataToLog.errors }\n );\n }\n }, [prefillData, fptiAdditionalTags]);\n};\n\nconst Paywall = () => {\n const { hostedButtonId } = useParams();\n const appContext = useAppContext();\n const worldReady = useWorldReadyContext();\n const enablePaywall = appContext?.enablePaywall;\n const hostedButtonDetails = appContext?.hostedButtonDetails as HostedButtonDetailsType;\n const { sourceType, flowType } = extractSourceAndFlowType(appContext?.fptiData);\n const fptiAdditionalTags = useDeepEqualMemo(\n buildAdditionalTags(hostedButtonDetails, sourceType, flowType, enablePaywall)\n );\n\n const prefillData = useDeepEqualMemo(getPrefillData(appContext, hostedButtonDetails, worldReady));\n const paymentContextValues = PaymentContextValuesGenerator(fptiAdditionalTags, prefillData);\n\n useOnPrefillDataPopulatedEffect(prefillData, fptiAdditionalTags);\n\n useOnCaptureFailEffect(\n paymentContextValues.captureStatus,\n fptiAdditionalTags,\n paymentContextValues.errorMessage\n );\n return (\n \n
\n \n \n \n \n
\n {paymentContextValues.isLoading && (\n
\n \n \n {getLocalizedString(worldReady, 'payment.text.paymentProcessing')}\n \n
\n )}\n
\n \n
\n
\n {hostedButtonId && (\n \n )}\n
\n
\n \n \n \n
\n
\n
\n );\n};\n\nexport default Paywall;\n","import { css } from '@emotion/react';\n\nconst styles = {\n containerStyles: css`\n display: flex;\n align-items: center;\n justify-content: center;\n height: 30rem;\n `,\n iconContainerStyles: css`\n margin: 0 0.5rem;\n `\n};\n\nexport default styles;\n","import React, { useContext, useEffect } from 'react';\nimport { CriticalIcon, HeadingText } from '@paypalcorp/pp-react';\nimport { Context as WorldReadyContext } from '@paypalcorp/worldready-react';\nimport { getLocalizedString, WorldReadyProps } from '@client/utils/localeHelper';\nimport { recordImpression } from '@common/analytics';\nimport styles from './styles';\n\nconst NotFound = () => {\n const worldReady = useContext(WorldReadyContext);\n\n useEffect(() => {\n recordImpression({\n eventName: 'not_found_shown',\n pageName: 'not_found'\n });\n }, []);\n\n return (\n
\n
\n \n
\n {getLocalizedString(worldReady, 'error.text.default')}\n
\n );\n};\n\nexport default NotFound;\n","import React from 'react';\nimport { hydrateRoot, createRoot } from 'react-dom/client';\nimport { BrowserRouter } from 'react-router-dom';\nimport { WorldReady } from '@paypalcorp/worldready';\nimport { WorldReadyProvider } from '@paypalcorp/pp-react-worldready';\nimport { ContextProvider as WorldReadyContextProvider } from '@paypalcorp/worldready-react';\nimport { init as initServerData, Data as ServerData } from '@client/utils/server-data';\nimport { CONTEXT_ROOT } from '@client/lib/constants';\nimport { WorldReadyProps } from '../utils/localeHelper';\n\ntype InitialAppData = {\n app: {\n locale: string;\n worldReady: WorldReadyProps;\n };\n serverData: ServerData;\n};\n\nexport const initializeAppData = (): InitialAppData => {\n // eslint-disable-next-line no-underscore-dangle\n const windowInitialState = window.__initialState__ as InitialAppData;\n\n // Load localization messages from WorldReady\n const worldReadyData = windowInitialState?.app?.worldReady;\n WorldReady.load(worldReadyData);\n initServerData(windowInitialState?.serverData);\n\n // Allow the passed state to be garbage-collected\n // eslint-disable-next-line no-underscore-dangle\n delete window.__initialState__;\n\n return windowInitialState;\n};\n\nexport const hydrate = ({\n App,\n initialAppData,\n options = {\n hydrateMethod: 'rootRender'\n }\n}: {\n App: React.FunctionComponent<{ initialAppData: InitialAppData }>;\n initialAppData: InitialAppData;\n options?: {\n hydrateMethod: 'hydrateRoot' | 'rootRender';\n };\n}) => {\n const container = document.getElementById('root');\n if (container) {\n const Comp = (\n \n \n \n \n \n \n \n );\n\n if (options.hydrateMethod === 'hydrateRoot') {\n hydrateRoot(container, Comp);\n } else {\n const root = createRoot(container);\n root.render(Comp);\n }\n }\n};\n","import React from 'react';\nimport PaymentApp from '@components/App';\nimport { initializeAppData, hydrate } from './bootstrap';\n\nconst initialAppData = initializeAppData();\nhydrate({ App: PaymentApp, initialAppData, options: { hydrateMethod: 'hydrateRoot' } });\n","import React from 'react';\nimport { Routes, Route } from 'react-router-dom';\nimport { ThemeProvider as EmotionThemeProvider } from '@emotion/react';\nimport { PAYPAL_THEME } from '@paypalcorp/pp-react';\nimport { AppContextProvider } from '@client/contexts/AppContext';\nimport Payment from '@components/payment';\nimport Paywall from '@components/Paywall';\nimport Notfound from '@components/notfound';\n\nfunction App({ initialAppData }) {\n const { enablePaywall } = initialAppData;\n\n return (\n \n \n \n : }\n />\n } />\n \n \n \n );\n}\n\nexport default App;\n","import _invert from 'lodash/invert';\nimport type { ButtonConfig, Item } from './types';\nimport { Payload } from './mapValuesToPayload';\n\nconst COMMON_PAYLOAD_KEY_MAPPER: { [K in keyof ButtonConfig]?: string } = {\n currencyCode: 'currency_code',\n itemName: 'item_name',\n shipping: 'shipping',\n taxRate: 'tax_rate',\n memoLabel: 'memo_label',\n layout: 'layout',\n shape: 'shape',\n color: 'color',\n paypalButtonText: 'button_text',\n tagline: 'tagline',\n amount: 'amount',\n quantityOption: 'quantity_option',\n amountLabel: 'amount_label',\n invoiceLabel: 'invoice_label',\n returnUrlType: 'return_url_type',\n customReturnUrl: 'custom_return_url',\n cancelUrl: 'cancel_url',\n checkoutButtonTextType: 'checkout_button_text_type',\n checkoutButtonCustomText: 'checkout_button_custom_text',\n singleButtonColorType: 'single_button_color_type',\n singleButtonColor: 'single_button_color',\n singleButtonTextType: 'single_button_text_type',\n singleButtonCustomText: 'single_button_custom_text',\n singleButtonSize: 'single_button_size',\n paymentButtonType: 'payment_button_type',\n productId: 'product_id',\n checkoutButtonType: 'checkout_button_type',\n size: 'size',\n isNotCollectShippingAddress: 'no_shipping',\n shippingPreference: 'shipping_preference',\n taxRatePreference: 'tax_rate_preference',\n openVenmo: 'open_venmo',\n openPayLater: 'open_paylater',\n openApplePay: 'open_applepay'\n};\n\nconst CLIENT_TO_NCNWServer_PAYLOAD_KEY_MAPPER: { [K in keyof ButtonConfig]?: string } = {\n ...COMMON_PAYLOAD_KEY_MAPPER,\n buttonType: 'button_type',\n items: 'items',\n isEnableQuantityOption: 'enableQuantity'\n};\n\nconst BFS_TO_CLIENT_PAYLOAD_KEY_MAPPER = {\n ..._invert(COMMON_PAYLOAD_KEY_MAPPER),\n button_sub_type: 'buttonType'\n};\n\nexport const mapServerToClientPayloadKeys = (\n buttonVariables: Record\n) => {\n return Object.entries(buttonVariables).reduce(\n (acc, [key, value]) => ({\n ...acc,\n ...(BFS_TO_CLIENT_PAYLOAD_KEY_MAPPER[key] && {\n [BFS_TO_CLIENT_PAYLOAD_KEY_MAPPER[key]]: value\n })\n }),\n {}\n );\n};\n\nexport const mapClientToServerPayloadKeys = (payloadWithClientTypeKeys: Payload) => {\n return Object.entries(payloadWithClientTypeKeys).reduce(\n (acc, [key, value]) => ({\n ...acc,\n ...(CLIENT_TO_NCNWServer_PAYLOAD_KEY_MAPPER[key] && {\n [CLIENT_TO_NCNWServer_PAYLOAD_KEY_MAPPER[key]]: value\n })\n }),\n {}\n );\n};\n\n/**\n * Get \"items\" from optionDetails which is separate from buttonVariables\n */\nexport const mapServerToClientItems = (optionDetails: unknown): Item[] | null => {\n if (!optionDetails || !Array.isArray(optionDetails)) {\n return null;\n }\n\n const itemOptionDetail = optionDetails.find((optionDetail) => optionDetail.name === 'items');\n if (!itemOptionDetail) {\n return null;\n }\n\n const selectionDetails = itemOptionDetail.selection_details;\n if (!selectionDetails || !Array.isArray(selectionDetails) || !selectionDetails.length) {\n return null;\n }\n\n const items = selectionDetails.map((selectionDetail) => ({\n desc: selectionDetail.option_selection,\n price: selectionDetail.price\n }));\n return items;\n};\n","import { ButtonType } from '@client/utils/constants';\n\nexport enum PaymentButtonType {\n Link = 'LINK',\n Button = 'BUTTON'\n}\n\nexport enum CheckoutButtonType {\n Stacked = 'stacked',\n Single = 'single'\n}\n\nexport enum CheckoutButtonLayout {\n Vertical = 'vertical',\n Horizontal = 'horizontal'\n}\n\nexport enum CheckoutButtonShape {\n Rect = 'rect',\n Pill = 'pill'\n}\n\nexport enum CheckoutButtonColor {\n Gold = 'gold',\n Blue = 'blue',\n Silver = 'silver',\n White = 'white',\n Black = 'black'\n}\n\nexport enum CheckoutSingleButtonColorType {\n Recommended = 'recommended',\n White = 'white',\n Black = 'black',\n Custom = 'custom'\n}\n\nexport enum SingleButtonTextType {\n Buynow = 'buynow',\n Paynow = 'paynow',\n Custom = 'custom'\n}\n\nexport enum CheckoutPaypalButtonText {\n Paypal = 'paypal',\n Checkout = 'checkout',\n Buynow = 'buynow',\n Pay = 'pay',\n Installment = 'installment'\n}\n\nexport enum CheckoutButtonTagline {\n True = 'true',\n False = 'false'\n}\n\nexport enum CheckoutButtonSize {\n Large = 'large',\n Medium = 'medium',\n Small = 'small'\n}\n\nexport enum CheckoutButtonTextType {\n Checkout = 'checkout',\n Proceed = 'proceed',\n Pay = 'pay',\n Custom = 'custom'\n}\n\nexport enum NoShipping {\n /**\n * Prompt for an address, but do not require one\n */\n // PromptOptional = '0',\n /**\n * Do not prompt for an address\n */\n NoPrompt = '1',\n /**\n * Prompt for an address and require one\n */\n PromptRequired = '2'\n}\n\nexport enum ShippingPreference {\n /**\n * Shipping from profile\n */\n FromProfile = 'shipping_from_profile',\n /**\n * Free shipping\n */\n Free = 'free_shipping',\n /**\n * Shipping not applicable\n */\n NotApplicable = 'shipping_not_applicable',\n /**\n * Custom shipping\n */\n Custom = 'custom_shipping'\n}\n\nexport enum TaxRatePreference {\n /**\n * Tax rate from profile\n */\n FromProfile = 'tax_rate_from_profile',\n /**\n * Tax rate not applicable\n */\n NotApplicable = 'tax_rate_not_applicable',\n /**\n * Custom tax rate\n */\n Custom = 'custom_tax_rate'\n}\n\nexport enum ReturnUrlType {\n /**\n * No return url\n */\n None = 'no_return_url',\n /**\n * Return url from profile\n */\n FromProfile = 'return_url_from_profile',\n /**\n * Custom return url\n */\n Custom = 'custom_return_url'\n}\n\nexport enum CheckoutPaymentOptionsOtherThanPayPal {\n Venmo = 'venmo',\n PayLater = 'paylater',\n ApplePay = 'applepay',\n Card = 'card'\n}\n\nexport enum PayPalPaymentOption {\n PayPal = 'paypal'\n}\n\nexport type CheckoutPaymentOptions = PayPalPaymentOption | CheckoutPaymentOptionsOtherThanPayPal;\n\n/**\n * Key values that are specific to client side and will not send to server\n */\ntype ClientConfig = {};\n\nexport type CheckoutButtonStackedConfig = {\n /**\n * Checkout button layout\n */\n layout: `${CheckoutButtonLayout}`;\n /**\n * Checkout button shape\n */\n shape: `${CheckoutButtonShape}`;\n /**\n * Checkout button color\n */\n color: `${CheckoutButtonColor}`;\n /**\n * Paypal checkout button text\n */\n paypalButtonText: `${CheckoutPaypalButtonText}`;\n /**\n * Checkout button tagline\n * @deprecated\n * No longer being used in phase 2\n */\n tagline: `${CheckoutButtonTagline}`;\n /**\n * Checkout button text type\n */\n checkoutButtonTextType: `${CheckoutButtonTextType}`;\n /**\n * Checkout button custom text\n */\n checkoutButtonCustomText: string;\n /**\n * Checkout button size\n */\n size: `${CheckoutButtonSize}`;\n};\n\nexport type CheckoutButtonSingleConfig = {\n /**\n * Checkout single button color type\n */\n singleButtonColorType: `${CheckoutSingleButtonColorType}`;\n /**\n * Checkout single button color type in hex\n * E.g: \"FFD140\"\n */\n singleButtonColor: string;\n /**\n * Checkout button text type\n */\n singleButtonTextType: `${SingleButtonTextType}`;\n /**\n * Checkout button custom text\n */\n singleButtonCustomText: string;\n /**\n * Checkout single button color type\n */\n singleButtonSize: `${CheckoutButtonSize}`;\n};\n\ntype CheckoutButtonConfig = CheckoutButtonStackedConfig &\n CheckoutButtonSingleConfig & {\n /**\n * Checkout button type\n */\n checkoutButtonType: `${CheckoutButtonType}`;\n };\n\ntype ThankYouConfig = {\n /**\n * Return url type\n */\n returnUrlType: `${ReturnUrlType}`;\n /**\n * Custom return url\n */\n customReturnUrl: string;\n};\n\nexport type CheckoutConfig = {\n openVenmo: boolean;\n openPayLater: boolean;\n openApplePay: boolean;\n /**\n * Cancel return url, redirect if buyers cancel their transaction.\n */\n cancelUrl: string;\n};\n\nexport type ButtonConfigBase = CheckoutButtonConfig &\n ThankYouConfig &\n CheckoutConfig & {\n /**\n * Preference type to guide the merchant through button creation experience\n */\n paymentButtonType: `${PaymentButtonType}`;\n /**\n * Button type\n */\n buttonType: `${ButtonType}`;\n /**\n * Product name or description\n */\n itemName: string;\n /**\n * Currency code\n * e.g: USD\n */\n currencyCode: string;\n /**\n * Custom shipping rate\n */\n shipping: string;\n /**\n * Shipping preference\n */\n shippingPreference: `${ShippingPreference}`;\n /**\n * Custom tax rate\n */\n taxRate: string;\n /**\n * Tax rate preference\n */\n taxRatePreference: `${TaxRatePreference}`;\n /**\n * Whether to not collect shipping address\n */\n isNotCollectShippingAddress: boolean;\n /**\n * Memo notes for the buyers\n */\n memoLabel: string;\n /**\n * Product id to show in order details. Does not show to buyer\n */\n productId: string;\n };\n\ntype QuantityConfig = {\n quantityOption: string;\n isEnableQuantityOption: boolean;\n};\n\nexport type Item = {\n desc: string;\n price: string;\n};\n\nexport type FixedButtonConfig = QuantityConfig & {\n amount: string;\n};\n\nexport type SingleSelectButtonConfig = QuantityConfig & {\n items: Array;\n};\n\nexport type VariableButtonConfig = {\n invoiceLabel: string;\n amountLabel: string;\n};\n\nexport type ButtonConfig = ClientConfig &\n ButtonConfigBase &\n FixedButtonConfig &\n SingleSelectButtonConfig &\n VariableButtonConfig;\n\nexport enum AccordionName {\n BUTTON_PREFERENCE = 'buttonPreference',\n CREATE_PRODUCT = 'createProduct',\n CUSTOMIZE_BUTTON = 'customizeButton',\n CUSTOMIZE_CHECKOUT = 'customizeCheckout',\n CUSTOMIZE_THANK_YOU = 'customizeThankYou'\n}\n","import { css } from '@emotion/react';\nimport { PAYPAL_THEME } from '@paypalcorp/pp-react';\n\nexport const Row = (gap?: number, center = false) => css`\n margin: ${gap || 1}rem 0;\n ${center\n ? `\n display: flex;\n justify-content: center;\n align-items: center;\n `\n : ''}\n`;\n\nexport const Col = css`\n box-sizing: border-box;\n`;\n\nexport const inputShimmer = css`\n height: 4rem;\n`;\n\nexport const inputStyle = css`\n margin-bottom: 1rem;\n`;\n\nexport const spinnerStyle = css`\n ${Row()};\n display: flex;\n align-items: center;\n justify-content: center;\n`;\n\nexport const dropdownMenu = css`\n button {\n span:nth-child(2) {\n display: inline-block;\n overflow: hidden;\n text-overflow: ellipsis;\n word-break: break-all;\n width: 100%;\n }\n }\n .dropdownMenuContainerLimit {\n max-height: 12rem;\n width: 100%;\n ul {\n width: 100% !important;\n }\n li {\n word-break: break-all;\n }\n }\n`;\n\nexport const dropdownMenuInPreview = css`\n ${dropdownMenu}\n button {\n span:nth-child(2) {\n max-width: 22rem;\n }\n }\n`;\n\nexport const buyerExpLayout = {\n container: css`\n box-sizing: border-box;\n padding: 0 1rem;\n max-width: 86.5rem !important;\n\n @media screen and (max-width: ${PAYPAL_THEME.sysSizeMediaSm}) {\n padding: 0 0.75rem;\n }\n\n @media screen and (max-width: ${PAYPAL_THEME.sysSizeMediaXs}) {\n padding: 0 0.5rem;\n }\n `,\n content: css`\n position: relative;\n display: flex;\n border-radius: 1.5rem;\n box-shadow: 0px 0.1rem 1rem rgba(0, 0, 0, 0.15);\n background-color: #ffffff;\n flex-wrap: nowrap;\n min-height: 70vh;\n\n @media screen and (max-width: ${PAYPAL_THEME.sysSizeMediaMd}) {\n flex-direction: column;\n }\n\n .loading-spinner-container {\n position: absolute;\n top: 0;\n bottom: 0;\n left: 0;\n right: 0;\n display: flex;\n align-items: center;\n justify-content: center;\n background: rgba(255, 255, 255, 0.9);\n z-index: 9999;\n border-radius: 1.5rem;\n flex-direction: column;\n }\n\n .panel {\n /**\n * Why did we set width: 0?\n * This makes the panels the equal widths when there is not enough space for the children to grow\n * E.g: When Single select dropdown text is too long, it will not grow the dropdown width\n * TODO: move this to the SingleSelectList dropdown when paywall is ramped\n */\n width: 0;\n flex: 1;\n padding: 4rem;\n gap: 1.5rem;\n\n @media screen and (max-width: ${PAYPAL_THEME.sysSizeMediaMd}) {\n width: auto;\n }\n\n @media screen and (max-width: ${PAYPAL_THEME.sysSizeMediaLg}) {\n padding: 2rem;\n }\n\n @media screen and (max-width: ${PAYPAL_THEME.sysSizeMediaSm}) {\n padding: 1rem;\n }\n }\n\n .details-panel {\n /* Need to match the border for the panel */\n border-top-left-radius: 1.5rem;\n border-bottom-left-radius: 1.5rem;\n\n /* Swap when we swap the layout orientation */\n @media screen and (max-width: ${PAYPAL_THEME.sysSizeMediaMd}) {\n border-bottom-left-radius: 0;\n border-top-right-radius: 1.5rem;\n }\n\n background-color: rgb(250, 251, 251);\n }\n `\n};\n\nexport const globalDropdownMenuSheet = css`\n .dropdownMenuSheet {\n word-break: break-all;\n }\n`;\n\n/*\n In pp-react@7, they only use font-weight = 400 right now for their strong text since\n they're depending on the OpenPayPal-Bold font itself. This doesn't work for non-latin\n characters though since the font does not support those. In pp-react@8 they fix this but\n since we aren't upgrading to 5.0 yet, we need this override.\n\n Reference: https://paypal.slack.com/archives/CD2TG6ZD3/p1721069183602749\n*/\nexport const boldTextOverride = css`\n font-weight: 700;\n`;\n\nexport const alertWrapper = css`\n padding-top: 0.75rem;\n`;\n\nexport default {\n alertWrapper,\n boldTextOverride,\n buyerExpLayout,\n Col,\n dropdownMenu,\n dropdownMenuInPreview,\n globalDropdownMenuSheet,\n inputShimmer,\n inputStyle,\n Row,\n spinnerStyle\n};\n","import React, { useState, useContext, useMemo } from 'react';\nimport _set from 'lodash/set';\nimport { FlowType, SourceType } from 'src/common/analytics';\nimport type {\n HostedButtonDetails,\n OrderDetails,\n HostedButton,\n UcpConfig,\n DeployEnvironment,\n MerchantInfo,\n PaymentPrefillData\n} from '../typings/Common';\nimport { WorldReadyProps } from './WorldReadyContext';\n\ninterface IData {\n app: {\n context?: {\n locality: { country: string; language: string };\n };\n csrfToken: string;\n hostname: string;\n nonce: string;\n targetEnv: DeployEnvironment;\n worldReady: WorldReadyProps;\n locale: string;\n timeZone: string;\n region: string;\n config: UcpConfig;\n };\n clientId?: string;\n hostedButtonDetails?: HostedButtonDetails; // From HBS\n orderDetails?: OrderDetails | null;\n hostedButton?: HostedButton; // From BFS\n serverData: {\n csrfToken: string;\n nonce: string;\n sdkUrl: string;\n sdkClientId: string;\n };\n isLoading?: boolean;\n paymentPrefillData?: PaymentPrefillData;\n merchantInfo?: MerchantInfo;\n // Flags\n enablePaywall?: boolean;\n enableApplePay?: boolean;\n is3ButtonsEligible?: boolean;\n isSlowRampMerchant?: boolean;\n shouldDisplayFeedbackButton?: boolean;\n // fpti\n fptiData?: {\n flowType: FlowType;\n sourceType: SourceType;\n };\n}\n\nexport interface IAppContext extends IData {\n setCustomData: (path: string, value: unknown) => void;\n setCsrfToken: (csrfToken: string) => void;\n setHostedButton: (HostedButton: HostedButton) => void;\n}\n\nconst AppContext = React.createContext(null);\n\nexport const AppContextProvider = ({\n value,\n children\n}: {\n value: IData | null;\n children: React.ReactElement;\n}) => {\n const [data, setData] = useState(value);\n\n const appContextValue = useMemo(\n () =>\n data\n ? {\n ...data,\n setCustomData: (path: string, value: unknown) => {\n setData((prevData) => {\n /* istanbul ignore next */\n if (!prevData) return prevData;\n _set(prevData, path, value);\n return {\n ...prevData\n };\n });\n },\n setCsrfToken: (csrfToken: string) => {\n setData((prevData) => {\n /* istanbul ignore next */\n if (!prevData) return prevData;\n prevData.app.csrfToken = csrfToken;\n return {\n ...prevData\n };\n });\n },\n setHostedButton: (hostedButton: HostedButton) => {\n setData((prevData) => {\n /* istanbul ignore next */\n if (!prevData) return prevData;\n prevData.hostedButton = hostedButton;\n return {\n ...prevData\n };\n });\n }\n }\n : null,\n [data]\n );\n\n return {children};\n};\n\nexport const useAppContext = () => useContext(AppContext);\n","import React, { createContext, useContext } from 'react';\nimport type { PayPalButtonsComponentOptions } from '@paypal/paypal-js';\nimport { PreviewTabName } from '@client/utils/constants';\n\nexport interface PreviewContextType {\n isPreview: boolean;\n tabName: PreviewTabName;\n onClickButtonInPreview?: PayPalButtonsComponentOptions['onClick'];\n createOrderInPreview?: PayPalButtonsComponentOptions['createOrder'];\n onApproveInPreview?: PayPalButtonsComponentOptions['onApprove'];\n onCancelInPreview?: PayPalButtonsComponentOptions['onCancel'];\n}\n\nexport const PreviewContext = createContext({} as PreviewContextType);\n\nexport const PreviewContextProvider = ({\n value,\n children\n}: {\n value: PreviewContextType;\n children: React.ReactElement;\n}) => {\n return {children};\n};\n\nexport const usePreviewContext = () => useContext(PreviewContext);\n","import React, { useContext } from 'react';\nimport { Context as WorldReadyContext } from '@paypalcorp/worldready-react';\nimport { WorldReadyProvider } from '@paypalcorp/pp-react-worldready';\nimport type { WorldReadyProps } from '@client/utils/localeHelper';\n\nconst useWorldReadyContext = () => useContext(WorldReadyContext);\n\nexport { WorldReadyProvider, useWorldReadyContext, WorldReadyProps };\n","import { IAppContext } from '@client/contexts/AppContext';\nimport { UcpConfig } from '@client/typings/Common';\n\nexport const getAppConfig = (appContext: IAppContext | null) => appContext?.app?.config;\n\nexport const getFeatureFlags = (appContext: IAppContext | null): UcpConfig['featureFlags'] =>\n getAppConfig(appContext)?.featureFlags || {};\n","import { Logger } from 'beaver-logger';\n\nlet logger; // beaver logger instance\n\nconst getCurrentPathname = () => window?.location?.pathname || '';\n\n// Reference: https://github.com/krakenjs/beaver-logger\n// NOTE: exporting beaverLogger for unit tests\nexport const beaverLogger = () => {\n if (logger) {\n return logger;\n }\n // eslint-disable-next-line new-cap\n logger = Logger({\n url: '/ncp/api/log',\n prefix: '',\n flushInterval: 10 * 1000,\n logLevel: 'info'\n });\n\n logger.addMetaBuilder(function () {\n // add the current pathname to the meta so we can log it before all the other logs\n // and can tell where the user is\n return {\n currPathname: getCurrentPathname()\n };\n });\n\n return logger;\n};\n\nconst getPayloadString = (payload: object | string | undefined): string => {\n if (!payload) {\n return '';\n }\n\n let payloadString = '';\n try {\n payloadString = typeof payload !== 'string' ? JSON.stringify(payload) : payload;\n } catch {\n console.error('getPayloadStringError Issue generating payload string');\n }\n\n return payloadString;\n};\n\nexport const logInfoClient = (event: string, payload?: object | string): void => {\n beaverLogger().info(event, { payload: getPayloadString(payload) });\n};\n\nexport const logErrorClient = (event: string, payload?: object | string): void => {\n beaverLogger().error(event, { payload: getPayloadString(payload) });\n};\n\nexport const logWarnClient = (event: string, payload?: object | string): void => {\n beaverLogger().warn(event, { payload: getPayloadString(payload) });\n};\n\nexport const logFptiClient = (payload?: object): void => {\n if (typeof payload !== 'object') {\n return;\n }\n beaverLogger().track(payload);\n};\n","import {\n CheckoutButtonSize,\n CheckoutPaymentOptionsOtherThanPayPal,\n CheckoutSingleButtonColorType\n} from '@components/buttons/types';\n\nexport enum OrderStatus {\n CREATED = 'CREATED',\n COMPLETED = 'COMPLETED',\n FAILED = 'FAILED',\n PAYER_ACTION_REQUIRED = 'PAYER_ACTION_REQUIRED'\n}\n\nexport enum CaptureStatus {\n PENDING = 'PENDING',\n COMPLETED = 'COMPLETED',\n FAILED = 'FAILED',\n DECLINED = 'DECLINED',\n AUTH_FAILED = 'AUTH_FAILED'\n}\n\nexport enum ButtonType {\n FIXED_PRICE = 'FIXED_PRICE',\n VARIABLE_PRICE = 'VARIABLE_PRICE',\n SINGLE_SELECT_LIST = 'SINGLE_SELECT_LIST'\n}\n\nexport enum IntegrationOptions {\n PAYMENT_LINK = 'paymentLink',\n QR_CODE = 'qrCode',\n STACKED_BUTTONS = 'stackedButtons',\n SINGLE_BUTTON = 'singleButton'\n}\n\nconst cardImg = 'https://www.paypalobjects.com/paypal-ui/pictograms/multicolored/svg/cards.svg';\n\nexport const INTEGRATION_TYPE_TO_IMAGE = {\n [IntegrationOptions.PAYMENT_LINK]:\n 'https://www.paypalobjects.com/paypal-ui/pictograms/multicolored/svg/fun.svg',\n [IntegrationOptions.QR_CODE]:\n 'https://www.paypalobjects.com/paypal-ui/pictograms/multicolored/svg/qrc-pay.svg',\n [IntegrationOptions.STACKED_BUTTONS]: cardImg,\n [IntegrationOptions.SINGLE_BUTTON]: cardImg\n};\n\nexport const PaymentMethodLogoSVGUrlMapper = {\n [CheckoutPaymentOptionsOtherThanPayPal.Venmo]:\n 'https://www.paypalobjects.com/paypal-ui/logos/svg/venmo-mark-color.svg',\n [CheckoutPaymentOptionsOtherThanPayPal.PayLater]:\n 'https://www.paypalobjects.com/paypal-ui/logos/svg/paypal-mark-color.svg',\n [CheckoutPaymentOptionsOtherThanPayPal.ApplePay]:\n 'https://www.paypalobjects.com/paypal-ui/logos/svg/apple-pay-color.svg'\n};\n\nexport const Color = {\n [CheckoutSingleButtonColorType.Recommended]: '#FFD140',\n [CheckoutSingleButtonColorType.Black]: '#000000',\n [CheckoutSingleButtonColorType.White]: '#ffffff'\n};\n\nexport enum PreviewTabName {\n PRODUCT = 'product',\n CHECK_OUT = 'checkout',\n THANK_YOU = 'thankyou',\n STACKED_BUTTONS = 'stackedButtons',\n SINGLE_BUTTON = 'singleButton'\n}\n\nexport const SINGLE_SELECT_ITEM_LIMIT = 15;\nexport const INVALID_OPTION_CONTENT_KEY = 'error.text.buyerInvalidOption';\n\nexport const CardSVGUrl = {\n cardSVGUrlWithApplePay: 'https://www.paypalobjects.com/images/Debit_Credit_APM.svg',\n cardSVGUrlWithOutApplePay: 'https://www.paypalobjects.com/images/Debit_Credit.svg'\n};\n\n// reference: https://www.figma.com/design/2R4zzzptJETTxjvplCSTTM/No-Code-Checkout-2.0?node-id=13514-107034&m=dev\n// checkout button requires height in px unit to match SDK buttons, which only accept px values\nexport const ButtonSizes = {\n [CheckoutButtonSize.Large]: {\n minWidth: '11.625rem',\n maxWidth: '31.1875rem',\n horizontalWidth: '33.75rem',\n lineHeight: '1.5rem',\n fontWeight: 700,\n sdkFontSize: '1.125rem',\n sdkHeight: '50px',\n singleButtonFontSize: '1.125rem',\n singleButtonHeight: '3.125rem'\n },\n [CheckoutButtonSize.Medium]: {\n minWidth: '11.625rem',\n maxWidth: '24.9375rem',\n horizontalWidth: '30.625rem',\n lineHeight: '1.25rem',\n fontWeight: 700,\n sdkFontSize: '1rem',\n sdkHeight: '42px',\n singleButtonFontSize: '1rem',\n singleButtonHeight: '2.625rem'\n },\n [CheckoutButtonSize.Small]: {\n minWidth: '11.625rem',\n // need this to be 316px instead of 299px since minimum JS SDK button width is 150\n // so when 2 horizontal buttons are rendered side by side, it could be up to 150+150+16(gap)\n maxWidth: '19.75rem',\n horizontalWidth: '25rem',\n lineHeight: '1.125rem',\n fontWeight: 700,\n sdkFontSize: '0.75rem',\n sdkHeight: '32px',\n singleButtonFontSize: '0.875rem',\n singleButtonHeight: '2rem'\n }\n};\n\nexport const VenmoColorMapping = {\n gold: undefined,\n blue: 'silver',\n silver: 'blue',\n black: 'black',\n white: 'white'\n};\n\nexport const checkoutColorMapping = {\n default: {\n backgroundColor: '#001435',\n color: 'white',\n hoverBrightness: 1.5,\n focus: {\n outline: 'solid 0.3rem #009cde',\n offset: '-0.3rem'\n }\n },\n black: {\n color: 'white',\n backgroundColor: '#2c2e2f',\n hoverBrightness: 1.2\n },\n white: {\n color: '#2c2e2f',\n backgroundColor: 'white',\n border: '0.0625rem solid #555',\n hoverBrightness: 0.95\n }\n};\n","import {\n MessageFormat,\n AddressFormat,\n CurrencyFormat,\n NumberFormat,\n DateTimeFormat\n} from '@paypalcorp/worldready';\nimport type { Address } from '../typings/Common';\nimport { PaymentButtonType } from '../components/buttons/types';\n\nexport interface WorldReadyProps {\n language: string; // en, fr\n region: string; // US, GB\n locale: string; // en-US, en-GB\n bundle: string; // en-US, en-GB\n globalize: object;\n}\n\nexport type CurrencyConfigType = {\n symbol: string;\n currencyCode: string;\n maxDecimalPlaces: number;\n};\n\nexport const getLocalizedString = (\n worldReady: WorldReadyProps,\n id: string | undefined,\n format: Record = {}\n): string => {\n if (!id) {\n return '';\n }\n\n const messageFormatter = new MessageFormat(worldReady, {\n id\n });\n return messageFormatter.format(format);\n};\n\ninterface ButtonAndLinkId {\n button: string;\n link: string;\n}\nexport const flexButtonAndLinkContent = (type: PaymentButtonType, id: ButtonAndLinkId): string => {\n if (type === PaymentButtonType.Button) {\n return id.button;\n }\n return id.link;\n};\n\nexport const getLocalizedAddress = (\n worldReady: WorldReadyProps,\n address: Address | undefined\n): string => {\n if (!address) {\n return '';\n }\n\n const addressFormatter = new AddressFormat(worldReady, {\n addressRegion: address.country_code,\n style: 'international-multiline'\n });\n return addressFormatter.format({\n addressLine1: address.address_line_1,\n adminArea1: address.admin_area_1,\n adminArea2: address.admin_area_2,\n countryCode: address.country_code,\n postalCode: address.postal_code\n });\n};\n\nexport const getLocalizedAddressParts = (\n worldReady: WorldReadyProps,\n address: Address | undefined\n): { type: string; value: string; parts: [] }[] => {\n if (!address) {\n return [];\n }\n\n const addressFormatter = new AddressFormat(worldReady, {\n addressRegion: address.country_code,\n style: 'international-multiline'\n });\n return addressFormatter.formatToParts({\n addressLine1: address.address_line_1,\n adminArea1: address.admin_area_1,\n adminArea2: address.admin_area_2,\n countryCode: address.country_code,\n postalCode: address.postal_code\n });\n};\n\nexport const getCurrencyConfig = (\n worldReady: WorldReadyProps,\n currency: string | undefined\n): CurrencyConfigType => {\n if (!currency) {\n return {\n symbol: '$',\n currencyCode: 'USD',\n maxDecimalPlaces: 2\n };\n }\n\n const currencyFormatter = new CurrencyFormat(worldReady, {\n currency,\n style: 'international'\n });\n const maxDecimalPlaces = currencyFormatter.resolvedOptions().maximumFractionDigits;\n const dummyParts = currencyFormatter.formatToParts(1);\n const symbol = dummyParts.find((part) => part.type === 'currencySymbol')?.value;\n const currencyCode = dummyParts.find((part) => part.type === 'currencyCode')?.value;\n\n return {\n symbol: symbol || '',\n currencyCode,\n maxDecimalPlaces\n };\n};\n\nexport const formatCurrency = (\n worldReady: WorldReadyProps,\n currencyCode: string | undefined,\n currencyAmount: string | number | undefined,\n showCurrencySymbol: boolean = false\n) => {\n if (currencyCode && currencyAmount != null) {\n const currencyFormatter = new CurrencyFormat(worldReady, {\n currency: currencyCode,\n style: 'international'\n });\n\n if (showCurrencySymbol) {\n return currencyFormatter.format(Number(currencyAmount));\n }\n const { minimumFractionDigits, maximumFractionDigits } = currencyFormatter.resolvedOptions();\n\n const numberFormatter = new NumberFormat(worldReady, {\n minimumFractionDigits,\n maximumFractionDigits\n });\n const formattedCurrencyAmount = numberFormatter.format(Number(currencyAmount));\n\n return `${formattedCurrencyAmount} ${currencyCode}`;\n }\n return null;\n};\n\nexport const getLocalizedDate = (\n worldReady: WorldReadyProps,\n timeZone: string,\n date: Date,\n options?: {\n style?: string;\n }\n) => {\n if (!date) {\n return '';\n }\n\n const dateTimeFormatter = new DateTimeFormat(worldReady, {\n style: options?.style || 'date-short',\n timeZone\n });\n return dateTimeFormatter.format(date);\n};\n\nexport const getLocalizedPercentage = (\n worldReady: WorldReadyProps,\n number: number | string | undefined\n) => {\n if (!number) {\n return '';\n }\n\n const numberFormatter = new NumberFormat(worldReady, {\n style: 'percent',\n maximumFractionDigits: 4\n });\n\n return numberFormatter.format(Number(number) / 100);\n};\n","/**\n * Grabs the data we dump from the server into the DOM and exports them as a singleton.\n * This allows us to conveniently dump server data into the dom and use this to load\n * that data into our app.\n */\n// because the way webpack is implemented, you can import this file anywhere\n// in the codebase like so:\n// import serverData from 'utils/server-data'\nimport { WorldReady } from '@paypalcorp/worldready';\nimport { ServerData } from '../typings/Common';\nimport { logErrorClient } from './beaverLogger';\n\nconst serverData = {} as ServerData;\n\nexport interface Data extends ServerData {\n serializedServerData?: string;\n serializedFptiConfigs?: string;\n}\n\nfunction init(data: Data) {\n if (!data) {\n return;\n }\n\n try {\n const serverDataDetails = JSON.parse(data.serializedServerData || '{}');\n const serverFPTIConfig = JSON.parse(data.serializedFptiConfigs || '{}');\n Object.assign(serverData, { ...data, ...serverDataDetails, ...serverFPTIConfig });\n\n if (process.env.NODE_ENV !== 'test' && serverData?.worldReady) {\n WorldReady.load(serverData.worldReady);\n }\n } catch (err) {\n logErrorClient('server-data: ', err.toString());\n }\n}\n\nconst supportedCurrencies = () => {\n return serverData.accountCurrencies || [];\n};\n\nexport default serverData;\nexport { init, supportedCurrencies };\n","import { CheckoutPaymentOptionsOtherThanPayPal } from '@client/components/buttons/types';\nimport type {\n ButtonStyleConfig,\n HostedButtonDetails,\n PaymentAmountDetails,\n PaymentBreakdownAmount,\n SDKButtonStyle,\n UcpConfig\n} from '@client/typings/Common';\nimport { IAppContext } from '@client/contexts/AppContext';\nimport { getFeatureFlags } from '@client/helpers/ucpConfig';\nimport { JSSDK_SPECIAL_LOCALES_MAP } from '@common/constants';\nimport { extractSourceAndFlowType } from '@common/fpti';\nimport { PreviewTabName } from '@client/utils/constants';\nimport { CurrencyConfigType } from './localeHelper';\n\nexport const transformButtonVariables = (linkVariables: HostedButtonDetails['link_variables']) =>\n (linkVariables || []).reduce((acc, curr) => {\n acc[curr.name] = curr.value;\n return acc;\n }, {} as Record);\n\nexport const transButtonStyleFromButtonVariables = (\n buttonStyleConfig: ButtonStyleConfig\n): SDKButtonStyle => {\n const { layout, shape, color, button_text: label, tagline } = buttonStyleConfig;\n const style: SDKButtonStyle = { layout, shape, color, label };\n\n if (layout !== 'vertical') {\n style.tagline = tagline === 'true' || tagline === true;\n } else {\n // JSSDK - style.tagline is not allowed for vertical layout\n style.tagline = false;\n }\n return style;\n};\n\nexport const isMerchantHostedExp = () =>\n typeof window !== 'undefined' && window.opener && window.opener !== window;\n\n/**\n * Align with round method used in worldready\n * (2.54, 0) => 3\n * (2.54, 1) => 2.5\n * (2.54, 2) => 2.54\n * (2.54, 3) => 2.54\n */\nexport const roundToMaxDecimal = (initValue: number, maximumFractionDigits: number = 2) => {\n const maxDecimals = Math.max(0, maximumFractionDigits);\n return +`${Math.round(Number(`${initValue}e${maxDecimals}`))}e-${maxDecimals}`;\n};\n\nexport const getTaxAmount = (\n subtotal: number,\n taxRate: number,\n maximumFractionDigits: number = 2\n) => {\n const taxAmount = (subtotal * taxRate) / 100;\n return roundToMaxDecimal(taxAmount, maximumFractionDigits);\n};\n\nexport const buttonIsEligible = (\n paymentMethod: CheckoutPaymentOptionsOtherThanPayPal,\n country: string | undefined,\n currency: string,\n config: UcpConfig | undefined\n) => {\n const paymentMethodConfig = config?.[paymentMethod];\n if (paymentMethodConfig) {\n const isSupportedCountry =\n !paymentMethodConfig.supportedCountries ||\n (country && paymentMethodConfig.supportedCountries.includes(country));\n const isSupportedCurrency =\n !paymentMethodConfig.supportedCurrencies ||\n paymentMethodConfig.supportedCurrencies.includes(currency);\n return isSupportedCountry && isSupportedCurrency;\n }\n return true;\n};\n\nexport const buttonIsAvailable = (\n paymentMethod: CheckoutPaymentOptionsOtherThanPayPal,\n country: string | undefined,\n currency: string,\n globalConfig: UcpConfig | undefined,\n flags: { enableApplePay: boolean }\n) => {\n if (paymentMethod === CheckoutPaymentOptionsOtherThanPayPal.ApplePay && !flags.enableApplePay) {\n return false;\n }\n const paymentMethodConfig = globalConfig?.[paymentMethod];\n const paymentMethodEnabled = !!paymentMethodConfig?.enabled;\n const buttonEligible = buttonIsEligible(paymentMethod, country, currency, globalConfig);\n if (!paymentMethodEnabled || !buttonEligible) {\n return false;\n }\n return true;\n};\n\nexport const transSDKFundingConfig = (\n allowedPaymentMethods: `${CheckoutPaymentOptionsOtherThanPayPal}`[]\n) => {\n const disabledPaymentMethods = Object.values(CheckoutPaymentOptionsOtherThanPayPal).filter(\n (method) => !allowedPaymentMethods.includes(method)\n );\n const newConfig = {\n enableFunding: allowedPaymentMethods.includes(CheckoutPaymentOptionsOtherThanPayPal.Venmo)\n ? CheckoutPaymentOptionsOtherThanPayPal.Venmo\n : '',\n disableFunding: disabledPaymentMethods.length > 0 ? disabledPaymentMethods.join(',') : ''\n };\n return newConfig;\n};\n\nexport const getPaymentBreakdown = (\n paymentDetails: PaymentAmountDetails,\n currencyConfig: CurrencyConfigType\n): PaymentBreakdownAmount => {\n const maxDecimal = currencyConfig.maxDecimalPlaces;\n let shippingValue = parseFloat(paymentDetails.shipping);\n let taxRateValue = parseFloat(paymentDetails.taxRate);\n let itemPriceValue = parseFloat(paymentDetails.itemPrice);\n if (Number.isNaN(itemPriceValue)) {\n itemPriceValue = 0;\n }\n if (Number.isNaN(shippingValue)) {\n shippingValue = 0;\n }\n if (Number.isNaN(taxRateValue)) {\n taxRateValue = 0;\n }\n const roundedPrice = roundToMaxDecimal(itemPriceValue, maxDecimal);\n const subtotal = roundedPrice * paymentDetails.quantity;\n const taxAmount = getTaxAmount(subtotal, taxRateValue, maxDecimal);\n return {\n subtotal: roundToMaxDecimal(subtotal, maxDecimal),\n shipping: roundToMaxDecimal(shippingValue, maxDecimal),\n taxAmount: roundToMaxDecimal(taxAmount, maxDecimal),\n total: roundToMaxDecimal(subtotal + shippingValue + taxAmount, maxDecimal)\n };\n};\n\nexport const getAllowedPaymentMethodsFromConfigs = (\n merchantCountry: string | undefined,\n ucpConfig: UcpConfig | undefined,\n currencyCode: string,\n toggles: {\n openVenmo: boolean;\n openPayLater: boolean;\n openApplePay: boolean;\n },\n flags: {\n enableApplePay: boolean; // TODO: Remove this after elmo is ramped to 100%\n }\n): CheckoutPaymentOptionsOtherThanPayPal[] => {\n let venmoToggle = toggles.openVenmo;\n let payLaterToggle = toggles.openPayLater;\n let applePayToggle = toggles.openApplePay;\n\n // If we do not have customize your checkout enabled, we should enable them by default.\n // Whether or not the button is actually allowed will be dictated by `buttonIsAvailable`\n // which ends up checking the UCP config for each funding method.\n if (!ucpConfig?.featureFlags?.customizeYourCheckout) {\n venmoToggle = true;\n payLaterToggle = true;\n applePayToggle = true;\n }\n\n const switches = {\n [CheckoutPaymentOptionsOtherThanPayPal.Venmo]: venmoToggle,\n [CheckoutPaymentOptionsOtherThanPayPal.PayLater]: payLaterToggle,\n [CheckoutPaymentOptionsOtherThanPayPal.ApplePay]: applePayToggle,\n [CheckoutPaymentOptionsOtherThanPayPal.Card]: true\n };\n const allowedMethods = Object.values(CheckoutPaymentOptionsOtherThanPayPal).reduce(\n (acc, paymentOption) => {\n const buttonAvailable = buttonIsAvailable(\n paymentOption,\n merchantCountry,\n currencyCode,\n ucpConfig,\n flags\n );\n if (buttonAvailable && switches[paymentOption]) {\n return acc.concat(paymentOption);\n }\n return acc;\n },\n [] as CheckoutPaymentOptionsOtherThanPayPal[]\n );\n return allowedMethods;\n};\n\nexport const shouldShow3ButtonsInDetails = (appContext: IAppContext | null) => {\n const buttonVariables = transformButtonVariables(appContext?.hostedButton?.button_variables);\n return !!(\n (appContext?.isSlowRampMerchant || !!buttonVariables.checkout_button_text_type) &&\n getFeatureFlags(appContext).jsSDKThreeButtonExp\n );\n};\n\nexport const shouldShow3ButtonsInEditor = (appContext: IAppContext | null) =>\n !!(appContext?.is3ButtonsEligible && getFeatureFlags(appContext).jsSDKThreeButtonExp);\n\nexport const get3ButtonsPaymentEligibility = (enableApplePay, currencyCode, country, config) => {\n const flags = { enableApplePay: enableApplePay ?? false };\n const showVenmo = currencyCode\n ? buttonIsAvailable(\n CheckoutPaymentOptionsOtherThanPayPal.Venmo,\n country,\n currencyCode,\n config,\n flags\n ) && window?.paypal?.isFundingEligible?.(CheckoutPaymentOptionsOtherThanPayPal.Venmo)\n : false;\n const showPayLater = currencyCode\n ? buttonIsAvailable(\n CheckoutPaymentOptionsOtherThanPayPal.PayLater,\n country,\n currencyCode,\n config,\n flags\n ) && window?.paypal?.isFundingEligible?.(CheckoutPaymentOptionsOtherThanPayPal.PayLater)\n : false;\n const eligibleApplePay = currencyCode\n ? buttonIsAvailable(\n CheckoutPaymentOptionsOtherThanPayPal.ApplePay,\n country,\n currencyCode,\n config,\n flags\n )\n : false;\n return {\n showVenmo,\n showPayLater,\n eligibleApplePay\n };\n};\n/**\n * Map WorldReady locale to jssdk locale.\n * @param locale\n * @returns\n */\nexport const sdkLocaleMapper = (locale: string) => {\n return (JSSDK_SPECIAL_LOCALES_MAP[locale] || locale || 'en-US').replace('-', '_');\n};\n\nexport const shouldShow3ButtonsAlert = (appContext: IAppContext | null) => {\n const buttonVariables = transformButtonVariables(appContext?.hostedButton?.button_variables);\n return (\n appContext?.hostedButton?.id &&\n shouldShow3ButtonsInEditor(appContext) &&\n !buttonVariables.checkout_button_text_type\n );\n};\n\nexport const getSourceAndFlowTypeForOrderStatus = (appContext: IAppContext | null) => {\n const checkoutButtonTextType = appContext?.orderDetails?.checkoutButtonTextType;\n const isSlowRampMerchant = appContext?.isSlowRampMerchant;\n let { sourceType, flowType } = extractSourceAndFlowType(appContext?.fptiData);\n if (isMerchantHostedExp()) {\n if (isSlowRampMerchant || !!checkoutButtonTextType) {\n flowType = 'merchant';\n sourceType = '3_button_code';\n } else {\n flowType = 'merchant';\n sourceType = 'button_code';\n }\n }\n return { sourceType, flowType };\n};\n\nexport const isMerchantHostedPreview = (isPreview: boolean, tabName: string) =>\n isPreview && (tabName === PreviewTabName.PRODUCT || tabName === PreviewTabName.STACKED_BUTTONS);\n","import React from 'react';\nimport type { DeepPartial } from 'react-hook-form';\nimport { HostedButton, HostedButtonDetails } from '@client/typings/Common';\nimport { KrakenRequest } from '@server/typings';\nimport { transformButtonVariables } from '@client/utils/utils';\nimport {\n ButtonConfig,\n NoShipping,\n CheckoutButtonTextType,\n CheckoutButtonType,\n SingleButtonTextType,\n CheckoutSingleButtonColorType\n} from '@client/components/buttons/types';\nimport { logErrorClient } from '@client/utils/beaverLogger';\nimport { mapServerToClientItems } from '@client/components/buttons/serverClientPayloadKeyMapper';\nimport { fptiPageNames, FPTI_GROUP, COMPONENT, PRODUCT } from './fpti';\n\nexport type FlowType = 'paypal' | 'merchant' | 'unknown' | 'preview';\nexport type SourceType =\n | 'link'\n | 'qr_code'\n | 'button_code'\n | 'unknown'\n | 'checkout_button'\n | 'single_button'\n | '3_button_code';\nexport type PageName =\n | 'payment'\n | 'paywall'\n | 'order_status'\n | 'deploy_sheet'\n | 'not_found'\n | 'account_check_failed';\nexport type FptiData = {\n eventName: string;\n pageName?: PageName;\n hosted_button_id?: string;\n merchant_id?: string;\n order_id?: string | unknown;\n payment_source?: string;\n selected_payment_method?: string;\n error_type?: string;\n flow_type?: FlowType;\n source_type?: SourceType;\n api_response_code?: number;\n api_duration?: number;\n event?: string;\n [key: string]: unknown;\n};\n\nexport type MerchantFptiData = {\n eventName: string;\n hosted_button_id?: string;\n merchant_id?: string;\n order_id?: string | unknown;\n payment_source?: string;\n selected_payment_method?: string;\n error_type?: string;\n flow_type?: FlowType;\n source_type?: SourceType;\n api_response_code?: number;\n api_duration?: number;\n [key: string]: unknown;\n};\n\nconst BASE_TAGS = {\n product: PRODUCT,\n component: COMPONENT,\n pgrp: FPTI_GROUP\n};\n\nexport const buildBaseTags = (pageName: string | undefined, eventName: string, event?: string) => {\n const page = fptiPageNames[pageName || ''];\n if (event) {\n return {\n ...BASE_TAGS,\n page,\n event_name: eventName,\n e: event,\n event_type: event\n };\n }\n return {\n ...BASE_TAGS,\n page,\n action: eventName\n };\n};\n\nexport const buildAdditionalTags = (\n buttonDetails: HostedButtonDetails,\n sourceType: SourceType,\n flowType: FlowType,\n enablePaywall?: boolean\n) => {\n const buttonVariables = transformButtonVariables(buttonDetails.link_variables);\n const hostedButtonId = buttonDetails.id;\n const {\n business: merchantId,\n shape: buttonShape,\n color: buttonColor,\n ...otherProps\n } = buttonVariables;\n return {\n ...otherProps,\n button_shape: buttonShape,\n button_color: buttonColor,\n merchant_id: merchantId,\n hosted_button_id: hostedButtonId,\n source_type: sourceType,\n flow_type: flowType,\n version: enablePaywall ? 'v2' : ''\n };\n};\n\nexport type ButtonConfigFptiFlags = {\n shouldSend3ButtonTags?: boolean;\n shouldSendSingleButtonTags?: boolean;\n};\n\nexport const buildButtonConfigTagsV2 = (\n buttonConfig: DeepPartial,\n flags?: ButtonConfigFptiFlags\n) => ({\n button_color: buttonConfig.color,\n button_layout: buttonConfig.layout,\n button_shape: buttonConfig.shape,\n button_text: buttonConfig.paypalButtonText,\n button_type: buttonConfig.paymentButtonType,\n component: 'nocodenodeweb',\n is_no_shipping: buttonConfig.isNotCollectShippingAddress,\n item: buttonConfig.items,\n label_amount: buttonConfig.amountLabel,\n label_invoice: buttonConfig.invoiceLabel,\n label_note: buttonConfig.memoLabel,\n max_qty: buttonConfig.quantityOption,\n price: buttonConfig.amount,\n pricing_option_selected: buttonConfig.buttonType,\n product_name: buttonConfig.itemName,\n product_id: buttonConfig.productId,\n quantity_option: buttonConfig.isEnableQuantityOption,\n return_url: buttonConfig.customReturnUrl,\n return_url_option: buttonConfig.returnUrlType,\n shipping_config: buttonConfig.shippingPreference,\n shipping_fee: buttonConfig.shipping,\n tax_config: buttonConfig.taxRatePreference,\n tax_rate: buttonConfig.taxRate,\n version: 'v2',\n // 3-button fields, we need to add a ramp check here since these values get\n // pre-populated to default values\n ...(flags?.shouldSend3ButtonTags && {\n button_size: buttonConfig.size,\n button_text_checkout:\n buttonConfig.checkoutButtonTextType === CheckoutButtonTextType.Custom\n ? buttonConfig.checkoutButtonCustomText\n : buttonConfig.checkoutButtonTextType\n }),\n // single button fields\n ...(flags?.shouldSendSingleButtonTags && {\n checkout_button_type: buttonConfig.checkoutButtonType,\n button_size_single: buttonConfig.singleButtonSize,\n button_color_single:\n buttonConfig.singleButtonColorType === CheckoutSingleButtonColorType.Custom\n ? buttonConfig.singleButtonColor\n : buttonConfig.singleButtonColorType,\n button_text_single:\n buttonConfig.singleButtonTextType === SingleButtonTextType.Custom\n ? buttonConfig.singleButtonCustomText\n : buttonConfig.singleButtonTextType\n })\n});\n\nexport const buildButtonDetailsTags = (hostedButton?: HostedButton) => {\n const buttonVariables = transformButtonVariables(hostedButton?.button_variables);\n const items = mapServerToClientItems(hostedButton?.option_details);\n return {\n button_color: buttonVariables.color,\n button_layout: buttonVariables.layout,\n button_shape: buttonVariables.shape,\n button_text: buttonVariables.button_text,\n button_type: buttonVariables.payment_button_type,\n component: 'nocodenodeweb',\n is_no_shipping: buttonVariables.no_shipping === NoShipping.NoPrompt,\n item: items,\n label_amount: buttonVariables.amount_label,\n label_invoice: buttonVariables.invoice_label,\n label_note: buttonVariables.memo_label,\n max_qty: buttonVariables.quantity_option,\n price: buttonVariables.amount,\n pricing_option_selected: buttonVariables.button_sub_type,\n product_name: buttonVariables.item_name,\n product_id: buttonVariables.product_id,\n quantity_option: buttonVariables.quantity_option !== undefined,\n return_url: buttonVariables.custom_return_url,\n return_url_option: buttonVariables.return_url_type,\n shipping_config: buttonVariables.shipping_preference,\n shipping_fee: buttonVariables.shipping,\n tax_config: buttonVariables.tax_rate_preference,\n tax_rate: buttonVariables.tax_rate,\n version: 'v2',\n // 3-button fields\n button_size: buttonVariables.size,\n button_text_checkout:\n buttonVariables.checkout_button_text_type === CheckoutButtonTextType.Custom\n ? buttonVariables.checkout_button_custom_text\n : buttonVariables.checkout_button_text_type,\n // single button fields\n checkout_button_type: buttonVariables.checkout_button_type,\n button_size_single: buttonVariables.single_button_size,\n button_color_single:\n buttonVariables.single_button_color_type === CheckoutSingleButtonColorType.Custom\n ? buttonVariables.single_button_color\n : buttonVariables.single_button_color_type,\n button_text_single:\n buttonVariables.single_button_text_type === SingleButtonTextType.Custom\n ? buttonVariables.single_button_custom_text\n : buttonVariables.single_button_text_type\n };\n};\n\nexport const recordImpression = (fptiData: FptiData, onceData?: Partial) => {\n if (window.PAYPAL?.analytics?.instance) {\n const { eventName, pageName, ...otherProps } = fptiData;\n const data = {\n ...buildBaseTags(pageName, eventName, 'im'),\n ...otherProps\n };\n\n window.PAYPAL.analytics.instance.recordImpression({ data }, onceData);\n }\n};\n\nexport const recordClick = (fptiData: FptiData) => {\n if (window.PAYPAL?.analytics?.instance) {\n const { eventName, pageName, ...otherProps } = fptiData;\n const data = {\n ...buildBaseTags(pageName, eventName, 'cl'),\n ...otherProps\n };\n\n window.PAYPAL.analytics.instance.recordClick({ data });\n }\n};\n\nexport const recordActivity = (fptiData: FptiData) => {\n if (window.PAYPAL?.analytics?.instance) {\n const { eventName, pageName, ...otherProps } = fptiData;\n const data = {\n ...buildBaseTags(pageName, eventName, 'ac'),\n ...otherProps\n };\n\n window.PAYPAL.analytics.instance.logActivity({ data });\n }\n};\n\nexport const recordError = (error: Error, info?: React.ErrorInfo) => {\n const isErrorBoundary = !!info?.componentStack;\n if (window.PAYPAL?.analytics?.instance) {\n const data = {\n ...BASE_TAGS,\n error_description: error.message,\n erpg: isErrorBoundary ? 'error_boundary' : undefined\n };\n\n window.PAYPAL.analytics.instance.recordError(data);\n }\n\n if (isErrorBoundary) {\n logErrorClient('ERROR_BOUNDARY_SHOWN', error.message);\n }\n};\n\nexport const startCPLTracking = (fptiData: FptiData, identifier?: string) => {\n if (window.PAYPAL?.analytics) {\n const { pageName, eventName, event, ...otherProps } = fptiData;\n const data = {\n ...buildBaseTags(pageName, eventName, event),\n ...otherProps\n };\n window.PAYPAL.analytics.startCPLTracking(data, identifier);\n }\n};\n\nexport const endCPLTracking = (fptiData?: FptiData, identifier?: string) => {\n if (window.PAYPAL?.analytics) {\n let data;\n if (fptiData) {\n const { pageName, eventName, event, ...otherProps } = fptiData;\n data = {\n ...buildBaseTags(pageName, eventName, event),\n ...otherProps\n };\n }\n window.PAYPAL.analytics.endCPLTracking(data, identifier);\n }\n};\n\nexport const recordServerSide = (\n req: KrakenRequest,\n fptiData: FptiData,\n shouldFlush: boolean = false\n) => {\n const { eventName, pageName = '', ...otherProps } = fptiData;\n const base = buildBaseTags(pageName, eventName, 'im');\n if (req.tracking) {\n // Adding this in now as a stop-gap until we figure out how to handle\n // multiple server-side FPTI calls in one request\n if (shouldFlush) {\n req.tracking.flushServerSide({ ...base, ...otherProps }, true);\n } else {\n req.tracking.addServerSideFptiData({ ...base, ...otherProps });\n req.tracking.doAnalytics();\n }\n }\n};\n\nexport const buildMerchantBaseTags = (eventName: string, event?: string) => {\n const data = {\n product: PRODUCT,\n component: COMPONENT,\n pgrp: FPTI_GROUP\n };\n if (event) {\n return {\n ...data,\n event_name: eventName,\n e: event,\n event_type: event\n };\n }\n return {\n ...data,\n action: eventName\n };\n};\n\n/**\n * Merchant hosted payment button FPTI\n */\nexport const recordMerchantFPTI = (\n req: KrakenRequest,\n fptiData: MerchantFptiData,\n shouldFlush: boolean = false\n) => {\n const { eventName, ...otherProps } = fptiData;\n const base = buildMerchantBaseTags(eventName, 'im');\n if (req.tracking) {\n if (shouldFlush) {\n req.tracking.flushServerSide({ ...base, ...otherProps }, true);\n } else {\n req.tracking.addServerSideFptiData({ ...base, ...otherProps });\n req.tracking.doAnalytics();\n }\n }\n};\n","/**\n * !!!!!! THIS FILE ASSUMES THAT ALL NUMBERS HAVE ALREADY BEEN NORMALIZED !!!!!!\n *\n * All initial validations logic taken from `smart-button-editor`'s `validate.js`\n * https://github.paypal.com/Checkout/smart-button-editor/blob/master/src/common/validate.js\n *\n * Validations documented here: https://paypal.atlassian.net/wiki/spaces/NCPS/pages/815675533/NCPS+button+validations\n *\n */\nimport { CurrencyFormat } from '@paypalcorp/worldready';\nimport { Buffer } from 'buffer';\nimport { WorldReadyProps } from '@client/utils/localeHelper';\nimport {\n CheckoutButtonLayout,\n PaymentButtonType,\n CheckoutButtonType,\n CheckoutButtonShape,\n CheckoutButtonColor,\n CheckoutPaypalButtonText,\n CheckoutButtonSize,\n NoShipping,\n CheckoutButtonTextType,\n ReturnUrlType,\n ShippingPreference,\n TaxRatePreference,\n CheckoutSingleButtonColorType,\n SingleButtonTextType\n} from '@components/buttons/types';\nimport type { KrakenRequest } from '@server/typings';\nimport { ButtonType, SINGLE_SELECT_ITEM_LIMIT } from '@client/utils/constants';\nimport { supportedCurrencies, validations as currencyValidations } from './currencyConfigs';\n\n// Shared error messages\nexport enum ValidationErrorType {\n REQUIRED = 'required',\n INVALID_NUMBER = 'invalidNumber',\n INVALID_INTEGER = 'invalidInteger',\n INVALID_SIZE = 'invalidSize',\n INVALID_RANGE = 'invalidRange',\n DECIMAL_PLACES = 'decimalPlaces',\n DECIMAL_NOT_SUPPORTED = 'decimalNotSupported',\n UNSUPPORTED_CURRENCY = 'unsupportedCurrency',\n INVALID_BUTTON_TYPE = 'invalidButtonType',\n UNSUPPORTED_TYPE = 'unsupportedType',\n INVALID_URL = 'invalidUrl',\n INVALID_CUSTOM_COLOR = 'invalidCustomColor',\n DUPLICATE = 'duplicate',\n GENERIC_INVALID = 'genericInvalid'\n}\n\nexport type ValidationError = {\n error?: `${ValidationErrorType}`;\n details?: {\n min?: number;\n max?: number;\n numOfPlaces?: number;\n };\n};\n\ntype ItemError = {\n desc: ValidationError;\n price: ValidationError;\n};\n\nexport interface ItemsError extends ValidationError {\n itemErrors?: Array;\n}\n\n// To support both the server and client side typings for WorldReady.\ntype WorldReadyFlex = WorldReadyProps | KrakenRequest['worldReady'];\n\ntype NumberInput = string;\n\n// Data size/length validations\nconst MAX_BYTES_ITEM_NAME = 127;\nconst MAX_CHARS_LABEL = 127;\nconst MAX_CHARS_OPTION_NAME = 64;\nexport const MAX_CHARS_BUTTON_TEXT = 20;\n\n// Min/max config taken from smart-button-editor\nexport const MIN_QUANTITY = 1;\nexport const MAX_QUANTITY = 100;\nexport const taxConfig = {\n min: 0,\n max: 99.9999,\n maxDecimals: 4\n};\n\nconst trimString = (value: unknown) => (typeof value === 'string' ? value.trim() : '');\n\nexport const validateItemName = (itemName: string | unknown, buttonType: string) => {\n const validations: ValidationError = {};\n const trimmedItemName = trimString(itemName);\n if (trimmedItemName === '') {\n if (buttonType === ButtonType.FIXED_PRICE || buttonType === ButtonType.SINGLE_SELECT_LIST) {\n validations.error = ValidationErrorType.REQUIRED;\n }\n } else if (Buffer.byteLength(trimmedItemName, 'utf8') > MAX_BYTES_ITEM_NAME) {\n validations.error = ValidationErrorType.INVALID_SIZE;\n }\n return validations;\n};\n\nexport const validateQuantity = (quantity: NumberInput, isEnabled: boolean) => {\n const validations: ValidationError = {};\n if (!isEnabled) {\n return validations;\n }\n\n const quantityNum = Number(quantity);\n if (quantity === '') {\n validations.error = ValidationErrorType.REQUIRED;\n } else if (Number.isNaN(quantityNum)) {\n validations.error = ValidationErrorType.INVALID_NUMBER;\n } else if (!Number.isInteger(quantityNum)) {\n validations.error = ValidationErrorType.INVALID_INTEGER;\n } else if (quantityNum < MIN_QUANTITY || quantityNum > MAX_QUANTITY) {\n validations.error = ValidationErrorType.INVALID_RANGE;\n validations.details = {\n min: MIN_QUANTITY,\n max: MAX_QUANTITY\n };\n }\n\n return validations;\n};\n\nconst VALID_SINGLE_BUTTON_COLOR_TYPES = [\n CheckoutSingleButtonColorType.Recommended,\n CheckoutSingleButtonColorType.Black,\n CheckoutSingleButtonColorType.White,\n CheckoutSingleButtonColorType.Custom\n];\nexport const validateSingleButtonColorType = (singleColorType: string) => {\n const validations: ValidationError = {};\n if (!singleColorType) {\n validations.error = ValidationErrorType.REQUIRED;\n } else if (VALID_SINGLE_BUTTON_COLOR_TYPES.every((value) => value !== singleColorType)) {\n validations.error = ValidationErrorType.UNSUPPORTED_TYPE;\n }\n return validations;\n};\n\nexport const validateCustomColor = (singleButtonColorType: string, color: string) => {\n const validations: ValidationError = {};\n\n if (singleButtonColorType !== CheckoutSingleButtonColorType.Custom) {\n return validations;\n }\n\n const HEX_VALIDATION = /^[A-Fa-f0-9]{6}$/g;\n if (!color.match(HEX_VALIDATION)) {\n validations.error = ValidationErrorType.INVALID_CUSTOM_COLOR;\n }\n return validations;\n};\n\nconst VALID_SINGLE_BUTTON_TEXT_TYPES = [\n SingleButtonTextType.Buynow,\n SingleButtonTextType.Paynow,\n SingleButtonTextType.Custom\n];\nexport const validateSingleButtonTextType = (singleButtonTextType: string) => {\n const validations: ValidationError = {};\n if (!singleButtonTextType) {\n validations.error = ValidationErrorType.REQUIRED;\n } else if (VALID_SINGLE_BUTTON_TEXT_TYPES.every((value) => value !== singleButtonTextType)) {\n validations.error = ValidationErrorType.UNSUPPORTED_TYPE;\n }\n return validations;\n};\n\nexport const validateSingleButtonCustomText = (\n singleButtonTextType: string,\n singleButtonCustomText: string\n) => {\n const validations: ValidationError = {};\n if (singleButtonTextType !== SingleButtonTextType.Custom) {\n return validations;\n }\n\n const trimmedLabel = trimString(singleButtonCustomText);\n if (trimmedLabel === '') {\n validations.error = ValidationErrorType.REQUIRED;\n } else if (trimmedLabel.length > MAX_CHARS_BUTTON_TEXT) {\n validations.error = ValidationErrorType.INVALID_SIZE;\n }\n return validations;\n};\n\n// This should only be applied to a normalized number so that % will work correctly with Number.\nconst isDecimal = (n: number) => !Number.isNaN(n) && n % 1 !== 0;\n\n// At this point, we should have normalized the prices/numbers so the decimal should be using the expected separator (\".\")\nconst countDecimals = (n: number) => {\n let decimalCount: number | undefined;\n if (isDecimal(n)) {\n decimalCount = n.toString().split('.')[1].length;\n }\n return decimalCount || 0;\n};\n\n// Get the maximum number of decimals allowed from WorldReady and validate the number.\nexport const checkForDecimalErrors = (\n worldReady: WorldReadyFlex,\n num: number,\n currency: string\n): {\n hasError: boolean;\n decimalError?: ValidationError;\n} => {\n const currencyOptions = new CurrencyFormat(worldReady, {\n currency\n }).resolvedOptions();\n\n // If for some reason WorldReady does not have a max fraction digit,\n // we'll use the original fallback of 2.\n const maximumFractionDigits =\n currencyOptions?.maximumFractionDigits !== undefined\n ? currencyOptions.maximumFractionDigits\n : 2;\n\n // If the currency does not support decimals (maximumFractionDigits = 0),\n // then we should return decimal not supported.\n if (isDecimal(num) && maximumFractionDigits === 0) {\n return {\n hasError: true,\n decimalError: {\n error: ValidationErrorType.DECIMAL_NOT_SUPPORTED\n }\n };\n }\n\n if (countDecimals(num) > maximumFractionDigits) {\n return {\n hasError: true,\n decimalError: {\n error: ValidationErrorType.DECIMAL_PLACES,\n details: {\n numOfPlaces: maximumFractionDigits\n }\n }\n };\n }\n\n return {\n hasError: false\n };\n};\n\nexport const validateTaxRate = (taxRatePreference: string, taxRate: NumberInput) => {\n const validations: ValidationError = {};\n /**\n * 1. Tax rate is optional so we should just return if it's not passed in\n * 2. When tax rate preference is NOT custom, we send '0'\n */\n if (!taxRate || taxRatePreference !== TaxRatePreference.Custom) {\n return validations;\n }\n\n const rateNum = parseFloat(taxRate);\n const isTaxValid = rateNum >= taxConfig.min && rateNum <= taxConfig.max;\n\n if (Number.isNaN(rateNum)) {\n validations.error = ValidationErrorType.INVALID_NUMBER;\n } else if (!isTaxValid) {\n validations.error = ValidationErrorType.INVALID_RANGE;\n validations.details = {\n min: taxConfig.min,\n max: taxConfig.max\n };\n } else if (countDecimals(rateNum) > taxConfig.maxDecimals) {\n validations.error = ValidationErrorType.DECIMAL_PLACES;\n validations.details = {\n numOfPlaces: 4\n };\n }\n return validations;\n};\n\nexport const validateShipping = (\n worldReady: WorldReadyFlex,\n shippingPreference: string,\n shipping: NumberInput,\n currencyCode: string\n) => {\n let validations: ValidationError = {};\n\n /**\n * 1. Shipping is optional so return early if there is no value.\n * 2. When shipping preference is NOT custom, we send '0'\n */\n if (!shipping || shippingPreference !== ShippingPreference.Custom) {\n return validations;\n }\n\n const shippingNum = parseFloat(shipping);\n const { hasError: hasDecimalError, decimalError } = checkForDecimalErrors(\n worldReady,\n shippingNum,\n currencyCode\n );\n if (Number.isNaN(shippingNum)) {\n validations.error = ValidationErrorType.INVALID_NUMBER;\n } else if (shippingNum < 0) {\n validations.error = ValidationErrorType.INVALID_RANGE;\n validations.details = {\n min: 0\n };\n } else if (hasDecimalError) {\n validations = {\n ...validations,\n ...decimalError\n };\n }\n return validations;\n};\n\n// Fixed price amount validations. Re-used when verifying the single select list\n// item prices.\nexport const validateAmount = (\n worldReady: WorldReadyFlex,\n amount: NumberInput,\n currencyCode: string\n) => {\n let validations: ValidationError = {};\n const minAmount = currencyValidations[currencyCode]?.min ?? currencyValidations.default.min;\n const maxAmount = currencyValidations[currencyCode]?.max;\n\n const amountNum = Number(amount);\n const { hasError: hasDecimalError, decimalError } = checkForDecimalErrors(\n worldReady,\n amountNum,\n currencyCode\n );\n if (amount === '') {\n validations.error = ValidationErrorType.REQUIRED;\n } else if (Number.isNaN(amountNum)) {\n validations.error = ValidationErrorType.INVALID_NUMBER;\n } else if (amountNum < minAmount) {\n validations.error = ValidationErrorType.INVALID_RANGE;\n validations.details = {\n min: minAmount\n };\n } else if (maxAmount && amountNum > maxAmount) {\n validations.error = ValidationErrorType.INVALID_RANGE;\n validations.details = {\n max: maxAmount\n };\n } else if (hasDecimalError) {\n validations = {\n ...validations,\n ...decimalError\n };\n }\n return validations;\n};\n\nexport const validateItems = (\n worldReady: WorldReadyFlex,\n items: Array<{ desc: string; price: NumberInput }>,\n currencyCode: string,\n checkMaxQuantity?: boolean\n) => {\n const validations: ItemsError = {};\n const itemErrors: Array = [];\n\n // If no list is provided, we need to throw a required validation error.\n if (!items.length) {\n validations.error = ValidationErrorType.REQUIRED;\n return validations;\n }\n\n // If we have more than 15 items, we should throw an error. This error does not have a corresponding\n // error message on the UI since the UI should be blocking item addition past 15, we should just be\n // showing the generic error message.\n if (checkMaxQuantity && items.length > SINGLE_SELECT_ITEM_LIMIT) {\n validations.error = ValidationErrorType.GENERIC_INVALID;\n return validations;\n }\n\n // Iterate through each of the items and ensure that the descriptions and the amounts are valid.\n items.forEach((item, index) => {\n const trimmedDesc = item.desc.trim();\n const descError: ValidationError = {};\n if (trimmedDesc === '') {\n descError.error = ValidationErrorType.REQUIRED;\n } else if (\n trimmedDesc.length > MAX_CHARS_OPTION_NAME ||\n Buffer.byteLength(trimmedDesc, 'utf8') > MAX_BYTES_ITEM_NAME\n ) {\n descError.error = ValidationErrorType.INVALID_SIZE;\n } else if (\n items.some(\n (itemTemp, indexTemp) => itemTemp.desc.trim() === trimmedDesc && indexTemp !== index\n )\n ) {\n descError.error = ValidationErrorType.DUPLICATE;\n }\n\n const priceError: ValidationError = validateAmount(worldReady, item.price, currencyCode);\n itemErrors.push({ desc: descError, price: priceError });\n });\n\n // If even one of the items in the list has an error,\n // then we should set the whole errors list.\n const hasItemError = itemErrors.some((err) => err.desc.error || err.price.error);\n if (hasItemError) {\n validations.itemErrors = itemErrors;\n }\n\n return validations;\n};\n\n// For Variable Price labels - memo, price, and invoice (optional)\nexport const validateVariableLabel = (label: string | unknown, isRequired: boolean) => {\n const validations: ValidationError = {};\n const trimmedLabel = trimString(label);\n if (isRequired && trimmedLabel === '') {\n validations.error = ValidationErrorType.REQUIRED;\n } else if (trimmedLabel.length > MAX_CHARS_LABEL) {\n validations.error = ValidationErrorType.INVALID_SIZE;\n }\n return validations;\n};\n\nexport const validateCurrencyCode = (currencyCode: string, country: string) => {\n const validations: ValidationError = {};\n if ((currencyCode === 'MYR' && country !== 'MY') || !supportedCurrencies.includes(currencyCode)) {\n validations.error = ValidationErrorType.UNSUPPORTED_CURRENCY;\n }\n return validations;\n};\n\nconst VALID_LAYOUT_TYPES = [CheckoutButtonLayout.Vertical, CheckoutButtonLayout.Horizontal];\nexport const validateLayout = (layout: string) => {\n const validations: ValidationError = {};\n if (!layout) {\n validations.error = ValidationErrorType.REQUIRED;\n } else if (VALID_LAYOUT_TYPES.every((value) => value !== layout)) {\n validations.error = ValidationErrorType.UNSUPPORTED_TYPE;\n }\n return validations;\n};\n\nconst VALID_SHAPE_TYPES = [CheckoutButtonShape.Pill, CheckoutButtonShape.Rect];\nexport const validateShape = (shape: string) => {\n const validations: ValidationError = {};\n if (!shape) {\n validations.error = ValidationErrorType.REQUIRED;\n } else if (VALID_SHAPE_TYPES.every((value) => value !== shape)) {\n validations.error = ValidationErrorType.UNSUPPORTED_TYPE;\n }\n return validations;\n};\n\nconst VALID_COLOR_TYPES = [\n CheckoutButtonColor.Black,\n CheckoutButtonColor.Blue,\n CheckoutButtonColor.Gold,\n CheckoutButtonColor.Silver,\n CheckoutButtonColor.White\n];\nexport const validateColor = (color: string) => {\n const validations: ValidationError = {};\n if (!color) {\n validations.error = ValidationErrorType.REQUIRED;\n } else if (VALID_COLOR_TYPES.every((value) => value !== color)) {\n validations.error = ValidationErrorType.UNSUPPORTED_TYPE;\n }\n return validations;\n};\n\nconst VALID_BUTTON_TEXT_TYPES = [\n CheckoutPaypalButtonText.Buynow,\n CheckoutPaypalButtonText.Checkout,\n CheckoutPaypalButtonText.Installment,\n CheckoutPaypalButtonText.Pay,\n CheckoutPaypalButtonText.Paypal\n];\nexport const validateButtonText = (buttonText: string) => {\n const validations: ValidationError = {};\n if (!buttonText) {\n validations.error = ValidationErrorType.REQUIRED;\n } else if (VALID_BUTTON_TEXT_TYPES.every((value) => value !== buttonText)) {\n validations.error = ValidationErrorType.UNSUPPORTED_TYPE;\n }\n return validations;\n};\n\nconst VALID_PAYMENT_BUTTON_TYPES = [PaymentButtonType.Button, PaymentButtonType.Link];\nexport const validatePaymentButtonType = (paymentButtonType: string) => {\n const validations: ValidationError = {};\n if (!paymentButtonType) {\n validations.error = ValidationErrorType.REQUIRED;\n } else if (VALID_PAYMENT_BUTTON_TYPES.every((value) => value !== paymentButtonType)) {\n validations.error = ValidationErrorType.UNSUPPORTED_TYPE;\n }\n return validations;\n};\n\nconst VALID_NO_SHIPPING_TYPES = [NoShipping.NoPrompt, NoShipping.PromptRequired];\nexport const validateNoShipping = (noShipping: string) => {\n const validations: ValidationError = {};\n if (!noShipping) {\n validations.error = ValidationErrorType.REQUIRED;\n } else if (VALID_NO_SHIPPING_TYPES.every((value) => value !== noShipping)) {\n validations.error = ValidationErrorType.UNSUPPORTED_TYPE;\n }\n return validations;\n};\n\nconst VALID_CHECKOUT_BUTTON_TYPES = [CheckoutButtonType.Single, CheckoutButtonType.Stacked];\nexport const validateCheckoutButtonType = (checkoutButtonType: string) => {\n const validations: ValidationError = {};\n if (!checkoutButtonType) {\n validations.error = ValidationErrorType.REQUIRED;\n } else if (VALID_CHECKOUT_BUTTON_TYPES.every((value) => value !== checkoutButtonType)) {\n validations.error = ValidationErrorType.UNSUPPORTED_TYPE;\n }\n return validations;\n};\n\nconst VALID_CHECKOUT_BUTTON_TEXT_TYPES = [\n CheckoutButtonTextType.Checkout,\n CheckoutButtonTextType.Pay,\n CheckoutButtonTextType.Proceed,\n CheckoutButtonTextType.Custom\n];\nexport const validateCheckoutButtonTextType = (checkoutButtonTextType: string) => {\n const validations: ValidationError = {};\n if (!checkoutButtonTextType) {\n validations.error = ValidationErrorType.REQUIRED;\n } else if (VALID_CHECKOUT_BUTTON_TEXT_TYPES.every((value) => value !== checkoutButtonTextType)) {\n validations.error = ValidationErrorType.UNSUPPORTED_TYPE;\n }\n return validations;\n};\n\nexport const validateCheckoutButtonCustomText = (\n checkoutButtonTextType: string,\n checkoutButtonCustomText: string\n) => {\n const validations: ValidationError = {};\n if (checkoutButtonTextType !== CheckoutButtonTextType.Custom) {\n return validations;\n }\n\n const trimmedLabel = trimString(checkoutButtonCustomText);\n if (trimmedLabel === '') {\n validations.error = ValidationErrorType.REQUIRED;\n } else if (trimmedLabel.length > MAX_CHARS_BUTTON_TEXT) {\n validations.error = ValidationErrorType.INVALID_SIZE;\n }\n return validations;\n};\n\nconst VALID_SIZE_TYPES = [\n CheckoutButtonSize.Large,\n CheckoutButtonSize.Medium,\n CheckoutButtonSize.Small\n];\nexport const validateSize = (size: string) => {\n const validations: ValidationError = {};\n if (!size) {\n validations.error = ValidationErrorType.REQUIRED;\n } else if (VALID_SIZE_TYPES.every((value) => value !== size)) {\n validations.error = ValidationErrorType.UNSUPPORTED_TYPE;\n }\n return validations;\n};\n\n// https://uibakery.io/regex-library/url\nconst URL_REGEX =\n /^((http|https)\\:\\/\\/)?[-a-zA-Z0-9@:%._\\+~#=]{1,256}\\.[a-zA-Z0-9()]{1,6}\\b(?:[-a-zA-Z0-9()@:%_\\+.~#?&//=]*)$/;\nexport const validateUrl = (url: string) => {\n const validations: ValidationError = {};\n const trimmedUrl = trimString(url);\n if (!trimmedUrl) return validations; // Optional\n\n if (trimmedUrl.length > MAX_CHARS_LABEL) {\n validations.error = ValidationErrorType.INVALID_SIZE;\n } else if (!URL_REGEX.test(url)) {\n validations.error = ValidationErrorType.INVALID_URL;\n }\n return validations;\n};\n\nconst VALID_RETURN_URL_TYPES = [ReturnUrlType.Custom, ReturnUrlType.None];\nexport const validateReturnUrlType = (returnUrlType: string) => {\n const validations: ValidationError = {};\n if (!returnUrlType) {\n validations.error = ValidationErrorType.REQUIRED;\n } else if (VALID_RETURN_URL_TYPES.every((value) => value !== returnUrlType)) {\n validations.error = ValidationErrorType.UNSUPPORTED_TYPE;\n }\n return validations;\n};\n\nexport const validateReturnUrl = (returnUrlType: string, returnUrl: string) => {\n const validations: ValidationError = {};\n if (returnUrlType !== ReturnUrlType.Custom) {\n return validations;\n }\n if (!trimString(returnUrl)) {\n validations.error = ValidationErrorType.INVALID_URL;\n return validations;\n }\n\n return validateUrl(returnUrl);\n};\n\nconst VALID_SHIPPING_PREFERENCES = [\n ShippingPreference.Custom,\n ShippingPreference.Free,\n ShippingPreference.FromProfile,\n ShippingPreference.NotApplicable\n];\nexport const validateShippingPreference = (shippingPreference: string, noShipping: string) => {\n const validations: ValidationError = {};\n if (!shippingPreference) {\n validations.error = ValidationErrorType.REQUIRED;\n } else if (VALID_SHIPPING_PREFERENCES.every((value) => value !== shippingPreference)) {\n validations.error = ValidationErrorType.UNSUPPORTED_TYPE;\n } else if (\n noShipping === NoShipping.NoPrompt &&\n shippingPreference === ShippingPreference.FromProfile\n ) {\n validations.error = ValidationErrorType.UNSUPPORTED_TYPE;\n }\n return validations;\n};\n\nconst VALID_TAX_RATE_PREFERENCES = [\n TaxRatePreference.Custom,\n TaxRatePreference.FromProfile,\n TaxRatePreference.NotApplicable\n];\nexport const validateTaxRatePreference = (taxRatePreference: string, noShipping: string) => {\n const validations: ValidationError = {};\n if (!taxRatePreference) {\n validations.error = ValidationErrorType.REQUIRED;\n } else if (VALID_TAX_RATE_PREFERENCES.every((value) => value !== taxRatePreference)) {\n validations.error = ValidationErrorType.UNSUPPORTED_TYPE;\n } else if (\n noShipping === NoShipping.NoPrompt &&\n taxRatePreference === TaxRatePreference.FromProfile\n ) {\n validations.error = ValidationErrorType.UNSUPPORTED_TYPE;\n }\n return validations;\n};\n\nexport const validatePaymentOption = (paymentOption: string) => {\n const validations: ValidationError = {};\n if (!paymentOption) {\n validations.error = ValidationErrorType.REQUIRED;\n } else if (paymentOption !== 'true' && paymentOption !== 'false') {\n validations.error = ValidationErrorType.REQUIRED;\n }\n return validations;\n};\n","export const EDITOR_AND_DETAILS_URL = '/ncp/links';\n\n// This mapping is for JSSDK, according to https://developer.paypal.com/sdk/js/configuration/#link-locale\nexport const JSSDK_SPECIAL_LOCALES_MAP = {\n 'zh-CN-xbord': 'zh-CN',\n 'en-CN-xbord': 'zh-CN',\n 'nb-NO': 'no-NO',\n 'fil-PH': 'en-PH'\n};\n\n// According to https://paypal.slack.com/archives/C02D21KRD45/p1693268291663499\nexport const BFS_SPECIAL_LOCALES_MAP = {\n 'zh-CN-xbord': 'zh-C2',\n 'en-CN-xbord': 'en-C2',\n 'nb-NO': 'no-NO',\n 'fil-PH': 'tl-PH'\n};\n","import { FlowType, SourceType } from './analytics';\n\nexport const COMPONENT = 'nocodenodeweb';\nexport const PRODUCT = 'quantum_leap';\nexport const FPTI_GROUP = 'main:business:web:hostedcheckout';\nexport const fptiPageNames = {\n payment: 'main:business:web:hostedcheckout:payment',\n order_status: 'main:business:web:hostedcheckout:order_status',\n not_found: 'main:business:web:hostedcheckout:not_found',\n merchant_website: 'main:business:web:hostedcheckout:merchant_website'\n};\n\ntype ftpiType = {\n sourceType?: SourceType;\n flowType?: FlowType;\n};\n\nexport const extractSourceAndFlowType = (ftpi: ftpiType | undefined) => {\n return { sourceType: ftpi?.sourceType ?? 'unknown', flowType: ftpi?.flowType ?? 'unknown' };\n};\n"],"names":["ButtonWrapperVariation","containerStyles","css","PaymentWrapper","children","_jsx","_Container","xxl","memo","hostedButtonId","buttonDetails","variation","appContext","useAppContext","merchantCountryCode","country_code","buttonVariables","transformButtonVariables","link_variables","business","merchantId","currency_code","currencyCode","button_type","buttonType","shipping_preference","shippingPreference","tax_rate_preference","taxRatePreference","open_venmo","openVenmo","open_paylater","openPayLater","open_applepay","openApplePay","no_shipping","noShipping","worldReady","useContext","WorldReadyContext","allowedPaymentMethods","getAllowedPaymentMethodsFromConfigs","app","context","locality","country","config","enableApplePay","Boolean","sdkOptions","clientId","serverData","sdkClientId","components","currency","sdkBaseUrl","sdkUrl","dataCspNonce","nonce","locale","sdkLocaleMapper","transSDKFundingConfig","styleForStackedButtons","transButtonStyleFromButtonVariables","layout","shape","color","button_text","tagline","commonSDKWrapperProps","notCollectShippingAddr","commonStyles","_jsxs","PayPalScriptProvider","options","PAYWALL","PaywallHostedButtons","HOSTED_BUTTONS","StackedPayPalButtons","buttonStyle","ErrorMessage","captureStatus","errorMessage","message","CaptureStatus","FAILED","getLocalizedString","AUTH_FAILED","_Alert","type","style","DisclaimerPolicy","_CaptionText","_Link","href","region","target","size","secondary","onClick","recordClick","eventName","pageName","Payment","useParams","enablePaywall","hostedButtonDetails","sourceType","flowType","extractSourceAndFlowType","fptiData","fptiAdditionalTags","buildAdditionalTags","paymentContextValues","PaymentContextValuesGenerator","useOnCaptureFailEffect","useEffect","recordImpression","error_message","PaymentContextProvider","value","_Col","HostedButtonDetails","StackedButtonsContainer","VALID_FIELDS_MAP","ButtonType","FIXED_PRICE","quantity","SINGLE_SELECT_LIST","item","VARIABLE_PRICE","amount","invoice","backgroundWrapper","disclaimerPolicyStyle","Paywall","useWorldReadyContext","useDeepEqualMemo","prefillData","getPrefillData","paymentPrefillData","toUpperCase","paymentContextPrefillData","values","errors","loggingErrors","Object","keys","length","validFields","quantityErrors","quantityValues","getQuantityData","shouldCheckQuantity","quantityOption","quantityOptionNumber","Number","isQuantityRelevant","prototype","hasOwnProperty","call","isQuantityOptionEnabled","isNaN","prefillQuantity","isInteger","INVALID_OPTION_CONTENT_KEY","quantity_option","doesPrefillItemExist","prefillItem","option_details","find","_","name","selection_details","option_selection","amountValues","amountLoggingErrors","getAmountData","shouldCheckAmount","hasAmountLabel","prefillAmount","prefilledAmountNumber","checkForDecimalErrors","hasError","amount_label","invoice_label","memo_label","useOnPrefillDataPopulatedEffect","prefillErrorKeys","errorKeysForLogging","hasValues","hasErrors","prefillDataToLog","logInfoClient","prefill","int_error_desc","styles","container","_Row","content","isLoading","className","_LoadingSpinner","cx","ButtonContainer","iconContainerStyles","NotFound","_CriticalIcon","_HeadingText","hydrate","App","initialAppData","hydrateMethod","document","getElementById","Comp","WorldReadyContextProvider","WorldReadyProvider","BrowserRouter","basename","hydrateRoot","createRoot","render","EmotionThemeProvider","theme","_PAYPAL_THEME","AppContextProvider","Routes","Route","path","element","Notfound","initializeAppData","windowInitialState","window","__initialState__","worldReadyData","WorldReady","load","initServerData","_invert","itemName","shipping","taxRate","memoLabel","paypalButtonText","amountLabel","invoiceLabel","returnUrlType","customReturnUrl","cancelUrl","checkoutButtonTextType","checkoutButtonCustomText","singleButtonColorType","singleButtonColor","singleButtonTextType","singleButtonCustomText","singleButtonSize","paymentButtonType","productId","checkoutButtonType","isNotCollectShippingAddress","PaymentButtonType","CheckoutButtonType","CheckoutButtonLayout","CheckoutButtonShape","CheckoutButtonColor","CheckoutSingleButtonColorType","SingleButtonTextType","CheckoutPaypalButtonText","CheckoutButtonSize","CheckoutButtonTextType","NoShipping","ShippingPreference","TaxRatePreference","ReturnUrlType","CheckoutPaymentOptionsOtherThanPayPal","Row","gap","center","Col","inputShimmer","inputStyle","spinnerStyle","dropdownMenu","dropdownMenuInPreview","buyerExpLayout","sysSizeMediaSm","sysSizeMediaXs","sysSizeMediaMd","sysSizeMediaLg","globalDropdownMenuSheet","boldTextOverride","alertWrapper","AppContext","React","data","setData","useState","appContextValue","useMemo","setCustomData","prevData","_set","setCsrfToken","csrfToken","setHostedButton","hostedButton","Provider","PreviewContext","createContext","usePreviewContext","getFeatureFlags","getAppConfig","featureFlags","logger","beaverLogger","Logger","url","prefix","flushInterval","logLevel","addMetaBuilder","currPathname","location","pathname","getPayloadString","payload","payloadString","JSON","stringify","console","error","event","info","logErrorClient","logWarnClient","warn","OrderStatus","IntegrationOptions","PAYMENT_LINK","QR_CODE","STACKED_BUTTONS","SINGLE_BUTTON","Venmo","PayLater","ApplePay","Recommended","Black","White","PreviewTabName","Large","Medium","Small","id","format","MessageFormat","getCurrencyConfig","symbol","maxDecimalPlaces","currencyFormatter","CurrencyFormat","resolvedOptions","maximumFractionDigits","dummyParts","formatToParts","part","formatCurrency","currencyAmount","showCurrencySymbol","minimumFractionDigits","NumberFormat","init","serverDataDetails","parse","serializedServerData","serverFPTIConfig","serializedFptiConfigs","assign","err","toString","linkVariables","reduce","acc","curr","buttonStyleConfig","label","getTaxAmount","subtotal","roundToMaxDecimal","initValue","maxDecimals","Math","max","round","disabledPaymentMethods","filter","method","includes","enableFunding","disableFunding","join","merchantCountry","ucpConfig","toggles","flags","venmoToggle","payLaterToggle","applePayToggle","customizeYourCheckout","switches","Card","paymentOption","buttonIsAvailable","paymentMethod","globalConfig","paymentMethodConfig","paymentMethodEnabled","enabled","buttonEligible","buttonIsEligible","isSupportedCountry","supportedCountries","isSupportedCurrency","supportedCurrencies","concat","JSSDK_SPECIAL_LOCALES_MAP","replace","isMerchantHostedPreview","isPreview","tabName","PRODUCT","BASE_TAGS","product","component","COMPONENT","pgrp","FPTI_GROUP","buildBaseTags","page","fptiPageNames","event_name","e","event_type","action","buttonShape","buttonColor","otherProps","button_shape","button_color","merchant_id","hosted_button_id","source_type","flow_type","version","onceData","PAYPAL","analytics","instance","startCPLTracking","identifier","endCPLTracking","ValidationErrorType","MAX_QUANTITY","isDecimal","Custom","Buynow","Paynow","n","num","currencyOptions","undefined","decimalError","DECIMAL_NOT_SUPPORTED","decimalCount","split","countDecimals","DECIMAL_PLACES","details","numOfPlaces","Vertical","Horizontal","Pill","Rect","Blue","Gold","Silver","Checkout","Installment","Pay","Paypal","Button","Link","NoPrompt","PromptRequired","Single","Stacked","Proceed","None","Free","FromProfile","NotApplicable","payment","order_status","not_found","merchant_website","ftpi"],"sourceRoot":""}