{"version":3,"sources":["webpack:///webpack/bootstrap","webpack:///./node_modules/cpf-cnpj-validator/dist/cpf-cnpj-validator.es.js","webpack:///./app/javascript/packs/helper_functions.js","webpack:///./node_modules/@babel/runtime/regenerator/index.js","webpack:///./app/javascript/packs/formatters.js","webpack:///./app/javascript/packs/utils/correlation_id_store.js","webpack:///./app/javascript/packs/gtm_script.js","webpack:///./app/javascript/packs/utils/encrypt.js","webpack:///./app/javascript/packs/utils/ignored_form_key_codes.js","webpack:///./app/javascript/packs/coupon_form_factory.js","webpack:///./node_modules/regenerator-runtime/runtime.js","webpack:///./app/javascript/packs/coupon_service.js","webpack:///./app/javascript/packs/webhook_service.js","webpack:///./app/javascript/packs/debounced.js","webpack:///./app/javascript/packs/utils/form/payment/payment_form.js","webpack:///./app/javascript/packs/utils/vanish_element.js","webpack:///./app/javascript/packs/utils/get_descriptive_time.js","webpack:///./app/javascript/packs/utils/form/payment/cc_number.js","webpack:///./app/javascript/packs/utils/form/payment/cc_expiration_date.js","webpack:///./app/javascript/packs/utils/form/payment/cc_cvv.js","webpack:///./app/javascript/packs/payments/malga/mpm_tabs.js","webpack:///./app/javascript/packs/payments/malga/pix.js","webpack:///./app/javascript/packs/utils/form/client/client_form.js","webpack:///./app/javascript/packs/utils/form/product/product_form.js","webpack:///./app/javascript/packs/payments/malga/nupay.js","webpack:///./app/javascript/packs/utils/recaptcha_wrapper.js","webpack:///./app/javascript/packs/client_payments_malga.js"],"names":["installedModules","__webpack_require__","moduleId","exports","module","i","l","modules","call","m","c","d","name","getter","o","Object","defineProperty","enumerable","get","r","Symbol","toStringTag","value","t","mode","__esModule","ns","create","key","bind","n","object","property","prototype","hasOwnProperty","p","s","BLACKLIST","STRICT_STRIP_REGEX","LOOSE_STRIP_REGEX","verifierDigit","digits","numbers","split","map","number","parseInt","modulus","length","mod","index","reduce","buffer","strip","strict","regex","replace","cpf","stripped","includes","substr","BLACKLIST$1","STRICT_STRIP_REGEX$1","LOOSE_STRIP_REGEX$1","verifierDigit$1","concat","strip$1","cnpj","isPJ","trim","toUpperCase","doesNotHaveValue","input","setElementHiddenClass","el","isHidden","classList","toggle","disableSubmitButtonElement","button","isInvalid","disabled","disableInputField","isDisabled","clearValue","style","disableRequiredInputField","isDisabledAndNotRequired","clear","required","checkoutCustomerFormHelpers","elements","alertMessageDocumentElement","documentLabelElement","formDocumentElement","formPhoneNumberElement","formClientType","isForeignerElement","submitButtonElement","whatsappAcceptElement","whatsappLabelElement","toggleDocumentErrorMessage","isEmpty","emptyErrorMessage","querySelector","invalidErrorMessage","pjMode","helpers","cpfCnpjValidator","checked","docNum","isFilled","filter","digit","test","isValid","valid","disableCpfCnpjFields","state","optionalLabel","contains","undefined","phoneNumberChangeHandler","num","addEventListener","e","target","parseFetchResponse","response","json","then","data","status","body","objectToInlineCss","obj","entries","join","querySelectorOrFail","query","document","Error","blurOnEnterKeyupHandler","event","blur","activeElement","forceBlurOnEventHandler","formatterCurrency","Intl","NumberFormat","currency","getFormattedCurrencyValueFromEl","element","format","getValueWithoutFormat","getLowerCaseInputValue","toString","toLowerCase","correlationId","corrHeaderKey","getCorrId","setCorrId","addCorrId","headers","Headers","set","loadCorrId","has","tapAndLoadCorrId","CHECKOUT_STEP","freeze","begin_checkout","add_payment_info","purchase","PAYMENT_TYPE","card","pix","nupay","GtmFactory","dataLayer","window","sendDataLayer","eventType","payload","push","ecommerce","buildPayload","paymentType","a","fullName","phone","getPhone","email","totalAmount","item_id","productId","item_name","productName","coupon","discount","price","quantity","convert","items","hashed_full_name","hashed_email","hashed_phone","transactionId","transaction_id","sendEvent","productData","sendBeginCheckout","this","registerCheckoutOptionEvent","paymentMethod","formsValues","eventData","registerPurchaseEvent","purchaseData","encoder","TextEncoder","dataBuffer","encode","crypto","subtle","digest","hashBuffer","hashArray","Array","from","Uint8Array","hashHex","byte","padStart","ignoredFormKeyCodes","createCouponErrorSpan","errorMessage","className","couponErrorMessageSpan","createElement","color","textContent","couponFormFactory","params","errorMessageOptions","keys","URLSearchParams","location","search","removeCouponFromUrlHandler","currentUrl","URL","href","searchParams","assign","clearCouponButton","Rollbar","error","url","fixedCoupon","couponInput","discountAmountSpan","errorSpanContainer","formAmountHiddenInput","paymentTotalSpan","submitCouponButton","emailInput","submitFormButton","couponChangeEventListeners","currentlyActiveCoupon","validEmail","couponErrorSpan","addCouponChangeListener","listener","some","registeredListener","removeCouponChangeListener","pushCouponChangeToListeners","couponData","forEach","console","couponInputClickHandler","removeErrorSpan","parentElement","removeChild","appendErrorSpan","appendChild","fetchCoupon","amount","CouponService","getCoupon","formattedDiscountedAmount","discountedAmount","formattedDiscount","discountAmount","formattedPixDiscountedAmount","pixDiscountedAmount","formattedPixAmount","pixAmount","couponInputBlurHandler","preventDefault","couponName","lowercasedEmailValue","removeCouponHandler","runtime","Op","hasOwn","$Symbol","iteratorSymbol","iterator","asyncIteratorSymbol","asyncIterator","toStringTagSymbol","define","configurable","writable","err","wrap","innerFn","outerFn","self","tryLocsList","protoGenerator","Generator","generator","context","Context","_invoke","GenStateSuspendedStart","method","arg","GenStateExecuting","GenStateCompleted","doneResult","delegate","delegateResult","maybeInvokeDelegate","ContinueSentinel","sent","_sent","dispatchException","abrupt","record","tryCatch","type","done","GenStateSuspendedYield","makeInvokeMethod","fn","GeneratorFunction","GeneratorFunctionPrototype","IteratorPrototype","getProto","getPrototypeOf","NativeIteratorPrototype","values","Gp","defineIteratorMethods","AsyncIterator","PromiseImpl","invoke","resolve","reject","result","__await","unwrapped","previousPromise","callInvokeWithMethodAndArg","TypeError","info","resultName","next","nextLoc","pushTryEntry","locs","entry","tryLoc","catchLoc","finallyLoc","afterLoc","tryEntries","resetTryEntry","completion","reset","iterable","iteratorMethod","isNaN","displayName","isGeneratorFunction","genFun","ctor","constructor","mark","setPrototypeOf","__proto__","awrap","async","Promise","iter","reverse","pop","skipTempReset","prev","charAt","slice","stop","rootRecord","rval","exception","handle","loc","caught","hasCatch","hasFinally","finallyEntry","complete","finish","thrown","delegateYield","regeneratorRuntime","accidentalStrictMode","globalThis","Function","fetchUrlParams","product_id","fetch","couponResponse","ok","statusText","discount_amount","new_amount","amountOff","amount_off","percentOff","percent_off","pix_amount","pix_discount_amount","webhook","sendPost","JSON","stringify","text","debounced","fnToCall","timeout","timeoutRef","args","setTimeout","clearTimeout","setupPaymentForm","clientForm","productForm","submitButton","formCouponIdHiddenInput","getElementById","formAmountOffHiddenInput","formPercentOffHiddenInput","formDiscountAmountHiddenInput","formTotalAmountHiddenInput","formCountInstallmentsHiddenInput","formFixedInstallmentHiddenInput","coupon_accepted","inputs","couponElements","couponForm","getId","updateInstallments","fixedInstallments","numericValue","Number","formattedInstallmentValue","showInstallmentsSpan","innerText","installmentsOptionsElements","item","couponChangeHandler","rawOriginalAmount","originalAmount","getPaymentInfoHelpers","from_cents","factor","productUnitAmountHiddenInput","getUnitAmount","getDiscountAmount","percentDiscount","getTotalAmount","vanishElement","hidden","getDescriptiveTime","secondsTime","hideSeconds","ONE_MIN","ONE_HOUR","ONE_DAY","seconds","minutesTime","minutes","hoursTime","hours","daysTime","days","numFormat","minimumFractionDigits","maximumFractionDigits","descriptiveParts","unit","Math","floor","one","multiple","splice","descriptive","FORMATTED_CC_NUM_LENGTH","CC_NUM_LENGTH","CC_NUM_BLOCK_SIZE","CC_NUM_SPACE_POSITION_FACTOR","NUM_KEYS","fill","_","ALLOWED_KEYS_NUMERIC","creditCardNumberInputPartialValidator","creditCardNumberInputValidator","isCursorMovementKey","isInSpaceChar","creditCardNumberExtractor","char","creditCardNumberFormatter","arr","handleCCInputEmptySpace","selectionStart","selectionEnd","idx","lastIndexOf","ccNumKeydownHandler","stopPropagation","metaKey","altKey","ctrlKey","active","keyCode","slicedValue","setSelectionRange","ccNumKeyupHandler","updatedTarget","updatedValue","shouldJumpToNextField","isFieldOverflowing","sizeDiff","caretPositionDiff","nextElementSibling","focus","ccNumPasteHandler","pasteData","clipboardData","getData","setupCreditCardNumberInput","inputElement","setAttribute","proxyHandler","prop","_receiver","Reflect","arguments","Proxy","replaceStringDate","ccEDExtractor","month","year","Date","getFullYear","toFixed","ccEDFormatter","CC_ED_M_MAX_LENGTH","strMonth","ccEDValidator","currentYear","currentYearHundreds","fullYear","numMonth","getMonth","ccEDKeydownHandler","ccEDKeyupHandler","shouldFocusNext","ccEDPasteHandler","setupCCExpirationDateInput","numericOnlyFilter","filterNonNumericCharacters","CVVFilter","setupCCCVVInput","listeners","addListener","removeListener","setupMPMTabs","tabsContentsContainerElement","mpmButtons","getElementsByClassName","_idx","tabTriggerList","tabTriggersList","contentsContainerElement","targetContentId","dataset","contentContainerId","contentContainerElement","clickHandler","contentIdToShow","tabTriggerElement","children","child","isActiveTabContentsContainer","id","setButtonsDisabled","removeAttribute","initPix","cancelPixPaymentValidationLoop","timeLeftUpdateLoop","copiedMessageTimeoutRef","showPaymentError","setLoading","PIX_STATUS_POLLING_TIME_LIMIT","PM3","PIX_STATUS_POLLING_INTERVAL","PIX_EXPIRATION_UPDATE_INTERVAL","fetchTransactionStatus","clientInstantPaymentId","signal","closeQrCodeDialog","dialog","open","close","amountHeader","img","copyCta","expirationInfoSpan","src","qrCode","navigator","clipboard","writeText","label","previousText","expirationDateTimeFormatter","DateTimeFormat","day","hour","minute","second","showQrCodeDialog","imgSrc","dataContents","expiresIn","expirationTimestamp","now","updateExpirationTime","timeLeftInMs","expiration","expirationUpdateInterval","setInterval","clearInterval","showModal","resolveAsPending","expirationTime","timeoutId","controller","AbortController","promise","expirationDelta","timeoutLimit","executeRequest","expired","cancel","failed","abort","pollTransactionConfirmation","setupPixPayment","bumpForm","formElements","formHelpers","baseSetLoading","gtm","setPaymentMethodSubmitHandler","onSuccess","onPending","onError","submitButtonLabel","loading","loadingIndicator","pixTotalAmountSpans","querySelectorAll","totalAmountOperators","updateTotalAmount","baseCents","getProductInfo","formatted","cents","span","unshift","enabled","bumpState","addChangeListener","authenticity_token","authenticityTokenElement","clientInfo","getFormData","paymentInfo","getAmountAndCouponInformation","provider","payment_method","client_payment","installments_count","payment_type","order_bump_active","coupons","is_pj","is_foreigner","phone_number","whatsapp_accept","coupon_id","coupon_amount_off","counpon_percent_off","subtotal_amount","total_amount","trace","clientInstantPaymentResponse","product_name","qrCodeData","qrCodeImageUrl","pixStatusUpdate","stripe_payment_intent","updateClientInstantPaymentResponse","paymentValues","_event","isClientPj","stateRegistrationInput","municipalRegistrationInput","stateRegistrationAlertMessageElement","productInfo","createClientInstantPayment","message","stack","clientType","setupClientForm","formHelpersInstance","clientTypeInput","formElement","nameInput","documentInput","isForeignerInput","phoneNumberInput","clientCreatedAtHiddenInput","getClientInformation","client_name","client_email","client_document","client_phone_number","client_created_at","client_whatsapp_accept","client_state_registration","client_municipal_registration","pj","base","created_at","state_registration","setPersonalDocumentRequired","isRequired","add","remove","setPersonalPhoneNumberRequired","setupProductForm","idHiddenInput","nameHiddenInput","unitAmountHiddenInput","providerHiddenInput","getName","getProvider","getUnitAmountValue","NUPAY_STATUS_POLLING_TIME_LIMIT","initNupay","cancelPaymentValidationLoop","closeDialog","showDialog","setupNupayPayment","nupayTotalAmountSpan","unitAmount","useRecaptcha","action","grecaptcha","ready","execute","GRCSK","setupMalgaPayment","MPMInstance","sendCardErrorToWebhook","setupCreditCardForm","submitCardPurchaseForm","handlePaymentResult","prepareFieldsForPaymentMethods","success","pending","getElementsByName","productIdHiddenInput","productNameHiddenInput","formPixAmountHiddenInput","coupon_percent_off","formTotalPixAmountHiddenInput","redirectURL","redirectionUrl","parent","handler","paymentMethodsSubmitHandlers","createPaymentMethodResponse","creditCardNumberInput","expirationDateInput","cvvInput","creditCardNumber","expirationDate","cvv","fillPaymentFormWithValidSandboxCreditCard","errorCode","error_level","error_code","error_contents","payment_intent_id","paymentIntentId","tokenize_cvv","formNameInput","formEmailInput","formDocumentInput","formPhoneNumberInput","productProviderHiddenInput","formDocumentAlertMessageSpan","buttonLoadingSpinner","payNowButtonLabel","getActiveEl","getValueEl","Boolean","getValue","triggerChange","activeEl","pixTotalAmountSpan","bumpValue","totalWithBump","isLoading","errorMsgText","getClientPaymentFormData","paymentMethodId","cvvToken","payment_method_id","paymentHelpers","creditCardForm","createPaymentIntentOnDB","paymentIntentsPath","payment_intent","showOrderCompleteAndRedirect","spinnerLoading","fetchClientPayment","grToken","gr_token","clientPaymentResponse","statusReason","error_message","stripe_confirm_payment_data","revenue","gtmPurchaseEventData","metadata","webhooks","allSettled","defaultErrorMessage","log","baseGatewayURL","malgaApiUrl","gatewayClientId","malgaClientId","gatewayClientToken","malgaClientToken","cardNumber","cardExpirationDate","cardCvv","cardHolderName","bodyText","parse","cardTokenizationResponse","cvvUpdate","cvvTokenizationResponse","tokenId","errorPayload","_err","declinedCode","declined_code","debouncedHandleSubmit","notUsingCardPaymentMethod","_self","typPixProcessing","typPixError"],"mappings":"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","file":"js/client_payments_malga-09f4bf5a3ea4e36be07f.js","sourcesContent":[" \t// The module cache\n \tvar installedModules = {};\n\n \t// The require function\n \tfunction __webpack_require__(moduleId) {\n\n \t\t// Check if module is in cache\n \t\tif(installedModules[moduleId]) {\n \t\t\treturn installedModules[moduleId].exports;\n \t\t}\n \t\t// Create a new module (and put it into the cache)\n \t\tvar module = installedModules[moduleId] = {\n \t\t\ti: moduleId,\n \t\t\tl: false,\n \t\t\texports: {}\n \t\t};\n\n \t\t// Execute the module function\n \t\tmodules[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n\n \t\t// Flag the module as loaded\n \t\tmodule.l = true;\n\n \t\t// Return the exports of the module\n \t\treturn module.exports;\n \t}\n\n\n \t// expose the modules object (__webpack_modules__)\n \t__webpack_require__.m = modules;\n\n \t// expose the module cache\n \t__webpack_require__.c = installedModules;\n\n \t// define getter function for harmony exports\n \t__webpack_require__.d = function(exports, name, getter) {\n \t\tif(!__webpack_require__.o(exports, name)) {\n \t\t\tObject.defineProperty(exports, name, { enumerable: true, get: getter });\n \t\t}\n \t};\n\n \t// define __esModule on exports\n \t__webpack_require__.r = function(exports) {\n \t\tif(typeof Symbol !== 'undefined' && Symbol.toStringTag) {\n \t\t\tObject.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });\n \t\t}\n \t\tObject.defineProperty(exports, '__esModule', { value: true });\n \t};\n\n \t// create a fake namespace object\n \t// mode & 1: value is a module id, require it\n \t// mode & 2: merge all properties of value into the ns\n \t// mode & 4: return value when already ns object\n \t// mode & 8|1: behave like require\n \t__webpack_require__.t = function(value, mode) {\n \t\tif(mode & 1) value = __webpack_require__(value);\n \t\tif(mode & 8) return value;\n \t\tif((mode & 4) && typeof value === 'object' && value && value.__esModule) return value;\n \t\tvar ns = Object.create(null);\n \t\t__webpack_require__.r(ns);\n \t\tObject.defineProperty(ns, 'default', { enumerable: true, value: value });\n \t\tif(mode & 2 && typeof value != 'string') for(var key in value) __webpack_require__.d(ns, key, function(key) { return value[key]; }.bind(null, key));\n \t\treturn ns;\n \t};\n\n \t// getDefaultExport function for compatibility with non-harmony modules\n \t__webpack_require__.n = function(module) {\n \t\tvar getter = module && module.__esModule ?\n \t\t\tfunction getDefault() { return module['default']; } :\n \t\t\tfunction getModuleExports() { return module; };\n \t\t__webpack_require__.d(getter, 'a', getter);\n \t\treturn getter;\n \t};\n\n \t// Object.prototype.hasOwnProperty.call\n \t__webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };\n\n \t// __webpack_public_path__\n \t__webpack_require__.p = \"/packs/\";\n\n\n \t// Load entry module and return exports\n \treturn __webpack_require__(__webpack_require__.s = 37);\n","/*!\n * cpf-cnpj-validator v1.0.3\n * (c) 2020-present Carvalho, Vinicius Luiz \n * Released under the MIT License.\n */\nvar BLACKLIST = ['00000000000', '11111111111', '22222222222', '33333333333', '44444444444', '55555555555', '66666666666', '77777777777', '88888888888', '99999999999', '12345678909'];\nvar STRICT_STRIP_REGEX = /[.-]/g;\nvar LOOSE_STRIP_REGEX = /[^\\d]/g;\n\nvar verifierDigit = function verifierDigit(digits) {\n var numbers = digits.split('').map(function (number) {\n return parseInt(number, 10);\n });\n var modulus = numbers.length + 1;\n var multiplied = numbers.map(function (number, index) {\n return number * (modulus - index);\n });\n var mod = multiplied.reduce(function (buffer, number) {\n return buffer + number;\n }) % 11;\n return mod < 2 ? 0 : 11 - mod;\n};\n\nvar strip = function strip(number, strict) {\n var regex = strict ? STRICT_STRIP_REGEX : LOOSE_STRIP_REGEX;\n return (number || '').replace(regex, '');\n};\n\nvar format = function format(number) {\n return strip(number).replace(/^(\\d{3})(\\d{3})(\\d{3})(\\d{2})$/, '$1.$2.$3-$4');\n};\n\nvar isValid = function isValid(number, strict) {\n var stripped = strip(number, strict);\n\n if (!stripped) {\n return false;\n }\n\n if (stripped.length !== 11) {\n return false;\n }\n\n if (BLACKLIST.includes(stripped)) {\n return false;\n }\n\n var numbers = stripped.substr(0, 9);\n numbers += verifierDigit(numbers);\n numbers += verifierDigit(numbers);\n return numbers.substr(-2) === stripped.substr(-2);\n};\n\nvar generate = function generate(formatted) {\n var numbers = '';\n\n for (var i = 0; i < 9; i += 1) {\n numbers += Math.floor(Math.random() * 9);\n }\n\n numbers += verifierDigit(numbers);\n numbers += verifierDigit(numbers);\n return formatted ? format(numbers) : numbers;\n};\n\nvar cpf = {\n verifierDigit: verifierDigit,\n strip: strip,\n format: format,\n isValid: isValid,\n generate: generate\n};\nvar BLACKLIST$1 = ['00000000000000', '11111111111111', '22222222222222', '33333333333333', '44444444444444', '55555555555555', '66666666666666', '77777777777777', '88888888888888', '99999999999999'];\nvar STRICT_STRIP_REGEX$1 = /[-\\\\/.]/g;\nvar LOOSE_STRIP_REGEX$1 = /[^\\d]/g;\n\nvar verifierDigit$1 = function verifierDigit$1(digits) {\n var index = 2;\n var reverse = digits.split('').reduce(function (buffer, number) {\n return [parseInt(number, 10)].concat(buffer);\n }, []);\n var sum = reverse.reduce(function (buffer, number) {\n buffer += number * index;\n index = index === 9 ? 2 : index + 1;\n return buffer;\n }, 0);\n var mod = sum % 11;\n return mod < 2 ? 0 : 11 - mod;\n};\n\nvar strip$1 = function strip$1(number, strict) {\n var regex = strict ? STRICT_STRIP_REGEX$1 : LOOSE_STRIP_REGEX$1;\n return (number || '').replace(regex, '');\n};\n\nvar format$1 = function format$1(number) {\n return strip$1(number).replace(/^(\\d{2})(\\d{3})(\\d{3})(\\d{4})(\\d{2})$/, '$1.$2.$3/$4-$5');\n};\n\nvar isValid$1 = function isValid$1(number, strict) {\n var stripped = strip$1(number, strict);\n\n if (!stripped) {\n return false;\n }\n\n if (stripped.length !== 14) {\n return false;\n }\n\n if (BLACKLIST$1.includes(stripped)) {\n return false;\n }\n\n var numbers = stripped.substr(0, 12);\n numbers += verifierDigit$1(numbers);\n numbers += verifierDigit$1(numbers);\n return numbers.substr(-2) === stripped.substr(-2);\n};\n\nvar generate$1 = function generate$1(formatted) {\n var numbers = '';\n\n for (var i = 0; i < 12; i += 1) {\n numbers += Math.floor(Math.random() * 9);\n }\n\n numbers += verifierDigit$1(numbers);\n numbers += verifierDigit$1(numbers);\n return formatted ? format$1(numbers) : numbers;\n};\n\nvar cnpj = {\n verifierDigit: verifierDigit$1,\n strip: strip$1,\n format: format$1,\n isValid: isValid$1,\n generate: generate$1\n};\n\nvar validator = function validator(joi) {\n return {\n type: 'document',\n base: joi.string(),\n messages: {\n 'document.cpf': 'CPF inválido',\n 'document.cnpj': 'CNPJ inválido'\n },\n rules: {\n cpf: {\n validate: function validate(value, helpers, args, options) {\n if (!cpf.isValid(value)) {\n return helpers.error('document.cpf');\n }\n\n return value;\n }\n },\n cnpj: {\n validate: function validate(value, helpers, args, options) {\n if (!cnpj.isValid(value)) {\n return helpers.error('document.cnpj');\n }\n\n return value;\n }\n }\n }\n };\n};\n\nexport default validator;\nexport { cpf, cnpj, validator };","import { cpf, cnpj } from \"cpf-cnpj-validator\";\n\nexport const isPJ = function (value) {\n return value.trim().toUpperCase() === \"PJ\";\n};\n\nexport const doesNotHaveValue = function (input) {\n return (input?.value.trim() ?? \"\") === \"\";\n};\n\n/**\n * @param {HTMLElement} el to transform\n * @param {boolean} isHidden\n */\nexport const setElementHiddenClass = (el, isHidden) => {\n el.classList.toggle(\"hidden\", isHidden);\n};\n\n/**\n * @param {HTMLButtonElement} button to transform\n * @param {boolean} isInvalid\n */\nexport const disableSubmitButtonElement = (button, isInvalid) => {\n button.disabled = isInvalid;\n button.classList.toggle(\"cursor-not-allowed\", isInvalid);\n button.classList.toggle(\"opacity-60\", isInvalid);\n};\n\n/**\n * @param {HTMLInputElement} input to transform\n * @param {boolean} isDisabled\n */\nexport const disableInputField = (input, isDisabled, clearValue = true) => {\n if (clearValue) {\n input.value = \"\";\n }\n input.disabled = isDisabled;\n input.style = isDisabled ? \"background-color: #e0e0e0;\" : \"\";\n};\n\n/**\n * @param {HTMLInputElement} input to transform\n * @param {boolean} isDisabledAndNotRequired\n */\nexport const disableRequiredInputField = (input, isDisabledAndNotRequired, clear = true) => {\n disableInputField(input, isDisabledAndNotRequired, clear);\n input.required = !isDisabledAndNotRequired;\n};\n\nexport const checkoutCustomerFormHelpers = (elements) => {\n const {\n alertMessageDocumentElement,\n documentLabelElement,\n formDocumentElement,\n formPhoneNumberElement,\n formClientType,\n isForeignerElement,\n submitButtonElement,\n whatsappAcceptElement,\n whatsappLabelElement\n } = elements;\n\n function toggleDocumentErrorMessage (isInvalid, isEmpty) {\n const emptyErrorMessage = alertMessageDocumentElement.querySelector(\".document_empty\");\n const invalidErrorMessage = alertMessageDocumentElement.querySelector(\".document_invalid\");\n\n if (isEmpty) {\n setElementHiddenClass(emptyErrorMessage, false);\n setElementHiddenClass(invalidErrorMessage, true);\n } else if (isInvalid) {\n setElementHiddenClass(emptyErrorMessage, true);\n setElementHiddenClass(invalidErrorMessage, false);\n }\n\n setElementHiddenClass(alertMessageDocumentElement, !isInvalid);\n\n disableSubmitButtonElement(submitButtonElement, isInvalid);\n }\n\n const pjMode = isPJ(formClientType.value);\n\n const helpers = {\n pjMode,\n /**\n *\n * @param {HTMLInputValue} formClientType\n * @returns boolean\n */\n cpfCnpjValidator () {\n if (isForeignerElement?.checked) {\n return true;\n }\n const docNum = formDocumentElement.value?.trim() ?? \"\";\n const docNumDigits = docNum.split(\"\").filter(digit => /^\\d$/.test(digit));\n const isFilled = docNumDigits.length > 0;\n const isValid = isFilled && (pjMode ? cnpj.isValid(docNum) : cpf.isValid(docNum));\n\n if (formDocumentElement.required) {\n toggleDocumentErrorMessage(!isValid, !isFilled);\n return isValid;\n } else {\n const valid = isFilled ? isValid : true;\n toggleDocumentErrorMessage(!valid, false);\n return valid;\n }\n },\n /** @param {boolean} state */\n disableCpfCnpjFields: isForeignerElement\n ? (state) => {\n const optionalLabel = documentLabelElement.querySelector(\"small\");\n if (!optionalLabel || (optionalLabel && optionalLabel.classList.contains(\"inline-zero-width\"))) {\n documentLabelElement.classList.toggle(\"required\", !state);\n }\n disableRequiredInputField(formDocumentElement, state);\n\n if (state) {\n toggleDocumentErrorMessage(false, false);\n }\n }\n : undefined,\n phoneNumberChangeHandler () {\n const phoneValue = formPhoneNumberElement\n .value\n .split(\"\")\n .filter(num => /\\d/.test(num));\n\n const valid = phoneValue.length > 6;\n\n whatsappAcceptElement.checked = valid;\n whatsappAcceptElement.classList.toggle(\"hidden\", !valid);\n whatsappLabelElement.classList.toggle(\"hidden\", !valid);\n }\n };\n // to validate cpf/cnpj\n formDocumentElement.addEventListener(\"blur\", () => {\n helpers.cpfCnpjValidator(formClientType);\n });\n\n // to disabled cpf/cnpj fields\n if (isForeignerElement) {\n isForeignerElement.addEventListener(\"change\", (e) => {\n helpers.disableCpfCnpjFields(e.target.checked);\n });\n }\n\n // Show hidden whatsapp checkbox and label\n formPhoneNumberElement.addEventListener(\"keyup\", helpers.phoneNumberChangeHandler);\n\n return helpers;\n};\n\nexport const parseFetchResponse = (response) =>\n response\n .json()\n .then((data) => ({ status: response.status, body: data }));\n\n/**\n * Transform object to inline CSS string to use directly in style properties.\n *\n * @param {Object.} obj containing css key:values\n * @returns\n */\nexport const objectToInlineCss = (obj) => Object.entries(obj).map(([key, value]) => `${key}: ${value}`).join(\";\");\n\n/**\n *\n * @param {string} query to search element\n * @returns {HTMLElement} element\n */\nexport const querySelectorOrFail = (query) => {\n const el = document.querySelector(query);\n if (!el) {\n throw new Error(\"Not element found with query \" + query);\n }\n return el;\n};\n\n/**\n * Trigger a blur (loss of focus) in element and document's current active element when Enter is pressed.\n * @param {KeyboardEvent} event\n */\nexport function blurOnEnterKeyupHandler (event) {\n if (event.key === \"Enter\") {\n event.target.blur();\n document.activeElement.blur();\n }\n}\n\n/**\n * Forces blur (loss of focus) in the active document on event.\n */\nexport function forceBlurOnEventHandler () {\n document.activeElement.blur();\n}\n","module.exports = require(\"regenerator-runtime\");\n","export const formatterCurrency = new Intl.NumberFormat(\"pt-BR\", {\n style: \"currency\",\n currency: \"BRL\"\n});\n\n/**\n * Gets value from element and returns as formatted currency string.\n *\n * @param {HTMLInputElement} element to get the value from\n * @returns {string} formatted currency value\n */\nexport const getFormattedCurrencyValueFromEl = (element) => {\n if (!(\"value\" in element) || !element.value || element.value?.trim().length < 1) {\n return 0;\n }\n return formatterCurrency.format(element.value / 100);\n};\n\n/**\n * Remove non-currency related characters from string for getting number without decimals separator\n *\n * @param {string} value formatted\n * @returns {string} numeric value without decimals (value * 100)\n */\nexport const getValueWithoutFormat = function (value) {\n return value.replace(/[^0-9,.]+/gm, \"\").replace(\",\", \".\").replace(\".\", \"\");\n};\n\n/**\n * Gets input element value in lowercase\n *\n * @param {HTMLInputElement} element input field to get value from\n * @returns {string} input element field in lowercase\n */\nexport const getLowerCaseInputValue = function (element) {\n return element.value.toString().toLowerCase();\n};\n","let correlationId = null;\n\nexport const corrHeaderKey = 'X-Correlation-Id'\n\nexport function getCorrId() {\n return correlationId;\n}\n\nexport function setCorrId(value) {\n if (correlationId == null) {\n correlationId = value;\n }\n}\n\nexport function addCorrId(headers = new Headers()) {\n if (correlationId == null) return headers;\n\n if (headers instanceof Headers) {\n headers.set(corrHeaderKey, correlationId);\n } else {\n headers[corrHeaderKey] = correlationId;\n }\n\n return headers;\n}\n\nexport function loadCorrId(headers) {\n if (correlationId) return headers;\n\n if (headers instanceof Headers && headers.has(corrHeaderKey)) {\n setCorrId(headers.get(corrHeaderKey));\n } else if (corrHeaderKey in headers && headers[corrHeaderKey]) {\n setCorrId(headers[corrHeaderKey]);\n }\n}\n\nexport function tapAndLoadCorrId(response) {\n loadCorrId(response.headers);\n return response;\n}\n","import { convert } from \"./utils/encrypt\";\n\n/**\n * Enum-like to define checkout option step\n */\nexport const CHECKOUT_STEP = Object.freeze({\n begin_checkout: \"begin_checkout\",\n add_payment_info: \"add_payment_info\",\n purchase: \"purchase\"\n});\n\nexport const PAYMENT_TYPE = Object.freeze({\n card: \"Cartão de Crédito\",\n pix: \"PIX\",\n nupay: \"Nupay\"\n});\n\nexport function GtmFactory (dataLayer = window.dataLayer || []) {\n const sendDataLayer = (eventType, payload) => {\n dataLayer.push({ ecommerce: null });\n dataLayer.push({\n event: eventType,\n ecommerce: payload\n });\n };\n\n const buildPayload = async (data, paymentType) => {\n const fullName = data.fullName || \"\";\n const phone = getPhone(data.phone);\n const email = data.email?.toLowerCase() || \"\";\n\n const ecommerce = {\n currency: \"BRL\",\n value: data.totalAmount,\n items: [\n {\n index: 0,\n item_id: data.productId,\n item_name: data.productName,\n coupon: data.coupon || \"\",\n currency: \"BRL\",\n discount: data.discount || 0,\n price: data.price,\n quantity: 1\n }\n ],\n fullName,\n hashed_full_name: await convert(fullName.replace(/\\s/g, \"\").toLowerCase()),\n email,\n hashed_email: await convert(email),\n phone,\n hashed_phone: await convert(phone)\n };\n\n if (paymentType) ecommerce.paymentType = paymentType;\n if (data.transactionId) ecommerce.transaction_id = data.transactionId;\n\n return ecommerce;\n };\n\n return {\n dataLayer,\n /**\n * Send any Event\n * @param {String} eventType\n * @param {Object.} productData\n * @param {String} paymentType\n */\n async sendEvent (eventType, productData, paymentType) {\n sendDataLayer(eventType, await buildPayload(productData, paymentType));\n },\n /**\n * Sends analytics data about initializing the checkout page\n */\n sendBeginCheckout ({ price, discount, productId, productName, coupon, fullName, email, phone }) {\n return this.sendEvent(CHECKOUT_STEP.begin_checkout, {\n totalAmount: price,\n productId,\n productName,\n price,\n discount,\n coupon,\n fullName,\n email,\n phone\n });\n },\n registerCheckoutOptionEvent (paymentMethod, formsValues) {\n const {\n price,\n discount,\n coupon,\n productName,\n productId,\n fullName,\n email,\n phone\n } = formsValues;\n\n const eventData = {\n price,\n discount,\n coupon,\n productName,\n productId,\n fullName,\n email,\n phone,\n totalAmount: price\n };\n\n return this.sendEvent(CHECKOUT_STEP.add_payment_info, eventData, paymentMethod);\n },\n registerPurchaseEvent (paymentMethod, formsValues) {\n // The payment succeeded!\n const {\n coupon,\n discount,\n productName,\n productId,\n price,\n transactionId,\n fullName,\n email,\n phone\n } = formsValues;\n\n const purchaseData = {\n transactionId, // Transaction ID. Required for purchases and refunds.\n coupon,\n discount,\n productId,\n productName,\n price,\n fullName,\n email,\n phone,\n totalAmount: price\n };\n\n return this.sendEvent(CHECKOUT_STEP.purchase, purchaseData, paymentMethod);\n }\n };\n}\n\nfunction getPhone (phone) {\n if (phone === \"\" || phone === undefined) {\n return \"\";\n } else {\n return `55${phone.replace(/[^0-9]/g, \"\")}`;\n }\n}\n","export async function convert (data) {\n if (data === \"\" || data === undefined) return \"\";\n\n const encoder = new TextEncoder();\n const dataBuffer = encoder.encode(data);\n const hashBuffer = await window.crypto.subtle.digest(\"SHA-256\", dataBuffer);\n const hashArray = Array.from(new Uint8Array(hashBuffer));\n const hashHex = hashArray\n .map((byte) => byte.toString(16).padStart(2, \"0\"))\n .join(\"\");\n\n return hashHex;\n}\n","/* KeyCodes de comandos e modifiers a serem ignorados pela formatação de campos */\nexport const ignoredFormKeyCodes = [\n 3, // CANCEL\n 8, // BACKSPACE\n 9, // TAB\n 16, // SHIFT\n 17, // CTRL\n 18, // ALT\n 20, // CAPS LOCK\n 27, // ESC\n 33, // PG UP\n 34, // PG DOWN\n 35, // END\n 36, // HOME\n 37, // ARROW LEFT\n 38, // ARROW UP\n 39, // ARROW RIGHT\n 40, // ARROW DOWN\n 41, // SELECT\n 42, // PRINT\n 43, // EXECUTE\n 44, // F13/PRINTSCREEN\n 45, // INSERT\n 46, // DELETE\n 91, // Meta (Mac Key)\n 92, // Meta (Mac Key)\n 93, // Context Menu\n 112, // F1\n 113, // F2\n 114, // F3\n 115, // [...]\n 116,\n 117,\n 118,\n 119,\n 120,\n 121,\n 122, // [...]\n 123, // F12\n 124, // F13\n 125, // F14\n 126, // [...]\n 127,\n 128,\n 129,\n 130,\n 131,\n 132,\n 133,\n 134,\n 135,\n 136,\n 137,\n 138,\n 139,\n 140,\n 141, // [...]\n 142, // F31\n 143, // F32\n 144, // Num Lock\n 145, // Scroll Lock\n 166, // Browser Back\n 167, // Browser Forward\n 168, // Browser Refresh\n 174, // [Media Key]\n 175, // [Media Key]\n 176, // [Media Key]\n 177, // [Media Key]\n 178, // [Media Key]\n 179, // [Media Key]\n 180, // [Media Key]\n 181, // [Media Key]\n 182, // [Media Key]\n 183, // [Media Key]\n 224, // Meta (Mac key)\n 225, // Alt (Mac Key)\n];\n","/* globals Rollbar */\n\nimport { CouponService } from \"./coupon_service\";\nimport { formatterCurrency, getLowerCaseInputValue } from \"./formatters\";\nimport {\n blurOnEnterKeyupHandler,\n disableInputField,\n disableSubmitButtonElement,\n forceBlurOnEventHandler,\n objectToInlineCss,\n setElementHiddenClass\n} from \"./helper_functions\";\n\nconst createCouponErrorSpan = ({ errorMessage = \"Cupom inválido\", className = \"alert-message\" } = {}) => {\n const couponErrorMessageSpan = document.createElement(\"span\");\n couponErrorMessageSpan.className = className;\n couponErrorMessageSpan.style = objectToInlineCss({\n color: \"#B91C1C\",\n \"font-weight\": 500,\n \"font-size\": \"14px\",\n \"font-family\": \"Inter, sans-serif\",\n \"padding-top\": \"6px\",\n });\n\n couponErrorMessageSpan.textContent = errorMessage;\n return couponErrorMessageSpan;\n};\n\n/**\n *\n * @param {{\n * elements: {\n * clearCouponButton: HTMLSpanElement;\n * couponInput: HTMLInputElement;\n * discountAmountSpan: HTMLSpanElement;\n * errorSpanContainer: HTMLElement;\n * formAmountHiddenInput: HTMLInputElement;\n * paymentTotalSpan: HTMLSpanElement;\n * submitCouponButton: HTMLSpanElement;\n * emailInput: HTMLInputElement;\n * submitFormButton: HTMLInputElement;\n * };\n * errorMessageOptions: {\n * errorMessage: string;\n * className: string;\n * };\n * }} params\n * @returns\n */\nexport const couponFormFactory = (params = {}) => {\n const { elements, productId, errorMessageOptions = {} } = params;\n if (!elements || Object.keys(elements).length < 1) {\n throw new Error(\"Should provide elements references!\");\n }\n if (!productId || !productId?.length) {\n throw new Error(\"Should provide productId value!\");\n }\n\n if (new URLSearchParams(window.location.search).has(\"cupom\")) {\n const { clearCouponButton } = elements;\n\n function removeCouponFromUrlHandler () {\n const currentUrl = new URL(window.location.href);\n currentUrl.searchParams.delete(\"cupom\");\n window.location.assign(currentUrl);\n }\n\n if (clearCouponButton) {\n clearCouponButton.addEventListener(\"click\", removeCouponFromUrlHandler);\n } else if (Rollbar) {\n Rollbar.error(\"Missing clear coupon button reference\", {\n url: window.location.href\n });\n }\n\n return { fixedCoupon: true };\n }\n\n const {\n clearCouponButton,\n couponInput,\n discountAmountSpan,\n errorSpanContainer,\n formAmountHiddenInput,\n paymentTotalSpan,\n submitCouponButton,\n emailInput,\n submitFormButton\n } = elements;\n\n /** @type {Function[]} */\n let couponChangeEventListeners = [];\n\n let currentlyActiveCoupon = \"\";\n\n let validEmail = null;\n\n const couponErrorSpan = createCouponErrorSpan(errorMessageOptions);\n\n function addCouponChangeListener (listener) {\n if (!couponChangeEventListeners.some((registeredListener) => registeredListener === listener)) {\n couponChangeEventListeners.push(listener);\n }\n }\n\n function removeCouponChangeListener (listener) {\n couponChangeEventListeners = couponChangeEventListeners\n .filter((registeredListener) => registeredListener !== listener);\n }\n\n /**\n * Publish data to listeners\n *\n * @param {{\n * amountOff: string\n * couponId: string\n * discountAmount: string\n * discountedAmount: string\n * percentOff: string\n * }} couponData\n * @param {boolean=} clear\n */\n function pushCouponChangeToListeners (couponData, clear) {\n couponChangeEventListeners.forEach((listener) => {\n try {\n listener?.(couponData, clear);\n } catch (error) {\n console.error(\"Failed to call listener:\", { listener });\n }\n });\n }\n\n function couponInputClickHandler () {\n setElementHiddenClass(submitCouponButton, false);\n disableInputField(submitCouponButton, false, !currentlyActiveCoupon.length);\n removeErrorSpan();\n }\n\n function removeErrorSpan () {\n if (couponErrorSpan.parentElement) {\n couponErrorSpan.parentElement.removeChild(couponErrorSpan);\n }\n }\n\n /**\n * Appends errorSpan into the given parentElement\n * @param {HTMLElement} parentElement to append the errorSpan as child\n */\n function appendErrorSpan (parentElement = errorSpanContainer) {\n removeErrorSpan();\n parentElement.appendChild(couponErrorSpan);\n }\n\n /**\n * Fetch coupon data from server relative to the current product\n * @param {string} coupon\n * @param {string} amount\n * @param {string} email\n */\n const fetchCoupon = async (coupon, amount, email) => {\n const couponData = await CouponService.getCoupon(coupon, amount, productId, email)\n .catch((error) => {\n console.error(error);\n appendErrorSpan(errorSpanContainer);\n });\n if (!couponData) {\n return null;\n }\n const formattedDiscountedAmount = formatterCurrency.format(couponData.discountedAmount / 100);\n const formattedDiscount = formatterCurrency.format(couponData.discountAmount / 100);\n const formattedPixDiscountedAmount = formatterCurrency.format(couponData.pixDiscountedAmount / 100);\n const formattedPixAmount = formatterCurrency.format(couponData.pixAmount / 100);\n\n return {\n ...couponData,\n formattedDiscount,\n formattedDiscountedAmount,\n formattedPixAmount,\n formattedPixDiscountedAmount\n };\n };\n\n /**\n * Handles loss of focus in couponInput\n * @param {FocusEvent} event\n */\n function couponInputBlurHandler (event) {\n event.preventDefault();\n removeErrorSpan();\n\n const couponName = couponInput.value.toUpperCase();\n\n setElementHiddenClass(submitCouponButton, true);\n disableInputField(couponInput, true, false);\n\n if (couponName.trim().length < 1 && currentlyActiveCoupon) {\n couponInput.value = currentlyActiveCoupon;\n disableInputField(couponInput, false, false);\n return;\n // eslint-disable-next-line eqeqeq\n } else if (couponName.trim() == currentlyActiveCoupon && validEmail == getLowerCaseInputValue(emailInput)) {\n disableInputField(couponInput, false, false);\n return;\n } else if (couponName.trim().length < 1) {\n disableInputField(couponInput, false, true);\n return;\n }\n\n // disable submit form while the coupon is validating\n disableSubmitButtonElement(submitFormButton, true);\n\n const lowercasedEmailValue = getLowerCaseInputValue(emailInput);\n\n fetchCoupon(couponName, formAmountHiddenInput.value, lowercasedEmailValue)\n .then((couponData) => {\n if (couponData !== null) {\n // save the previous email used to validate coupon\n validEmail = lowercasedEmailValue;\n currentlyActiveCoupon = couponName;\n couponInput.value = couponName;\n discountAmountSpan.textContent = couponData.formattedDiscount;\n paymentTotalSpan.textContent = couponData.formattedDiscountedAmount;\n // disable input to not edit coupon after a validation\n disableInputField(couponInput, true, false);\n setElementHiddenClass(discountAmountSpan, false);\n setElementHiddenClass(clearCouponButton, false);\n } else if (validEmail !== lowercasedEmailValue) {\n // if email input value is different from the first email filled, coupon is invalid\n removeCouponHandler();\n } else {\n couponInput.value = currentlyActiveCoupon;\n }\n disableInputField(submitCouponButton, true, false);\n\n pushCouponChangeToListeners(couponData);\n })\n .finally(() => {\n // deal with coupon input disable\n // when currentlyActiveCoupon has not length, disable is false\n // when currentlyActiveCoupon has length, disable is true (coupon is already validated)\n disableInputField(couponInput, currentlyActiveCoupon.length, !currentlyActiveCoupon.length);\n disableSubmitButtonElement(submitFormButton, false);\n });\n }\n\n function removeCouponHandler () {\n removeErrorSpan();\n setElementHiddenClass(submitCouponButton, false);\n disableInputField(couponInput, false, true);\n pushCouponChangeToListeners(null, true);\n setElementHiddenClass(discountAmountSpan, true);\n setElementHiddenClass(clearCouponButton, true);\n setElementHiddenClass(submitCouponButton, true);\n currentlyActiveCoupon = \"\";\n }\n\n // check coupon after email is filled\n emailInput.addEventListener(\"blur\", couponInputBlurHandler);\n\n couponInput.addEventListener(\"blur\", couponInputBlurHandler);\n\n couponInput.addEventListener(\"click\", couponInputClickHandler);\n\n couponInput.addEventListener(\"keyup\", blurOnEnterKeyupHandler);\n\n submitCouponButton.addEventListener(\"click\", forceBlurOnEventHandler);\n\n clearCouponButton.addEventListener(\"click\", removeCouponHandler);\n\n return {\n fixedCoupon: false,\n couponInput,\n clearCouponButton,\n submitCouponButton,\n discountAmountSpan,\n paymentTotalSpan,\n addCouponChangeListener,\n removeCouponChangeListener,\n appendErrorSpan,\n removeErrorSpan,\n elements\n };\n};\n","/**\n * Copyright (c) 2014-present, Facebook, Inc.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n\nvar runtime = (function (exports) {\n \"use strict\";\n\n var Op = Object.prototype;\n var hasOwn = Op.hasOwnProperty;\n var undefined; // More compressible than void 0.\n var $Symbol = typeof Symbol === \"function\" ? Symbol : {};\n var iteratorSymbol = $Symbol.iterator || \"@@iterator\";\n var asyncIteratorSymbol = $Symbol.asyncIterator || \"@@asyncIterator\";\n var toStringTagSymbol = $Symbol.toStringTag || \"@@toStringTag\";\n\n function define(obj, key, value) {\n Object.defineProperty(obj, key, {\n value: value,\n enumerable: true,\n configurable: true,\n writable: true\n });\n return obj[key];\n }\n try {\n // IE 8 has a broken Object.defineProperty that only works on DOM objects.\n define({}, \"\");\n } catch (err) {\n define = function(obj, key, value) {\n return obj[key] = value;\n };\n }\n\n function wrap(innerFn, outerFn, self, tryLocsList) {\n // If outerFn provided and outerFn.prototype is a Generator, then outerFn.prototype instanceof Generator.\n var protoGenerator = outerFn && outerFn.prototype instanceof Generator ? outerFn : Generator;\n var generator = Object.create(protoGenerator.prototype);\n var context = new Context(tryLocsList || []);\n\n // The ._invoke method unifies the implementations of the .next,\n // .throw, and .return methods.\n generator._invoke = makeInvokeMethod(innerFn, self, context);\n\n return generator;\n }\n exports.wrap = wrap;\n\n // Try/catch helper to minimize deoptimizations. Returns a completion\n // record like context.tryEntries[i].completion. This interface could\n // have been (and was previously) designed to take a closure to be\n // invoked without arguments, but in all the cases we care about we\n // already have an existing method we want to call, so there's no need\n // to create a new function object. We can even get away with assuming\n // the method takes exactly one argument, since that happens to be true\n // in every case, so we don't have to touch the arguments object. The\n // only additional allocation required is the completion record, which\n // has a stable shape and so hopefully should be cheap to allocate.\n function tryCatch(fn, obj, arg) {\n try {\n return { type: \"normal\", arg: fn.call(obj, arg) };\n } catch (err) {\n return { type: \"throw\", arg: err };\n }\n }\n\n var GenStateSuspendedStart = \"suspendedStart\";\n var GenStateSuspendedYield = \"suspendedYield\";\n var GenStateExecuting = \"executing\";\n var GenStateCompleted = \"completed\";\n\n // Returning this object from the innerFn has the same effect as\n // breaking out of the dispatch switch statement.\n var ContinueSentinel = {};\n\n // Dummy constructor functions that we use as the .constructor and\n // .constructor.prototype properties for functions that return Generator\n // objects. For full spec compliance, you may wish to configure your\n // minifier not to mangle the names of these two functions.\n function Generator() {}\n function GeneratorFunction() {}\n function GeneratorFunctionPrototype() {}\n\n // This is a polyfill for %IteratorPrototype% for environments that\n // don't natively support it.\n var IteratorPrototype = {};\n define(IteratorPrototype, iteratorSymbol, function () {\n return this;\n });\n\n var getProto = Object.getPrototypeOf;\n var NativeIteratorPrototype = getProto && getProto(getProto(values([])));\n if (NativeIteratorPrototype &&\n NativeIteratorPrototype !== Op &&\n hasOwn.call(NativeIteratorPrototype, iteratorSymbol)) {\n // This environment has a native %IteratorPrototype%; use it instead\n // of the polyfill.\n IteratorPrototype = NativeIteratorPrototype;\n }\n\n var Gp = GeneratorFunctionPrototype.prototype =\n Generator.prototype = Object.create(IteratorPrototype);\n GeneratorFunction.prototype = GeneratorFunctionPrototype;\n define(Gp, \"constructor\", GeneratorFunctionPrototype);\n define(GeneratorFunctionPrototype, \"constructor\", GeneratorFunction);\n GeneratorFunction.displayName = define(\n GeneratorFunctionPrototype,\n toStringTagSymbol,\n \"GeneratorFunction\"\n );\n\n // Helper for defining the .next, .throw, and .return methods of the\n // Iterator interface in terms of a single ._invoke method.\n function defineIteratorMethods(prototype) {\n [\"next\", \"throw\", \"return\"].forEach(function(method) {\n define(prototype, method, function(arg) {\n return this._invoke(method, arg);\n });\n });\n }\n\n exports.isGeneratorFunction = function(genFun) {\n var ctor = typeof genFun === \"function\" && genFun.constructor;\n return ctor\n ? ctor === GeneratorFunction ||\n // For the native GeneratorFunction constructor, the best we can\n // do is to check its .name property.\n (ctor.displayName || ctor.name) === \"GeneratorFunction\"\n : false;\n };\n\n exports.mark = function(genFun) {\n if (Object.setPrototypeOf) {\n Object.setPrototypeOf(genFun, GeneratorFunctionPrototype);\n } else {\n genFun.__proto__ = GeneratorFunctionPrototype;\n define(genFun, toStringTagSymbol, \"GeneratorFunction\");\n }\n genFun.prototype = Object.create(Gp);\n return genFun;\n };\n\n // Within the body of any async function, `await x` is transformed to\n // `yield regeneratorRuntime.awrap(x)`, so that the runtime can test\n // `hasOwn.call(value, \"__await\")` to determine if the yielded value is\n // meant to be awaited.\n exports.awrap = function(arg) {\n return { __await: arg };\n };\n\n function AsyncIterator(generator, PromiseImpl) {\n function invoke(method, arg, resolve, reject) {\n var record = tryCatch(generator[method], generator, arg);\n if (record.type === \"throw\") {\n reject(record.arg);\n } else {\n var result = record.arg;\n var value = result.value;\n if (value &&\n typeof value === \"object\" &&\n hasOwn.call(value, \"__await\")) {\n return PromiseImpl.resolve(value.__await).then(function(value) {\n invoke(\"next\", value, resolve, reject);\n }, function(err) {\n invoke(\"throw\", err, resolve, reject);\n });\n }\n\n return PromiseImpl.resolve(value).then(function(unwrapped) {\n // When a yielded Promise is resolved, its final value becomes\n // the .value of the Promise<{value,done}> result for the\n // current iteration.\n result.value = unwrapped;\n resolve(result);\n }, function(error) {\n // If a rejected Promise was yielded, throw the rejection back\n // into the async generator function so it can be handled there.\n return invoke(\"throw\", error, resolve, reject);\n });\n }\n }\n\n var previousPromise;\n\n function enqueue(method, arg) {\n function callInvokeWithMethodAndArg() {\n return new PromiseImpl(function(resolve, reject) {\n invoke(method, arg, resolve, reject);\n });\n }\n\n return previousPromise =\n // If enqueue has been called before, then we want to wait until\n // all previous Promises have been resolved before calling invoke,\n // so that results are always delivered in the correct order. If\n // enqueue has not been called before, then it is important to\n // call invoke immediately, without waiting on a callback to fire,\n // so that the async generator function has the opportunity to do\n // any necessary setup in a predictable way. This predictability\n // is why the Promise constructor synchronously invokes its\n // executor callback, and why async functions synchronously\n // execute code before the first await. Since we implement simple\n // async functions in terms of async generators, it is especially\n // important to get this right, even though it requires care.\n previousPromise ? previousPromise.then(\n callInvokeWithMethodAndArg,\n // Avoid propagating failures to Promises returned by later\n // invocations of the iterator.\n callInvokeWithMethodAndArg\n ) : callInvokeWithMethodAndArg();\n }\n\n // Define the unified helper method that is used to implement .next,\n // .throw, and .return (see defineIteratorMethods).\n this._invoke = enqueue;\n }\n\n defineIteratorMethods(AsyncIterator.prototype);\n define(AsyncIterator.prototype, asyncIteratorSymbol, function () {\n return this;\n });\n exports.AsyncIterator = AsyncIterator;\n\n // Note that simple async functions are implemented on top of\n // AsyncIterator objects; they just return a Promise for the value of\n // the final result produced by the iterator.\n exports.async = function(innerFn, outerFn, self, tryLocsList, PromiseImpl) {\n if (PromiseImpl === void 0) PromiseImpl = Promise;\n\n var iter = new AsyncIterator(\n wrap(innerFn, outerFn, self, tryLocsList),\n PromiseImpl\n );\n\n return exports.isGeneratorFunction(outerFn)\n ? iter // If outerFn is a generator, return the full iterator.\n : iter.next().then(function(result) {\n return result.done ? result.value : iter.next();\n });\n };\n\n function makeInvokeMethod(innerFn, self, context) {\n var state = GenStateSuspendedStart;\n\n return function invoke(method, arg) {\n if (state === GenStateExecuting) {\n throw new Error(\"Generator is already running\");\n }\n\n if (state === GenStateCompleted) {\n if (method === \"throw\") {\n throw arg;\n }\n\n // Be forgiving, per 25.3.3.3.3 of the spec:\n // https://people.mozilla.org/~jorendorff/es6-draft.html#sec-generatorresume\n return doneResult();\n }\n\n context.method = method;\n context.arg = arg;\n\n while (true) {\n var delegate = context.delegate;\n if (delegate) {\n var delegateResult = maybeInvokeDelegate(delegate, context);\n if (delegateResult) {\n if (delegateResult === ContinueSentinel) continue;\n return delegateResult;\n }\n }\n\n if (context.method === \"next\") {\n // Setting context._sent for legacy support of Babel's\n // function.sent implementation.\n context.sent = context._sent = context.arg;\n\n } else if (context.method === \"throw\") {\n if (state === GenStateSuspendedStart) {\n state = GenStateCompleted;\n throw context.arg;\n }\n\n context.dispatchException(context.arg);\n\n } else if (context.method === \"return\") {\n context.abrupt(\"return\", context.arg);\n }\n\n state = GenStateExecuting;\n\n var record = tryCatch(innerFn, self, context);\n if (record.type === \"normal\") {\n // If an exception is thrown from innerFn, we leave state ===\n // GenStateExecuting and loop back for another invocation.\n state = context.done\n ? GenStateCompleted\n : GenStateSuspendedYield;\n\n if (record.arg === ContinueSentinel) {\n continue;\n }\n\n return {\n value: record.arg,\n done: context.done\n };\n\n } else if (record.type === \"throw\") {\n state = GenStateCompleted;\n // Dispatch the exception by looping back around to the\n // context.dispatchException(context.arg) call above.\n context.method = \"throw\";\n context.arg = record.arg;\n }\n }\n };\n }\n\n // Call delegate.iterator[context.method](context.arg) and handle the\n // result, either by returning a { value, done } result from the\n // delegate iterator, or by modifying context.method and context.arg,\n // setting context.delegate to null, and returning the ContinueSentinel.\n function maybeInvokeDelegate(delegate, context) {\n var method = delegate.iterator[context.method];\n if (method === undefined) {\n // A .throw or .return when the delegate iterator has no .throw\n // method always terminates the yield* loop.\n context.delegate = null;\n\n if (context.method === \"throw\") {\n // Note: [\"return\"] must be used for ES3 parsing compatibility.\n if (delegate.iterator[\"return\"]) {\n // If the delegate iterator has a return method, give it a\n // chance to clean up.\n context.method = \"return\";\n context.arg = undefined;\n maybeInvokeDelegate(delegate, context);\n\n if (context.method === \"throw\") {\n // If maybeInvokeDelegate(context) changed context.method from\n // \"return\" to \"throw\", let that override the TypeError below.\n return ContinueSentinel;\n }\n }\n\n context.method = \"throw\";\n context.arg = new TypeError(\n \"The iterator does not provide a 'throw' method\");\n }\n\n return ContinueSentinel;\n }\n\n var record = tryCatch(method, delegate.iterator, context.arg);\n\n if (record.type === \"throw\") {\n context.method = \"throw\";\n context.arg = record.arg;\n context.delegate = null;\n return ContinueSentinel;\n }\n\n var info = record.arg;\n\n if (! info) {\n context.method = \"throw\";\n context.arg = new TypeError(\"iterator result is not an object\");\n context.delegate = null;\n return ContinueSentinel;\n }\n\n if (info.done) {\n // Assign the result of the finished delegate to the temporary\n // variable specified by delegate.resultName (see delegateYield).\n context[delegate.resultName] = info.value;\n\n // Resume execution at the desired location (see delegateYield).\n context.next = delegate.nextLoc;\n\n // If context.method was \"throw\" but the delegate handled the\n // exception, let the outer generator proceed normally. If\n // context.method was \"next\", forget context.arg since it has been\n // \"consumed\" by the delegate iterator. If context.method was\n // \"return\", allow the original .return call to continue in the\n // outer generator.\n if (context.method !== \"return\") {\n context.method = \"next\";\n context.arg = undefined;\n }\n\n } else {\n // Re-yield the result returned by the delegate method.\n return info;\n }\n\n // The delegate iterator is finished, so forget it and continue with\n // the outer generator.\n context.delegate = null;\n return ContinueSentinel;\n }\n\n // Define Generator.prototype.{next,throw,return} in terms of the\n // unified ._invoke helper method.\n defineIteratorMethods(Gp);\n\n define(Gp, toStringTagSymbol, \"Generator\");\n\n // A Generator should always return itself as the iterator object when the\n // @@iterator function is called on it. Some browsers' implementations of the\n // iterator prototype chain incorrectly implement this, causing the Generator\n // object to not be returned from this call. This ensures that doesn't happen.\n // See https://github.com/facebook/regenerator/issues/274 for more details.\n define(Gp, iteratorSymbol, function() {\n return this;\n });\n\n define(Gp, \"toString\", function() {\n return \"[object Generator]\";\n });\n\n function pushTryEntry(locs) {\n var entry = { tryLoc: locs[0] };\n\n if (1 in locs) {\n entry.catchLoc = locs[1];\n }\n\n if (2 in locs) {\n entry.finallyLoc = locs[2];\n entry.afterLoc = locs[3];\n }\n\n this.tryEntries.push(entry);\n }\n\n function resetTryEntry(entry) {\n var record = entry.completion || {};\n record.type = \"normal\";\n delete record.arg;\n entry.completion = record;\n }\n\n function Context(tryLocsList) {\n // The root entry object (effectively a try statement without a catch\n // or a finally block) gives us a place to store values thrown from\n // locations where there is no enclosing try statement.\n this.tryEntries = [{ tryLoc: \"root\" }];\n tryLocsList.forEach(pushTryEntry, this);\n this.reset(true);\n }\n\n exports.keys = function(object) {\n var keys = [];\n for (var key in object) {\n keys.push(key);\n }\n keys.reverse();\n\n // Rather than returning an object with a next method, we keep\n // things simple and return the next function itself.\n return function next() {\n while (keys.length) {\n var key = keys.pop();\n if (key in object) {\n next.value = key;\n next.done = false;\n return next;\n }\n }\n\n // To avoid creating an additional object, we just hang the .value\n // and .done properties off the next function object itself. This\n // also ensures that the minifier will not anonymize the function.\n next.done = true;\n return next;\n };\n };\n\n function values(iterable) {\n if (iterable) {\n var iteratorMethod = iterable[iteratorSymbol];\n if (iteratorMethod) {\n return iteratorMethod.call(iterable);\n }\n\n if (typeof iterable.next === \"function\") {\n return iterable;\n }\n\n if (!isNaN(iterable.length)) {\n var i = -1, next = function next() {\n while (++i < iterable.length) {\n if (hasOwn.call(iterable, i)) {\n next.value = iterable[i];\n next.done = false;\n return next;\n }\n }\n\n next.value = undefined;\n next.done = true;\n\n return next;\n };\n\n return next.next = next;\n }\n }\n\n // Return an iterator with no values.\n return { next: doneResult };\n }\n exports.values = values;\n\n function doneResult() {\n return { value: undefined, done: true };\n }\n\n Context.prototype = {\n constructor: Context,\n\n reset: function(skipTempReset) {\n this.prev = 0;\n this.next = 0;\n // Resetting context._sent for legacy support of Babel's\n // function.sent implementation.\n this.sent = this._sent = undefined;\n this.done = false;\n this.delegate = null;\n\n this.method = \"next\";\n this.arg = undefined;\n\n this.tryEntries.forEach(resetTryEntry);\n\n if (!skipTempReset) {\n for (var name in this) {\n // Not sure about the optimal order of these conditions:\n if (name.charAt(0) === \"t\" &&\n hasOwn.call(this, name) &&\n !isNaN(+name.slice(1))) {\n this[name] = undefined;\n }\n }\n }\n },\n\n stop: function() {\n this.done = true;\n\n var rootEntry = this.tryEntries[0];\n var rootRecord = rootEntry.completion;\n if (rootRecord.type === \"throw\") {\n throw rootRecord.arg;\n }\n\n return this.rval;\n },\n\n dispatchException: function(exception) {\n if (this.done) {\n throw exception;\n }\n\n var context = this;\n function handle(loc, caught) {\n record.type = \"throw\";\n record.arg = exception;\n context.next = loc;\n\n if (caught) {\n // If the dispatched exception was caught by a catch block,\n // then let that catch block handle the exception normally.\n context.method = \"next\";\n context.arg = undefined;\n }\n\n return !! caught;\n }\n\n for (var i = this.tryEntries.length - 1; i >= 0; --i) {\n var entry = this.tryEntries[i];\n var record = entry.completion;\n\n if (entry.tryLoc === \"root\") {\n // Exception thrown outside of any try block that could handle\n // it, so set the completion value of the entire function to\n // throw the exception.\n return handle(\"end\");\n }\n\n if (entry.tryLoc <= this.prev) {\n var hasCatch = hasOwn.call(entry, \"catchLoc\");\n var hasFinally = hasOwn.call(entry, \"finallyLoc\");\n\n if (hasCatch && hasFinally) {\n if (this.prev < entry.catchLoc) {\n return handle(entry.catchLoc, true);\n } else if (this.prev < entry.finallyLoc) {\n return handle(entry.finallyLoc);\n }\n\n } else if (hasCatch) {\n if (this.prev < entry.catchLoc) {\n return handle(entry.catchLoc, true);\n }\n\n } else if (hasFinally) {\n if (this.prev < entry.finallyLoc) {\n return handle(entry.finallyLoc);\n }\n\n } else {\n throw new Error(\"try statement without catch or finally\");\n }\n }\n }\n },\n\n abrupt: function(type, arg) {\n for (var i = this.tryEntries.length - 1; i >= 0; --i) {\n var entry = this.tryEntries[i];\n if (entry.tryLoc <= this.prev &&\n hasOwn.call(entry, \"finallyLoc\") &&\n this.prev < entry.finallyLoc) {\n var finallyEntry = entry;\n break;\n }\n }\n\n if (finallyEntry &&\n (type === \"break\" ||\n type === \"continue\") &&\n finallyEntry.tryLoc <= arg &&\n arg <= finallyEntry.finallyLoc) {\n // Ignore the finally entry if control is not jumping to a\n // location outside the try/catch block.\n finallyEntry = null;\n }\n\n var record = finallyEntry ? finallyEntry.completion : {};\n record.type = type;\n record.arg = arg;\n\n if (finallyEntry) {\n this.method = \"next\";\n this.next = finallyEntry.finallyLoc;\n return ContinueSentinel;\n }\n\n return this.complete(record);\n },\n\n complete: function(record, afterLoc) {\n if (record.type === \"throw\") {\n throw record.arg;\n }\n\n if (record.type === \"break\" ||\n record.type === \"continue\") {\n this.next = record.arg;\n } else if (record.type === \"return\") {\n this.rval = this.arg = record.arg;\n this.method = \"return\";\n this.next = \"end\";\n } else if (record.type === \"normal\" && afterLoc) {\n this.next = afterLoc;\n }\n\n return ContinueSentinel;\n },\n\n finish: function(finallyLoc) {\n for (var i = this.tryEntries.length - 1; i >= 0; --i) {\n var entry = this.tryEntries[i];\n if (entry.finallyLoc === finallyLoc) {\n this.complete(entry.completion, entry.afterLoc);\n resetTryEntry(entry);\n return ContinueSentinel;\n }\n }\n },\n\n \"catch\": function(tryLoc) {\n for (var i = this.tryEntries.length - 1; i >= 0; --i) {\n var entry = this.tryEntries[i];\n if (entry.tryLoc === tryLoc) {\n var record = entry.completion;\n if (record.type === \"throw\") {\n var thrown = record.arg;\n resetTryEntry(entry);\n }\n return thrown;\n }\n }\n\n // The context.catch method must only be called with a location\n // argument that corresponds to a known catch block.\n throw new Error(\"illegal catch attempt\");\n },\n\n delegateYield: function(iterable, resultName, nextLoc) {\n this.delegate = {\n iterator: values(iterable),\n resultName: resultName,\n nextLoc: nextLoc\n };\n\n if (this.method === \"next\") {\n // Deliberately forget the last sent value so that we don't\n // accidentally pass it on to the delegate.\n this.arg = undefined;\n }\n\n return ContinueSentinel;\n }\n };\n\n // Regardless of whether this script is executing as a CommonJS module\n // or not, return the runtime object so that we can declare the variable\n // regeneratorRuntime in the outer scope, which allows this module to be\n // injected easily by `bin/regenerator --include-runtime script.js`.\n return exports;\n\n}(\n // If this script is executing as a CommonJS module, use module.exports\n // as the regeneratorRuntime namespace. Otherwise create a new empty\n // object. Either way, the resulting object will be used to initialize\n // the regeneratorRuntime variable at the top of this file.\n typeof module === \"object\" ? module.exports : {}\n));\n\ntry {\n regeneratorRuntime = runtime;\n} catch (accidentalStrictMode) {\n // This module should not be running in strict mode, so the above\n // assignment should always work unless something is misconfigured. Just\n // in case runtime.js accidentally runs in strict mode, in modern engines\n // we can explicitly access globalThis. In older engines we can escape\n // strict mode using a global Function call. This could conceivably fail\n // if a Content Security Policy forbids using Function, but in that case\n // the proper solution is to fix the accidental strict mode problem. If\n // you've misconfigured your bundler to force strict mode and applied a\n // CSP to forbid Function, and you're not willing to fix either of those\n // problems, please detail your unique predicament in a GitHub issue.\n if (typeof globalThis === \"object\") {\n globalThis.regeneratorRuntime = runtime;\n } else {\n Function(\"r\", \"regeneratorRuntime = r\")(runtime);\n }\n}\n","export const CouponService = {\n /**\n * Retrieves coupon info from backend\n *\n * @param {string} coupon identifier\n * @param {string} amount value of the product\n * @param {string} productId of the discounted product\n * @param {string} email of the user\n * @returns {Promise<{\n * coupon: string;\n * amount: string;\n * amountOff: number;\n * discountAmount: number;\n * discountedAmount: number;\n * percentOff: number;\n * pixAmount: number;\n * pixDiscountedAmount: number;\n * }>}\n */\n async getCoupon (coupon, amount, productId, email) {\n const fetchUrlParams = new URLSearchParams({ amount, product_id: productId, email });\n const couponResponse = await fetch(`/coupon_payments/${coupon}?${fetchUrlParams}`);\n if (!couponResponse.ok) {\n throw new Error(`Failed to get coupon: ${couponResponse.statusText}`);\n }\n const couponData = await couponResponse.json();\n if (\"error\" in couponData) {\n throw new Error(coupon.error);\n }\n const discountAmount = couponData.discount_amount;\n const discountedAmount = couponData.new_amount;\n\n return {\n coupon,\n amount,\n amountOff: couponData.amount_off,\n percentOff: couponData.percent_off,\n discountAmount,\n discountedAmount,\n pixAmount: couponData.pix_amount,\n pixDiscountedAmount: couponData.pix_discount_amount\n };\n }\n};\n","import { addCorrId, loadCorrId } from './utils/correlation_id_store';\n\n// Send webhook to Zapier or any other service\nexport const webhook = Object.freeze({\n sendPost (url, body, headers = { \"Content-Type\": \"application/json\" }) {\n return fetch(url, {\n method: \"POST\",\n headers: addCorrId(headers),\n body: JSON.stringify(body)\n })\n .then(async (response) => {\n loadCorrId(response.headers);\n return {\n ok: response.ok,\n status: response.status,\n statusText: response.statusText,\n body: await (response.ok ? response.json() : response.text()),\n };\n })\n .catch((error) => {\n return {\n ok: false,\n error\n };\n });\n }\n});\n","export function debounced (fnToCall, timeout = 500) {\n let timeoutRef = null;\n return (...args) => {\n if (timeoutRef) return;\n timeoutRef = setTimeout(() => {\n fnToCall(...args);\n\n clearTimeout(timeoutRef);\n timeoutRef = null;\n }, timeout);\n };\n};\n","import { couponFormFactory } from \"../../../coupon_form_factory\";\nimport { formatterCurrency, getValueWithoutFormat } from \"../../../formatters\";\n\nexport function setupPaymentForm (clientForm, productForm, submitButton, paymentMethod = \"card\") {\n const formCouponIdHiddenInput = document.getElementById(\"client_payment_coupon_id\");\n const formAmountOffHiddenInput = document.getElementById(\"client_payment_amount_off\");\n const formPercentOffHiddenInput = document.getElementById(\"client_payment_percent_off\");\n const formDiscountAmountHiddenInput = document.getElementById(\"client_payment_discount_amount\");\n const formAmountHiddenInput = document.getElementById(\"client_payment_amount\");\n const formTotalAmountHiddenInput = document.getElementById(\"client_payment_total_amount\");\n const formCountInstallmentsHiddenInput = document.getElementById(\"client_payment_installments_count\");\n const formFixedInstallmentHiddenInput = document.getElementById(\"client_payment_fixed_installments\");\n\n if (window.coupon_accepted) {\n const { emailInput } = clientForm.inputs;\n\n const couponElements = {\n formAmountHiddenInput,\n couponInput: document.getElementById(\"coupon_id\"),\n discountAmountSpan: document.getElementById(\"discount-amount\"),\n paymentTotalSpan: document.getElementById(\"payment-total\"),\n clearCouponButton: document.getElementById(\"clear_coupon\"),\n errorSpanContainer: document.getElementById(\"coupon-container\")?.parentElement,\n submitCouponButton: document.getElementById(\"submit_coupon\"),\n emailInput,\n submitButton\n };\n let timeoutRef = null;\n\n const couponForm = couponFormFactory({\n elements: couponElements,\n productId: productForm.getId()\n });\n if (couponForm && !couponForm.fixedCoupon) {\n // TODO: this is for card payment, should extract and have the variant for pix/nupay here\n /**\n * Update installments options or span\n *\n * @param {string} amount numeric value\n * @param {boolean} [fixedInstallments=false] flag\n */\n const updateInstallments = (amount, fixedInstallments = false) => {\n if (fixedInstallments) {\n // operates over single span element\n const numericValue = Number(formCountInstallmentsHiddenInput.value);\n const formattedInstallmentValue = formatterCurrency.format(\n Number(amount) / numericValue\n );\n showInstallmentsSpan.innerText = `${numericValue}x ${formattedInstallmentValue} sem juros`;\n } else {\n // operate over options elements\n installmentsOptionsElements.forEach(function (item) {\n const numericValue = Number(item.value);\n const formattedInstallmentValue = formatterCurrency.format(\n Number(amount) / numericValue\n );\n item.innerText = `${numericValue}x ${formattedInstallmentValue} sem juros`;\n });\n }\n };\n\n if (couponForm) {\n /**\n * Handles changes in coupon values\n *\n * @param {{\n * amount: string\n * amountOff: number\n * coupon: string\n * discountAmount: number\n * discountedAmount: number\n * formattedDiscount: string\n * formattedDiscountedAmount: string\n * percentOff: string\n * } | null} coupon\n * @param {boolean=} clear\n */\n const couponChangeHandler = (coupon, clear = false) => {\n const rawOriginalAmount = Number(formAmountHiddenInput.value) / 100;\n const originalAmount = formatterCurrency.format(rawOriginalAmount);\n\n if (clear) {\n formCouponIdHiddenInput.value = \"\";\n formTotalAmountHiddenInput.value = formAmountHiddenInput.value;\n formDiscountAmountHiddenInput.value = \"\";\n formAmountOffHiddenInput.value = \"\";\n formPercentOffHiddenInput.value = \"\";\n\n couponElements.paymentTotalSpan.innerText = originalAmount;\n couponElements.discountAmountSpan.innerText = \"\";\n\n updateInstallments(rawOriginalAmount, formFixedInstallmentHiddenInput?.value === \"true\");\n return;\n } else if (coupon === null && formCouponIdHiddenInput.value) {\n if (timeoutRef !== null) {\n clearTimeout(timeoutRef);\n }\n timeoutRef = setTimeout(() => {\n couponForm.removeErrorSpan();\n }, 3000);\n return;\n } else if (coupon === null) {\n couponForm.appendErrorSpan();\n return;\n }\n\n couponForm.removeErrorSpan();\n\n formAmountOffHiddenInput.value = coupon.amountOff;\n formCouponIdHiddenInput.value = coupon.coupon;\n formDiscountAmountHiddenInput.value = coupon.discountAmount;\n formTotalAmountHiddenInput.value = coupon.discountedAmount;\n formPercentOffHiddenInput.value = coupon.percentOff;\n\n couponElements.paymentTotalSpan.innerText = coupon.formattedDiscountedAmount;\n couponElements.discountAmountSpan.innerText = coupon.formattedDiscount;\n\n updateInstallments(coupon.discountedAmount / 100, formFixedInstallmentHiddenInput?.value === \"true\");\n };\n couponForm.addCouponChangeListener(couponChangeHandler);\n }\n }\n }\n // END of Coupon Form\n}\n\nexport function getPaymentInfoHelpers ({ from_cents } = { from_cents: false }) {\n const factor = from_cents ? 100 : 1;\n const productUnitAmountHiddenInput = document.getElementById(\"unit-amount\") || document.getElementById(\"payment-total\");\n const formAmountOffHiddenInput = document.getElementById(\"client_payment_amount_off\");\n const formPercentOffHiddenInput = document.getElementById(\"client_payment_percent_off\");\n\n function getUnitAmount () {\n return getValueWithoutFormat(productUnitAmountHiddenInput?.innerText) / factor;\n }\n\n function getDiscountAmount () {\n const percentDiscount = formPercentOffHiddenInput.value\n ? (getUnitAmount() * (+formPercentOffHiddenInput.value)) / 100\n : 0;\n const discountAmount = getValueWithoutFormat(formAmountOffHiddenInput.value)\n ? +getValueWithoutFormat(formAmountOffHiddenInput.value) / 100\n : percentDiscount;\n return discountAmount;\n }\n\n function getTotalAmount () {\n return getUnitAmount() - getDiscountAmount();\n }\n\n return { getUnitAmount, getDiscountAmount, getTotalAmount };\n}\n","export function vanishElement (element, hidden = true) {\n element.classList.toggle(\"invisible\", hidden);\n element.classList.toggle(\"h-0\", hidden);\n}\n","/**\n * Converts a number in seconds to a string of descriptive time in the biggest units\n *\n * @param {number} secondsTime to parse\n * @param {boolean} hideSeconds to not show seconds in final string\n */\nexport function getDescriptiveTime (secondsTime, hideSeconds = false) {\n const ONE_MIN = 60;\n const ONE_HOUR = 60 * ONE_MIN;\n const ONE_DAY = 24 * ONE_HOUR;\n\n const seconds = secondsTime % ONE_MIN;\n const minutesTime = secondsTime - seconds;\n const minutes = (minutesTime % ONE_HOUR) / ONE_MIN;\n const hoursTime = minutesTime - (minutes * ONE_MIN);\n const hours = (hoursTime % ONE_DAY) / ONE_HOUR;\n const daysTime = hoursTime - (hours * ONE_HOUR);\n const days = daysTime / ONE_DAY;\n\n const numFormat = new Intl.NumberFormat([\"pt-BR\"], {\n minimumFractionDigits: 0,\n maximumFractionDigits: 0\n }).format;\n\n const descriptiveParts = [\n { value: days, unit: [\"dia\", \"dias\"] },\n { value: hours, unit: [\"hora\", \"horas\"] },\n { value: minutes, unit: [\"minuto\", \"minutos\"] },\n { value: hideSeconds ? 0 : seconds, unit: [\"segundo\", \"segundos\"] }\n ]\n .filter(({ value }) => Math.floor(value) > 0)\n .map(({ value, unit: [one, multiple] }) => `${numFormat(Math.floor(value))} ${value === 1 ? one : multiple}`);\n\n if (descriptiveParts.length > 1) {\n descriptiveParts.splice(\n descriptiveParts.length - 2,\n 2,\n [\n descriptiveParts[descriptiveParts.length - 2],\n descriptiveParts[descriptiveParts.length - 1]\n ].join(\" e \")\n );\n }\n\n const descriptive = descriptiveParts.join(\", \").trim();\n\n return descriptive.length ? descriptive : \"Agora\";\n}\n","import { ignoredFormKeyCodes } from \"../../ignored_form_key_codes\";\n\nexport const FORMATTED_CC_NUM_LENGTH = 19;\nexport const CC_NUM_LENGTH = 16;\nexport const CC_NUM_BLOCK_SIZE = 4;\nexport const CC_NUM_SPACE_POSITION_FACTOR = CC_NUM_BLOCK_SIZE + 1;\n\nconst NUM_KEYS = new Array(10).fill(null).map((_, i) => i.toString());\nconst ALLOWED_KEYS_NUMERIC = [...NUM_KEYS, ...ignoredFormKeyCodes];\n\nexport const creditCardNumberInputPartialValidator = /^[\\d\\s]+$/;\n\nexport const creditCardNumberInputValidator = (value) => /^([\\d]{4}\\s){3}[\\d]{4}$/.test(value);\nexport const isCursorMovementKey = (key) => /arrow|home|end/i.test(key);\nexport const isInSpaceChar = (num) => num % CC_NUM_SPACE_POSITION_FACTOR === 0;\n\nexport function creditCardNumberExtractor (value) {\n return value.split(\"\")\n .filter((char) => /^\\d$/.test(char))\n .slice(0, CC_NUM_LENGTH)\n .join(\"\");\n}\n\nexport function creditCardNumberFormatter (value) {\n const cleanChars = creditCardNumberExtractor(value);\n\n const formatted = cleanChars.split(\"\").reduce((result, char, index, arr) => {\n if (result.length >= FORMATTED_CC_NUM_LENGTH) return result;\n const separator =\n (index + 1) % CC_NUM_BLOCK_SIZE === 0 &&\n (result.length + 2) <= FORMATTED_CC_NUM_LENGTH\n ? \" \"\n : \"\";\n return result + char + separator;\n }, \"\").trim();\n\n return formatted;\n}\n\nexport function handleCCInputEmptySpace (event) {\n const { key, target: { value, selectionStart, selectionEnd } } = event;\n\n const target = {\n value: value.slice(0),\n selectionStart,\n selectionEnd\n };\n\n // if selection is diff it is selecting text, if is cursor movement commands skips\n // eslint-disable-next-line eqeqeq\n if (selectionStart == selectionEnd && !isCursorMovementKey(key)) {\n // handle cases where user is dealing with a space\n if (isInSpaceChar(selectionStart + 1) && isInSpaceChar(selectionEnd + 1)) {\n // case: remove space before cursor w/ backspace, remove char before space and move cursor 2 chars before\n if (/backspace/i.test(key)) {\n target.value = value\n .split(\"\")\n .filter((_, idx) => idx !== (selectionStart - 1))\n .join(\"\");\n target.selectionStart -= 2;\n target.selectionEnd -= 2;\n return target;\n }\n\n // case: remove space after cursor w/ delete, remove char after space and keep cursor position\n if (/delete/i.test(key)) {\n target.value = value\n .split(\"\")\n .filter((_, idx) => idx !== selectionStart)\n .join(\"\");\n\n return target;\n }\n }\n }\n // in case it is updating a 4-digits block moving a space, just move the caret an extra character forward\n if (value.slice(value.slice(0, selectionEnd).lastIndexOf(\" \"), selectionEnd + 1).length > 5) {\n target.selectionStart += 1;\n target.selectionEnd += 1;\n }\n\n return target;\n}\n\nexport function ccNumKeydownHandler (event) {\n if (event.key == 'Enter') {\n event.stopPropagation();\n event.preventDefault();\n return;\n }\n if (![event.metaKey, event.altKey, event.ctrlKey].some(active => active)) {\n if (!ALLOWED_KEYS_NUMERIC.includes(event.key) && !ignoredFormKeyCodes.includes(event.keyCode)) {\n event.preventDefault();\n return;\n }\n if (ignoredFormKeyCodes.includes(event.keyCode)) {\n return;\n }\n }\n\n const { value, selectionStart, selectionEnd } = event.target;\n\n const slicedValue = value.slice(0, FORMATTED_CC_NUM_LENGTH);\n\n event.target.value = slicedValue;\n\n this.value = slicedValue; // `this` here points to the input HTML Element\n\n event.target.setSelectionRange(selectionStart, selectionEnd);\n}\n\nexport function ccNumKeyupHandler (event) {\n const updatedTarget = handleCCInputEmptySpace(event);\n\n const { value } = updatedTarget;\n if (!value.length) {\n return;\n }\n\n const updatedValue = creditCardNumberFormatter(value);\n\n const shouldJumpToNextField =\n !ignoredFormKeyCodes.includes(event.keyCode) &&\n updatedTarget.value.length >= FORMATTED_CC_NUM_LENGTH &&\n updatedTarget.selectionStart >= FORMATTED_CC_NUM_LENGTH &&\n updatedTarget.selectionEnd >= FORMATTED_CC_NUM_LENGTH;\n\n // eslint-disable-next-line eqeqeq\n const isContentDiff = updatedValue != value;\n if (!isContentDiff) {\n if (shouldJumpToNextField) {\n event.target.nextElementSibling.focus();\n }\n return;\n }\n const isFieldOverflowing = value.length >= FORMATTED_CC_NUM_LENGTH;\n const sizeDiff = updatedValue.length - value.length;\n\n this.value = updatedValue.slice(0, FORMATTED_CC_NUM_LENGTH); // `this` here points to the input HTML Element\n\n const caretPositionDiff = isFieldOverflowing ? 0 : sizeDiff;\n\n event.target.setSelectionRange(\n updatedTarget.selectionStart + caretPositionDiff,\n updatedTarget.selectionEnd + caretPositionDiff\n );\n\n if (shouldJumpToNextField) {\n event.target.nextElementSibling.focus();\n }\n}\n\nfunction ccNumPasteHandler (event) {\n const pasteData = event.clipboardData.getData(\"text\");\n event.preventDefault(pasteData);\n this.value = creditCardNumberFormatter(pasteData);\n}\n\nexport function setupCreditCardNumberInput (inputElement) {\n inputElement.addEventListener(\"keydown\", ccNumKeydownHandler);\n inputElement.addEventListener(\"keyup\", ccNumKeyupHandler);\n inputElement.addEventListener(\"paste\", ccNumPasteHandler);\n\n inputElement.setAttribute(\"maxlength\", FORMATTED_CC_NUM_LENGTH);\n inputElement.setAttribute(\"pattern\", \"^([0-9]{4}\\\\s){3}[0-9]{4}$\");\n\n const proxyHandler = {\n get (target, prop, _receiver) {\n switch (prop) {\n case \"value\":\n return creditCardNumberExtractor(target.value ?? \"\");\n case \"valid\":\n return creditCardNumberInputValidator(target.value ?? \"\");\n case \"_self\":\n return target;\n default:\n return Reflect.get(...arguments);\n }\n },\n set (target, prop, value, _receiver) {\n if (prop === \"value\") {\n target.value = creditCardNumberFormatter(value.toString());\n } else {\n return Reflect.set(...arguments);\n }\n return true; // spec requires return of true in strict-mode\n }\n };\n\n return new Proxy(inputElement, proxyHandler);\n}\n","import { ignoredFormKeyCodes } from \"../../ignored_form_key_codes\";\n\nconst CC_ED_M_MAX_LENGTH = 2;\nconst CC_ED_Y_MAX_LENGTH = 2;\nconst FORMATTED_CC_ED_MAX_LENGTH = CC_ED_M_MAX_LENGTH + CC_ED_Y_MAX_LENGTH + 1;\nconst NUM_KEYS = new Array(10).fill(null).map((_, i) => i.toString());\nconst ALLOWED_KEYS_NUMERIC = [...NUM_KEYS, ...ignoredFormKeyCodes];\n\nexport function replaceStringDate (value) {\n return value\n .replace(/^([1-9]\\/|[2-9])$/g, \"0$1/\") // 3 > 03/\n .replace(/^(0[1-9]|1[0-2])$/g, \"$1/\") // 11 > 11/\n .replace(/^([0-1])([3-9])$/g, \"0$1/$2\") // 13 > 01/3\n .replace(/^(0?[1-9]|1[0-2])([0-9]{2})$/g, \"$1/$2\") // 141 > 01/41\n .replace(/^([0]+)\\/|[0]+$/g, \"0\") // 0/ > 0 and 00 > 0\n .replace(/[^\\d/]|^[/]*$/g, \"\") // To allow only digits and `/`\n .replace(/\\/\\//g, \"/\"); // Prevent entering more than 1 `/`\n}\n\nexport function ccEDExtractor (value) {\n const [month, year] = value.split(\"/\");\n\n if (year.length && year.length < 3) {\n const currentYearHundreds = new Date().getFullYear().toFixed(0).slice(0, CC_ED_Y_MAX_LENGTH);\n return [\n month,\n currentYearHundreds + year.padStart(2, \"0\")\n ].join(\"/\");\n }\n return value;\n}\n\nexport function ccEDFormatter (value) {\n const [month, year] = value.slice(0, FORMATTED_CC_ED_MAX_LENGTH).split(\"/\");\n if (Number.isNaN(+month)) {\n return \"\";\n }\n const numMonth = +month > 12 || +month < 1 ? 1 : Number(month);\n const strMonth = numMonth.toString().padStart(CC_ED_M_MAX_LENGTH, \"0\");\n\n if (year?.length && year.length > 2) {\n const twoDigitsYear = year.slice(CC_ED_Y_MAX_LENGTH).padStart(CC_ED_Y_MAX_LENGTH, \"0\");\n return [\n strMonth,\n twoDigitsYear\n ].join(\"/\");\n }\n return [strMonth, year].join(\"/\");\n}\n\nexport function ccEDValidator (value) {\n const [month, year] = value.split(\"/\");\n const currentYear = new Date().getFullYear();\n const currentYearHundreds = currentYear.toFixed(0).slice(0, CC_ED_Y_MAX_LENGTH);\n\n if (year.length === 3 || Number.isNaN(year) || +year < 1) {\n return false;\n }\n\n const fullYear = Number(\n year.length < 4\n ? currentYearHundreds + year.toFixed(0).padStart(2, \"0\")\n : year.toFixed(0)\n );\n\n if (fullYear < currentYear) {\n return false;\n }\n\n const numMonth = Number(month);\n if (!Number.isNaN(numMonth) || numMonth < 1 || numMonth > 12) {\n return false;\n }\n if (fullYear > currentYear) {\n return true;\n }\n\n const currentMonth = new Date().getMonth() + 1;\n\n return numMonth >= currentMonth;\n}\n\nexport function ccEDKeydownHandler (event) {\n if (event.key == 'Enter') {\n event.stopPropagation();\n event.preventDefault();\n return;\n }\n if (![event.metaKey, event.altKey, event.ctrlKey].some(active => active)) {\n if (!ALLOWED_KEYS_NUMERIC.includes(event.key) && !ignoredFormKeyCodes.includes(event.keyCode)) {\n event.preventDefault();\n return;\n }\n if (ignoredFormKeyCodes.includes(event.keyCode)) {\n return;\n }\n }\n\n const slicedValue = event.target.value.slice(0, FORMATTED_CC_ED_MAX_LENGTH);\n\n event.target.value = replaceStringDate(slicedValue);\n}\n\nexport function ccEDKeyupHandler (event) {\n const { selectionStart, selectionEnd } = event.target;\n const shouldFocusNext =\n !ignoredFormKeyCodes.includes(event.keyCode) &&\n event.target.value.length >= 5 &&\n selectionStart >= 5 &&\n selectionEnd >= 5;\n\n event.target.value = event.target.value.slice(0, FORMATTED_CC_ED_MAX_LENGTH);\n\n if (shouldFocusNext) {\n event.target.nextElementSibling.focus();\n }\n}\n\nexport function ccEDPasteHandler (event) {\n const pasteData = event.clipboardData.getData(\"text\");\n event.preventDefault(pasteData);\n event.target.value = replaceStringDate(pasteData);\n}\n\nexport function setupCCExpirationDateInput (inputElement) {\n inputElement.addEventListener(\"keydown\", ccEDKeydownHandler);\n inputElement.addEventListener(\"keyup\", ccEDKeyupHandler);\n inputElement.addEventListener(\"paste\", ccEDPasteHandler);\n\n inputElement.setAttribute(\"maxlength\", FORMATTED_CC_ED_MAX_LENGTH);\n inputElement.setAttribute(\"pattern\", `^[0-9]{${CC_ED_M_MAX_LENGTH}}/[0-9]{${CC_ED_Y_MAX_LENGTH}}$`);\n\n return new Proxy(inputElement, {\n get (target, prop, _receiver) {\n switch (prop) {\n case \"value\":\n return ccEDExtractor(target.value ?? \"\");\n case \"_self\":\n return target;\n default:\n return Reflect.get(...arguments);\n }\n },\n set (target, prop, value, _receiver) {\n if (prop === \"value\") {\n target.value = replaceStringDate(ccEDFormatter(value));\n } else {\n return Reflect.set(...arguments);\n }\n return true;\n }\n });\n}\n","import { ignoredFormKeyCodes } from \"../../ignored_form_key_codes\";\n\nconst NUM_KEYS = new Array(10).fill(null).map((_, i) => i.toString());\nconst ALLOWED_KEYS_NUMERIC = [...NUM_KEYS, ...ignoredFormKeyCodes];\n\nconst CVV_MIN_LENGTH = 3;\nconst CVV_MAX_LENGTH = 4;\n\nexport function numericOnlyFilter (char) {\n return /^\\d$/.test(char);\n}\n\nexport function filterNonNumericCharacters (value) {\n return value.split(\"\").filter(numericOnlyFilter).join(\"\");\n}\n\nexport function CVVFilter (value) {\n return filterNonNumericCharacters(value.slice(0, CVV_MAX_LENGTH));\n}\n\nexport function ccEDKeydownHandler (event) {\n if (event.key == 'Enter') {\n event.stopPropagation();\n event.preventDefault();\n return;\n }\n if (![event.metaKey, event.altKey, event.ctrlKey].some(active => active)) {\n if (!ALLOWED_KEYS_NUMERIC.includes(event.key) && !ignoredFormKeyCodes.includes(event.keyCode)) {\n event.preventDefault();\n return;\n }\n if (ignoredFormKeyCodes.includes(event.keyCode)) {\n return;\n }\n }\n\n event.target.value = CVVFilter(event.target.value);\n}\n\nexport function ccEDKeyupHandler (event) {\n if (event.key == 'Enter') {\n event.stopPropagation();\n event.preventDefault();\n return;\n }\n if (ignoredFormKeyCodes.includes(event.keyCode)) {\n return;\n }\n\n event.target.value = CVVFilter(event.target.value);\n}\n\nexport function ccEDPasteHandler (event) {\n const pasteData = event.clipboardData.getData(\"text\");\n event.preventDefault(pasteData);\n event.target.value = CVVFilter(pasteData);\n}\n\nexport function setupCCCVVInput (inputElement) {\n inputElement.addEventListener(\"keydown\", ccEDKeydownHandler);\n inputElement.addEventListener(\"keyup\", ccEDKeyupHandler);\n inputElement.addEventListener(\"paste\", ccEDPasteHandler);\n\n inputElement.setAttribute(\"maxlength\", CVV_MAX_LENGTH);\n inputElement.setAttribute(\"pattern\", `^[0-9]{${CVV_MIN_LENGTH},${CVV_MAX_LENGTH}}$`)\n\n return new Proxy(inputElement, {\n get (target, prop, _receiver) {\n switch (prop) {\n case \"value\":\n return CVVFilter(target.value);\n case \"_self\":\n return target;\n default:\n return Reflect.get(...arguments);\n }\n },\n set (target, prop, value, _receiver) {\n if (prop === \"value\") {\n target.value = CVVFilter(value.toString());\n } else {\n return Reflect.set(...arguments);\n }\n return true;\n }\n });\n}\n","import { vanishElement } from \"../../utils/vanish_element\";\n\nlet listeners = [];\n\nfunction addListener (listener) {\n listeners = [...listeners, listener];\n}\n\nfunction removeListener (listener) {\n listeners = listeners.filter(registeredListener => registeredListener !== listener);\n}\n\nfunction createToggleTabHandler (tabTriggersList, contentsContainerElement) {\n return function toggleTabHandler (event) {\n event.preventDefault();\n\n if (event.target.disabled) return;\n\n const contentIdToShow = this.dataset?.contentContainerId; // this uses data-content-container-id attr\n\n tabTriggersList.forEach((tabTriggerElement) => {\n tabTriggerElement.classList.toggle(\"active-tab\", this === tabTriggerElement);\n });\n\n const childrenList = Array.from(contentsContainerElement.children);\n\n childrenList.forEach((child) => {\n if (child?.classList.contains(\"mpm-tab-contents\")) {\n const isActiveTabContentsContainer = child.id === contentIdToShow;\n vanishElement(child, !isActiveTabContentsContainer);\n }\n });\n\n listeners.forEach((listener) => {\n listener(this.dataset.paymentMethod, this);\n });\n };\n}\n\nexport function setupMPMTabs (tabsContentsContainerElement) {\n const mpmButtons = Array.from(document.getElementsByClassName(\"tab-trigger\"))\n .map((element, _idx, tabTriggerList) => {\n const targetContentId = element?.dataset?.contentContainerId;\n const contentContainerElement = document.getElementById(targetContentId);\n const clickHandler = createToggleTabHandler(tabTriggerList, tabsContentsContainerElement, targetContentId);\n element.addEventListener(\"click\", clickHandler);\n return {\n clickHandler,\n element,\n contentContainerElement\n };\n });\n\n function setButtonsDisabled (state) {\n mpmButtons.forEach(({ element }) => {\n if (state) {\n element.classList.toggle(\"disabled\", true);\n element.setAttribute(\"disabled\", true);\n } else {\n element.classList.toggle(\"disabled\", false);\n element.removeAttribute(\"disabled\");\n }\n });\n }\n\n return {\n addListener,\n removeListener,\n setButtonsDisabled\n };\n};\n","import { formatterCurrency } from \"../../formatters\";\nimport { PAYMENT_TYPE } from \"../../gtm_script\";\nimport { doesNotHaveValue, isPJ, parseFetchResponse } from \"../../helper_functions\";\nimport { getDescriptiveTime } from \"../../utils/get_descriptive_time\";\nimport { addCorrId, tapAndLoadCorrId } from \"../../utils/correlation_id_store\";\n\nexport function initPix ({ showPaymentError, setLoading }) {\n const PIX_STATUS_POLLING_TIME_LIMIT = window.PM3.PIX_STATUS_POLLING_TIME_LIMIT || 1000 * 60 * 5; // 5 min in ms\n const PIX_STATUS_POLLING_INTERVAL = window.PM3.PIX_STATUS_POLLING_INTERVAL || 1000 * 5; // 5s in ms\n const PIX_EXPIRATION_UPDATE_INTERVAL = window.PM3.PIX_EXPIRATION_UPDATE_INTERVAL || 60 * 1000;\n\n function fetchTransactionStatus (clientInstantPaymentId, signal) {\n return fetch(`/client_instant_payments/${clientInstantPaymentId}`, { signal, headers: addCorrId() })\n .then(tapAndLoadCorrId)\n .then(async (response) => {\n if (response.ok) {\n const { status, error } = await response.json();\n return { status, error };\n }\n return { status: undefined, error: await response.text() };\n })\n .catch((error) => {\n return { status: undefined, error: { type: \"requestError\", error } };\n });\n }\n\n let cancelPixPaymentValidationLoop;\n let timeLeftUpdateLoop;\n\n function closeQrCodeDialog () {\n cancelPixPaymentValidationLoop?.();\n timeLeftUpdateLoop?.();\n\n const dialog = document.getElementById(\"pix-dialog\");\n\n if (dialog.open) {\n dialog.close();\n }\n\n const amountHeader = dialog.querySelector(\".amount-header\");\n const img = dialog.querySelector(\"img.qr-code-img\");\n const copyCta = dialog.querySelector(\"button.qr-code-data-copy-cta\");\n const expirationInfoSpan = dialog.querySelector(\".qr-code-expiration-info\");\n\n img.src = \"\";\n copyCta.dataset.qrCode = \"\";\n amountHeader.textContent = \"\";\n expirationInfoSpan.textContent = \"Vence em\";\n }\n\n document.getElementById(\"pix-dialog\")\n .querySelector(\".close-qr-code-cta\")\n .addEventListener(\"click\", closeQrCodeDialog);\n\n document.getElementById(\"pix-dialog\").addEventListener(\"cancel\", (event) => {\n event.preventDefault();\n closeQrCodeDialog();\n });\n\n let copiedMessageTimeoutRef;\n\n document.getElementById(\"pix-dialog\")\n .querySelector(\"button.qr-code-data-copy-cta\")\n .addEventListener(\"click\", async function handleCopyCtaClick () {\n const dialog = document.getElementById(\"pix-dialog\");\n const self = dialog.querySelector(\"button.qr-code-data-copy-cta\");\n const qrCode = self.dataset.qrCode;\n if (!navigator || !(\"clipboard\" in navigator)) {\n throw new Error(\"Failed to copy Pix QR Code, Clipboard API not available\");\n }\n if (!qrCode) {\n throw new Error(\"Tried to copy empty Pix QR Code\");\n }\n await navigator.clipboard.writeText(qrCode);\n if (copiedMessageTimeoutRef) {\n clearTimeout(copiedMessageTimeoutRef);\n }\n const label = self.querySelector(\".qr-code-data-copy-cta-label\");\n const previousText = label.textContent;\n label.textContent = \"Copiado!\";\n copiedMessageTimeoutRef = setTimeout(() => {\n if (label.textContent !== previousText) {\n label.textContent = previousText;\n }\n }, 3000);\n });\n\n function pollTransactionConfirmation (clientInstantPaymentId, expirationTime = null) {\n if (cancelPixPaymentValidationLoop) {\n cancelPixPaymentValidationLoop();\n cancelPixPaymentValidationLoop = undefined;\n }\n\n let resolveAsPending;\n\n const controller = new AbortController();\n\n let timeoutId;\n\n const promise = new Promise((resolve, reject) => {\n const expirationDelta = expirationTime ? expirationTime * 1000 : PIX_STATUS_POLLING_TIME_LIMIT;\n const timeoutLimit = Date.now() + expirationDelta;\n resolveAsPending = () => {\n resolve(\"pending\");\n };\n function executeRequest () {\n if (timeoutId) clearTimeout(timeoutId);\n timeoutId = setTimeout(async () => {\n const expired = Date.now() > timeoutLimit;\n const { status, error } = await fetchTransactionStatus(clientInstantPaymentId, controller.signal);\n if (error) {\n promise.cancel(error);\n return reject(error);\n }\n if (status !== \"pending\") {\n return resolve(status);\n }\n if (expired) {\n return resolve(\"pending\");\n }\n executeRequest();\n }, PIX_STATUS_POLLING_INTERVAL);\n }\n executeRequest();\n });\n promise.cancel = (failed) => {\n if (!failed && resolveAsPending) {\n resolveAsPending();\n }\n clearTimeout(timeoutId);\n controller.abort();\n };\n cancelPixPaymentValidationLoop = promise.cancel;\n return promise;\n }\n\n const expirationDateTimeFormatter = new Intl.DateTimeFormat([\"pt-BR\"], {\n day: \"numeric\",\n month: \"numeric\",\n hour: \"numeric\",\n minute: \"2-digit\",\n second: \"2-digit\"\n });\n\n function showQrCodeDialog (clientInstantPaymentId, amount, imgSrc, dataContents, expiresIn) {\n setLoading(true);\n showPaymentError(\"\");\n const dialog = document.getElementById(\"pix-dialog\");\n const amountHeader = dialog.querySelector(\".amount-header\");\n const img = dialog.querySelector(\"img.qr-code-img\");\n const copyCta = dialog.querySelector(\"button.qr-code-data-copy-cta\");\n const expirationInfoSpan = dialog.querySelector(\".qr-code-expiration-info\");\n\n img.src = imgSrc;\n copyCta.dataset.qrCode = dataContents;\n amountHeader.textContent = formatterCurrency.format(amount / 100);\n\n const expirationTimestamp = Date.now() + (expiresIn * 1000);\n\n function updateExpirationTime () {\n const timeLeftInMs = expirationTimestamp - Date.now();\n const expiration = expirationDateTimeFormatter.format(expirationTimestamp);\n if (timeLeftInMs < 0) {\n timeLeftUpdateLoop?.();\n expirationInfoSpan.textContent = `Venceu em ${expiration}`;\n } else {\n expirationInfoSpan.textContent = `Vence em ${expiration} (${getDescriptiveTime(timeLeftInMs / 1000, true)})`;\n }\n }\n\n if (PIX_EXPIRATION_UPDATE_INTERVAL) {\n const expirationUpdateInterval = setInterval(updateExpirationTime, PIX_EXPIRATION_UPDATE_INTERVAL);\n timeLeftUpdateLoop = () => {\n clearInterval(expirationUpdateInterval);\n timeLeftUpdateLoop = undefined;\n };\n }\n\n updateExpirationTime();\n\n dialog.showModal();\n\n setLoading(false);\n\n return pollTransactionConfirmation(clientInstantPaymentId, expiresIn * 1000);\n }\n\n return {\n showQrCodeDialog,\n closeQrCodeDialog\n };\n}\n\nexport function setupPixPayment ({\n clientForm,\n productForm,\n couponForm,\n bumpForm,\n formElements,\n formHelpers,\n showPaymentError,\n setLoading: baseSetLoading,\n gtm,\n setPaymentMethodSubmitHandler,\n onSuccess,\n onPending,\n onError\n}) {\n const setLoading = (state) => baseSetLoading(state, {\n label: formElements.submitButtonLabel,\n loading: formElements.loadingIndicator\n });\n\n const { showQrCodeDialog, closeQrCodeDialog } = initPix({ showPaymentError, setLoading });\n\n const pixTotalAmountSpans = document.querySelectorAll(\"#pix_total_amount\");\n\n let totalAmountOperators = [];\n\n function updateTotalAmount() {\n const { pixAmount } = formElements.getProductInfo({ formatted: false });\n const baseCents = (+pixAmount) * 100;\n const cents = totalAmountOperators.reduce((a, c, i, arr) => c(a, i, arr), baseCents);\n const amount = formatterCurrency.format(cents / 100);\n pixTotalAmountSpans.forEach(function updatePixTotalAmountSpans(span) {\n span.innerText = `${amount}`;\n });\n }\n\n if (couponForm && !couponForm.fixedCoupon) {\n let coupon\n function sumCouponInPixTotalAmount(value) {\n if (!coupon) return value;\n\n return coupon?.pixAmount || coupon?.pixAmount === 0 ? +coupon.pixAmount : value;\n }\n totalAmountOperators.unshift(sumCouponInPixTotalAmount);\n couponForm.addCouponChangeListener(function pixCouponChangeListener(state) {\n coupon = state;\n updateTotalAmount();\n });\n }\n\n if (bumpForm.enabled()) {\n let bumpState\n function sumBumpInPixTotalAmount(value) {\n if (!bumpState?.active) return value\n\n return value + bumpState.value\n }\n totalAmountOperators.push(sumBumpInPixTotalAmount);\n bumpForm.addChangeListener(function pixBumpChangeListener(state) {\n bumpState = state;\n updateTotalAmount();\n })\n }\n\n // Submit the form to creates payment intent\n async function createClientInstantPayment () {\n const authenticity_token = formElements.authenticityTokenElement.value;\n const product_id = productForm.getId();\n const clientInfo = clientForm.getFormData();\n const paymentInfo = formElements.getAmountAndCouponInformation();\n\n const body = {\n authenticity_token,\n provider: \"malga\",\n payment_method: \"pix\",\n product_id,\n client_payment: {\n product_id,\n installments_count: 1,\n provider: \"malga\",\n payment_type: \"pix\"\n },\n order_bump_active: bumpForm.enabled() && bumpForm.active(),\n coupons: formElements.getAmountAndCouponInformation()\n };\n\n body.client_payment = {\n ...body.client_payment,\n product_id,\n name: clientInfo.name,\n email: clientInfo.email,\n is_pj: clientInfo.is_pj,\n is_foreigner: clientInfo.is_foreigner,\n document: clientInfo.document,\n phone_number: clientInfo.phone_number,\n whatsapp_accept: clientInfo.whatsapp_accept,\n coupon_id: paymentInfo.coupon_id,\n amount_off: paymentInfo.coupon_amount_off,\n percent_off: paymentInfo.counpon_percent_off,\n discount_amount: paymentInfo.discount_amount,\n amount: paymentInfo.subtotal_amount,\n total_amount: paymentInfo.pix_amount\n };\n\n /**\n * @type {{\n * body: {\n * id: string;\n * provider: string;\n * amount: number;\n * stripe_customer: { id: string; };\n * stripe_payment_intent: { id: string, client_secret: string; };\n * }\n * }}\n */\n const clientInstantPaymentResponse = await fetch(\n \"/client_instant_payments\",\n {\n method: \"POST\",\n headers: addCorrId(new Headers({ \"Content-Type\": \"application/json\" })),\n body: JSON.stringify(body)\n }\n )\n .then(tapAndLoadCorrId)\n .then(parseFetchResponse)\n .catch((error) => {\n console.trace({ error });\n\n return null;\n });\n\n if (!clientInstantPaymentResponse) {\n setLoading(false);\n\n showPaymentError(\n \"Ocorreu um erro. Verifique os dados preenchidos e tente novamente em alguns minutos\"\n );\n\n return;\n }\n\n const {\n body: {\n id: clientInstantPaymentId,\n product_id: productId,\n product_name,\n // unit_amount: unitAmount, // exists here but not being used\n amount: totalAmount,\n // transaction_id, // exists here but not being used\n // coupon_id, // exists here but not being used\n pix\n }\n } = clientInstantPaymentResponse;\n\n if (!pix?.qrCodeData) {\n setLoading(false);\n\n showPaymentError(\n \"Ocorreu um erro. Verifique os dados preenchidos e tente novamente em alguns minutos\"\n );\n\n return;\n }\n\n const pixStatusUpdate = await showQrCodeDialog(clientInstantPaymentId, totalAmount, pix.qrCodeImageUrl, pix.qrCodeData, pix.expiresIn);\n\n if (pixStatusUpdate === \"authorized\") {\n const updateClientInstantPaymentResponse = await fetch(\n `/client_instant_payments/${clientInstantPaymentId}`,\n {\n method: \"PATCH\",\n headers: addCorrId(new Headers({ \"Content-Type\": \"application/json\" })),\n body: JSON.stringify({\n stripe_payment_intent: { status: pixStatusUpdate }\n })\n }\n )\n .then(tapAndLoadCorrId)\n .then(parseFetchResponse)\n .catch((error) => {\n console.error(\n \"Failed to update client instant payment with confirmed payment intent:\",\n error\n );\n return null;\n });\n if (\n updateClientInstantPaymentResponse === null ||\n updateClientInstantPaymentResponse.status !== 200\n ) {\n showPaymentError(\n \"Ocorreu um erro ao confirmar o pagamento. Verifique os dados e tente novamente.\"\n );\n throw new Error(\n updateClientInstantPaymentResponse?.body ??\n \"Failed to update client instant payment\"\n );\n }\n setLoading(false);\n baseSetLoading(false);\n const paymentValues = formElements.getAmountAndCouponInformation({ formatted: false });\n gtm.registerPurchaseEvent(PAYMENT_TYPE.pix, {\n coupon: paymentInfo.coupon_id,\n discount: paymentValues.subtotal_amount - paymentValues.pix_amount,\n transactionId: clientInstantPaymentId,\n productId,\n productName: product_name,\n price: Number(totalAmount) / 100,\n fullName: clientInfo.name,\n email: clientInfo.email,\n phone: clientInfo.phone_number\n });\n onSuccess();\n } else if ([\"pre_authorized\", \"pending\"].includes(pixStatusUpdate)) {\n setLoading(false);\n baseSetLoading(false);\n onPending();\n } else {\n baseSetLoading(false);\n setLoading(false);\n closeQrCodeDialog();\n onError();\n }\n };\n\n function handlePixChargeSubmission (_event) {\n const clientInfo = clientForm.getFormData();\n showPaymentError(\"\");\n\n if (!formHelpers.cpfCnpjValidator()) {\n showPaymentError(`${isPJ(clientForm.inputs.clientType.value) ? \"CNPJ\" : \"CPF\"} inválido`);\n return;\n }\n\n if (\n clientForm.isClientPj() &&\n doesNotHaveValue(clientForm.inputs.stateRegistrationInput) &&\n doesNotHaveValue(clientForm.inputs.municipalRegistrationInput)\n ) {\n if (formElements.stateRegistrationAlertMessageElement) {\n formElements.stateRegistrationAlertMessageElement.className = \"\";\n formElements.stateRegistrationAlertMessageElement.style =\n \"color:#FF5757; font-weight:600;\";\n }\n showPaymentError(\"Verifique as informações inseridas\");\n return;\n }\n\n if (formElements.stateRegistrationAlertMessageElement) {\n formElements.stateRegistrationAlertMessageElement.className = \"hidden\";\n }\n baseSetLoading(true);\n setLoading(true);\n\n const productInfo = formElements.getProductInfo({ formatted: false });\n const paymentValues = formElements.getAmountAndCouponInformation({ formatted: false });\n\n gtm.registerCheckoutOptionEvent(PAYMENT_TYPE.pix, {\n price: paymentValues.pix_amount,\n discount: paymentValues.subtotal_amount - paymentValues.pix_amount,\n coupon: paymentValues.coupon_id,\n productName: productInfo.productName,\n productId: productInfo.productId,\n fullName: clientInfo.name,\n email: clientInfo.email,\n phone: clientInfo.phone_number\n });\n\n createClientInstantPayment()\n .catch((error) => {\n showPaymentError(error.message);\n baseSetLoading(false);\n setLoading(false);\n console.error(\n \"Failed to create payment method\",\n error.message,\n error?.stack ?? error\n );\n });\n };\n\n setPaymentMethodSubmitHandler(\"pix\", handlePixChargeSubmission);\n}\n","import { isPJ } from \"../../../helper_functions\";\nimport { vanishElement } from \"../../vanish_element\";\n\nexport function setupClientForm (formHelpersInstance) {\n // Defines PF or PJ from backend\n const clientTypeInput = document.getElementById(\"client_payment_client_type\");\n\n // form\n const formElement = document.getElementById(\"client_payment_form\");\n const nameInput = document.getElementById(\"client_payment_name\");\n const emailInput = document.getElementById(\"client_payment_email\");\n const documentInput = document.getElementById(\"client_payment_document\");\n const isForeignerInput = document.getElementById(\"is_foreigner\");\n const phoneNumberInput = document.getElementById(\n \"client_payment_phone_number\"\n );\n const whatsappAcceptElement = document.getElementById(\"whatsapp_checkbox\");\n // CNPJ registration\n const stateRegistrationInput = formElement.querySelector(\n \"input#client_payment_state_registration\"\n );\n const municipalRegistrationInput = formElement.querySelector(\n \"input#client_payment_municipal_registration\"\n );\n\n const clientCreatedAtHiddenInput = document.getElementById(\"client_created_at\");\n\n function isClientPj () {\n return isPJ(clientTypeInput.value);\n }\n\n return {\n isClientPj,\n getClientInformation () {\n return {\n client_name: nameInput.value,\n client_email: emailInput.value,\n client_document: documentInput.value,\n client_phone_number: phoneNumberInput.value,\n client_created_at: clientCreatedAtHiddenInput.value,\n client_whatsapp_accept: whatsappAcceptElement.checked,\n client_state_registration: stateRegistrationInput?.value.trim() ?? \"\",\n client_municipal_registration: municipalRegistrationInput?.value.trim() ?? \"\"\n };\n },\n getFormData () {\n const pj = isClientPj();\n const base = {\n name: nameInput.value,\n email: emailInput.value,\n is_pj: pj,\n is_foreigner: false,\n document: documentInput.value,\n phone_number: phoneNumberInput.value,\n whatsapp_accept: whatsappAcceptElement.checked,\n created_at: clientCreatedAtHiddenInput.value\n };\n\n return pj\n ? {\n ...base,\n state_registration: stateRegistrationInput.value,\n municipalRegistrationInput: municipalRegistrationInput.value\n }\n : {\n ...base,\n is_foreigner: isForeignerInput?.checked\n };\n },\n setPersonalDocumentRequired (isRequired = false) {\n if (isClientPj()) {\n return;\n }\n vanishElement(isForeignerInput.parentElement, isRequired);\n // Nupay Requires CPF (Nupay is not available for PJ)\n const label = document.querySelector(\"label[for=client_payment_document]\");\n const error = document.querySelector(\"#document_validation\");\n if (isRequired) {\n documentInput.setAttribute(\"required\", true);\n label.classList.add(\"required\");\n label.querySelector(\"small\").classList.add(\"inline-zero-width\");\n } else {\n documentInput.removeAttribute(\"required\");\n label.classList.remove(\"required\");\n label.querySelector(\"small\").classList.remove(\"inline-zero-width\");\n error.classList.add(\"hidden\");\n }\n },\n setPersonalPhoneNumberRequired (isRequired = false) {\n if (isClientPj()) {\n return;\n }\n const label = document.querySelector(`label[for=\"${phoneNumberInput.id}\"]`);\n if (isRequired) {\n phoneNumberInput.setAttribute(\"required\", true);\n label.classList.add(\"required\");\n label.querySelector(\"small\").classList.add(\"inline-zero-width\");\n } else {\n phoneNumberInput.removeAttribute(\"required\");\n label.classList.remove(\"required\");\n label.querySelector(\"small\").classList.remove(\"inline-zero-width\");\n }\n },\n inputs: {\n clientTypeInput,\n nameInput,\n emailInput,\n documentInput,\n isForeignerInput,\n phoneNumberInput,\n whatsappAcceptElement,\n stateRegistrationInput,\n municipalRegistrationInput\n }\n };\n}\n","import { getValueWithoutFormat } from \"../../../formatters\";\n\nexport function setupProductForm () {\n // Product details\n const idHiddenInput = document.getElementById(\"product_id\");\n const nameHiddenInput = document.getElementById(\"product_name\");\n const unitAmountHiddenInput = document.getElementById(\"unit-amount\") || document.getElementById(\"payment-total\");\n const providerHiddenInput = document.getElementById(\"provider\");\n\n return {\n getId () {\n return idHiddenInput.value;\n },\n getName () {\n return nameHiddenInput.value;\n },\n getProvider () {\n return providerHiddenInput.value;\n },\n getUnitAmountValue (formatted = false) {\n return formatted\n ? unitAmountHiddenInput\n : getValueWithoutFormat(unitAmountHiddenInput?.innerText) / 100;\n },\n inputs: {\n idHiddenInput,\n nameHiddenInput,\n unitAmountHiddenInput\n }\n };\n}\n","import { formatterCurrency } from \"../../formatters\";\nimport { PAYMENT_TYPE } from \"../../gtm_script\";\nimport { doesNotHaveValue, isPJ, parseFetchResponse } from \"../../helper_functions\";\nimport { addCorrId, tapAndLoadCorrId } from \"../../utils/correlation_id_store\";\n\nconst NUPAY_STATUS_POLLING_TIME_LIMIT = 1000 * 60 * 5; // 5 min in ms\nconst NUPAY_STATUS_POLLING_INTERVAL = 1000 * 5; // 5s in ms\n\nexport function initNupay ({ setLoading, showPaymentError }) {\n function fetchTransactionStatus (clientInstantPaymentId, signal) {\n return fetch(`/client_instant_payments/${clientInstantPaymentId}`, { signal, headers: addCorrId() })\n .then(tapAndLoadCorrId)\n .then(async (response) => {\n if (response.ok) {\n const { status, error } = await response.json();\n return { status, error };\n }\n return { status: undefined, error: await response.text() };\n })\n .catch((error) => {\n return { status: undefined, error: { type: \"requestError\", error } };\n });\n }\n\n let cancelPaymentValidationLoop;\n\n function closeDialog () {\n if (cancelPaymentValidationLoop) {\n cancelPaymentValidationLoop();\n }\n\n const dialog = document.getElementById(\"nupay-dialog\");\n\n dialog.close();\n }\n\n document.getElementById(\"nupay-dialog\")\n .querySelector(\"button.close-dialog\")\n .addEventListener(\"click\", closeDialog);\n\n document.getElementById(\"nupay-dialog\").addEventListener(\"cancel\", (event) => {\n event.preventDefault();\n closeDialog();\n });\n\n function pollTransactionConfirmation (clientInstantPaymentId, expirationTime = null) {\n if (cancelPaymentValidationLoop) {\n cancelPaymentValidationLoop();\n cancelPaymentValidationLoop = undefined;\n }\n\n let resolveAsPending;\n\n const controller = new AbortController();\n\n let timeoutId;\n\n const promise = new Promise((resolve, reject) => {\n const expirationDelta = expirationTime ? expirationTime * 1000 : NUPAY_STATUS_POLLING_TIME_LIMIT;\n const timeoutLimit = Date.now() + expirationDelta;\n resolveAsPending = () => {\n resolve(\"pending\");\n };\n function executeRequest () {\n if (timeoutId) clearTimeout(timeoutId);\n timeoutId = setTimeout(async () => {\n const expired = Date.now() > timeoutLimit;\n const { status, error } = await fetchTransactionStatus(clientInstantPaymentId, controller.signal);\n if (error) {\n promise.cancel(error);\n return reject(error);\n }\n if (status !== \"pending\") {\n return resolve(status);\n }\n if (expired) {\n return resolve(\"pending\");\n }\n executeRequest();\n }, NUPAY_STATUS_POLLING_INTERVAL);\n }\n executeRequest();\n });\n promise.cancel = (failed) => {\n if (!failed && resolveAsPending) {\n resolveAsPending();\n }\n clearTimeout(timeoutId);\n controller.abort();\n };\n cancelPaymentValidationLoop = promise.cancel;\n return promise;\n }\n\n function showDialog (clientInstantPaymentId, expiresIn) {\n setLoading(true);\n showPaymentError(\"\");\n\n const dialog = document.getElementById(\"nupay-dialog\");\n\n dialog.showModal();\n\n return pollTransactionConfirmation(clientInstantPaymentId, expiresIn * 1000);\n }\n\n return {\n showDialog,\n closeDialog\n };\n}\n\nexport function setupNupayPayment ({\n clientForm,\n productForm,\n couponForm,\n bumpForm,\n formElements,\n formHelpers,\n showPaymentError,\n setLoading: baseSetLoading,\n gtm,\n setPaymentMethodSubmitHandler,\n onSuccess,\n onPending,\n onError\n}) {\n const setLoading = (state) => baseSetLoading(state, {\n label: formElements.submitButtonLabel,\n loading: formElements.loadingIndicator\n });\n\n const { showDialog, closeDialog } = initNupay({ setLoading, showPaymentError });\n\n const nupayTotalAmountSpan = document.getElementById(\"nupay_total_amount\");\n\n let totalAmountOperators = [];\n\n function updateTotalAmount() {\n const { unitAmount } = formElements.getProductInfo({ formatted: false });\n const baseCents = (+unitAmount) * 100;\n const cents = totalAmountOperators.reduce((a, c, i, arr) => c(a, i, arr), baseCents);\n const amount = formatterCurrency.format(cents / 100);\n nupayTotalAmountSpan.innerText = `Valor ${amount} em até 24x`;\n }\n\n if (couponForm && !couponForm.fixedCoupon) {\n let coupon\n function sumCouponInNupayTotalAmount(value) {\n if (!coupon) return value\n\n return coupon?.discountedAmount ? +coupon.discountedAmount : value;\n }\n totalAmountOperators.unshift(sumCouponInNupayTotalAmount)\n couponForm.addCouponChangeListener((state) => {\n coupon = state;\n updateTotalAmount();\n });\n }\n\n if (bumpForm.enabled()) {\n let bumpState\n function sumBumpInNupayTotalAmount(value) {\n if (!bumpState?.active) return value\n\n return value + bumpState.value\n }\n totalAmountOperators.push(sumBumpInNupayTotalAmount);\n bumpForm.addChangeListener(function nupayBumpChangeListener(state) {\n bumpState = state;\n updateTotalAmount();\n })\n }\n\n // Submit the form to creates payment intent\n async function createClientInstantPayment () {\n const authenticity_token = formElements.authenticityTokenElement.value;\n const product_id = productForm.getId();\n const clientInfo = clientForm.getFormData();\n const paymentInfo = formElements.getAmountAndCouponInformation();\n\n const body = {\n authenticity_token,\n provider: \"malga\",\n payment_method: \"nupay\",\n product_id,\n client_payment: {\n product_id,\n installments_count: 1,\n provider: \"malga\",\n payment_type: \"nupay\"\n },\n order_bump_active: bumpForm.enabled() && bumpForm.active(),\n coupons: formElements.getAmountAndCouponInformation()\n };\n\n body.client_payment = {\n ...body.client_payment,\n product_id,\n name: clientInfo.name,\n email: clientInfo.email,\n is_pj: clientInfo.is_pj,\n is_foreigner: clientInfo.is_foreigner,\n document: clientInfo.document,\n phone_number: clientInfo.phone_number,\n whatsapp_accept: clientInfo.whatsapp_accept,\n coupon_id: paymentInfo.coupon_id,\n amount_off: paymentInfo.coupon_amount_off,\n percent_off: paymentInfo.counpon_percent_off,\n discount_amount: paymentInfo.discount_amount,\n amount: paymentInfo.subtotal_amount,\n total_amount: paymentInfo.total_amount\n };\n\n /**\n * @type {{\n * body: {\n * id: string;\n * provider: string;\n * amount: number;\n * stripe_customer: { id: string; };\n * stripe_payment_intent: { id: string, client_secret: string; };\n * }\n * }}\n */\n const clientInstantPaymentResponse = await fetch(\n \"/client_instant_payments\",\n {\n method: \"POST\",\n headers: addCorrId(new Headers({ \"Content-Type\": \"application/json\" })),\n body: JSON.stringify(body)\n }\n )\n .then(tapAndLoadCorrId)\n .then(parseFetchResponse)\n .catch((error) => {\n console.trace({ error });\n\n return null;\n });\n\n if (!clientInstantPaymentResponse) {\n setLoading(false);\n\n showPaymentError(\n \"Ocorreu um erro. Verifique os dados preenchidos e tente novamente em alguns minutos\"\n );\n\n return;\n }\n\n const {\n body: {\n id: clientInstantPaymentId,\n product_id: productId,\n product_name,\n // unit_amount: unitAmount, // exists here but not being used\n amount: totalAmount,\n // transaction_id, // exists here but not being used\n // coupon_id, // exists here but not being used\n }\n } = clientInstantPaymentResponse;\n\n const pixStatusUpdate = await showDialog(clientInstantPaymentId);\n\n if (pixStatusUpdate === \"authorized\") {\n const updateClientInstantPaymentResponse = await fetch(\n `/client_instant_payments/${clientInstantPaymentId}`,\n {\n method: \"PATCH\",\n headers: addCorrId(new Headers({ \"Content-Type\": \"application/json\" })),\n body: JSON.stringify({\n stripe_payment_intent: { status: pixStatusUpdate }\n })\n }\n )\n .then(tapAndLoadCorrId)\n .then(parseFetchResponse)\n .catch((error) => {\n console.error(\n \"Failed to update client instant payment with confirmed payment intent:\",\n error\n );\n return null;\n });\n if (\n updateClientInstantPaymentResponse === null ||\n updateClientInstantPaymentResponse.status !== 200\n ) {\n showPaymentError(\n \"Ocorreu um erro ao confirmar o pagamento. Verifique os dados e tente novamente.\"\n );\n throw new Error(\n updateClientInstantPaymentResponse?.body ??\n \"Failed to update client instant payment\"\n );\n }\n setLoading(false);\n baseSetLoading(false);\n await gtm.registerPurchaseEvent(PAYMENT_TYPE.nupay, {\n coupon: paymentInfo.coupon_id,\n discount: paymentInfo.discount_amount,\n transactionId: clientInstantPaymentId,\n productId,\n productName: product_name,\n price: Number(totalAmount) / 100\n });\n onSuccess();\n } else if ([\"pre_authorized\", \"pending\"].includes(pixStatusUpdate)) {\n setLoading(false);\n baseSetLoading(false);\n onPending();\n } else {\n baseSetLoading(false);\n setLoading(false);\n closeDialog();\n onError();\n }\n };\n\n function handleNupayChargeSubmission (_event) {\n showPaymentError(\"\");\n\n if (!formHelpers.cpfCnpjValidator()) {\n showPaymentError(`${isPJ(clientForm.inputs.clientType.value) ? \"CNPJ\" : \"CPF\"} inválido`);\n return;\n }\n\n if (\n clientForm.isClientPj() &&\n doesNotHaveValue(clientForm.inputs.stateRegistrationInput) &&\n doesNotHaveValue(clientForm.inputs.municipalRegistrationInput)\n ) {\n if (formElements.stateRegistrationAlertMessageElement) {\n formElements.stateRegistrationAlertMessageElement.className = \"\";\n formElements.stateRegistrationAlertMessageElement.style =\n \"color:#FF5757; font-weight:600;\";\n }\n showPaymentError(\"Verifique as informações inseridas\");\n return;\n }\n\n if (formElements.stateRegistrationAlertMessageElement) {\n formElements.stateRegistrationAlertMessageElement.className = \"hidden\";\n }\n baseSetLoading(true);\n setLoading(true);\n\n const productInfo = formElements.getProductInfo({ formatted: false });\n const paymentValues = formElements.getAmountAndCouponInformation({ formatted: false });\n\n gtm.registerCheckoutOptionEvent(PAYMENT_TYPE.nupay, {\n price: paymentValues.total_amount,\n discount: paymentValues.discount_amount,\n coupon: paymentValues.coupon_id,\n productName: productInfo.productName,\n productId: productInfo.productId\n });\n\n createClientInstantPayment()\n .catch((error) => {\n showPaymentError(error.message);\n baseSetLoading(false);\n setLoading(false);\n console.error(\n \"Failed to create payment method\",\n error.message,\n error?.stack ?? error\n );\n });\n };\n\n setPaymentMethodSubmitHandler(\"nupay\", handleNupayChargeSubmission);\n}\n","/** globals grecaptcha */\nexport async function useRecaptcha(action = 'submit') {\n return new Promise((resolve, reject) => {\n try {\n grecaptcha.ready(function() {\n grecaptcha.execute(window.PM3.GRCSK, { action })\n .then(resolve)\n .catch(reject);\n });\n } catch (err) {\n reject(err);\n }\n });\n}\n","import { GtmFactory, CHECKOUT_STEP, PAYMENT_TYPE } from \"./gtm_script\";\nimport { addCorrId, tapAndLoadCorrId } from './utils/correlation_id_store';\nimport {\n getFormattedCurrencyValueFromEl,\n getValueWithoutFormat,\n formatterCurrency,\n getLowerCaseInputValue\n} from \"./formatters\";\nimport {\n isPJ,\n doesNotHaveValue,\n parseFetchResponse,\n checkoutCustomerFormHelpers,\n disableSubmitButtonElement,\n setElementHiddenClass,\n disableRequiredInputField\n} from \"./helper_functions\";\nimport { couponFormFactory } from \"./coupon_form_factory\";\nimport { webhook } from \"./webhook_service\";\nimport { debounced } from \"./debounced\";\nimport { setupCreditCardNumberInput } from \"./utils/form/payment/cc_number\";\nimport { setupCCExpirationDateInput } from \"./utils/form/payment/cc_expiration_date\";\nimport { setupCCCVVInput } from \"./utils/form/payment/cc_cvv\";\nimport { setupMPMTabs } from \"./payments/malga/mpm_tabs\";\nimport { setupPixPayment } from \"./payments/malga/pix\";\nimport { setupClientForm } from \"./utils/form/client/client_form\";\nimport { setupProductForm } from \"./utils/form/product/product_form\";\nimport { setupNupayPayment } from \"./payments/malga/nupay\";\nimport { getPaymentInfoHelpers } from \"./utils/form/payment/payment_form\";\nimport { useRecaptcha } from \"./utils/recaptcha_wrapper\";\n\nexport async function setupMalgaPayment(MPMInstance) {\n let paymentIntentId = null;\n\n // eslint-disable-next-line eqeqeq\n const tokenize_cvv = document.getElementsByName(\"save_card\").item(0)?.value == \"true\";\n\n // Product details\n const productIdHiddenInput = document.getElementById(\"product_id\");\n const productNameHiddenInput = document.getElementById(\"product_name\");\n const productUnitAmountHiddenInput = document.getElementById(\"unit-amount\") || document.getElementById(\"payment-total\");\n\n // Defines PF or PJ from backend\n const formClientType = document.getElementById(\"client_payment_client_type\");\n const pjMode = isPJ(formClientType.value);\n\n // form\n const formElement = document.getElementById(\"client_payment_form\");\n const formNameInput = document.getElementById(\"client_payment_name\");\n const formEmailInput = document.getElementById(\"client_payment_email\");\n const formDocumentInput = document.getElementById(\"client_payment_document\");\n const isForeignerInput = document.getElementById(\"is_foreigner\");\n const formPhoneNumberInput = document.getElementById(\"client_payment_phone_number\");\n const whatsappAcceptElement = document.getElementById(\"whatsapp_checkbox\");\n // CNPJ registration\n const stateRegistrationInput = formElement.querySelector(\"input#client_payment_state_registration\");\n const municipalRegistrationInput = formElement.querySelector(\"input#client_payment_municipal_registration\");\n\n const productProviderHiddenInput = document.getElementById(\"provider\");\n // const clientCreatedAtHiddenInput = document.getElementById(\"client_created_at\");\n const formCouponIdHiddenInput = document.getElementById(\"client_payment_coupon_id\");\n const formAmountOffHiddenInput = document.getElementById(\"client_payment_amount_off\");\n const formPercentOffHiddenInput = document.getElementById(\"client_payment_percent_off\");\n const formDiscountAmountHiddenInput = document.getElementById(\"client_payment_discount_amount\");\n const formAmountHiddenInput = document.getElementById(\"client_payment_amount\");\n const formTotalAmountHiddenInput = document.getElementById(\"client_payment_total_amount\");\n const formPixAmountHiddenInput = document.getElementById(\"client_payment_pix_amount\");\n const formTotalPixAmountHiddenInput = document.getElementById(\"client_payment_total_pix_amount\");\n const formCountInstallmentsHiddenInput = document.getElementById(\"client_payment_installments_count\");\n const formFixedInstallmentHiddenInput = document.getElementById(\"client_payment_fixed_installments\");\n\n const stateRegistrationAlertMessageElement = document.querySelector(\"#error_registration\");\n const formDocumentAlertMessageSpan = document.querySelector(\"#document_validation\");\n\n // UI Form elements\n const whatsappLabelElement = document.getElementById(\"whatsapp_label\");\n const documentLabelElement = document.getElementById(\"document_label\");\n const showInstallmentsSpan = document.getElementById(\"show-installments\");\n\n /** @type {HTMLFormElement} */\n const paymentInputsForm = document.getElementById(\"payment-input-form\");\n\n /** @type {HTMLButtonElement} */\n const submitButtonElement = document.querySelector(\"#submit\");\n\n /** @type {HTMLDivElement} */\n const buttonLoadingSpinner = submitButtonElement.querySelector(\"#pay-now-button-spinner\");\n /** @type {HTMLSpanElement} */\n const payNowButtonLabel = submitButtonElement.querySelector(\"#pay-now-button-label\");\n\n const formHelpers = checkoutCustomerFormHelpers({\n alertMessageDocumentElement: formDocumentAlertMessageSpan,\n documentLabelElement,\n formDocumentElement: formDocumentInput,\n formPhoneNumberElement: formPhoneNumberInput,\n formClientType,\n isForeignerElement: isForeignerInput,\n submitButtonElement,\n whatsappAcceptElement,\n whatsappLabelElement\n });\n\n const clientForm = setupClientForm(formHelpers);\n\n /** @type {HTMLOptionElement[]} */\n const installmentsOptionsElements = Array.from(\n document.querySelectorAll(\n \"form#client_payment_form select[name=\\\"client_payment[installments_count]\\\"] > option\"\n )\n );\n\n const bumpForm = {\n listeners: [],\n getActiveEl() {\n return document.getElementById(\"order-bump-active\");\n },\n getValueEl() {\n return document.getElementById(\"order-bump-value\");\n },\n enabled() {\n return Boolean(this.getActiveEl() && this.getValueEl());\n },\n active() {\n const el = this.getActiveEl();\n return Boolean(el?.checked || false);\n },\n getValue() {\n const el = this.getValueEl();\n const value = Number(el?.value);\n return Number.isNaN(value) || !value || value < 0 ? 0 : value;\n },\n triggerChange() {\n const state = {\n active: this.active(),\n activeEl: this.getActiveEl(),\n value: this.getValue(),\n };\n this.listeners.forEach((listener) => listener(state));\n },\n addChangeListener(listener) {\n if (!this.listeners.includes(listener)) {\n this.listeners.push(listener);\n }\n }\n }\n\n bumpForm.getActiveEl()?.addEventListener(\"change\", function bumpOrderActiveHandler () {\n bumpForm.triggerChange();\n });\n\n // Coupon Form init\n const couponElements = window.coupon_accepted && {\n formAmountHiddenInput,\n couponInput: document.getElementById(\"coupon_id\"),\n discountAmountSpan: document.getElementById(\"discount-amount\"),\n paymentTotalSpan: document.getElementById(\"payment-total\"),\n clearCouponButton: document.getElementById(\"clear_coupon\"),\n errorSpanContainer: document.getElementById(\"coupon-container\")?.parentElement,\n submitCouponButton: document.getElementById(\"submit_coupon\"),\n pixTotalAmountSpan: document.getElementById(\"pix_total_amount\"),\n emailInput: formEmailInput,\n submitFormButton: submitButtonElement\n };\n\n const couponForm = window.coupon_accepted && couponFormFactory({\n elements: couponElements,\n productId: productIdHiddenInput.value\n });\n\n /**\n * Update installments options or span\n *\n * @param {string} amount numeric value\n * @param {boolean} [fixedInstallments=false] flag\n */\n const updateInstallments = (amount, fixedInstallments = false) => {\n if (fixedInstallments) {\n // operates over single span element\n const numericValue = Number(formCountInstallmentsHiddenInput.value);\n const formattedInstallmentValue = formatterCurrency.format(\n Number(amount) / numericValue\n );\n showInstallmentsSpan.innerText = `${numericValue}x ${formattedInstallmentValue} sem juros`;\n } else {\n // operate over options elements\n installmentsOptionsElements.forEach(function (item) {\n const numericValue = Number(item.value);\n const formattedInstallmentValue = formatterCurrency.format(\n Number(amount) / numericValue\n );\n item.innerText = `${numericValue}x ${formattedInstallmentValue} sem juros`;\n });\n }\n };\n\n if (window.coupon_accepted) {\n let timeoutRef = null;\n if (couponForm && !couponForm.fixedCoupon) {\n if (couponForm) {\n /**\n * Handles changes in coupon values\n *\n * @param {{\n * amount: string\n * amountOff: number\n * coupon: string\n * discountAmount: number\n * discountedAmount: number\n * formattedDiscount: string\n * formattedDiscountedAmount: string\n * percentOff: string\n * pixAmount: number\n * } | null} coupon\n * @param {boolean=} clear\n */\n const couponChangeHandler = (coupon, clear = false) => {\n const bumpValue = bumpForm.active() ? bumpForm.getValue() : 0;\n const rawOriginalAmount = (Number(formAmountHiddenInput.value) + bumpValue) / 100;\n const originalAmount = formatterCurrency.format(rawOriginalAmount);\n\n if (clear) {\n formCouponIdHiddenInput.value = \"\";\n formTotalAmountHiddenInput.value = formAmountHiddenInput.value;\n formTotalPixAmountHiddenInput.value = formPixAmountHiddenInput.value;\n formDiscountAmountHiddenInput.value = \"\";\n formAmountOffHiddenInput.value = \"\";\n formPercentOffHiddenInput.value = \"\";\n\n couponElements.paymentTotalSpan.innerText = originalAmount;\n couponElements.discountAmountSpan.innerText = \"\";\n\n updateInstallments(rawOriginalAmount, formFixedInstallmentHiddenInput?.value === \"true\");\n return;\n } else if (coupon === null && formCouponIdHiddenInput.value) {\n if (timeoutRef !== null) {\n clearTimeout(timeoutRef);\n }\n timeoutRef = setTimeout(() => {\n couponForm.removeErrorSpan();\n }, 3000);\n return;\n } else if (coupon === null) {\n couponForm.appendErrorSpan();\n return;\n }\n\n couponForm.removeErrorSpan();\n\n formAmountOffHiddenInput.value = coupon.amountOff;\n formCouponIdHiddenInput.value = coupon.coupon;\n formDiscountAmountHiddenInput.value = coupon.discountAmount;\n formTotalAmountHiddenInput.value = coupon.discountedAmount;\n formPercentOffHiddenInput.value = coupon.percentOff;\n formTotalPixAmountHiddenInput.value = coupon.pixAmount;\n\n couponElements.paymentTotalSpan.innerText = bumpValue\n ? formatterCurrency.format((coupon.discountedAmount + bumpValue) / 100)\n : coupon.formattedDiscountedAmount;\n couponElements.discountAmountSpan.innerText = coupon.formattedDiscount;\n\n updateInstallments(\n (coupon.discountedAmount + bumpValue) / 100,\n formFixedInstallmentHiddenInput?.value === \"true\",\n );\n };\n couponForm.addCouponChangeListener(couponChangeHandler);\n }\n }\n }\n // END of Coupon Form\n\n if (bumpForm.getActiveEl()) {\n const paymentTotalSpan = document.getElementById(\"payment-total\");\n bumpForm.addChangeListener(function orderBumpCardTotalListener({ active, value }) {\n const bumpValue = active ? value : 0;\n const totalWithoutBump = Number(formTotalAmountHiddenInput.value);\n const totalWithBump = (totalWithoutBump + bumpValue) / 100;\n\n paymentTotalSpan.innerText = formatterCurrency.format(totalWithBump);\n updateInstallments(totalWithBump, formFixedInstallmentHiddenInput?.value === \"true\");\n });\n }\n\n /**\n * Show a spinner on payment submission\n *\n * @param {boolean} isLoading\n */\n const setLoading = function (isLoading) {\n // Disable the button and show the spinner\n disableSubmitButtonElement(submitButtonElement, isLoading);\n MPMInstance?.setButtonsDisabled(isLoading);\n\n setElementHiddenClass(buttonLoadingSpinner, !isLoading);\n setElementHiddenClass(payNowButtonLabel, isLoading);\n };\n\n // Show the customer the error from Stripe if their card fails to charge\n const showPaymentError = function (errorMsgText) {\n setLoading(false);\n const errorMsg = document.querySelector(\"#card-error\");\n errorMsg.textContent = errorMsgText;\n };\n\n function sendCardErrorToWebhook(errorCode, error) {\n webhook.sendPost(\"/webhooks\", {\n error_level: \"tokenization\",\n error_code: errorCode,\n error_contents: error.toString(),\n payment_intent_id: paymentIntentId,\n product_name: productNameHiddenInput.value,\n product_id: productIdHiddenInput.value,\n coupon_id: couponElements?.couponInput?.value\n }, {\n \"Content-Type\": \"application/json\",\n \"X-Payment-Error\": \"tokenization\"\n });\n }\n\n // Get payment information from form\n const getPaymentInformation = () => ({\n coupon_amount_off: getFormattedCurrencyValueFromEl(formAmountOffHiddenInput),\n discount_amount: getFormattedCurrencyValueFromEl(formDiscountAmountHiddenInput),\n subtotal_amount: productUnitAmountHiddenInput?.innerText,\n total_amount: getFormattedCurrencyValueFromEl(formTotalAmountHiddenInput),\n amount: getFormattedCurrencyValueFromEl(formAmountHiddenInput),\n coupon_id: formCouponIdHiddenInput.value,\n coupon_percent_off: formPercentOffHiddenInput.value,\n provider: productProviderHiddenInput.value,\n product_name: productNameHiddenInput.value,\n product_id: productIdHiddenInput.value,\n installments_count: formCountInstallmentsHiddenInput.value\n });\n\n // Get client payment information from form\n const getClientPaymentFormData = (paymentMethodId, cvvToken) => ({\n name: formNameInput.value,\n email: formEmailInput.value,\n document: formDocumentInput.value,\n phone_number: formPhoneNumberInput.value,\n coupon_id: formCouponIdHiddenInput.value,\n amount_off: formAmountOffHiddenInput.value,\n percent_off: formPercentOffHiddenInput.value,\n discount_amount: formDiscountAmountHiddenInput.value,\n amount: (getValueWithoutFormat(formAmountHiddenInput.value) / 100.0).toFixed(2),\n total_amount: (getValueWithoutFormat(formTotalAmountHiddenInput.value) / 100.0).toFixed(2),\n product_id: productIdHiddenInput.value,\n whatsapp_accept: whatsappAcceptElement.checked,\n installments_count: formCountInstallmentsHiddenInput.value,\n payment_method_id: cvvToken ? `${paymentMethodId}:${cvvToken}` : paymentMethodId,\n payment_intent_id: paymentIntentId,\n is_foreigner: isForeignerInput?.checked,\n provider: productProviderHiddenInput.value,\n is_pj: formHelpers.pjMode,\n });\n\n const productForm = setupProductForm();\n\n const paymentHelpers = getPaymentInfoHelpers();\n\n const gtm = GtmFactory();\n gtm.sendBeginCheckout({\n productId: productIdHiddenInput.value,\n productName: productNameHiddenInput.value,\n price: formTotalAmountHiddenInput.value / 100,\n coupon: formCouponIdHiddenInput.value,\n discount: formDiscountAmountHiddenInput.value / 100,\n fullName: formNameInput.value,\n email: formEmailInput.value,\n phone: formPhoneNumberInput.value\n });\n\n /**\n * Builds Payment inputs inside a given form HTML element\n * @param {HTMLFormElement} form to build the inputs inside\n * @returns {Object} object with data getters and validators\n */\n function setupCreditCardForm() {\n const creditCardNumberInput = document.querySelector(\"#payment-input-form .credit-card-number-input\");\n const expirationDateInput = document.querySelector(\"#payment-input-form .credit-card-expiration-date-input\");\n const cvvInput = document.querySelector(\"#payment-input-form .credit-card-cvv-input\");\n\n const creditCardNumber = setupCreditCardNumberInput(creditCardNumberInput);\n const expirationDate = setupCCExpirationDateInput(expirationDateInput);\n const cvv = setupCCCVVInput(cvvInput);\n\n window.PM3.fillPaymentFormWithValidSandboxCreditCard = () => {\n creditCardNumber.value = \"4019598346009339\";\n expirationDate.value = \"12/\" + (new Date().getFullYear() + 1);\n cvv.value = \"120\";\n };\n\n return {\n creditCardNumber,\n expirationDate,\n cvv\n };\n }\n\n const creditCardForm = setupCreditCardForm(paymentInputsForm);\n\n /**\n * Sets inputs blur event to send partial filled form data to backend as a paymentIntent\n */\n const createPaymentIntentOnDB = async () => {\n if (formEmailInput.value.trim().length) {\n const url = window.PM3.paymentIntentsPath;\n const body = {\n payment_intent: {\n id: paymentIntentId,\n name: formNameInput.value,\n email: getLowerCaseInputValue(formEmailInput),\n product_name: productNameHiddenInput.value,\n product_id: productIdHiddenInput.value,\n total_amount: formTotalAmountHiddenInput.value,\n phone_number: formPhoneNumberInput.value\n }\n };\n const response = await webhook.sendPost(url, body);\n if (response.ok) {\n paymentIntentId = response.body.payment_intent.id;\n }\n }\n };\n\n // Sets email field to trigger a Create Payment Intent on lost of focus\n formEmailInput.addEventListener(\"blur\", () => {\n if (formEmailInput.value.trim().length) createPaymentIntentOnDB();\n });\n\n // Sets phone number field to trigger a Create Payment Intent on lost of focus\n formPhoneNumberInput.addEventListener(\"blur\", () => {\n if (formPhoneNumberInput.value.trim().length) createPaymentIntentOnDB();\n });\n\n // Shows a success message when the payment is complete and redirect\n const showOrderCompleteAndRedirect = () => {\n showPaymentError(\"\");\n const redirectURL = document.getElementById(\"typ_url\").value;\n const spinnerLoading = document.getElementById(\"spinner-loading\");\n\n disableSubmitButtonElement(submitButtonElement);\n\n setTimeout(() => {\n window.parent.location.replace(redirectURL);\n }, 2000);\n\n spinnerLoading.classList.remove(\"hidden\");\n payNowButtonLabel.innerText = \"Pagamento feito com sucesso!\";\n };\n\n /**\n * Submit the form to creates payment intent\n *\n * @param {string} paymentMethodId from the tokenization service\n */\n const fetchClientPayment = (paymentMethodId, cvvToken) => {\n const [authenticityTokenElement] = Array.from(\n document.getElementsByName(\"authenticity_token\")\n );\n\n const body = {\n authenticity_token: authenticityTokenElement.value,\n order_bump_active: bumpForm.active(),\n client_payment: getClientPaymentFormData(\n paymentMethodId,\n cvvToken\n )\n };\n\n useRecaptcha('charge')\n .then((grToken) => fetch(\"/client_payments\", {\n method: \"POST\",\n headers: addCorrId(new Headers({ \"Content-Type\": \"application/json\" })),\n body: JSON.stringify({ ...body, gr_token: grToken })\n }))\n .then(tapAndLoadCorrId)\n .then(parseFetchResponse)\n .then(async (clientPaymentResponse) => {\n if (\"error_message\" in clientPaymentResponse.body) {\n console.error({ clientPaymentResponse });\n if (clientPaymentResponse.body?.error?.status == \"failed\") {\n if (clientPaymentResponse.body.error.statusReason) throw new Error(`reason:${clientPaymentResponse.body.error.statusReason}`);\n }\n throw new Error(clientPaymentResponse.body.error_message);\n }\n\n if (clientPaymentResponse.status === 200) {\n // The payment had an error!\n throw new Error(clientPaymentResponse.body?.error_message ?? clientPaymentResponse.body?.error ?? \"Unknown failure to register client payment\");\n }\n\n // The payment succeeded!\n const { product_id, coupon_id, stripe_confirm_payment_data, id: transactionId } = clientPaymentResponse.body;\n const revenue = stripe_confirm_payment_data.amount / 100;\n const amount = clientPaymentResponse.body.amount / 100;\n\n const gtmPurchaseEventData = {\n transactionId, // Transaction ID. Required for purchases and refunds.\n coupon: coupon_id,\n totalAmount: revenue,\n productId: product_id,\n productName: stripe_confirm_payment_data.metadata.product_name,\n price: revenue,\n discount: amount - revenue,\n fullName: formNameInput.value,\n email: formEmailInput.value,\n phone: formPhoneNumberInput.value\n };\n const webhooks = [\n gtm.sendEvent(CHECKOUT_STEP.purchase, gtmPurchaseEventData, PAYMENT_TYPE.card), // not webhook but async analytics\n ];\n\n await Promise.allSettled(webhooks);\n\n showOrderCompleteAndRedirect();\n })\n .catch((error) => {\n if (\"stack\" in error) {\n console.error(\"Failed to create client_payment\", error.stack);\n } else {\n console.trace(\"Failed to create client_payment\", error);\n }\n setLoading(false);\n\n const defaultErrorMessage = \"Ocorreu um erro. Verifique os dados preenchidos e tente novamente em alguns minutos\";\n console.log({ error });\n if (error.message && /^reason:.+/.test(error.message)) {\n showPaymentError(error.message.split(':')[1])\n } else if (error.message) {\n switch (error.message) {\n case \"Invalid CVV\":\n showPaymentError(\"CVV de cartão de crédito inválido\");\n break;\n case \"expired_card\":\n showPaymentError(\"Cartão de crédito expirado\");\n default:\n showPaymentError(defaultErrorMessage);\n }\n } else {\n showPaymentError(defaultErrorMessage);\n }\n });\n };\n\n const baseGatewayURL = window.PM3.malgaApiUrl;\n const gatewayClientId = window.PM3.malgaClientId;\n const gatewayClientToken = window.PM3.malgaClientToken;\n\n // Creates payment method\n const createPaymentMethodResponse = () => {\n setLoading(true);\n\n const cardNumber = creditCardForm.creditCardNumber.value;\n const cardExpirationDate = creditCardForm.expirationDate.value;\n const cardCvv = creditCardForm.cvv.value;\n\n const headers = addCorrId(new Headers({\n \"Content-Type\": \"application/json\",\n \"X-Client-ID\": gatewayClientId,\n \"X-Api-Key\": gatewayClientToken\n }));\n const body = JSON.stringify({\n cardHolderName: formNameInput.value,\n cardNumber,\n cardCvv,\n cardExpirationDate\n });\n\n return fetch(`${baseGatewayURL}/tokens`, { method: \"post\", headers, body })\n .then(tapAndLoadCorrId)\n .then(async (response) => {\n const bodyText = await response.text();\n if (!response.ok) {\n throw new Error(bodyText);\n }\n return JSON.parse(bodyText);\n })\n .then(async (cardTokenizationResponse) => {\n if (cardTokenizationResponse.error) {\n // Show error to your customer\n throw new Error(cardTokenizationResponse.error.message);\n }\n\n const cvvTokenizationResponse = tokenize_cvv && !isPJ(formClientType.value)\n ? await fetch(\n `${baseGatewayURL}/tokens`,\n { method: \"post\", headers, body: JSON.stringify({ cvvUpdate: cardCvv }) }\n )\n .then(tapAndLoadCorrId)\n .then(async (response) => {\n const bodyText = await response.text();\n if (!response.ok) {\n throw new Error(bodyText);\n }\n return JSON.parse(bodyText);\n })\n : {};\n gtm.registerCheckoutOptionEvent(\n PAYMENT_TYPE.card,\n {\n price: paymentHelpers.getTotalAmount(),\n discount: paymentHelpers.getDiscountAmount(),\n coupon: formCouponIdHiddenInput.value,\n productName: productNameHiddenInput.value,\n productId: productIdHiddenInput.value,\n fullName: formNameInput.value,\n email: formEmailInput.value,\n phone: formPhoneNumberInput.value\n }\n );\n\n // Otherwise send paymentMethod.id to your server\n fetchClientPayment(cardTokenizationResponse.tokenId, cvvTokenizationResponse?.tokenId);\n })\n .catch((error) => {\n const errorPayload = \"message\" in error ? (() => { try { return JSON.parse(error.message); } catch (_err) { return error; } })() : error;\n const declinedCode = \"error\" in errorPayload &&\n \"declined_code\" in errorPayload.error &&\n errorPayload.error.declined_code;\n\n setLoading(false);\n\n sendCardErrorToWebhook(declinedCode, error);\n console.error(\"Failed to tokenize card\", error);\n\n switch (true) {\n case declinedCode === \"invalid_expiration_date\":\n showPaymentError(\"Data de validade do cartão de crédito inválida\");\n break;\n case declinedCode === \"invalid_number\":\n showPaymentError(\"Número de cartão de crédito inválido\");\n break;\n default:\n showPaymentError(\"Algo deu errado, por favor verifique os dados informados e tente novamente\");\n Rollbar.error(\"Malga Tokenization error\", error)\n }\n });\n };\n\n /**\n * Does the submit, please use `debouncedHandleSubmit` instead\n *\n * @deprecated\n */\n function submitCardPurchaseForm() {\n if (!formHelpers.cpfCnpjValidator()) {\n setLoading(false);\n return;\n }\n\n if (\n isPJ(formClientType.value) &&\n doesNotHaveValue(stateRegistrationInput) &&\n doesNotHaveValue(municipalRegistrationInput)\n ) {\n if (stateRegistrationAlertMessageElement) {\n stateRegistrationAlertMessageElement.className = \"\";\n stateRegistrationAlertMessageElement.style = \"color:#FF5757; font-weight:600;\";\n }\n setLoading(false);\n return;\n }\n\n if (stateRegistrationAlertMessageElement) {\n stateRegistrationAlertMessageElement.className = \"hidden\";\n }\n createPaymentMethodResponse();\n }\n\n const paymentMethodsSubmitHandlers = {\n card: submitCardPurchaseForm\n };\n\n function setPaymentMethodSubmitHandler(method, handler) {\n if (method in paymentMethodsSubmitHandlers) {\n console.error(\"Attempt to overwrite payment method handler already assigned:\", method);\n return;\n }\n paymentMethodsSubmitHandlers[method] = handler;\n }\n\n const debouncedHandleSubmit = debounced(() => {\n const paymentMethod = submitButtonElement.dataset.paymentMethod;\n if (!(paymentMethod in paymentMethodsSubmitHandlers)) {\n console.error(\"Missing handler for payment method\", paymentMethod);\n setLoading(false);\n }\n const handler = paymentMethodsSubmitHandlers[paymentMethod] ?? paymentMethodsSubmitHandlers.card;\n handler();\n }, 1000);\n\n formElement.addEventListener(\"submit\", (event) => {\n event.preventDefault();\n setLoading(true);\n debouncedHandleSubmit();\n });\n\n submitButtonElement.dataset.paymentMethod = \"card\";\n\n MPMInstance?.addListener((paymentMethod) => {\n submitButtonElement.dataset.paymentMethod = paymentMethod;\n clientForm.setPersonalDocumentRequired(paymentMethod === \"nupay\");\n clientForm.setPersonalPhoneNumberRequired(paymentMethod === \"nupay\");\n const notUsingCardPaymentMethod = paymentMethod !== \"card\";\n disableRequiredInputField(creditCardForm.creditCardNumber._self, notUsingCardPaymentMethod, true);\n disableRequiredInputField(creditCardForm.expirationDate._self, notUsingCardPaymentMethod, true);\n disableRequiredInputField(creditCardForm.cvv._self, notUsingCardPaymentMethod, true);\n });\n\n const loadingIndicator = submitButtonElement.querySelector(\".loading-indicator\");\n const submitButtonLabel = submitButtonElement.querySelector(\"span\");\n\n function handlePaymentResult(redirectionUrl, label) {\n setLoading(false);\n disableSubmitButtonElement(submitButtonElement);\n\n setTimeout(() => {\n window.parent.location.replace(redirectionUrl);\n }, 2000);\n\n loadingIndicator.classList.remove(\"hidden\");\n submitButtonLabel.innerText = label;\n }\n\n function prepareFieldsForPaymentMethods({ success, pending, error }) {\n const [authenticityTokenElement] = Array.from(\n document.getElementsByName(\"authenticity_token\")\n );\n const formElements = {\n authenticityTokenElement,\n stateRegistrationAlertMessageElement,\n submitButtonElement,\n submitButtonLabel,\n loadingIndicator,\n getProductInfo({ formatted = true } = {}) {\n return {\n productId: productIdHiddenInput.value,\n productName: productNameHiddenInput.value,\n unitAmount: formatted\n ? getFormattedCurrencyValueFromEl(formAmountHiddenInput)\n : getValueWithoutFormat(formAmountHiddenInput.value) / 100.0,\n pixAmount: formatted\n ? getFormattedCurrencyValueFromEl(formPixAmountHiddenInput)\n : getValueWithoutFormat(formPixAmountHiddenInput.value) / 100.0\n };\n },\n getAmountAndCouponInformation({ formatted = true } = {}) {\n return {\n coupon_id: formCouponIdHiddenInput.value,\n coupon_amount_off: formatted\n ? getFormattedCurrencyValueFromEl(\n formAmountOffHiddenInput\n )\n : formAmountOffHiddenInput.value / 100,\n coupon_percent_off: formPercentOffHiddenInput.value || +formPercentOffHiddenInput.value,\n discount_amount: formatted\n ? getFormattedCurrencyValueFromEl(\n formDiscountAmountHiddenInput\n )\n : formDiscountAmountHiddenInput.value / 100,\n subtotal_amount: formatted\n ? productUnitAmountHiddenInput?.innerText\n : getValueWithoutFormat(productUnitAmountHiddenInput?.innerText) / 100,\n total_amount: formatted\n ? getFormattedCurrencyValueFromEl(formTotalAmountHiddenInput)\n : +formTotalAmountHiddenInput.value / 100,\n pix_amount: formatted\n ? getFormattedCurrencyValueFromEl(formTotalPixAmountHiddenInput)\n : +formTotalPixAmountHiddenInput.value / 100\n };\n }\n };\n\n return {\n gtm,\n clientForm,\n productForm,\n couponForm,\n bumpForm,\n formHelpers,\n formElements,\n setLoading,\n showPaymentError,\n setPaymentMethodSubmitHandler,\n onSuccess() {\n handlePaymentResult(success.redirectURL, success.label);\n },\n onPending() {\n handlePaymentResult(pending.redirectURL, pending.label);\n },\n onError() {\n handlePaymentResult(error.redirectURL, error.label);\n }\n };\n }\n\n if (document.getElementById(\"pix-payment-form\")) {\n setupPixPayment(\n prepareFieldsForPaymentMethods({\n success: { label: \"Pagamento feito com sucesso!\", redirectURL: document.getElementById(\"typ_url\").value },\n pending: {\n label: \"Processando pagamento via Pix\",\n redirectURL: document.getElementById(\"typ_pix_processing\").value.trim() || window.PM3.typPixProcessing\n },\n error: {\n label: \"Código Pix expirado\",\n redirectURL: document.getElementById(\"typ_pix_error\").value.trim() || window.PM3.typPixError\n }\n })\n );\n }\n if (document.getElementById(\"nupay-payment-form\")) {\n setupNupayPayment(\n prepareFieldsForPaymentMethods({\n success: { label: \"Pagamento feito com sucesso!\", redirectURL: document.getElementById(\"typ_url\").value },\n pending: {\n label: \"Processando pagamento via NuPay\",\n redirectURL: document.getElementById(\"typ_pix_processing\").value.trim() || window.PM3.typPixProcessing\n },\n error: {\n label: \"Pagamento NuPay expirado\",\n redirectURL: document.getElementById(\"typ_pix_error\").value.trim() || window.PM3.typPixError\n }\n }),\n );\n }\n}\n\ndocument.addEventListener(\"DOMContentLoaded\", function () {\n let MPMInstance;\n try {\n MPMInstance = setupMPMTabs(document.getElementById(\"mpm-tabs-contents\"));\n } catch (err) {\n console.error(\"Failed to start MPM Tabs:\", err);\n }\n\n try { setupMalgaPayment(MPMInstance); } catch (err) {\n console.error(\"Failed to setup Malga Payment:\", err);\n }\n});\n"],"sourceRoot":""}