{"version":3,"file":"js/2241.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/ContainerTemplates/SplitScreenBase/index.tsx","webpack://nocodenodeweb/./src/client/components/ContainerTemplates/SingleScreenBase/index.tsx","webpack://nocodenodeweb/./src/client/components/ContainerTemplates/MainBaseContainer/styles.ts","webpack://nocodenodeweb/./src/client/components/ContainerTemplates/MainBaseContainer/index.tsx","webpack://nocodenodeweb/./src/client/components/Paywall/prefillData.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/getVersion.ts","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';\nimport type { WorldReadyProps } from '@client/utils/localeHelper';\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: WorldReadyProps;\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 isClientError?: boolean;\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 GOOGLEPAY = 'googlepay',\n APPLEPAY = 'applepay'\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 shippingTaxExpansion?: boolean;\n singleButton?: boolean;\n jsSDKThreeButtonExp?: boolean;\n customizeYourCheckout?: boolean;\n venmoShipTaxSupport?: boolean;\n supportShippingTaxProfileInPayment?: boolean;\n paywallButtons?: 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\nexport type CurrencyListProps = {\n value: string;\n primaryText: 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 ShippingPreference,\n TaxRatePreference\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 profileShipTax =\n shippingPreference === ShippingPreference.FromProfile ||\n taxRatePreference === TaxRatePreference.FromProfile;\n const worldReady = useContext(WorldReadyContext);\n\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 profileShipTax\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 React from 'react';\nimport cx from 'classnames';\n\ninterface SplitScreenBaseProps {\n leftChild: React.ReactNode;\n rightChild: React.ReactNode;\n isMobileReverseOrder?: boolean;\n}\nconst SplitScreenBase = ({ leftChild, rightChild, isMobileReverseOrder }: SplitScreenBaseProps) => {\n return (\n <>\n
\n {leftChild}\n
\n
{rightChild}
\n \n );\n};\n\nexport default SplitScreenBase;\n","import React from 'react';\n\n/* As for now (August 2024), this SingleScreenBase is only used by Subscriptions */\nconst SingleScreenBase = ({ children }) => {\n return
{children}
;\n};\n\nexport default SingleScreenBase;\n","import { css } from '@emotion/react';\nimport { PAYPAL_THEME } from '@paypalcorp/pp-react';\n\n/*\n JS SDK buttons has a min-width of 150px.\n We noticed an issue with new button presentment on paywall, a 2-column button layout, \n buttons were overlapping the enclosed container on sysSizeMediaMd breakpoint.\n Hence, we have defined this specific breakpoint to overcome the issue.\n*/\nconst breakpointWidth = '51.25rem';\n\nconst styles = {\n pageContainer: css`\n min-height: 100vh;\n padding-top: 4.5rem;\n padding-bottom: 1rem;\n background-color: #f1f2f3;\n box-sizing: border-box;\n overflow: hidden;\n @media (max-width: 47rem) {\n padding-bottom: 3rem;\n }\n @media (max-width: 36rem) {\n padding-top: 0;\n }\n `,\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 contentContainer: 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: ${breakpointWidth}) {\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: ${breakpointWidth}) {\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: ${breakpointWidth}) {\n border-bottom-left-radius: 0;\n border-top-right-radius: 1.5rem;\n\n &.reverse-order {\n order: 1;\n background-color: transparent;\n }\n }\n\n background-color: rgb(250, 251, 251);\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, { ReactNode } from 'react';\nimport { Container, Row, CaptionText, LoadingSpinner, ContainerProps } from '@paypalcorp/pp-react';\nimport commonStyles from '@components/common/commonStyles';\nimport ErrorMessage from '@components/payment/ErrorMessage';\nimport SplitScreenBase from '../SplitScreenBase';\nimport SingleScreenBase from '../SingleScreenBase';\nimport styles from './styles';\n\ninterface MainBaseContainerProps extends ContainerProps {\n xxl?: boolean;\n contentLeft: ReactNode;\n contentRight?: ReactNode;\n disclaimer?: ReactNode;\n isLoading?: boolean;\n loadingSpinnerText?: string;\n topLevelErrorStatus?: string;\n topLevelErrorMessage?: string;\n isMobileReverseOrder?: boolean;\n}\n\nconst MainBaseContainer = ({\n contentLeft,\n contentRight = null,\n disclaimer,\n isLoading = false,\n loadingSpinnerText = '',\n topLevelErrorStatus = '',\n topLevelErrorMessage = '',\n isMobileReverseOrder,\n ...rest\n}: MainBaseContainerProps) => {\n return (\n
\n \n \n \n \n
\n {isLoading && (\n \n \n {loadingSpinnerText}\n
\n )}\n {contentLeft &&\n (contentRight ? (\n \n ) : (\n {contentLeft}\n ))}\n
\n {disclaimer && {disclaimer}}\n \n \n );\n};\n\nexport default MainBaseContainer;\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\ntype ValidFieldsMap = {\n amount?: boolean;\n invoice?: boolean;\n item?: boolean;\n memo?: boolean;\n quantity?: boolean;\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 prefillData: PaymentPrefillData,\n quantityOption: string | undefined,\n shouldCheckQuantity: boolean = false\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 getMatchedOption = (buttonDetails: HostedButtonDetails, prefillItem: string | undefined) => {\n const items =\n buttonDetails?.option_details?.find((_) => _.name === 'items')?.selection_details ?? [];\n const matchedItem = items.find((item) => item.option_selection?.trim() === prefillItem);\n return matchedItem?.option_selection;\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() as ButtonType;\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: ValidFieldsMap = VALID_FIELDS_MAP[buttonType] || {};\n\n const { errors: quantityErrors, values: quantityValues } = getQuantityData(\n paymentContextPrefillData,\n prefillData,\n buttonVariables.quantity_option,\n validFields.quantity\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 // We use the item value from matched option as prefillData value to avoid future mismatch issues.\n if (validFields.item && Object.prototype.hasOwnProperty.call(prefillData, 'item')) {\n const matchedOption = getMatchedOption(buttonDetails, prefillData?.item);\n const doesPrefillItemExist = !!matchedOption;\n if (doesPrefillItemExist) {\n paymentContextPrefillData.values.item = matchedOption;\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 && prefillData.invoice) {\n paymentContextPrefillData.values.invoice = prefillData.invoice;\n }\n\n if (validFields.memo && buttonVariables.memo_label && prefillData.memo) {\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 React, { useEffect } from 'react';\nimport { useParams } from 'react-router-dom';\nimport ButtonContainer from '@components/ButtonsStack/Container';\nimport { useAppContext } from '@client/contexts/AppContext';\nimport MainBaseContainer from '@components/ContainerTemplates/MainBaseContainer';\nimport DisclaimerPolicy from '@components/payment/DisclaimerPolicy';\nimport { useWorldReadyContext } from '@client/contexts/WorldReadyContext';\nimport { getLocalizedString } from '@client/utils/localeHelper';\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 {\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';\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 enablePaywallButtons = appContext?.enablePaywallButtons;\n const hostedButtonDetails = appContext?.hostedButtonDetails as HostedButtonDetailsType;\n const { sourceType, flowType } = extractSourceAndFlowType(appContext?.fptiData);\n const fptiAdditionalTags = useDeepEqualMemo(\n buildAdditionalTags(\n hostedButtonDetails,\n sourceType,\n flowType,\n enablePaywall,\n enablePaywallButtons\n )\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 contentRight={\n hostedButtonId && (\n \n )\n }\n topLevelErrorStatus={paymentContextValues.captureStatus}\n topLevelErrorMessage={paymentContextValues.errorMessage}\n isLoading={paymentContextValues.isLoading}\n loadingSpinnerText={getLocalizedString(worldReady, 'payment.text.paymentProcessing')}\n disclaimer={}\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 = (initialData?: InitialAppData): InitialAppData => {\n // eslint-disable-next-line no-underscore-dangle\n const initialState = initialData || (window.__initialState__ as InitialAppData);\n\n // Load localization messages from WorldReady\n const worldReadyData = initialState?.app?.worldReady;\n WorldReady.load(worldReadyData);\n initServerData(initialState?.serverData);\n\n // Allow the passed state to be garbage-collected\n // eslint-disable-next-line no-underscore-dangle\n if (!initialData) {\n delete window.__initialState__;\n }\n\n return initialState;\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\n/**\n * Key values that we want to pass to the server from the client\n */\ntype OverrideFlagsConfig = {\n /**\n * [DTNCPS-1141][TEMP] Adding in to handle overriding the 3-buttons elmo for our functional tests\n */\n is3ButtonsEligible?: boolean;\n};\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 - optional\n */\n shippingPreference?: `${ShippingPreference}`;\n /**\n * Custom tax rate\n */\n taxRate: string;\n /**\n * Tax rate preference - optional\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 OverrideFlagsConfig &\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';\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 globalDropdownMenuSheet = css`\n .dropdownMenuSheet {\n word-break: break-all;\n }\n`;\n\nexport const alertWrapper = css`\n padding-top: 0.75rem;\n`;\n\nexport const hideStyle = css`\n display: none;\n`;\n\nexport default {\n alertWrapper,\n Col,\n dropdownMenu,\n dropdownMenuInPreview,\n globalDropdownMenuSheet,\n inputShimmer,\n inputStyle,\n Row,\n spinnerStyle,\n hideStyle\n};\n","import React, { useState, useContext, useMemo } from 'react';\nimport _set from 'lodash/set';\nimport { FlowType, SourceType } from '@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 enablePaywallButtons?: boolean;\n is3ButtonsEligible?: boolean;\n isSlowRampMerchant?: boolean;\n shouldDisplayFeedbackButton?: boolean;\n // fpti\n fptiData?: {\n flowType: FlowType;\n sourceType: SourceType;\n };\n supportProfileShipTaxConfig?: boolean;\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}\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","const getVersion = (enablePaywall?: boolean, enablePaywallButtons?: boolean) => {\n let version = enablePaywall ? 'v2' : '';\n if (enablePaywallButtons) {\n version = 'v2.1';\n }\n return version;\n};\nexport default getVersion;\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 enum PaymentImageSource {\n Venmo = 'https://www.paypalobjects.com/paypal-ui/logos/svg/venmo-mark-color.svg',\n PayLater = 'https://www.paypalobjects.com/paypal-ui/logos/svg/paypal-mark-color.svg',\n ApplePay = 'https://www.paypalobjects.com/paypal-ui/logos/svg/apple-pay-color.svg',\n GooglePay = 'https://www.paypalobjects.com/paypal-ui/logos/svg/google-pay-color.svg'\n}\n\nexport const PaymentMethodLogoSVGUrlMapper = {\n [CheckoutPaymentOptionsOtherThanPayPal.Venmo]: PaymentImageSource.Venmo,\n [CheckoutPaymentOptionsOtherThanPayPal.PayLater]: PaymentImageSource.PayLater,\n [CheckoutPaymentOptionsOtherThanPayPal.ApplePay]: PaymentImageSource.ApplePay\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): ReturnType => {\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: currencyCode || currency,\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 { supportedCurrencies } from '@common/currencyConfigs';\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\nconst ENABLED_FUNDING_METHODS = [\n CheckoutPaymentOptionsOtherThanPayPal.Venmo,\n CheckoutPaymentOptionsOtherThanPayPal.PayLater\n];\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 profileShipTax?: boolean\n) => {\n if (paymentMethod === CheckoutPaymentOptionsOtherThanPayPal.ApplePay && !flags.enableApplePay) {\n return false;\n }\n if (\n paymentMethod === CheckoutPaymentOptionsOtherThanPayPal.Venmo &&\n profileShipTax &&\n !globalConfig?.featureFlags?.venmoShipTaxSupport\n ) {\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\n const enabledPaymentMethods = ENABLED_FUNDING_METHODS.filter((method) =>\n allowedPaymentMethods.includes(method)\n );\n\n const newConfig = {\n enableFunding: enabledPaymentMethods.length > 0 ? enabledPaymentMethods.join(',') : '',\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 profileShipTax?: boolean\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 profileShipTax\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 = (\n enableApplePay,\n currencyCode,\n country,\n config,\n profileShipTax?\n) => {\n const flags = { enableApplePay: enableApplePay ?? false };\n const showVenmo = currencyCode\n ? buttonIsAvailable(\n CheckoutPaymentOptionsOtherThanPayPal.Venmo,\n country,\n currencyCode,\n config,\n flags,\n profileShipTax\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\nexport const getCurrencyList = (country: string | undefined) => {\n return (\n country === 'MY' ? supportedCurrencies : supportedCurrencies.filter((_) => _ !== 'MYR')\n ).map((currency) => ({\n value: currency,\n primaryText: currency\n }));\n};\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 SingleButtonTextType,\n CheckoutSingleButtonColorType\n} from '@client/components/buttons/types';\nimport { logErrorClient } from '@client/utils/beaverLogger';\nimport { mapServerToClientItems } from '@client/components/buttons/serverClientPayloadKeyMapper';\nimport getVersion from '@client/helpers/getVersion';\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 | 'quick_actions'\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 enablePaywallButtons?: 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 const version = getVersion(enablePaywall, enablePaywallButtons);\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\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 space_key: 'SKS09G' // Insightly space key\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, amountValidations, shippingValidations } 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 NEED_COLLECT_SHIPPING_ADDR = 'needCollectShippingAddress',\n NOT_SUPPORT_FROM_PROFILE = 'notSupportFromProfile'\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 castedWorldReady = worldReady as WorldReadyProps; // TODO: fix the type\n const currencyOptions = new CurrencyFormat(castedWorldReady, {\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 | undefined, 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 | undefined,\n shipping: NumberInput,\n currencyCode: string\n) => {\n let validations: ValidationError = {};\n const minShipping = shippingValidations[currencyCode]?.min ?? shippingValidations.default.min;\n const maxShipping = shippingValidations[currencyCode]?.max;\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 < minShipping) {\n validations.error = ValidationErrorType.INVALID_RANGE;\n validations.details = {\n min: minShipping\n };\n } else if (maxShipping && shippingNum > maxShipping) {\n validations.error = ValidationErrorType.INVALID_RANGE;\n validations.details = {\n max: maxShipping\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 = amountValidations[currencyCode]?.min ?? amountValidations.default.min;\n const maxAmount = amountValidations[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 = (\n shippingPreference: string | undefined,\n noShipping: string,\n supportProfileShipTaxConfig?: boolean\n) => {\n const validations: ValidationError = {};\n if (\n shippingPreference &&\n VALID_SHIPPING_PREFERENCES.every((value) => value !== shippingPreference)\n ) {\n validations.error = ValidationErrorType.UNSUPPORTED_TYPE;\n } else if (\n !supportProfileShipTaxConfig &&\n shippingPreference === ShippingPreference.FromProfile\n ) {\n validations.error = ValidationErrorType.NOT_SUPPORT_FROM_PROFILE;\n } else if (\n noShipping === NoShipping.NoPrompt &&\n shippingPreference === ShippingPreference.FromProfile\n ) {\n validations.error = ValidationErrorType.NEED_COLLECT_SHIPPING_ADDR;\n }\n return validations;\n};\n\nconst VALID_TAX_RATE_PREFERENCES = [\n TaxRatePreference.Custom,\n TaxRatePreference.FromProfile,\n TaxRatePreference.NotApplicable\n];\nexport const validateTaxRatePreference = (\n taxRatePreference: string | undefined,\n noShipping: string,\n supportProfileShipTaxConfig?: boolean\n) => {\n const validations: ValidationError = {};\n if (\n taxRatePreference &&\n VALID_TAX_RATE_PREFERENCES.every((value) => value !== taxRatePreference)\n ) {\n validations.error = ValidationErrorType.UNSUPPORTED_TYPE;\n } else if (!supportProfileShipTaxConfig && taxRatePreference === TaxRatePreference.FromProfile) {\n validations.error = ValidationErrorType.NOT_SUPPORT_FROM_PROFILE;\n } else if (\n noShipping === NoShipping.NoPrompt &&\n taxRatePreference === TaxRatePreference.FromProfile\n ) {\n validations.error = ValidationErrorType.NEED_COLLECT_SHIPPING_ADDR;\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","profileShipTax","ShippingPreference","FromProfile","TaxRatePreference","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","SplitScreenBase","leftChild","rightChild","isMobileReverseOrder","_Fragment","className","cx","SingleScreenBase","breakpointWidth","pageContainer","container","_PAYPAL_THEME","sysSizeMediaSm","sysSizeMediaXs","contentContainer","sysSizeMediaLg","disclaimerPolicyStyle","MainBaseContainer","contentLeft","contentRight","disclaimer","isLoading","loadingSpinnerText","topLevelErrorStatus","topLevelErrorMessage","rest","styles","_Row","_LoadingSpinner","VALID_FIELDS_MAP","ButtonType","FIXED_PRICE","quantity","SINGLE_SELECT_LIST","item","VARIABLE_PRICE","amount","invoice","Paywall","useWorldReadyContext","enablePaywallButtons","useDeepEqualMemo","prefillData","getPrefillData","paymentPrefillData","toUpperCase","paymentContextPrefillData","values","errors","loggingErrors","Object","keys","length","validFields","quantityErrors","quantityValues","getQuantityData","quantityOption","shouldCheckQuantity","quantityOptionNumber","Number","isQuantityRelevant","prototype","hasOwnProperty","call","isQuantityOptionEnabled","isNaN","prefillQuantity","isInteger","INVALID_OPTION_CONTENT_KEY","quantity_option","matchedOption","getMatchedOption","prefillItem","matchedItem","option_details","find","_","name","selection_details","option_selection","trim","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","ButtonContainer","iconContainerStyles","NotFound","_CriticalIcon","_HeadingText","hydrate","App","initialAppData","hydrateMethod","document","getElementById","Comp","WorldReadyContextProvider","WorldReadyProvider","BrowserRouter","basename","hydrateRoot","createRoot","render","EmotionThemeProvider","theme","AppContextProvider","Routes","Route","path","element","Notfound","initialData","initialState","window","__initialState__","worldReadyData","WorldReady","load","initServerData","initializeAppData","_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","ReturnUrlType","CheckoutPaymentOptionsOtherThanPayPal","Row","gap","center","Col","inputShimmer","inputStyle","spinnerStyle","dropdownMenu","dropdownMenuInPreview","globalDropdownMenuSheet","alertWrapper","hideStyle","AppContext","React","data","setData","useState","appContextValue","useMemo","setCustomData","prevData","_set","setCsrfToken","csrfToken","setHostedButton","hostedButton","Provider","PreviewContext","createContext","usePreviewContext","getVersion","version","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","PaymentImageSource","Venmo","PayLater","ApplePay","Recommended","Black","White","PreviewTabName","checkoutColorMapping","Large","Medium","Small","default","backgroundColor","hoverBrightness","focus","outline","offset","black","white","border","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","ENABLED_FUNDING_METHODS","linkVariables","reduce","acc","curr","buttonStyleConfig","label","getTaxAmount","subtotal","roundToMaxDecimal","initValue","maxDecimals","Math","max","round","disabledPaymentMethods","filter","method","includes","enabledPaymentMethods","enableFunding","join","disableFunding","merchantCountry","ucpConfig","toggles","flags","venmoToggle","payLaterToggle","applePayToggle","customizeYourCheckout","switches","Card","paymentOption","buttonIsAvailable","paymentMethod","globalConfig","venmoShipTaxSupport","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","onceData","PAYPAL","analytics","instance","recordActivity","logActivity","startCPLTracking","identifier","endCPLTracking","ValidationErrorType","MAX_QUANTITY","isDecimal","Custom","Buynow","Paynow","n","num","castedWorldReady","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","NotApplicable","payment","order_status","not_found","merchant_website","ftpi"],"sourceRoot":""}