{"version":3,"file":"js/5183.js","mappings":"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","sources":["webpack://nocodenodeweb/./src/client/components/ButtonsStack/Container.tsx","webpack://nocodenodeweb/./src/client/components/Settings/getInitialMerchantSettings.ts","webpack://nocodenodeweb/./src/client/components/Settings/types.ts","webpack://nocodenodeweb/./src/client/components/ViewCart/utils.ts","webpack://nocodenodeweb/./src/client/components/common/commonStyles.ts","webpack://nocodenodeweb/./src/client/components/notfound/styles.ts","webpack://nocodenodeweb/./src/client/components/notfound/index.tsx","webpack://nocodenodeweb/./src/client/components/payment/ErrorMessage.tsx","webpack://nocodenodeweb/./src/client/contexts/CartContext.tsx","webpack://nocodenodeweb/./src/client/contexts/PreviewContext.tsx","webpack://nocodenodeweb/./src/client/typings/Common.ts","webpack://nocodenodeweb/./src/client/utils/beaverLogger.ts","webpack://nocodenodeweb/./src/client/utils/localeHelper.ts","webpack://nocodenodeweb/./src/common/analytics.ts","webpack://nocodenodeweb/./src/common/fpti.ts","webpack://nocodenodeweb/./src/common/isCartInSync.ts","webpack://nocodenodeweb/./src/client/lib/constants.js"],"sourcesContent":["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 { CheckoutPaymentOptionsOtherThanPayPal } from '@client/components/buttons/types';\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 { getButtonVariablesFromMerchantSettings } from '@components/Settings/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 extends React.HTMLAttributes {\n hostedButtonId: string;\n buttonDetails: HostedButtonDetails;\n /** paywall or stacked buttons */\n variation: ButtonWrapperVariation;\n}\n\nexport default memo(({ hostedButtonId, buttonDetails, variation, ...rest }: ContainerProps) => {\n const appContext = useAppContext();\n const merchantSettings = appContext?.merchantSettings;\n const isSettingsEnabled = appContext?.isSettingsEnabled;\n const merchantCountryCode = buttonDetails.country_code;\n const originalButtonVariables = transformButtonVariables(buttonDetails.link_variables);\n const buttonVariables = getButtonVariablesFromMerchantSettings(\n merchantSettings,\n originalButtonVariables,\n isSettingsEnabled\n );\n\n const {\n business: merchantId,\n currency_code: currencyCode,\n button_type: buttonType,\n shipping_preference: shippingPreference,\n tax_rate_preference: taxRatePreference,\n payment_method_venmo: paymentMethodVenmo,\n payment_method_paylater: paymentMethodPayLater,\n payment_method_applepay: paymentMethodApplePay,\n no_shipping: noShipping\n } = buttonVariables;\n const profileShipTax =\n shippingPreference === ShippingPreference.FromProfile ||\n taxRatePreference === TaxRatePreference.FromProfile;\n const worldReady = useContext(WorldReadyContext);\n\n let 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 paymentMethodVenmo:\n (paymentMethodVenmo && paymentMethodVenmo === 'true') || !paymentMethodVenmo,\n paymentMethodPayLater:\n (paymentMethodPayLater && paymentMethodPayLater === 'true') || !paymentMethodPayLater,\n paymentMethodApplePay:\n (paymentMethodApplePay && paymentMethodApplePay === 'true') || !paymentMethodApplePay\n },\n {\n enableApplePay: Boolean(appContext?.enableApplePay)\n },\n profileShipTax\n );\n if (appContext?.enableFireAid) {\n allowedPaymentMethods = allowedPaymentMethods.filter(\n (method) => method === CheckoutPaymentOptionsOtherThanPayPal.Venmo\n );\n }\n const sdkOptions: ReactPayPalScriptOptions = {\n clientId: serverData.sdkClientId,\n merchantId,\n components: 'buttons,funding-eligibility',\n currency: currencyCode,\n sdkBaseUrl: serverData.sdkUrl,\n dataCspNonce: serverData.nonce,\n locale: sdkLocaleMapper(worldReady.locale),\n ...transSDKFundingConfig(allowedPaymentMethods)\n };\n\n const styleForStackedButtons = transButtonStyleFromButtonVariables({\n layout: buttonVariables.layout as CheckoutButtonLayout,\n shape: buttonVariables.shape as CheckoutButtonShape,\n color: buttonVariables.color as CheckoutButtonColor,\n button_text: buttonVariables.button_text as CheckoutPaypalButtonText,\n tagline: buttonVariables.tagline as CheckoutButtonTagline | boolean\n });\n const commonSDKWrapperProps: SDKButtonWrapperProps = {\n merchantId,\n hostedButtonId,\n buttonType,\n currencyCode,\n shippingPreference,\n taxRatePreference,\n notCollectShippingAddr: noShipping === '1',\n // TODO: Will need to clean up the above wrapper props at a later time\n buttonVariables\n };\n return (\n
\n \n {variation === ButtonWrapperVariation.PAYWALL && (\n \n )}\n {variation === ButtonWrapperVariation.HOSTED_BUTTONS && (\n \n )}\n \n
\n );\n});\n","import type { WorldReadyProps } from '@client/utils/localeHelper';\nimport { MerchantSettings } from '@client/typings/Common';\n\nimport {\n ButtonLayout,\n ButtonShape,\n ButtonSize,\n ButtonColorType,\n SecondButtonType,\n ButtonTextType\n} from '@components/Settings/types';\n\nexport const DEFAULT_MERCHANT_CHECKOUT_SETTINGS: MerchantSettings = Object.freeze({\n payment_method_paylater: true,\n payment_method_venmo: true,\n payment_method_apple_pay: true,\n show_business_name: false,\n show_business_logo: false,\n homepage_url: ''\n});\n\nexport const DEFAULT_MERCHANT_STACKED_BUTTON_SETTINGS: MerchantSettings = Object.freeze({\n stacked_button_layout: ButtonLayout.Vertical,\n stacked_button_shape: ButtonShape.Rect,\n stacked_button_size: ButtonSize.Medium,\n stacked_button_color_type: ButtonColorType.Gold,\n stacked_button_second_button_type: SecondButtonType.PayPalRecommended,\n stacked_button_text_type: ButtonTextType.Checkout,\n stacked_button_custom_text: ''\n});\n\nexport const DEFAULT_MERCHANT_SINGLE_BUTTON_SETTINGS: MerchantSettings = Object.freeze({\n single_button_color_type: ButtonColorType.Gold,\n single_button_shape: ButtonShape.Rect,\n single_button_size: ButtonSize.Medium,\n single_button_color_code: 'FFD140'\n});\n\nexport const DEFAULT_MERCHANT_CART_BUTTON_SETTINGS: MerchantSettings = Object.freeze({\n cart_button_shape: ButtonShape.Rect,\n cart_button_size: ButtonSize.Medium,\n cart_button_color_type: ButtonColorType.Gold,\n cart_button_color_code: 'FFD140'\n});\n\nexport const DEFAULT_MERCHANT_SETTINGS: MerchantSettings = Object.freeze({\n ...DEFAULT_MERCHANT_CHECKOUT_SETTINGS,\n ...DEFAULT_MERCHANT_STACKED_BUTTON_SETTINGS,\n ...DEFAULT_MERCHANT_SINGLE_BUTTON_SETTINGS\n});\n\nconst getInitialMerchantSettings = (\n worldReady: WorldReadyProps,\n merchantSettings: MerchantSettings | undefined,\n isSettingsEnabled?: boolean,\n isCartButtonSettingEnabled?: boolean\n): MerchantSettings => {\n const defaultMerchantSettings: MerchantSettings = {\n ...(isSettingsEnabled ? DEFAULT_MERCHANT_SETTINGS : {}),\n ...(isCartButtonSettingEnabled ? DEFAULT_MERCHANT_CART_BUTTON_SETTINGS : {})\n };\n\n if (merchantSettings) {\n return {\n ...defaultMerchantSettings,\n ...merchantSettings\n };\n }\n\n return defaultMerchantSettings;\n};\n\nexport default getInitialMerchantSettings;\n","export enum OptionalPaymentMethods {\n VENMO = 'venmo',\n PAYLATER = 'payLater',\n APPLEPAY = 'applePay',\n GOOGLEPAY = 'googlePay'\n}\n\nexport enum SettingsTabName {\n CHECKOUT = 'checkout',\n STACKED_BUTTONS = 'stackedButtons',\n SINGLE_BUTTON = 'singleButton',\n CART_BUTTONS = 'cartButton'\n}\n\nexport enum ButtonLayout {\n Vertical = 'vertical',\n Horizontal = 'horizontal'\n}\n\nexport enum ButtonShape {\n Rect = 'rect',\n Pill = 'pill'\n}\n\nexport enum ButtonSize {\n Large = 'large',\n Medium = 'medium',\n Small = 'small'\n}\n\nexport enum ButtonColorType {\n Gold = 'gold',\n Black = 'black',\n White = 'white',\n Blue = 'blue',\n Silver = 'silver',\n Custom = 'custom'\n}\n\nexport enum SecondButtonType {\n PayPalRecommended = 'paypalRecommended',\n PayLater = 'payLater',\n Venmo = 'venmo',\n None = 'none'\n}\n\nexport enum ButtonTextType {\n Checkout = 'checkout',\n Proceed = 'proceed',\n Pay = 'pay',\n Custom = 'custom'\n}\n\nexport enum SettingsTabIdx {\n CHECKOUT = 0,\n STACKED_BUTTONS = 1,\n SINGLE_BUTTON = 2,\n CART_BUTTONS = 3\n}\n\nexport enum Stacked3ButtonPaymentOption {\n PayPal = 'paypal',\n Venmo = 'venmo',\n PayLater = 'paylater',\n Checkout = 'checkout'\n}\n","import { CartItemType, CartDetails } from '@client/typings/Cart';\nimport { UserInputsType } from 'src/client/typings/Common';\n\nconst getItemTotals = (item: CartItemType, userInputs?: UserInputsType): number =>\n parseInt(userInputs?.cartItems?.[item.id]?.quantity || item.purchase_quantity, 10);\n\nconst getCartTotals = (items?: Array, userInputs?: UserInputsType): number =>\n items?.reduce((total, item) => total + getItemTotals(item, userInputs), 0) || 0;\n\nconst getButtonIdList = (items?: Array): string => {\n const ids: Array = [];\n items?.forEach((item) => {\n ids.push(item.link_id);\n });\n return ids.join();\n};\n\nconst getCartItems = (items?: Array, userInputs?: UserInputsType) => {\n const cartItems: Array> = [];\n items?.forEach((item) => {\n cartItems.push({\n [item.link_id]: getItemTotals(item, userInputs)\n });\n });\n return cartItems;\n};\n\nconst buildViewCartTags = (cart: CartDetails, userInputs?: UserInputsType) => ({\n cart_id: cart?.id,\n total_items: getCartTotals(cart?.items, userInputs),\n hosted_button_id: getButtonIdList(cart?.items),\n cart_items: getCartItems(cart?.items, userInputs)\n});\n\nexport { getItemTotals, getCartTotals, getButtonIdList, getCartItems, buildViewCartTags };\n","import calculateFontColor, {\n hexToRgb,\n isColorBright,\n isHexValue\n} from '@client/helpers/fontColorHelper';\nimport { ButtonSizes, Color } from '@client/utils/constants';\nimport { css } from '@emotion/react';\nimport { PAYPAL_THEME } from '@paypalcorp/pp-react';\nimport {\n CheckoutButtonShape,\n CheckoutButtonSize,\n CheckoutSingleButtonColorType\n} from '../buttons/types';\n\nconst {\n sysColorFeaturedMain,\n sysColorBackgroundHighContrast,\n sysColorFeaturedMainHover,\n sysColorFeaturedMainActive\n} = PAYPAL_THEME;\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-word;\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-word;\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-word;\n }\n`;\n\nexport const alertWrapper = css`\n padding-top: 0.75rem;\n`;\n\nexport const hideStyle = css`\n display: none;\n`;\n\nexport const buttonRadiusRaw = (shape?: CheckoutButtonShape) =>\n shape === CheckoutButtonShape.Pill ? '1000rem' : '0.25rem';\n\nexport const buttonRadiusCss = (shape?: CheckoutButtonShape) => {\n return css`\n border-radius: ${buttonRadiusRaw(shape)};\n `;\n};\n\nexport const buttonColorCss = (color?: string) => {\n if (\n !color ||\n !isHexValue(color) ||\n color.toUpperCase() === Color[CheckoutSingleButtonColorType.Recommended].toUpperCase()\n ) {\n return css`\n background-color: ${sysColorFeaturedMain};\n color: ${sysColorBackgroundHighContrast};\n\n &:hover:enabled {\n background-color: ${sysColorFeaturedMainHover};\n }\n\n &:active:enabled {\n background-color: ${sysColorFeaturedMainActive};\n }\n `;\n }\n\n if (color.toUpperCase() === Color[CheckoutSingleButtonColorType.Black].toUpperCase()) {\n return css`\n background-color: black;\n color: white;\n\n &:hover:enabled {\n background-color: #9198a0;\n }\n\n &:active:enabled {\n background-color: #545d68;\n }\n `;\n }\n\n if (color.toUpperCase() === Color[CheckoutSingleButtonColorType.White].toUpperCase()) {\n return css`\n background-color: white;\n color: black;\n border: 0.0625rem solid #cfd3d8;\n\n &:hover:enabled {\n background-color: #faf8f5;\n }\n\n &:active:enabled {\n background-color: #f1ede8;\n }\n `;\n }\n\n const rgb = hexToRgb(color);\n const isBright = !!(rgb && isColorBright(rgb.r, rgb.g, rgb.b));\n return css`\n background-color: ${color};\n color: ${calculateFontColor(color)};\n\n &:hover:enabled {\n filter: ${isBright ? 'brightness(0.9)' : 'brightness(1.1)'};\n }\n\n &:active:enabled {\n filter: ${isBright ? 'brightness(0.8)' : 'brightness(1.2)'};\n }\n `;\n};\n\nexport const buttonSizeCss = (size?: CheckoutButtonSize) => {\n if (size === CheckoutButtonSize.Large) {\n return css`\n font-size: 0.875rem;\n line-height: 1.125rem;\n height: ${ButtonSizes[CheckoutButtonSize.Large].singleButtonHeight};\n `;\n }\n\n if (size === CheckoutButtonSize.Small) {\n return css`\n font-size: 0.75rem;\n line-height: 1rem;\n height: ${ButtonSizes[CheckoutButtonSize.Small].singleButtonHeight};\n `;\n }\n\n return css`\n font-size: 0.875rem;\n line-height: 1.125rem;\n height: ${ButtonSizes[CheckoutButtonSize.Medium].singleButtonHeight};\n `;\n};\n\nexport const buttonIconSizeCss = (size?: CheckoutButtonSize) => {\n if (size === CheckoutButtonSize.Small) {\n return css`\n width: 1rem;\n height: 1rem;\n `;\n }\n\n return css`\n width: 1.125rem;\n height: 1.125rem;\n `;\n};\n\nexport const buttonDisabledCss = (disabled: boolean) => {\n return css`\n cursor: ${disabled ? 'unset' : 'pointer'};\n `;\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 { 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, { 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, {\n Dispatch,\n SetStateAction,\n createContext,\n useContext,\n useMemo,\n useState\n} from 'react';\nimport { CartDetails } from '@client/typings/Cart';\nimport { Updater, useImmer } from 'use-immer';\n\nexport interface CartContextType {\n cartDetails: CartDetails;\n setCartDetails: Updater;\n setIsLoading: Dispatch>;\n isLoading: boolean;\n setIsUpdating: Dispatch>;\n isUpdating: boolean;\n message: string;\n setMessage: Dispatch>;\n staleCartItems: null | string[];\n setStaleCartItems: Dispatch>;\n}\n\nexport const CartContextValuesGenerator = (initCartDetails?: CartDetails) => {\n const [isLoading, setIsLoading] = useState(false);\n const [isUpdating, setIsUpdating] = useState(false);\n const [staleCartItems, setStaleCartItems] = useState(null);\n const [cartDetails, setCartDetails] = useImmer(\n initCartDetails || ({} as CartDetails)\n );\n const [message, setMessage] = useState('');\n\n const contextValues = useMemo(\n () => ({\n cartDetails,\n setCartDetails,\n setIsLoading,\n isLoading,\n setIsUpdating,\n isUpdating,\n message,\n setMessage,\n staleCartItems,\n setStaleCartItems\n }),\n [cartDetails, setCartDetails, isLoading, isUpdating, message, staleCartItems]\n );\n\n return contextValues;\n};\n\nexport const CartContext = createContext({} as CartContextType);\n\nexport const CartContextProvider = ({\n value,\n children\n}: {\n value: CartContextType;\n children: React.ReactElement | React.ReactElement[];\n}) => {\n return {children};\n};\n\nexport const useCartContext = () => useContext(CartContext);\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 {\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 geoAwareDomain?: 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 memos?: Array<{ label: string; value: string }>; // Spec change\n option_selections?: Array<{\n name: string;\n select: string;\n }>; // Spec change\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 CartItemInputType = {\n quantity?: string;\n item?: string; // TODO - This is added temporarily only for Preview. Please remove this prop, when DTNCPS-2122 story is completed\n};\n\nexport type CartItemErrorType = {\n id?: string;\n link_id?: string;\n quantity?: string;\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 cartItems?: Record;\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 cartItems?: Record;\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 venmoShipTaxSupport?: boolean;\n supportShippingTaxProfileInPayment?: boolean;\n paywallButtons?: boolean;\n };\n paypalButtonMessaging: PaymentMethodConfig;\n fireaid: {\n supportedMerchants: string[];\n sdkClientId: string;\n iosErrorMessage: string;\n showAmountLabel: 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 businessLogo?: string;\n countryCode?: string;\n};\n\nexport type OptionSelection = {\n name: string;\n select: string;\n};\n\nexport type Memo = {\n label: string;\n value: string;\n};\n\nexport type PaymentPrefillData = {\n memo?: string;\n amount?: string;\n invoice?: string;\n quantity?: string;\n item?: string;\n};\n\nexport enum ButtonVariation {\n BuyNow = 'BUY_NOW',\n Cart = 'ADD_TO_CART'\n}\n\nexport enum FieldValueContent {\n EstimateLater = 'ESTIMATE_LATER',\n Free = 'FREE'\n}\n\nexport type Field = {\n showField: boolean;\n value: T;\n};\n\nexport interface TotalFields {\n tax: Field;\n shipping: Field;\n subtotal: Field;\n total: Field;\n}\n\nexport type CurrencyListProps = {\n value: string;\n primaryText: string;\n};\n\nexport type MerchantSettingsQuery = {\n categories?: string;\n groups?: string;\n preferences?: string;\n};\n\nexport type MerchantPreferences = {\n categories: Category[];\n};\n\nexport type Category = {\n name: string;\n description?: string;\n groups: Group[];\n};\n\nexport type Group = {\n name: string;\n description?: string;\n preferences: Preference[];\n};\n\nexport type Preference = {\n name: string;\n value: string;\n description?: string;\n status?: string;\n};\n\nexport type PayLaterStatus = {\n isPayLaterDisabled: boolean;\n};\n\nexport type MerchantSettings = {\n //checkout related settings\n payment_method_paylater?: boolean;\n payment_method_venmo?: boolean;\n payment_method_apple_pay?: boolean;\n // TODO: Support Google Pay once Google Pay integration provided\n // payment_method_google_pay?: boolean;\n // TODO: Support paypal button message once JSSDK inner source work completed\n // paypal_button_message?: boolean;\n show_business_name?: boolean;\n show_business_logo?: boolean;\n homepage_url?: string;\n //stacked button related settings\n stacked_button_layout?: string;\n stacked_button_shape?: string;\n stacked_button_size?: string;\n stacked_button_color_type?: string;\n stacked_button_second_button_type?: string;\n stacked_button_text_type?: string;\n stacked_button_custom_text?: string;\n //single button related settings\n single_button_shape?: string;\n single_button_size?: string;\n single_button_color_type?: string;\n single_button_color_code?: string;\n //cart button related settings\n cart_button_shape?: string;\n cart_button_size?: string;\n cart_button_color_type?: string;\n cart_button_color_code?: string;\n};\n\nexport interface EnableMessagingObj {\n enabled: boolean;\n xe: string;\n xt: string;\n}\n\nexport type InterstitialExperimentDetails =\n | {\n isEnabled: true;\n isTreatment: boolean;\n experimentId: string;\n treatmentId: string;\n }\n | {\n isEnabled: false;\n };\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 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';\nimport temporaryLocale from './temporaryLocale';\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\n/**\n * This function is for future temporary use in early stage when content are still to be decided.\n * @param id\n * @param format\n */\nexport const getTempLocalizedString = (\n id: string | undefined,\n format: Record = {}\n): string => {\n if (!id) {\n return '';\n }\n const placeholderRegex = /\\{(\\w+?)}/g;\n\n /* istanbul ignore next (since we do not have a regex temp content for now) */\n return (temporaryLocale[id] || '').replace(placeholderRegex, (_, name) => format[name]);\n};\n\ninterface ButtonAndLinkId {\n button: string;\n link: string;\n}\nexport const flexButtonAndLinkContent = (type: PaymentButtonType, id: ButtonAndLinkId): string => {\n if (type === PaymentButtonType.Link) {\n return id.link;\n }\n return id.button;\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 showCurrencyCode: boolean = true\n) => {\n if (currencyCode && currencyAmount != null) {\n const currencyOptions = showCurrencyCode\n ? { currency: currencyCode, style: 'international' }\n : { currency: currencyCode };\n const currencyFormatter = new CurrencyFormat(worldReady, currencyOptions);\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","import React from 'react';\nimport type { DeepPartial } from 'react-hook-form';\nimport { HostedButton, HostedButtonDetails, MerchantSettings } from '@client/typings/Common';\nimport { KrakenRequest } from '@server/typings';\nimport { transformButtonVariables } from '@client/utils/utils';\nimport { getButtonVariablesFromMerchantSettings } from '@components/Settings/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, SPACE_KEY } from './fpti';\n\nexport type FlowType =\n | 'paypal'\n | 'merchant'\n | 'unknown'\n | 'preview'\n | 'redirection'\n | 'third-party';\nexport type FlowVariationType = 'buy_now' | 'add_to_cart';\nexport type SourceType =\n | 'link'\n | 'qr_code'\n | 'button_code'\n | 'unknown'\n | 'checkout_button'\n | 'single_button'\n | '3_button_code'\n | 'add_to_cart_button'\n | 'view_cart_button';\nexport type PageName =\n | 'payment'\n | 'paywall'\n | 'order_status'\n | 'deploy_sheet'\n | 'not_found'\n | 'quick_actions'\n | 'account_check_failed'\n | 'confirmation_cart'\n | 'settings'\n | 'merchant_website'\n | 'fireaid'\n | 'subscriptions';\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 flow_variation?: FlowVariationType;\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 space_key: SPACE_KEY\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 type MerchantSettingOptions = {\n merchantSettings?: MerchantSettings;\n isSettingsEnabled?: boolean;\n};\n\nexport const buildAdditionalTags = (\n buttonDetails: HostedButtonDetails,\n sourceType: SourceType,\n flowType: FlowType,\n enablePaywall?: boolean,\n merchantSettingsOptions?: MerchantSettingOptions,\n enablePaywallButtons?: boolean\n) => {\n const merchantSettings = merchantSettingsOptions?.merchantSettings;\n const isSettingsEnabled = merchantSettingsOptions?.isSettingsEnabled;\n const originalButtonVariables = transformButtonVariables(buttonDetails.link_variables);\n const buttonVariables = getButtonVariablesFromMerchantSettings(\n merchantSettings,\n originalButtonVariables,\n isSettingsEnabled\n );\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 flowVariation?: FlowVariationType;\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\n// TODO: replace appContext by specific params.\nexport const buildButtonDetailsTags = (\n hostedButton?: HostedButton,\n merchantSettings?: MerchantSettings,\n isSettingsEnabled?: boolean\n) => {\n const originalButtonVariables = transformButtonVariables(hostedButton?.button_variables);\n const buttonVariables = getButtonVariablesFromMerchantSettings(\n merchantSettings,\n originalButtonVariables,\n isSettingsEnabled\n );\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 type SettingsFptiFlags = {\n isSettingsEnabled?: boolean;\n isCartButtonSettingEnabled?: boolean;\n};\n\nexport const buildSettingsTags = (\n merchantSettings: MerchantSettings,\n flags?: SettingsFptiFlags\n) => {\n const {\n payment_method_paylater,\n payment_method_venmo,\n payment_method_apple_pay,\n show_business_name,\n show_business_logo,\n homepage_url,\n stacked_button_layout,\n stacked_button_shape,\n stacked_button_size,\n stacked_button_color_type,\n stacked_button_second_button_type,\n stacked_button_text_type,\n stacked_button_custom_text,\n single_button_color_type,\n single_button_shape,\n single_button_size,\n single_button_color_code,\n cart_button_shape,\n cart_button_size,\n cart_button_color_type,\n cart_button_color_code\n } = merchantSettings;\n\n return {\n ...(flags?.isSettingsEnabled\n ? {\n payment_method_paylater,\n payment_method_venmo,\n payment_method_apple_pay,\n show_business_name,\n show_business_logo,\n homepage_url,\n stacked_button_layout,\n stacked_button_shape,\n stacked_button_size,\n stacked_button_color_type,\n stacked_button_second_button_type,\n stacked_button_text_type,\n stacked_button_custom_text,\n single_button_shape,\n single_button_size,\n single_button_color_type,\n single_button_color_code\n }\n : {}),\n ...(flags?.isCartButtonSettingEnabled\n ? {\n cart_button_shape,\n cart_button_size,\n cart_button_color_type,\n cart_button_color_code\n }\n : {})\n };\n};\n\nexport const recordImpression = (\n fptiData: FptiData,\n onceData?: Partial,\n isFederated?: boolean\n) => {\n if (window.PAYPAL?.analytics?.instance) {\n const { eventName, pageName, ...otherProps } = fptiData;\n const data = {\n ...buildBaseTags(pageName, eventName, 'im'),\n ...otherProps\n };\n if (isFederated) {\n // when Federated don't send base data as that pollutes other events fired outside of our app.\n window.PAYPAL.analytics.instance.recordImpression({ eventName }, { ...data, ...onceData });\n } else {\n window.PAYPAL.analytics.instance.recordImpression({ data }, onceData);\n }\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 eventType: string = 'im'\n) => {\n const { eventName, ...otherProps } = fptiData;\n const base = buildMerchantBaseTags(eventName, eventType);\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","import { FlowType, SourceType } from './analytics';\n\nexport const COMPONENT = 'nocodenodeweb';\nexport const SPACE_KEY = 'SKS09G';\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 subscriptions: 'main:business:web:hostedcheckout:subscriptions' // TODO-SERVICES: engage with analytics team to decide which group subscriptions will belong\n};\n\nexport type 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","import type { CartDetails } from '@client/typings/Cart';\nimport type { UserInputsType } from '@client/typings/Common';\nimport _isEqual from 'lodash/isEqual';\n\nexport const getItemsUpdatedByMerchant = (\n currentCart: CartDetails,\n newCart: CartDetails\n): string[] => {\n return currentCart.items\n .filter((currentItem) => {\n // assume an item might have been removed, so cannot assume items are in the same order / length\n const newItem = newCart.items.find(({ id }) => id === currentItem.id);\n\n // if item is removed by buyer, it is not considered updated by merchant\n if (!newItem) {\n return false;\n }\n\n // if item or option is removed by merchant, it is also not considered updated\n // TODO: test merchant deleting item/option case once https://github.paypal.com/Customers-R/nocodenodeweb/pull/887 is in\n if (!newItem.valid) {\n return false;\n }\n\n if (currentItem.product_name !== newItem.product_name) {\n return true;\n }\n\n if (!_isEqual(currentItem.unit_price, newItem.unit_price)) {\n return true;\n }\n\n return false;\n })\n .map(({ id }) => id);\n};\n\nconst isCartInSync = (\n currentCart: CartDetails,\n newCart: CartDetails,\n userInputs?: UserInputsType\n): boolean => {\n if (currentCart.items.length !== newCart.items.length) {\n return false;\n }\n\n const isAllItemsMatching = currentCart.items.every((currentItem, index) => {\n const newItem = newCart.items[index];\n if (currentItem.id !== newItem.id) {\n return false;\n }\n\n const currentItemQuantity =\n userInputs?.cartItems?.[currentItem.id]?.quantity || currentItem.purchase_quantity;\n if (currentItemQuantity !== newItem.purchase_quantity) {\n return false;\n }\n\n if (currentItem.product_name !== newItem.product_name) {\n return false;\n }\n\n if (!_isEqual(currentItem.unit_price, newItem.unit_price)) {\n return false;\n }\n\n return true;\n });\n\n if (!isAllItemsMatching) {\n return false;\n }\n\n const {\n shipping_preference: currShipPref,\n tax_preference: currTaxPref,\n tax_rate: currTaxRate,\n no_shipping: currNoShipping\n } = currentCart.shipping_tax_detail || {};\n const {\n shipping_preference: newShipPref,\n tax_preference: newTaxPref,\n tax_rate: newTaxRate,\n no_shipping: newNoShipping\n } = newCart.shipping_tax_detail || {};\n\n if (\n currShipPref !== newShipPref ||\n currTaxPref !== newTaxPref ||\n currTaxRate !== newTaxRate ||\n currNoShipping !== newNoShipping\n ) {\n return false;\n }\n\n return true;\n};\n\nexport default isCartInSync;\n","import config from '../../../config/config.json';\n\nexport const CONTEXT_ROOT = config.express.mountpath;\nexport const COMPONENT = 'nocodenodeweb';\nexport const PRODUCT = 'quantum_leap';\n\n// Account Types\nexport const BUSINESS = 'BUSINESS';\nexport const INDIVIDUAL = 'INDIVIDUAL';\n\nexport const fptiPageNames = {\n hostedExp: 'container'\n};\n\nexport const FPTI_GROUP = 'main:business:web:hostedcheckout';\n\nexport const facebookApplicationId = '1084613224964631';\nexport const facebookShareLink = 'https://www.facebook.com/dialog/share';\nexport const twitterShareLink = 'https://twitter.com/share';\nexport const whatsappShareLink = 'https://web.whatsapp.com/send';\n"],"names":["memo","hostedButtonId","buttonDetails","variation","rest","appContext","useAppContext","merchantSettings","isSettingsEnabled","merchantCountryCode","country_code","originalButtonVariables","transformButtonVariables","link_variables","buttonVariables","getButtonVariablesFromMerchantSettings","business","merchantId","currency_code","currencyCode","button_type","buttonType","shipping_preference","shippingPreference","tax_rate_preference","taxRatePreference","payment_method_venmo","paymentMethodVenmo","payment_method_paylater","paymentMethodPayLater","payment_method_applepay","paymentMethodApplePay","no_shipping","noShipping","profileShipTax","ShippingPreference","FromProfile","TaxRatePreference","worldReady","useContext","WorldReadyContext","allowedPaymentMethods","getAllowedPaymentMethodsFromConfigs","app","context","locality","country","config","enableApplePay","Boolean","enableFireAid","filter","method","CheckoutPaymentOptionsOtherThanPayPal","Venmo","sdkOptions","clientId","serverData","sdkClientId","components","currency","sdkBaseUrl","sdkUrl","dataCspNonce","nonce","locale","sdkLocaleMapper","transSDKFundingConfig","styleForStackedButtons","transButtonStyleFromButtonVariables","layout","shape","color","button_text","tagline","commonSDKWrapperProps","notCollectShippingAddr","_jsx","css","commonStyles","children","_jsxs","PayPalScriptProvider","options","ButtonWrapperVariation","PAYWALL","PaywallHostedButtons","HOSTED_BUTTONS","StackedPayPalButtons","buttonStyle","DEFAULT_MERCHANT_CHECKOUT_SETTINGS","Object","freeze","payment_method_apple_pay","show_business_name","show_business_logo","homepage_url","DEFAULT_MERCHANT_STACKED_BUTTON_SETTINGS","stacked_button_layout","ButtonLayout","Vertical","stacked_button_shape","ButtonShape","Rect","stacked_button_size","ButtonSize","Medium","stacked_button_color_type","ButtonColorType","Gold","stacked_button_second_button_type","SecondButtonType","PayPalRecommended","stacked_button_text_type","ButtonTextType","Checkout","stacked_button_custom_text","DEFAULT_MERCHANT_SINGLE_BUTTON_SETTINGS","single_button_color_type","single_button_shape","single_button_size","single_button_color_code","DEFAULT_MERCHANT_CART_BUTTON_SETTINGS","cart_button_shape","cart_button_size","cart_button_color_type","cart_button_color_code","DEFAULT_MERCHANT_SETTINGS","OptionalPaymentMethods","getButtonIdList","items","ids","forEach","item","push","link_id","join","sysColorFeaturedMain","sysColorBackgroundHighContrast","sysColorFeaturedMainHover","sysColorFeaturedMainActive","_PAYPAL_THEME","Row","gap","center","Col","inputShimmer","inputStyle","spinnerStyle","dropdownMenu","dropdownMenuInPreview","globalDropdownMenuSheet","alertWrapper","hideStyle","containerStyles","iconContainerStyles","NotFound","useEffect","recordImpression","eventName","pageName","styles","_CriticalIcon","_HeadingText","size","getLocalizedString","ErrorMessage","captureStatus","errorMessage","message","CaptureStatus","FAILED","AUTH_FAILED","_Alert","type","CartContext","createContext","useCartContext","PreviewContext","usePreviewContext","ButtonVariation","FieldValueContent","logger","beaverLogger","Logger","url","prefix","flushInterval","logLevel","addMetaBuilder","currPathname","window","location","pathname","getPayloadString","payload","payloadString","JSON","stringify","console","error","logInfoClient","event","info","logErrorClient","logWarnClient","warn","id","format","MessageFormat","getCurrencyConfig","symbol","maxDecimalPlaces","currencyFormatter","CurrencyFormat","style","resolvedOptions","maximumFractionDigits","dummyParts","formatToParts","find","part","value","formatCurrency","currencyAmount","showCurrencySymbol","showCurrencyCode","currencyOptions","Number","minimumFractionDigits","NumberFormat","BASE_TAGS","product","PRODUCT","component","COMPONENT","pgrp","FPTI_GROUP","space_key","SPACE_KEY","buildBaseTags","page","fptiPageNames","event_name","e","event_type","action","buildAdditionalTags","sourceType","flowType","enablePaywall","merchantSettingsOptions","enablePaywallButtons","buttonShape","buttonColor","otherProps","button_shape","button_color","merchant_id","hosted_button_id","source_type","flow_type","version","getVersion","fptiData","onceData","isFederated","PAYPAL","analytics","instance","data","recordClick","recordActivity","logActivity","startCPLTracking","identifier","endCPLTracking","payment","order_status","not_found","merchant_website","subscriptions","extractSourceAndFlowType","ftpi","getItemsUpdatedByMerchant","currentCart","newCart","currentItem","newItem","valid","product_name","_isEqual","unit_price","map","CONTEXT_ROOT"],"sourceRoot":""}