{"version":3,"sources":["webpack:///./obj/desktop/src/payment-method/util/credit-card-util.ts","webpack:///./obj/desktop/src/invoice/components/payment-method-modal/payment-method-modal.tsx","webpack:///./obj/desktop/src/invoice/components/payment-methods/desktop/saved-payment-item.tsx","webpack:///./obj/desktop/src/invoice/components/payment-method-modal/mobile/payment-method-modal.tsx","webpack:///./obj/desktop/src/invoice/components/payment-methods/desktop/saved-payment-method.tsx","webpack:///./obj/desktop/src/invoice/components/payment-methods/mobile/saved-payment-item.tsx","webpack:///./obj/desktop/src/invoice/components/payment-methods/mobile/saved-payment-method.tsx","webpack:///./obj/desktop/src/invoice/components/payment-methods/desktop/payment-method-container.tsx","webpack:///./obj/desktop/src/invoice/components/payment-amount/desktop/payment-amount.tsx","webpack:///./obj/desktop/src/invoice/components/payment-amount/payment-amount.tsx","webpack:///./node_modules/moment/locale sync ^\\.\\/.*$","webpack:///./obj/desktop/src/invoice/components/payment-amount/desktop/payment-amount.less","webpack:///./obj/desktop/src/invoice/components/payment-methods/desktop/payment-method-container.less","webpack:///./obj/desktop/src/payment/components/ach/desktop/confirmation-modal.less","webpack:///./obj/desktop/src/payment/components/ach/desktop/ach-info.less","webpack:///./obj/desktop/src/invoice/components/payment-methods/desktop/payment-methods.less","webpack:///./obj/desktop/src/invoice/components/connected-accounts/connected-accounts.less","webpack:///./obj/desktop/src/invoice/components/connected-accounts/connected-account.less","webpack:///./obj/desktop/src/invoice/components/card-info/card-info/desktop/card-info.less","webpack:///./obj/desktop/src/invoice/components/card-info/pg-card-info/desktop/pg-card-info.less","webpack:///./obj/desktop/src/payment-method/components/card-select-modal/desktop/card-select-modal.less","webpack:///./obj/desktop/src/invoice/components/payment-methods/desktop/saved-payment-method.less","webpack:///./obj/desktop/src/invoice/components/payment-method-modal/payment-method-modal.less","webpack:///./obj/desktop/src/invoice/components/payment-methods/desktop/saved-payment-item.less","webpack:///./obj/desktop/src/invoice/components/payment-methods/mobile/saved-payment-method.less","webpack:///./obj/desktop/src/invoice/components/payment-method-modal/mobile/payment-method-modal.less","webpack:///./obj/desktop/src/invoice/components/payment-methods/mobile/saved-payment-item.less","webpack:///./obj/desktop/src/util/formatters.ts","webpack:///./obj/desktop/src/core/components/mat-field.tsx","webpack:///./obj/desktop/src/invoice/types/types.ts","webpack:///./obj/desktop/src/api/model/plaidVerificationStatus.ts","webpack:///./obj/desktop/src/payment-method/stores/saved-payment-methods.store.ts","webpack:///./obj/desktop/src/statement/ioc.ts","webpack:///./obj/desktop/src/statement/stores/payment-gateway.store.ts","webpack:///./obj/desktop/src/payment-method/ioc.ts","webpack:///./obj/desktop/src/login/ioc.ts","webpack:///./obj/desktop/src/invoice/stores/invoice.store.ts","webpack:///./obj/desktop/src/statement/stores/charge.store.ts","webpack:///./obj/desktop/src/invoice/ioc.ts","webpack:///./obj/desktop/src/login/stores/login.store.ts","webpack:///./obj/desktop/src/invoice/components/ach-info/ach-info/ach-info.tsx","webpack:///./obj/desktop/src/statement/stores/statement.store.ts","webpack:///./obj/desktop/src/util/clone-deep.ts","webpack:///./obj/desktop/src/payment-method/stores/saved-credit-cards.store.ts","webpack:///./obj/desktop/src/invoice/components/card-info/cc-validators.ts","webpack:///./obj/desktop/src/invoice/components/card-info/card-info/card-info.tsx","webpack:///./obj/desktop/src/invoice/components/card-info/pg-card-info/pg-card-info.tsx","webpack:///./obj/desktop/src/payment/components/ach/ach-utils.ts","webpack:///./obj/desktop/src/payment/components/ach/desktop/confirmation-modal.tsx","webpack:///./obj/desktop/src/payment/components/ach/desktop/ach-info.tsx","webpack:///./obj/desktop/src/invoice/components/ach-info/ach-info.tsx","webpack:///./obj/desktop/src/invoice/components/connected-accounts/connected-account.tsx","webpack:///./obj/desktop/src/invoice/components/connected-accounts/connected-accounts.tsx","webpack:///./obj/desktop/src/invoice/components/card-info/cc-formatters.ts","webpack:///./obj/desktop/src/invoice/components/card-info/card-info/desktop/card-info.tsx","webpack:///./obj/desktop/src/payment-method/components/card-select-modal/desktop/card-select-modal.tsx","webpack:///./obj/desktop/src/invoice/components/card-info/pg-card-info/desktop/pg-card-info.tsx","webpack:///./obj/desktop/src/invoice/components/payment-methods/desktop/payment-methods.tsx","webpack:///./obj/desktop/src/core/components/view-more.tsx"],"names":["getCardType","cardNumber","match","Visa","AmericanExpress","Discover","MasterCard","Other","getCardIcon","cardType","getCardNameByIssuer","issuer","NUMBER_3","NUMBER_4","NUMBER_5","NUMBER_6","getIssuerByCardType","NUMBER_0","PaymentMethodViewType","SavedPaymentItem","paymentMethod","paymentMethodId","primary","icon","expires","bankName","customerName","paymentMethodType","displayText","selected","showDivider","onSelectPaymentMethod","className","savedItemContainer","Radio","checked","onChange","savedItemLogo","src","alt","savedItemDetails","savedItemText","savedItemSubText","CreditCard","savedItemChipHolder","savedItemChipContainer","savedItemChip","savedItemDivider","PaymentMethodModal","selectedPaymentMethodId","onPaymentMethodSelected","onClose","isOpen","usePaymentGateway","usePaymentsService","invoiceId","store","chargeType","splits","statementId","PayByBank","creditCardInfo","achInfo","pgCreditCardInfo","id","skipIFrameMessageHandler","savePaymentChecked","setSavePaymentChecked","useAsPrimaryPaymentChecked","setUseAsPrimaryPaymentChecked","paymentMethodDialogTitle","setPaymentMethodDialogTitle","addPaymentMethodButtonTitle","setAddPaymentMethodButtonTitle","SelectPaymentMethod","paymentMethodViewType","setPaymentMethodViewType","currentSelectedPaymentMethod","currentSelectedPaymentMethodId","setCurrentSelectedPaymentMethodId","initialSelectedPaymentMethodId","isCurrentSelectedPaymentInValid","setIsCurrentSelectedPaymentInValid","connectedAccounts","paymentMethodAction","undefined","handleSelect","handleSelectPaymentMethod","current","paymentGateway","get","iframeMessageHandler","useEffect","window","addEventListener","removeEventListener","init","gotoSavedCardPage","isLoadingSavedPaymentMethods","setIsLoadingSavedPaymentMethods","preparePaymentOptions","savedPaymentMethods","forEach","isExpired","addPaymentMethod","setOnActionComplete","success","lastSavedPayment","getLastSavedPaymentMethod","needToStoreAsPrimary","processGatewayAddNewCard","p","updateButtonTitleForPayByBank","length","currentInvoiceId","currentStatementId","currentSplits","setOnSelectedPaymentMethodChange","desktopPaymentGatewayUrl","getDesktopPaymentGatewayUrl","mobilePaymentGatewayUrl","getMobilePaymentGatewayUrl","AddPaymentMethod","size","S","open","initialPaymentMethod","find","closable","title","footer","onClick","disabled","connectedAccount","filter","account","payByBankPaymentMethod","connectedBankAccountToPaymentMethod","form","validate","hasError","cardInfoToPaymentMethod","ACH","achInfoToPaymentMethod","achPaymentMethod","color","map","index","key","cardInfoData","pgcardInfoData","achInfoData","showLoginLink","setPaymentMethodValid","setPaymentMethodAction","action","setConnectedAccounts","accounts","setPaymentMethodType","type","showPrimaryOption","getIsCPEnabled","showSavePaymentOption","paymentMethodStore","SavedPaymentMethod","setPaymentMethod","paymentAmountData","setSecurityCodeValid","isModalOpen","setIsModalOpen","securityCode","validators","value","message","code","Number","isNaN","showCvc","setShowCvc","useCvc","currentPaymentMethod","currentPaymentMethodId","setCurrentPaymentMethodId","amount","isFullBalance","fullBalance","parseFloat","customAmount","payment","invoiceNumber","amountRemaining","cvv","chargePaymentMethod","securityCodeChanged","validation","getInvoice","getInvoiceByStatement","shouldShowCvc","invoice","usesPaymentsService","savedAccountContainer","savedAccountContainerTop","savedAccountLogo","savedAccountText","disconnected","savedAccountChipHolder","Chip","label","primaryChipColor","disconnectedChipColor","savedAccountContainerBottom","fieldState","autoComplete","fullWidth","maxLength","securityCodeField","placeholder","onFocus","onBlur","onKeyUp","savedAccountChangePayment","savedItemContainerItem","theme","contentWrapperClass","savedAccountLogoAdjustment","savedAccountItem","savedAccountChipHolderMobile","PaymentMethodContainer","setPaymentButtonTextIcon","setPaymentMethodSubmit","cardView","getIsLoggedIn","savedPayment","setSavedPayment","isLoggedIn","isSavedPaymentOptionEnabled","getIsSavedPaymentOptionEnabled","errorMessage","setErrorMessage","isReady","setIsReady","setOnPbbErrorMessage","error","name","number","card","nonCardView","paymentMethodsPayByBankError","payByBankErrorHeader","payByBankErrorWarning","payByBankErrorHeaderTitle","payByBankErrorBody","spinner","loadingMessage","PaymentAmount","data","handleFullAmountTrue","rightLabel","partialPaymentEnabled","handleFullAmountFalse","startAdornment","formatter","props","customAmountValidator","onStateChanged","minimumAmount","this","clearError","handleSubmit","e","isSubcomponent","preventDefault","invoiceStore","$","history","push","params","onDidChange","then","balance","router","replace","partialPaymentDisabled","err","render","container","PaymentAmountContainer","webpackContext","req","webpackContextResolve","__webpack_require__","o","Error","keys","Object","resolve","module","exports","utcOptions","timeZone","localeDate","date","Date","toLocaleDateString","longDate","dateTime","getUTCMonth","getUTCDate","getUTCFullYear","currency","num","Intl","NumberFormat","style","format","address","isWrap","streetAddress","unit","city","state","zip","twoDigitsAmount","startsWith","numbers","split","slice","getDurationBillingString","duration","billingFrequency","getBillingFrequencyString","freq","toNumber","iosFocus","hadBlur","hasFocus","fixAdornment","handleFocus","readOnly","handleBlur","hadBlurTimeout","setTimeout","dirty","handleAdornmentEnter","handleChange","validator","target","componentWillReceiveProps","nextProps","clearTimeout","componentWillUnmount","errorMap","endAdornmentOrig","endAdornmentFixed","errorColor","errorText","endAdornment","onMouseEnter","FormHelperTextProps","helperText","InputProps","inputProps","MatField","PaymentMethodType","BankAccountType","CreditCardType","PlaidVerificationStatus","savedCreditCardsApi","savedBankAccountsApi","statementApiService","payByBankApi","paymentGatewayService","chargeApi","analytics","invoicesApi","homeApi","customerInfos","postalCode","processing","isSavedCreditCardEnabled","isSavedCreditCardFeatureOn","isCreditCardEnabled","isPayByBankFeatureOn","isPayByBankEnabled","isSavedBankAccountFeatureOn","isBankAccountEnabled","isInSavedPaymentMethods","customerSelector","newValue","getSavedPaymentMethodsForCustomer","customerOptions","invoiceCache","paymentConfirmationCache","callback","initializeWithStatement","initializeWithInvoice","getHomeData","homeResponse","homeData","creditCardEnabled","creditCardDisabled","achEnabled","achDisabled","payByBankEnabled","payByBankDisabled","customerReference","customerExternalId","initialize","catch","paymentGatewayConfig","response","apiKey","baseUrl","paymentsServiceJwt","paymentsServiceCreditCardProcessorExists","clientData","getShowLoginLink","getCardIssuer","isExpiringSoon","year","month","today","currentYear","getFullYear","currentMonth","getMonth","isPaymentMethodExpiringSoon","token","parseInt","convertToCardIssuer","toLowerCase","result","lastSavedPaymentMethod","resetLastSavedPaymentMethod","getLastPGResponse","lastPGResponse","lastSavedPaymentMethodId","accountName","accountMask","bankIcon","publicToken","accountId","bankId","verificationStatus","cardInfo","cardResult","cardDetail","ccNumber","cardName","ccName","cardNumberEnding","substring","ccExp","achResult","achDetail","achNumber","accountNumber","achNumberEnding","routingNumber","bankAccountType","accountType","trim","Business","Personal","creditCardToSavedPayment","creditCard","expMonth","expYear","cardholderName","customerId","membership","bankAccountToSavedPayment","bankAccount","routing","routingEnding","payByBankToSavedPayment","payByBankAccount","getInstitution","pbbInstitutionId","institution","logo","verificationStatusEnumToString","verificationStatusToEnum","sortCreditCard","cards","primaryCards","c","membershipCards","others","sort","a","b","gotoMembershipPage","getCustomerId","customerIds","callCompleteAction","onActionComplete","callPostError","onPbbErrorMessage","getLinkToken","getTime","institutionId","savedCreditCards","allCards","savedBankAccounts","allBankAccounts","savedPayByBanks","allPayByBanks","creditCards","achAccounts","payByBankAccounts","payByBankPaymentIdMapping","Map","pbb","paymentsServicePaymentMethodId","has","achs","ach","payByBanks","i","paymentMethods","primaryPaymentMethods","otherPaymentMethods","setDefaultSelectedPaymentMethodToPay","getCustomerIds","isEnabled","users","text","setSelectedPaymentMethodToPay","selectedPaymentMethod","availablePaymentMethods","onSelectedPaymentMethodChange","setPrimary","setPaymentMethodAsPrimary","assignCreditCard","assignBankAccount","assignPayByBank","deletePaymentMethod","resetErrorMessage","deleteCreditCard","deleteBankAccount","deletePayByBank","processAddNewCard","processNonGatewayCreditCard","processACH","processPayByBank","selectedCustomerId","expToken","businessUnitId","processCreditCard","selectedCustomer","pbbAccountId","savePayByBank","amountApplied","paymentInvoiceId","paymentInvoice","processBankAccountCharge","processCreditCardCharge","processPayByBankCharge","getInvoicesById","invoiceIds","getInvoiceById","getCustomerStatementsById","statementData","customer","customers","invoices","forceRefresh","trimmedId","cachedInvoice","Promise","resp","isAnonymousPayments","request","method","notificationEmail","loginData","email","storePaymentMethod","isCreditCard","chargeStoredPaymentMethod","processChargeResponse","processChargeFailure","checkNumber","isBusinessPayment","chargeBankAccount","cvc","processCharge","pgResponse","Type","responseData","Data","Token","billingZip","CardholderName","ExpMonth","ExpYear","Cvc","issuerName","IssuerName","isStatementCharge","NUMBER_1","statementRequest","chargeCreditCardMultiple","chargeCreditCard","transaction","Math","abs","hashCode","charge","s","reduce","charCodeAt","toString","confirmation","amountPaid","remainingBalance","addPaymentConfirmationToCache","paymentAttemptSuccess","confirmId","sessionStorage","setItem","JSON","stringify","paymentAttemptFail","getCachedConfirmation","confirmationNumber","item","getItem","parse","removeItem","bankAccountInfo","saveBankAccount","saveCreditCard","usesPaymentsServiceTokenizationStore","invoiceData","some","feature","creditResponse","initializeFlags","payByBankReponse","achFeature","achReponse","portalData","brandData","phone","membershipNameTypeStore","SavedPaymentMethodsStore","statementContainer","createChild","bind","toSelf","inSingletonScope","PaymentGatewayResponseType","getPaymentGatewayUrl","view","url","location","origin","encodeURIComponent","event","postMessageEventIsValid","tokenizationCompleteCallback","iframe","document","getElementById","source","contentWindow","pgIframe","postMessage","PaymentGateway","paymentMethodsContainer","loginContainer","lazyInject","paymentLinkApi","home","savedCreditCardsStore","getSavedCreditCardStore","isInvoicePaymentLinkExpired","linkResp","isInvoiceDisabled","linkErr","submitAchPayment","reject","submitPaymentToUseStoredPaymentMethod","selectedCardToPay","submitPayment","needToSaveCard","getCachedInvoice","setCachedConfirmation","paymentConfirmation","getOpenInvoices","getInvoices","showStoreOption","InvoiceStore","chargeApiService","homeStore","outstandingBalance","statementBalance","paymentAmount","paymentCompleted","authCode","paymentProcessing","multiplePaymentOptionsEnabled","needToStoreCreditCard","useNewCard","setDefaultSelectedCardToPay","initializeConfirmationPage","refreshHomeData","backToSelectionPage","initializeFromStatementModel","statementModel","processMultiBankAccount","businessPayment","updateStoreCreditCardOption","setUseNewCard","ChargeStore","invoiceContainer","loginWithReturn","loginApi","logOut","removeLoginCookie","from","pathname","checkTokenObservable","firstName","authenticate","updateLoginData","checkToken","pwFormToken","pwFormEmail","pwFormPassword","LoginStore","modalIsOpen","isProcessing","currentInputAccountNumber","required","valid","confirmAccountNumber","isBusy","changeAccountType","val","reset","closeConfirmationModal","showConfirmationModal","withBusy","officialName","InvoiceFilter","DEFAULT_FILTER","Statement","chargeInfoService","gridState","pageSize","selectedFilter","customerMap","searchTerm","onUpdate","customerDropdownState","onSearchChange","isAnonymousStatement","isStatementPaymentLinkExpired","getCustomerStatements","initCustomerMap","initCustomerDropdownState","selectCustomer","initInvoiceFilter","clearSearch","setDataSource","All","PastDue","clear","extendedCustomer","sum","inv","set","options","dropdownDataSource","filteredInvoices","row","mapInvoiceColumns","serviceDate","serviceAddress","dueDate","invoiceDate","billingDate","invoiceTotal","total","paymentTotal","invoiceBalance","changeFilter","makePayment","paymentAmountTotal","toFixed","Array","selectedInvoices","isAfter","statementSentDate","isSameOrAfter","overdueInvoices","statementInvoices","x","selectedCount","Set","selectedIds","StatementStore","cloneDeep","isLoadingSavedCreditCards","isChangeCardDialogOpen","isAddNewCardDialogOpen","isDeleteCardDialogOpen","isSetPrimaryModalOpen","isDeleteModalOpen","isAddNewCardModalOpen","cardProcessing","isMobileCardSelectTakeoverOpen","isMobileCardDeleteTakeoverOpen","isMobileCardAddTakeoverOpen","isMobileSetPrimaryTakeoverOpen","getSavedCreditCardsForCustomer","isSelectedToUpdate","selectedCardToUpdate","availableCards","openSetPrimaryModal","currentEditingCard","closeSetPrimaryModal","openDeleteModal","closeDeleteModal","openAddNewCardModal","closeAddNewCardModal","openMobileCardSelectTakeover","closeMobileCardSelectTakeover","openMobileCardDeleteTakeover","closeMobileCardDeleteTakeover","openMobileSetPrimaryTakeover","closeMobileSetPrimaryTakeover","openMobileCardAddTakeover","closeMobileCardAddTakeover","setSelectedCardToPay","selectedCard","setSelectedCardToUpdate","setAsPrimary","handleDelete","handleAdd","SavedCreditCardsStore","ccNameValidator","test","ccNumberValidator","isValid","ccExpValidator","ccCscValidator","zipPostalCodeValidator","ccCsc","substr","existingCcExp","paymentGatewayBaseUrl","needToSelectAnotherCard","isSavedCreditCardFeatureEnabled","paymentGatewayResponseType","Submit","SearsCard","responseType","alert","needToChargeStoredCard","setNeedToSelectAnotherCard","setNeedToStoreCreditCard","toPrettyAmount","ConfirmationModal","companyName","companyPhoneNumber","onSubmit","prettyAmount","prettyDate","Dialog","DialogTitle","DialogContent","DialogContentText","achTable","DialogActions","Button","declineButton","AchInfo","containerStyles","isInvoicePayment","isEmbedded","maxAchPayment","amountError","Icon","warningIcon","fieldTitle","Tooltip","enterTouchDelay","classes","tooltip","infoTooltip","infoIcon","RadioGroup","FormControlLabel","control","firstRow","col","redirectToPayPage","AchInfoContainer","ConnectedAccount","borderColor","connectedAccountContainer","connectedAccountLogo","connectedAccountText","connectedAccountChipHolder","connectedAccountChipContainer","connectedAccountChip","ConnectedAccounts","setAccounts","connectedAccountsContainer","connectedAccountsHeader","idx","connectedAccountsItem","ccNumberFormatter","getHandler","lengths","max","apply","gaps","digitsValue","lastGap","gap","ccExpFormatter","func","element","handleEvent","isKeyUp","elem","currentTarget","selectionStart","selectionEnd","setSelectionRange","CardInfo","inputRef","ref","secondRow","agreement","href","rel","CardSelectModal","setSelectedCard","close","gotoNewCard","membershipNameType","replacedCard","setReplacedCard","Fragment","footerAlign","Divider","Item","alignItems","subdued","padStart","subtle","renderCard","formState","pgdata","loginStore","showSavePaymentInformation","isEmbeded","componentDidMount","loggedIn","renderStoredPaymentCard","cardItem","justifyContent","leftCard","expired","rightCard","membershipName","buttons","outline","fill","renderUseNewCard","scrolling","Checkbox","_","signin","embedded","backward","PGCardInfo","PlaidLinkView","linkToken","processPlaidSuccess","setFailedBankName","setReady","setOpen","config","onSuccess","metadata","onExit","_err","onEvent","ready","PaymentMethods","setPayByBankReady","useFeatureGate","setIsCreditCard","isAch","setIsAch","isPayByBank","setIsPayByBank","accountsRef","failedBankName","clientDataStore","paymentMethodTypeRef","paymentMethodLoadedRef","isACHModelOpen","setIsACHModelOpen","setLinkToken","setIsAchExceeded","isSavedPaymentChecked","isUseAsPrimaryPaymentChecked","isInitialized","onPayByBankSelected","onCreditCardSelected","onACHSelected","onPayByBankAction","connectAnotherAccount","onCreditCardAction","onACHAction","getPaymentAmount","resetSelectedStates","updatePaymentMethodType","setButtonTextIcon","updateConnectedAccounts","selectedAccount","acct","setPaymentButtonForPayByBank","onPaymentMethodSubmit","gatewayPaymentMethod","creditCardPaymentMethod","onAmountStateChanged","isAchAmountExceeded","institution_id","institutionLogo","updatedAccounts","console","log","verification_status","mask","subtype","paymentMethodsSpacing","paymentMethodsConnectBank","paymentMethodsCheckboxItem","paymentMethodsCheckbox","_value","signInMessage","createTenantURL","isExpanded","showViewMore","textDiv","setTextDiv","div","calculateShortHtml","toggleExpanded","fullHtml","dangerouslySetInnerHTML","shortHtml","componentWillUpdate","clientHeight","scrollHeight","innerHTML","lastIndexOf","Component","component","viewMore","ViewMore"],"mappings":"2FAAA,6JAIaA,EAAc,SAACC,GACxB,OAAIA,EAAWC,MAAM,gBACV,IAAeC,KACfF,EAAWC,MAAM,oBACjB,IAAeE,gBACfH,EAAWC,MAAM,iCACjB,IAAeG,SACfJ,EAAWC,MAAM,sGACjB,IAAeI,WAGnB,IAAeC,OAGbC,EAAc,SAACC,GACxB,OAAOA,IAAa,IAAeN,KAAO,yBACtCM,IAAa,IAAeL,gBAAkB,qCAC1CK,IAAa,IAAeJ,SAAW,kCACnCI,IAAa,IAAeH,WAAa,+BAAiC,IAG7EI,EAAsB,SAACC,GAChC,OAAOA,IAAW,IAAiBC,SAAW,IAAeR,gBACzDO,IAAW,IAAiBE,SAAW,IAAeV,KAClDQ,IAAW,IAAiBG,SAAW,IAAeR,WAClDK,IAAW,IAAiBI,SAAW,IAAeV,SAClD,IAAeE,OAGtBS,EAAsB,SAACP,GAChC,OAAOA,IAAa,IAAeL,gBAAkB,IAAiBQ,SAClEH,IAAa,IAAeN,KAAO,IAAiBU,SAChDJ,IAAa,IAAeH,WAAa,IAAiBQ,SACtDL,IAAa,IAAeJ,SAAW,IAAiBU,SACpD,IAAiBE,W,wECDhCC,E,0JCvBQC,EAA8C,SAAC,G,IACxD,IAAAC,cACIC,EAAe,kBACfC,EAAO,UACPC,EAAI,OACJC,EAAO,UACPC,EAAQ,WACRC,EAAY,eACZC,EAAiB,oBACjBC,EAAW,cAEfC,EAAQ,WACRC,EAAW,cACXC,EAAqB,wBACnB,OACF,oCACI,+BACI,yBAAKC,UAAW,IAAOC,oBACnB,kBAACC,EAAA,EAAK,CAACC,QAASN,EAAUO,SAAU,WAAM,OAAAL,EAAsBV,MAChE,yBAAKW,UAAW,IAAOK,cAAeC,IAAKf,GAAQ,gCAAiCgB,IAAKX,IACzF,yBAAKI,UAAW,IAAOQ,kBACnB,yBAAKR,UAAW,IAAOS,eAAgBb,GACtCJ,GAAY,yBAAKQ,UAAW,IAAOU,kB,WAA2BlB,GAC9DC,GAAYE,IAAsB,IAAkBgB,YAAe,yBAAKX,UAAW,IAAOU,kBAAmBjB,GAC7GC,GAAiB,yBAAKM,UAAW,IAAOU,kBAAmBhB,IAE/DJ,GACG,yBAAKU,UAAW,IAAOY,qBACnB,yBAAKZ,UAAW,IAAOa,wBACnB,yBAAKb,UAAW,IAAOc,eAAa,eAOvDhB,GACG,yBAAKE,UAAW,IAAOe,qB,k3CDdnC,SAAK7B,GACD,8CACA,wCAFJ,CAAKA,MAAqB,KAKnB,IENF,EFMQ8B,EAAwD,SAAC,G,MAClEC,EAAuB,0BACvBC,EAAuB,0BACvBC,EAAO,UACPC,EAAM,SACNC,EAAiB,oBACjBC,EAAkB,qBAClBC,EAAS,YACTC,EAAK,QACLC,EAAU,aACVC,EAAM,SACNC,EAAW,cAELhC,EAAoB,iBAAO,IAAkBiC,WAC7CC,EAAiB,iBAAO,IAAI,KAC5BC,EAAU,iBAAO,IAAI,KACrBC,EAAmB,iBAAO,IAAI,IAAoB,CAAEC,GAAIT,GAAa,GAAIU,0BAA0B,KACnG,EAA8C,oBAAS,GAAtDC,EAAkB,KAAEC,EAAqB,KAC1C,EAA8D,oBAAS,GAAtEC,EAA0B,KAAEC,EAA6B,KAC1D,EAA0D,mBAAS,qCAAlEC,EAAwB,KAAEC,EAA2B,KACtD,EAAgE,mBAAS,YAAxEC,EAA2B,KAAEC,EAA8B,KAC5D,EAAoD,mBAASvD,EAAsBwD,qBAAlFC,EAAqB,KAAEC,EAAwB,KAChDC,EAA+B,mBAC/B,EAAsE,mBAAS5B,GAA9E6B,EAA8B,KAAEC,EAAiC,KAClEC,EAAiC,iBAAO/B,GACxC,EAAwE,oBAAS,GAAhFgC,GAA+B,KAAEC,GAAkC,KAEpEC,GAAoB,iBAA+B,IACnDC,GAAsB,sBAAiCC,GAEvDC,GAAe,WACjBC,GAA0BV,EAA6BW,UAGrDD,GAA4B,SAACnE,GAC3BA,IAEA4D,EAA+BQ,QAAUpE,EAAcC,gBACvD6B,EAAwB9B,IAE5B+B,KAQEsC,GAAiB,IAAwBC,IAAI,KAC7CC,GAAuBF,GAAeE,qBAC5C,IAAMC,WAAU,WAEZ,OADAC,OAAOC,iBAAiB,UAAWH,IAC5B,WACHE,OAAOE,oBAAoB,UAAWJ,QAI9C,IAeIK,GAEAxC,EAAK,KADLyC,GACAzC,EAAK,kBAEH,GAAkE,oBAAS,GAA1E0C,GAA4B,MAAEC,GAA+B,MAE9DC,GAAwB,SAAC/E,G,MACF,QAAzB,EAAAmC,EAAM6C,2BAAmB,SAAEC,SAAQ,SAAAlF,GAC/BA,EAAcS,SAAWT,EAAcC,kBAAoBA,EACvDD,EAAcS,WACdgD,EAA6BW,QAAUpE,EACvC8D,GAAmC1B,EAAM+C,UAAUnF,SA4EzDoF,GAAmB,SAACpF,G,QAElBA,EAAcS,WACW,QAAzB,EAAA2B,EAAM6C,2BAAmB,SAAEC,SAAQ,SAAAlF,GAAmBA,EAAcS,UAAW,MAI/ET,EAAcE,UACW,QAAzB,EAAAkC,EAAM6C,2BAAmB,SAAEC,SAAQ,SAAAlF,GAAmBA,EAAcE,SAAU,MAG9E4C,GACAV,EAAMiD,qBAAoB,SAAAC,G,MACtB,GAAKA,EAAL,CAKA,IAAMC,EAAmBnD,EAAMoD,4BAC/B/B,EAA6BW,QAAUmB,EACvC5B,EAAsE,QAApC,EAAAF,EAA6BW,eAAO,eAAEnE,iBAExEkE,GAA0BoB,OAG9BnD,EAAMqD,qBAAuBzC,EAC7BZ,EAAMgD,iBAAiBpF,IAChBA,EAAcO,oBAAsB,IAAkBgB,YAAcU,IAC3EG,EAAMsD,0BAAyB,SAAAC,GAC3BlC,EAA6BW,QAAUuB,EACvChC,EAAkCgC,EAAG1F,iBACrCiE,SAGJT,EAA6BW,QAAUpE,EACvC2D,EAAkC3D,EAAcC,iBAChDiE,OAIF0B,GAAgC,WAClCvC,EAA+BU,GAAkBK,QAAQyB,OAAS,EAC9D,mBAAqB,yBAwD7B,OAxBA,qBAAU,WACNzD,EAAM0D,iBAAmB3D,EACzBC,EAAM2D,mBAAqBxD,EAC3BH,EAAM4D,cAAgB1D,EACtBF,EAAM6D,kCAAiC,WACnClB,IAAgC,MAEpCH,OACD,CAACA,KAEJ,qBAAU,WACNI,GAAsBtB,KACvB,CAACA,EAAgCtB,EAAM6C,sBAE1C,qBAAU,WACNtC,EAAiByB,QAAQ8B,yBAA2B7B,GAAe8B,4BAA4BjE,GAC/FS,EAAiByB,QAAQgC,wBAA0B/B,GAAegC,2BAA2BnE,GAC7FS,EAAiByB,QAAQG,qBAAuBA,KACjD,IAEH,qBAAU,WApKNpB,EAA4BI,IAA0BzD,EAAsBwG,iBACxE,qBAAuB,uCAqK5B,CAAC/C,IAGA,kBAAC,QAAK,CACFgD,KAAM,aAAWC,EACjBC,KAAMzE,EACND,QAxCa,W,MACjB,GAAI6B,EAA+BQ,QAAS,CAExC,IAAMsC,EAAgD,QAAzB,EAAAtE,EAAM6C,2BAAmB,eAAE0B,MAAK,SAAAhB,GAAK,OAAAA,EAAE1F,kBAAoB2D,EAA+BQ,WACnHsC,GACA5E,EAAwB4E,GAIhC3E,KAgCI6E,UAAQ,EACRC,MAAO3D,EACP4D,OACIvD,IAA0BzD,EAAsBwD,oBAC5C,kBAAC,cAAW,CAAC1C,UAAW,wBACpB,kBAAC,SAAM,CAACmG,QAlNH,WACrBtE,EAAe2B,QAAU,IAAI,IAC7B1B,EAAQ0B,QAAU,IAAI,IACtBzB,EAAiByB,QAAU,IAAI,IAAoB,CAAExB,GAAIT,GAAa,GAAIU,0BAA0B,IACpGF,EAAiByB,QAAQ8B,yBAA2B7B,GAAe8B,4BAA4BjE,GAC/FS,EAAiByB,QAAQG,qBAAuBA,GAChDf,EAAyB1D,EAAsBwG,oBA4ME,sBAGjC,kBAAC,SAAM,CAACpG,SAAO,EAAC6G,QAAS7C,GAAc8C,SAAUnD,IAA+B,gCAInF,kBAAC,cAAW,KACT,kBAAC,SAAM,CAACkD,QAtLM,WAC9BvD,EAAyB1D,EAAsBwD,uBAqLW,QAG1C,kBAAC,SAAM,CAACpD,SAAO,EAAC6G,QArLH,qD,8DAC7B,IAAK/C,GAAoBI,QACrB,UAIJ,GAAI7D,EAAkB6D,UAAY,IAAkB5B,UAAW,CAC3D,GAAIuB,GAAkBK,QAAQyB,OAAS,EAUnC,OARMoB,EAAmBlD,GAAkBK,QACtC8C,QAAO,SAAAC,GAAW,OAAAA,EAAQ1G,YAAU,GAEnC2G,EAAyBhF,EAAMiF,oCAAoCJ,EACrEjE,GAA8BF,GAGlCsC,GAAiBgC,GACjB,IAEApD,GAAoBI,U,OAIxB7D,EAAkB6D,UAAY,IAAkB7C,WAAhD,MACIU,IACmB,GAAMU,EAAiByB,QAAQkD,KAAKC,YADvD,M,OAEA,OADmB,SACJC,SACX,MAGExH,EAAgB,CAAEC,gBAAiB,IAC3BM,kBAAoB,IAAkBgB,WAEpD6D,GAAiBpF,G,cAEK,SAAMoC,EAAMqF,wBAAwBhF,EAAe2B,QACrEpB,GAA8BF,I,OAGlC,KAJM9C,EAAgB,UAKlB,UAGJoF,GAAiBpF,G,wBAIrBO,EAAkB6D,UAAY,IAAkBsD,IAAhD,MACyB,GAAMtF,EAAMuF,uBAAuBjF,EAAQ0B,QAChEpB,GAA8BF,I,OAGlC,KAJM8E,EAAmB,UAKrB,UAGJxC,GAAiBwC,G,oCA8HAxE,KAKhBG,IAA0BzD,EAAsBwD,qBAC5C,kBAAC,WAAQ,CAACiD,KAAK,SAAS3F,UAAW,e,gBAClB,IACd,kBAAC,OAAI,CAACiH,MAAM,UAAUd,QA7NL,WAC7BhF,IACA8C,OA2NmE,U,IAE9C,I,gCAEhBC,GACG,yBAAKlE,UAAW,cACZ,kBAAC,UAAO,CAACA,UAAW,YACpB,kBAAC,WAAQ,CAAC2F,KAAK,QAAQ3F,UAAW,kBAAqB,qCAI1D2C,IAA0BzD,EAAsBwD,oBAChD,kBAAC,OAAI,KAE2B,QAAzB,EAAAlB,EAAM6C,2BAAmB,eAAE6C,KACvB,SAAC9H,EAAe+H,GACZ,yBAAChI,EAAgB,CACbiI,IAAKhI,EAAcC,gBACnBD,cAAeA,EACfS,SAAUiD,IAAmC1D,EAAcC,gBAC3DS,YAAaqH,IAAU3F,EAAM6C,oBAAqBY,OAAS,EAC3DlF,sBAAuB,SAAAV,GACnBD,EAAcS,UAAW,EACzBuE,GAAsBhF,EAAcC,iBACpC0D,EAAkC1D,UAItD,kBAAC,IAAc,CACXgI,aAAcxF,EAAe2B,QAC7B/B,WAAYA,EACZ6F,eAAgBvF,EAAiByB,QACjCjC,UAAWA,EACXI,YAAaA,EACbD,OAAQA,EACR6F,YAAazF,EAAQ0B,QACrBnC,kBAAmBA,EACnBmG,eAAe,EACfC,sBAAuB,aACvBC,uBA1RW,SAACC,GAC5BvE,GAAoBI,QAAUmE,GA0RdC,qBA/GY,SAACC,GAC7B1E,GAAkBK,QAAUqE,EAC5B7C,MA8GgB8C,qBA3HS,SAACC,GAC1BpI,EAAkB6D,QAAUuE,EACxBA,IAAS,IAAkBpH,WAC3B8B,EAA+B,YACxBsF,IAAS,IAAkBjB,IAClCrE,EAA+B,WAE/BuC,MAqHYgD,kBAAmBxG,EAAMyG,iBACzBC,sBAAuB1G,EAAMyG,iBAC7B/F,mBAAoBA,EACpBC,sBAAuBA,EACvBC,2BAA4BA,EAC5BC,8BAA+BA,EAC/B8F,mBAAoB3G,M,y2CG7V/B4G,EAAkD,SAAC,G,IAC5DhJ,EAAa,gBACbiJ,EAAgB,mBAChBhH,EAAiB,oBACjBiH,EAAiB,oBACjBC,EAAoB,uBACpBb,EAAsB,yBACtBnG,EAAS,YACTC,EAAK,QACLC,EAAU,aACVC,EAAM,SACNC,EAAW,cAGL,EAAgC,oBAAS,GAAxC6G,EAAW,KAAEC,EAAc,KAqB5BC,EAAe,iBAAO,IAAI,aAAW,IAAIC,YAnBjB,SAACC,GAC3B,IAAIC,EAAU,GACRC,EAAOC,OAAOH,GAYpB,GAVKA,EAGII,MAAMF,GACXD,EAAU,kCAELD,EAAM3D,OAAS,IACpB4D,EAAU,2CANVA,EAAU,6BASVA,EACA,OAAOA,MAKT,EAAwB,oBAAS,GAAhCI,EAAO,KAAEC,EAAU,KACpBC,EAAS,kBAAO,GAChBC,EAAuB,iBAAOhK,GAC9B,EAAsD,mBAASA,EAAcC,iBAA5EgK,EAAsB,KAAEC,EAAyB,KAsBlDlG,EAAsB,qD,4DAmBxB,OAlBMhE,EAAgBgK,EAAqB5F,QACrC+F,GAAWjB,EAAkBkB,cAAcZ,MAE3CN,EAAkBmB,YADlBC,WAAWpB,EAAkBqB,aAAaf,SACR,EAElCgB,EAAiC,CACnCL,OAAM,EACNM,cAAetI,EACfuI,gBAAiBxB,EAAkBmB,YAAeF,EAClD9H,WAAU,EACVC,OAAM,EACNC,YAAW,GAGXwH,EAAO3F,SAAWpE,EAAcO,oBAAsB,IAAkBgB,aACxEvB,EAAc2K,IAAMrB,EAAalF,QAAQoF,OAG7C,GAAMpH,EAAMwI,oBAAoB5K,EAAewK,I,cAA/C,S,YAGEK,EAAsB,qD,wDACL,SAAMvB,EAAalF,QAAQmD,Y,cAAxCuD,EAAa,SACnB3B,GAAsBU,IAAYiB,EAAWtD,U,YAiBjD,OALA,qBAAU,WACNc,EAAuBtE,GAVL,mC,mEACF7B,EAAY,GAAMC,EAAM2I,WAAW5I,GAAa,KAAhD,M,cAAY,W,aACtB,SAAMC,EAAM4I,sBAAsBzI,GAAe,K,OAAjD,W,wBACA0I,GAAgBC,OAFhBA,EAAU,QAEa,EAAPA,EAASC,uBAAuB,EACtDrB,EAAWmB,GACX9B,GAAsB8B,GACtBlB,EAAO3F,QAAU6G,E,aAMlB,IAGC,oCACI,yBAAKrK,UAAW,IAAW,0BAA2B,IAAOwK,wBACzD,yBAAKxK,UAAW,IAAW,8BAA+B,IAAOyK,2BAC7D,yBAAKzK,UAAW,IAAW,qBAAsB,IAAO0K,kBAAmBpK,IAAKlB,EAAcG,MAAQ,oCAAqCgB,IAAKnB,EAAcQ,cAC9J,yBAAKI,UAAW,IAAW,qBAAsB,IAAO2K,mBACnDvL,EAAcQ,cAEjBR,EAAcE,SAAWF,EAAcwL,eACrC,yBAAK5K,UAAW,IAAW,4BAA6B,IAAO6K,yBAC1DzL,EAAcE,SAAY,kBAACwL,EAAA,EAAI,CAACC,MAAM,UAAUpF,KAAK,QAAQ3F,UAAW,IAAOgL,mBAC/E5L,EAAcwL,cAAiB,kBAACE,EAAA,EAAI,CAACC,MAAM,kBAAkBpF,KAAK,QAAQ3F,UAAW,IAAOiL,0BAIxGhC,GAAW7J,EAAcO,oBAAsB,IAAkBgB,YAAe,yBAAKX,UAAW,IAAW,iCAAkC,IAAOkL,8BACjJ,yFACA,kBAAC,IAAQ,CACLC,WAAYzC,EAAalF,QACzB4H,aAAa,MACbC,eAAWhI,EACXiI,UAAW,EACXtL,UAAW,IAAW,sBAAuB,IAAOuL,mBACpDC,YAAY,gBACZC,QAASxB,EACTyB,OAAQzB,EACR0B,QAAS1B,MAIrB,0BAAMjK,UAAW,IAAO4L,2BACpB,uBAAGzF,QA5Fe,WAC1BsC,GAAe,KA2F0B,0BAGpCD,GACG,kBAACxH,EAAkB,CACfC,wBAAyBoI,EACzBnI,wBA1FmB,SAAC9B,GAChCiJ,EAAiBjJ,GAEbgK,EAAqB5F,QAAQnE,kBAAoBD,EAAcC,kBAC/DqJ,EAAalF,QAAQoF,MAAQ,GAC7BL,GAAsBU,IAG1BG,EAAqB5F,QAAUpE,EAC/BkK,EAA0BlK,EAAcC,kBAkF5BoC,WAAYA,EACZN,QAhGK,WACjBsH,GAAe,IAgGHrH,OAAQoH,EACRjH,UAAWA,EACXF,kBAAmBA,EACnBC,mBAAoBE,EAAM+I,oBAC1B/I,MAAOA,EACPE,OAAQA,EACRC,YAAaA,M,gDClKpB,EAA8C,SAAC,G,IACxD,IAAAvC,cACIC,EAAe,kBACfC,EAAO,UACPC,EAAI,OACJC,EAAO,UACPC,EAAQ,WACRC,EAAY,eACZC,EAAiB,oBACjBC,EAAW,cAEfC,EAAQ,WACRC,EAAW,cACXC,EAAqB,wBACnB,OACF,oCACI,+BACI,yBAAKC,UAAW,IAAOC,oBACnB,kBAACC,EAAA,EAAK,CAACC,QAASN,EAAUO,SAAU,WAAM,OAAAL,EAAsBV,MAChE,yBAAKW,UAAW,IAAOK,cAAeC,IAAKf,GAAQ,gCAAiCgB,IAAKX,IACzF,yBAAKI,UAAW,IAAO6L,wBAClBvM,GACG,yBAAKU,UAAW,IAAOY,qBACnB,yBAAKZ,UAAW,IAAOa,wBACnB,yBAAKb,UAAW,IAAOc,eAAa,aAKhD,yBAAKd,UAAW,IAAOQ,kBACnB,yBAAKR,UAAW,IAAOS,eAAgBb,GACtCJ,GAAY,yBAAKQ,UAAW,IAAOU,kB,WAA2BlB,GAC9DC,GAAYE,IAAsB,IAAkBgB,YAAe,yBAAKX,UAAW,IAAOU,kBAAmBjB,GAC7GC,GAAiB,yBAAKM,UAAW,IAAOU,kBAAmBhB,OAK3EI,GACG,yBAAKE,UAAW,IAAOe,qB,80CFjBnC,SAAK7B,GACD,8CACA,wCAFJ,CAAK,MAAqB,KAKnB,IAAM,EAAwD,SAAC,G,MAClE+B,EAAuB,0BACvBC,EAAuB,0BACvBC,EAAO,UACPC,EAAM,SACNC,EAAiB,oBACjBC,EAAkB,qBAClBC,EAAS,YACTC,EAAK,QACLC,EAAU,aACVC,EAAM,SACNC,EAAW,cAELhC,EAAoB,iBAAO,IAAkBiC,WAC7CC,EAAiB,iBAAO,IAAI,KAC5BC,EAAU,iBAAO,IAAI,KACrBC,EAAmB,iBAAO,IAAI,IAAoB,CAAEC,GAAIT,GAAa,GAAIU,0BAA0B,KACnG,EAA8C,oBAAS,GAAtDC,EAAkB,KAAEC,EAAqB,KAC1C,EAA8D,oBAAS,GAAtEC,EAA0B,KAAEC,EAA6B,KAC1D,EAA0D,mBAAS,yBAAlEC,EAAwB,KAAEC,EAA2B,KACtD,EAAgE,mBAAS,YAAxEC,EAA2B,KAAEC,EAA8B,KAC5D,EAAoD,mBAAS,EAAsBC,qBAAlFC,EAAqB,KAAEC,EAAwB,KAChDC,EAA+B,mBAC/B,EAAsE,mBAAS5B,GAA9E6B,EAA8B,KAAEC,EAAiC,KAClEC,EAAiC,iBAAO/B,GACxC,EAAwE,oBAAS,GAAhFgC,GAA+B,KAAEC,GAAkC,KAEpEC,GAAoB,iBAA+B,IACnDC,GAAsB,sBAAiCC,GAEvDC,GAAe,WACjBC,GAA0BV,EAA6BW,UAGrDD,GAA4B,SAACnE,GAC3BA,IAEA4D,EAA+BQ,QAAUpE,EAAcC,gBACvD6B,EAAwB9B,IAE5B+B,KAQEsC,GAAiB,IAAwBC,IAAI,KAC7CC,GAAuBF,GAAeE,qBAC5C,IAAMC,WAAU,WAEZ,OADAC,OAAOC,iBAAiB,UAAWH,IAC5B,WACHE,OAAOE,oBAAoB,UAAWJ,QAI9C,IAeIK,GAEAxC,EAAK,KADLyC,GACAzC,EAAK,kBAEH,GAAkE,oBAAS,GAA1E0C,GAA4B,MAAEC,GAA+B,MAE9DC,GAAwB,SAAC/E,G,MACF,QAAzB,EAAAmC,EAAM6C,2BAAmB,SAAEC,SAAQ,SAAAlF,GAC/BA,EAAcS,SAAWT,EAAcC,kBAAoBA,EACvDD,EAAcS,WACdgD,EAA6BW,QAAUpE,EACvC8D,GAAmC1B,EAAM+C,UAAUnF,SA4EzDoF,GAAmB,SAACpF,G,QAElBA,EAAcS,WACW,QAAzB,EAAA2B,EAAM6C,2BAAmB,SAAEC,SAAQ,SAAAlF,GAAmBA,EAAcS,UAAW,MAI/ET,EAAcE,UACW,QAAzB,EAAAkC,EAAM6C,2BAAmB,SAAEC,SAAQ,SAAAlF,GAAmBA,EAAcE,SAAU,MAG9E4C,GACAV,EAAMiD,qBAAoB,SAAAC,G,MACtB,GAAKA,EAAL,CAIA,IAAMC,EAAmBnD,EAAMoD,4BAC/B/B,EAA6BW,QAAUmB,EACvC5B,EAAsE,QAApC,EAAAF,EAA6BW,eAAO,eAAEnE,iBAExEkE,GAA0BoB,OAG9BnD,EAAMqD,qBAAuBzC,EAC7BZ,EAAMgD,iBAAiBpF,IAChBA,EAAcO,oBAAsB,IAAkBgB,YAAcU,IAC3EG,EAAMsD,0BAAyB,SAAAC,GAC3BlC,EAA6BW,QAAUuB,EACvChC,EAAkCgC,EAAG1F,iBACrCiE,SAGJT,EAA6BW,QAAUpE,EACvC2D,EAAkC3D,EAAcC,iBAChDiE,OAIF0B,GAAgC,WAClCvC,EAA+BU,GAAkBK,QAAQyB,OAAS,EAC9D,mBAAqB,yBAwD7B,OAxBA,qBAAU,WACNzD,EAAM0D,iBAAmB3D,EACzBC,EAAM2D,mBAAqBxD,EAC3BH,EAAM4D,cAAgB1D,EACtBF,EAAM6D,kCAAiC,WACnClB,IAAgC,MAEpCH,OACD,CAACA,KAEJ,qBAAU,WACNI,GAAsBtB,KACvB,CAACA,EAAgCtB,EAAM6C,sBAE1C,qBAAU,WACNtC,EAAiByB,QAAQ8B,yBAA2B7B,GAAe8B,4BAA4BjE,GAC/FS,EAAiByB,QAAQgC,wBAA0B/B,GAAegC,2BAA2BnE,GAC7FS,EAAiByB,QAAQG,qBAAuBA,KACjD,IAEH,qBAAU,WAnKNpB,EAA4BI,IAA0B,EAAsB+C,iBACxE,qBAAuB,2BAoK5B,CAAC/C,IAGA,kBAAC,WAAQ,CACLgD,KAAM,aAAWC,EACjBkG,MAAM,QACNjG,KAAMzE,EACND,QAzCa,W,MACjB,GAAI6B,EAA+BQ,QAAS,CAExC,IAAMsC,EAAgD,QAAzB,EAAAtE,EAAM6C,2BAAmB,eAAE0B,MAAK,SAAAhB,GAAK,OAAAA,EAAE1F,kBAAoB2D,EAA+BQ,WACnHsC,GACA5E,EAAwB4E,GAIhC3E,KAiCI4K,oBAAqB,wBACrB/L,UAAW,wBACXgG,UAAQ,EACRC,MACI,0BAAMjG,UAAW,+BACZsC,GAGT4D,OACIvD,IAA0B,EAAsBD,oBAC5C,kBAAC,cAAW,CAAC1C,UAAW,wBACpB,kBAAC,SAAM,CAACmG,QAxNH,WACrBtE,EAAe2B,QAAU,IAAI,IAC7B1B,EAAQ0B,QAAU,IAAI,IACtBzB,EAAiByB,QAAU,IAAI,IAAoB,CAAExB,GAAIT,GAAa,GAAIU,0BAA0B,IACpGF,EAAiByB,QAAQ8B,yBAA2B7B,GAAe8B,4BAA4BjE,GAC/FS,EAAiByB,QAAQG,qBAAuBA,GAChDf,EAAyB,EAAsB8C,mBAkNI1F,UAAW,2BAA8B,sBAG5E,kBAAC,SAAM,CAACV,SAAO,EAAC8G,SAAUnD,GAAiCkD,QAAS7C,GAActD,UAAW,4BAA+B,WAI/H,kBAAC,cAAW,CAACA,UAAW,wBACrB,kBAAC,SAAM,CAACmG,QA5LM,WAC9BvD,EAAyB,EAAsBF,sBA2La1C,UAAW,2BAA8B,QAGrF,kBAAC,SAAM,CAACV,SAAO,EAAC6G,QA3LH,qD,8DAC7B,IAAK/C,GAAoBI,QACrB,UAIJ,GAAI7D,EAAkB6D,UAAY,IAAkB5B,UAAW,CAC3D,GAAIuB,GAAkBK,QAAQyB,OAAS,EAUnC,OARMoB,EAAmBlD,GAAkBK,QACtC8C,QAAO,SAAAC,GAAW,OAAAA,EAAQ1G,YAAU,GAEnC2G,EAAyBhF,EAAMiF,oCAAoCJ,EACrEjE,GAA8BF,GAGlCsC,GAAiBgC,GACjB,IAEApD,GAAoBI,U,OAIxB7D,EAAkB6D,UAAY,IAAkB7C,WAAhD,MACIU,IACmB,GAAMU,EAAiByB,QAAQkD,KAAKC,YADvD,M,OAEA,OADmB,SACJC,SACX,MAGExH,EAAgB,CAAEC,gBAAiB,IAC3BM,kBAAoB,IAAkBgB,WAEpD6D,GAAiBpF,G,cAEK,SAAMoC,EAAMqF,wBAAwBhF,EAAe2B,QACrEpB,GAA8BF,I,OAGlC,KAJM9C,EAAgB,UAKlB,UAGJoF,GAAiBpF,G,wBAIrBO,EAAkB6D,UAAY,IAAkBsD,IAAhD,MACyB,GAAMtF,EAAMuF,uBAAuBjF,EAAQ0B,QAChEpB,GAA8BF,I,OAGlC,KAJM8E,EAAmB,UAKrB,UAGJxC,GAAiBwC,G,mCAmI8ChH,UAAW,mCACzDwC,KAKhBG,IAA0B,EAAsBD,qBAC5C,kBAAC,WAAQ,CAACiD,KAAK,SAAS3F,UAAW,e,kCACA,IAChC,kBAAC,OAAI,CAACiH,MAAM,UAAUd,QAnOL,WAC7BhF,IACA8C,OAiOmE,c,KAI9DC,GACG,yBAAKlE,UAAW,cACZ,kBAAC,UAAO,CAACA,UAAW,YACpB,kBAAC,WAAQ,CAAC2F,KAAK,QAAQ3F,UAAW,kBAAqB,qCAI1D2C,IAA0B,EAAsBD,oBAChD,yBAAK1C,UAAW,qBAEgB,QAAzB,EAAAwB,EAAM6C,2BAAmB,eAAE6C,KACvB,SAAC9H,EAAe+H,GACZ,yBAAC,EAAgB,CACbC,IAAKhI,EAAcC,gBACnBD,cAAeA,EACfS,SAAUiD,IAAmC1D,EAAcC,gBAC3DS,YAAaqH,IAAU3F,EAAM6C,oBAAqBY,OAAS,EAC3DlF,sBAAuB,SAAAV,GACnBD,EAAcS,UAAW,EACzBuE,GAAsBhF,EAAcC,iBACpC0D,EAAkC1D,UAItD,kBAAC,IAAc,CACXgI,aAAcxF,EAAe2B,QAC7B/B,WAAYA,EACZ6F,eAAgBvF,EAAiByB,QACjCjC,UAAWA,EACXI,YAAaA,EACbD,OAAQA,EACR6F,YAAazF,EAAQ0B,QACrBnC,kBAAmBA,EACnBmG,eAAe,EACfC,sBAAuB,aACvBC,uBAhSW,SAACC,GAC5BvE,GAAoBI,QAAUmE,GAgSdC,qBAtHY,SAACC,GAC7B1E,GAAkBK,QAAUqE,EAC5B7C,MAqHgB8C,qBAlIS,SAACC,GAC1BpI,EAAkB6D,QAAUuE,EACxBA,IAAS,IAAkBpH,WAC3B8B,EAA+B,YACxBsF,IAAS,IAAkBjB,IAClCrE,EAA+B,WAE/BuC,MA4HYgD,kBAAmBxG,EAAMyG,iBACzBC,sBAAuB1G,EAAMyG,iBAC7B/F,mBAAoBA,EACpBC,sBAAuBA,EACvBC,2BAA4BA,EAC5BC,8BAA+BA,EAC/B8F,mBAAoB3G,M,60CGlW/B,EAAkD,SAAC,G,IAC5DpC,EAAa,gBACbiJ,EAAgB,mBAChBhH,EAAiB,oBACjBiH,EAAiB,oBACjBZ,EAAsB,yBACtBa,EAAoB,uBACpBhH,EAAS,YACTC,EAAK,QACLC,EAAU,aACVC,EAAM,SACNC,EAAW,cAGL,EAAgC,oBAAS,GAAxC6G,EAAW,KAAEC,EAAc,KAqB5BC,EAAe,iBAAO,IAAI,aAAW,IAAIC,YAnBjB,SAACC,GAC3B,IAAIC,EAAU,GACRC,EAAOC,OAAOH,GAYpB,GAVKA,EAGII,MAAMF,GACXD,EAAU,kCAELD,EAAM3D,OAAS,IACpB4D,EAAU,2CANVA,EAAU,6BASVA,EACA,OAAOA,MAKT,EAAwB,oBAAS,GAAhCI,EAAO,KAAEC,EAAU,KACpBC,EAAS,kBAAO,GAChBC,EAAuB,iBAAOhK,GAC9B,EAAsD,mBAASA,EAAcC,iBAA5EgK,EAAsB,KAAEC,EAAyB,KAsBlDlG,EAAsB,qD,4DAmBxB,OAlBMhE,EAAgBgK,EAAqB5F,QACrC+F,GAAWjB,EAAkBkB,cAAcZ,MAE3CN,EAAkBmB,YADlBC,WAAWpB,EAAkBqB,aAAaf,SACR,EAElCgB,EAAiC,CACnCL,OAAM,EACNM,cAAetI,EACfuI,gBAAiBxB,EAAkBmB,YAAeF,EAClD9H,WAAU,EACVC,OAAM,EACNC,YAAW,GAGXwH,EAAO3F,SAAWpE,EAAcO,oBAAsB,IAAkBgB,aACxEvB,EAAc2K,IAAMrB,EAAalF,QAAQoF,OAG7C,GAAMpH,EAAMwI,oBAAoB5K,EAAewK,I,cAA/C,S,YAGEK,EAAsB,qD,wDACL,SAAMvB,EAAalF,QAAQmD,Y,cAAxCuD,EAAa,SACnB3B,GAAsBU,IAAYiB,EAAWtD,U,YAiBjD,OALA,qBAAU,WACNc,EAAuBtE,GAVL,mC,mEACF7B,EAAY,GAAMC,EAAM2I,WAAW5I,GAAa,KAAhD,M,cAAY,W,aACtB,SAAMC,EAAM4I,sBAAsBzI,GAAe,K,OAAjD,W,wBACA0I,GAAgBC,OAFhBA,EAAU,QAEa,EAAPA,EAASC,uBAAuB,EACtDrB,EAAWmB,GACX9B,GAAsB8B,GACtBlB,EAAO3F,QAAU6G,E,aAMlB,IAGC,oCACI,yBAAKrK,UAAW,IAAW,0BAA2B,IAAOwK,wBACzD,yBAAKxK,UAAW,IAAW,8BAA+B,IAAOyK,2BAC7D,yBAAKzK,UAAW,IAAW,qBAAsB,IAAO0K,iBACpDtL,EAAcE,SAAWF,EAAcwL,aAAe,IAAOoB,2BAA6B,IAC3F1L,IAAKlB,EAAcG,MAAQ,oCAAqCgB,IAAKnB,EAAcQ,cACtF,yBAAKI,UAAW,IAAOiM,mBACjB7M,EAAcE,SAAWF,EAAcwL,eACrC,yBAAK5K,UAAW,IAAOkM,8BAClB9M,EAAcE,SAAY,kBAACwL,EAAA,EAAI,CAACC,MAAM,UAAUpF,KAAK,QAAQ3F,UAAW,IAAOgL,mBAC/E5L,EAAcwL,cAAiB,kBAACE,EAAA,EAAI,CAACC,MAAM,kBAAkBpF,KAAK,QAAQ3F,UAAW,IAAOiL,yBAGrG,yBAAKjL,UAAW,IAAW,qBAAsB,IAAO2K,mBACnDvL,EAAcQ,eAI1BqJ,GAAW7J,EAAcO,oBAAsB,IAAkBgB,YAAe,yBAAKX,UAAW,IAAW,iCAAkC,IAAOkL,8BACjJ,yFACA,kBAAC,IAAQ,CACLC,WAAYzC,EAAalF,QACzB4H,aAAa,MACbC,eAAWhI,EACXiI,UAAW,EACXtL,UAAW,IAAW,sBAAuB,IAAOuL,mBACpDC,YAAY,gBACZC,QAASxB,EACTyB,OAAQzB,EACR0B,QAAS1B,MAIrB,0BAAMjK,UAAW,IAAO4L,2BACpB,uBAAGzF,QAhGe,WAC1BsC,GAAe,KA+F0B,0BAGpCD,GACG,kBAAC,EAAkB,CACfvH,wBAAyBoI,EACzBnI,wBA9FmB,SAAC9B,GAChCiJ,EAAiBjJ,GAEbgK,EAAqB5F,QAAQnE,kBAAoBD,EAAcC,kBAC/DqJ,EAAalF,QAAQoF,MAAQ,GAC7BL,GAAsBU,IAG1BG,EAAqB5F,QAAUpE,EAC/BkK,EAA0BlK,EAAcC,kBAsF5BoC,WAAYA,EACZN,QApGK,WACjBsH,GAAe,IAoGHrH,OAAQoH,EACRjH,UAAWA,EACXF,kBAAmBA,EACnBC,mBAAoBE,EAAM+I,oBAC1B/I,MAAOA,EACPE,OAAQA,EACRC,YAAaA,M,s1CC7IpBwK,EAAiD,SAAC,G,IAC3D7D,EAAiB,oBACjBjB,EAAY,eACZC,EAAc,iBACdC,EAAW,cACXlG,EAAiB,oBACjBoG,EAAqB,wBACrBc,EAAoB,uBACpBb,EAAsB,yBACtBE,EAAoB,uBACpBwE,EAAwB,2BACxB5E,EAAa,gBACbjG,EAAS,YACT8K,EAAsB,yBACtB3K,EAAM,SACND,EAAU,aACVE,EAAW,cACXmG,EAAoB,uBAAE,IAAAwE,gBAAQ,IAAG,GAAI,EAE/B9K,EAAQ,IAAwBkC,IAAI,KAEpC,EAA8C,mBAASlC,EAAM+K,iBAA5DrK,EAAkB,KAAEC,EAAqB,KAC1C,EAA8D,mBAASX,EAAM+K,iBAA5EnK,EAA0B,KAAEC,EAA6B,KAC1D,EAAkC,wBAAwCgB,GAAzEmJ,EAAY,KAAEC,EAAe,KAE9BC,EAAalL,EAAM+K,gBAEnBI,EAA8BnL,EAAMoL,iCAEpC,EAAkC,wBAAuBvJ,GAAxDwJ,EAAY,KAAEC,EAAe,KAE9B,EAAwB,oBAAS,GAAhCC,EAAO,KAAEC,EAAU,KAqC1B,OAvBA,qBAAU,WACNxL,EAAM6D,kCAAiC,SAAAjG,GACnCqN,EAAgBrN,GAChB4N,GAAW,MAEfxL,EAAMyL,sBAAqB,SAAAC,GACvBJ,EAAgBI,MAEpB1L,EAAM0D,iBAAmB3D,EACzBC,EAAM2D,mBAAqBxD,EAC3BH,EAAM4D,cAAgB1D,EACtBF,EAAMwC,MAAK,WACFxC,EAAM+K,iBAAoB/K,EAAMoL,kCAEjCI,GAAW,QAGpB,CAACxL,EAAMwC,OAEV,qBAAU,WA/B2B,mC,kCAC7BwI,GAAgBE,IAChBjF,GAAuB+E,EAAa5B,cACpCkC,EAAgBN,EAAa5B,aACzB,sDAAmDvH,GACvD+I,EAAyB,YAAYI,EAAaW,KAAI,eAAeX,EAAaY,QAC9EtF,GACAA,EAAqB0E,EAAa7M,oB,YA0B3C,CAAC6M,IAEIO,EACH,yBAAK/M,UAAW,IAAW,OAAQ,IAAOqN,KAAMf,EAAW,GAAK,IAAOgB,cACpE,8CAECZ,IAAeF,GACZ,iNAGHK,GACG,yBAAK7M,UAAW,IAAW,oCAAqC,IAAOuN,+BACnE,yBAAKvN,UAAW,IAAW,2BAA4B,IAAOwN,uBAC1D,yBAAKxN,UAAW,IAAW,4BAA6B,IAAOyN,uBAC3DnN,IAAI,yCACR,0BAAMN,UAAW,IAAW,iCAAkC,IAAO0N,4BAA0B,yBAInG,yBAAK1N,UAAW,IAAW,yBAA0B,IAAO2N,qBACvDd,IAIZH,GAAcF,EACVF,EAAW,kBAAClE,EAAkB,CAC3BhJ,cAAeoN,EACfnE,iBAAkBoE,EAClBpL,kBAAmBA,EACnBiH,kBAAmBA,EACnBZ,uBAAwBA,EACxBa,qBAAsBA,EACtBhH,UAAWA,EACXG,OAAQA,EACRD,WAAYA,EACZE,YAAaA,EACbH,MAAOA,IACN,kBAAC,EAAwB,CAC1BpC,cAAeoN,EACfnE,iBAAkBoE,EAClBpL,kBAAmBA,EACnBiH,kBAAmBA,EACnBZ,uBAAwBA,EACxBa,qBAAsBA,EACtBhH,UAAWA,EACXG,OAAQA,EACRD,WAAYA,EACZE,YAAaA,EACbH,MAAOA,IAEV,kBAAC,IAAc,CACZD,UAAWA,EACXG,OAAQA,EACRC,YAAaA,EACbF,WAAYA,EACZ6G,kBAAmBA,EACnBjB,aAAcA,EACdC,eAAgBA,EAChBC,YAAaA,EACblG,kBAAmBA,EACnBmG,cAAeA,EACfC,sBAAuBA,EACvBC,uBAAwBA,EACxBE,qBAAsBA,EACtBwE,yBAA0BA,EAC1BpE,kBAAmB2E,EACnBzE,sBAAuByE,EACvBzK,mBAAoBA,EACpBE,2BAA4BA,EAC5BD,sBAAuBA,EACvBE,8BAA+BA,EAC/B8F,mBAAoB3G,EACpB6K,uBAAwBA,EACxBvE,qBAAsBA,KAGlC,6BACI,kBAAC,UAAO,CAAC9H,UAAW,IAAO4N,UAC3B,kBAAC,WAAQ,CAACjI,KAAK,SAAS3F,UAAW,IAAO6N,gBAAc,wC,qOCxKvDC,EAAgB,oBAA2B,SAAC,G,IAAeC,EAAI,iBACxE,OAAIA,EAAKlB,eAAiBkB,EAAKtE,YACpB,KAIP,uBAAKzJ,UAAW,IAAW,OAAQ,IAAOqN,OACtC,4CAEA,yBACIrN,UAAW,IAAW,mBAAoB,CAAEG,QAAS4N,EAAKvE,cAAcZ,SAExE,gBAAC1I,EAAA,EAAK,CAACC,QAAS4N,EAAKvE,cAAcZ,MAAOxI,SAAU2N,EAAKC,uBACzD,wBAAMhO,UAAU,qBAAmB,gBACnC,0BAAQA,UAAW,IAAW,oBAAqB,IAAOiO,aACrD,YAASF,EAAKtE,eAGtBsE,EAAKG,uBACF,6BACI,gBAAChO,EAAA,EAAK,CACFC,SAAU4N,EAAKvE,cAAcZ,MAC7BxI,SAAU2N,EAAKI,wBAEnB,gBAAC,IAAQ,CACLhD,WAAY4C,EAAKpE,aACjByB,aAAa,MACbC,WAAS,EACTG,YAAauC,EAAKvE,cAAcZ,MAAQ,eAAiB,GACzDxI,SAAU2N,EAAKI,sBACf1C,QAASsC,EAAKI,sBACdC,eACIL,EAAKvE,cAAcZ,QAAUmF,EAAKpE,aAAaf,MAAQ,KAAO,IAElEyF,UAAW,W,u3BCpCnC,aAgDI,WAAoBC,EACR/E,GADZ,WAII,GAJgB,KAAA+E,QACR,KAAA/E,SAxCZ,KAAAgF,sBAA2C,SAAC3F,GAKxC,GAJI,EAAK4F,gBACL,EAAKA,iBAGL,EAAKhF,cAAcZ,MACnB,OAAO,EAGX,IAAKA,EACD,MAAO,0BAGX,IAAMW,EAASR,OAAOH,GACtB,GAAII,MAAMO,GACN,MAAO,2BAGX,IAAIkF,EAAgB,EAIpB,YAHyBpL,IAArB,EAAKoG,aAA6B,EAAKA,YAAc,IACrDgF,EAAgB,EAAKhF,aAErBF,EAASkF,EACF,2BAA2B,YAASA,GAAc,SAGpCpL,IAArB,EAAKoG,aAA6BF,EAAS,EAAKE,YACzC,8CADX,GAKJ,KAAAD,cAAgB,IAAI,cAAW,GAC/B,KAAAG,aAAe,IAAI,aAAW,IAAIhB,WAAW+F,KAAKH,uBAElD,KAAA7H,KAAO,IAAI,YAAU,CACjB8C,cAAekF,KAAKlF,cACpBG,aAAc+E,KAAK/E,eAiDvB,KAAAgF,WAAa,WACT,EAAK9B,kBAAexJ,GAGxB,KAAAuL,aAAe,SAACC,EAAsCC,GAGlD,OAFAD,GAAKA,EAAEE,kBAEF,EAAKT,SAKN,EAAK5H,KAAKE,WAAa,EAAK6C,cAAgB,EAAKuF,aAAapF,WAIlE,EAAKoF,aAAapF,QAAQL,OAAS,EAAKC,cAAcyF,EAChD,EAAKxF,YACLV,OAAO,EAAKY,aAAasF,GAE1BH,GACD,EAAKR,MAAMY,QAAQC,KAAK,YAAY,EAAKb,MAAMpQ,MAAMkR,OAAOpN,GAAE,kBAG3D,IAGX,KAAAgM,qBAAuB,WACnB,EAAKxE,cAAcpJ,UAAS,GACxB,EAAKoO,gBACL,EAAKA,kBAIb,KAAAL,sBAAwB,WACpB,EAAK3E,cAAcpJ,UAAS,GACxB,EAAKoO,gBACL,EAAKA,kBA/ELjF,EAGA,OAFAmF,KAAKjF,YAAcF,OACnBmF,KAAKlF,cAAcZ,OAAQ,GAI/B8F,KAAKhI,KAAKC,WAEV+H,KAAKlF,cAAc6F,aAAY,WAC3B,EAAK1F,aAAahD,cAGtB,IAAM3E,EAAKsM,aAAK,EAALA,EAAOpQ,MAAMkR,OAAOpN,GAC1BA,IAIA0M,KAAKM,aAAapF,QAIZ8E,KAAKM,aAAapF,QAAQC,gBAAkB7H,IACnD0M,KAAKM,aAAapF,QAAQC,cAAgB7H,EAC1C0M,KAAKM,aAAapF,QAAQL,YAASlG,GALnCqL,KAAKM,aAAapF,QAAU,CACxBC,cAAe7H,GAOvB0M,KAAKM,aAAa7E,WAAWnI,GAAIsN,MAC7B,SAAChF,GACOA,EAAQiF,SAAW,EACnB,EAAKC,OAAON,QAAQO,QAAQ,YAAYzN,IAI5C,EAAKyH,YAAca,EAAQiF,QAC3B,EAAKrB,uBAAyB5D,EAAQoF,2BAE1C,SAACC,GACG,EAAK9C,aAAe8C,MA6CpC,OArI8B,GAAzB,YAAW,K,gBAAqC,M,mCACxB,GAAxB,YAAW,K,gBAA8B,M,6BAE9B,GAAX,a,4DACW,GAAX,a,2DACW,GAAX,a,qEACW,GAAX,a,gEA+HL,EAtIA,GAkJA,cAGI,WAAYrB,GAAZ,MACI,YAAMA,IAAM,K,OAEZ,EAAKP,KAAO,EAAKO,MAAMP,MAAQ,IAAI,EAAuBO,G,EAMlE,OAZ4C,OASxC,YAAAsB,OAAA,WACI,OAAO,gBAAC9B,EAAa,CAAC+B,UAAWnB,QATzB,GAAX,a,gBAAiB,I,2BADToB,EAAsB,GADlC,W,iCACYA,GAAb,CAA4C,c,qBC/J5C,IAAI5I,EAAM,CACT,OAAQ,KACR,UAAW,KACX,OAAQ,KACR,UAAW,KACX,aAAc,KACd,UAAW,KACX,aAAc,KACd,UAAW,KACX,aAAc,KACd,UAAW,KACX,aAAc,KACd,UAAW,KACX,aAAc,KACd,UAAW,KACX,aAAc,KACd,UAAW,KACX,OAAQ,KACR,UAAW,KACX,OAAQ,KACR,UAAW,KACX,OAAQ,KACR,UAAW,KACX,OAAQ,KACR,UAAW,KACX,OAAQ,KACR,UAAW,KACX,OAAQ,KACR,UAAW,KACX,OAAQ,KACR,UAAW,KACX,OAAQ,KACR,UAAW,KACX,OAAQ,KACR,UAAW,KACX,OAAQ,KACR,UAAW,KACX,OAAQ,KACR,UAAW,KACX,OAAQ,KACR,UAAW,KACX,OAAQ,KACR,UAAW,KACX,OAAQ,KACR,UAAW,KACX,aAAc,KACd,UAAW,KACX,aAAc,KACd,UAAW,KACX,OAAQ,KACR,UAAW,KACX,OAAQ,KACR,UAAW,KACX,UAAW,KACX,aAAc,KACd,UAAW,KACX,aAAc,KACd,UAAW,KACX,aAAc,KACd,UAAW,KACX,aAAc,KACd,UAAW,KACX,aAAc,KACd,UAAW,KACX,aAAc,KACd,UAAW,KACX,aAAc,KACd,OAAQ,KACR,UAAW,KACX,OAAQ,KACR,UAAW,KACX,aAAc,KACd,UAAW,KACX,aAAc,KACd,UAAW,KACX,OAAQ,KACR,UAAW,KACX,OAAQ,KACR,UAAW,KACX,OAAQ,KACR,UAAW,KACX,OAAQ,KACR,UAAW,KACX,OAAQ,KACR,UAAW,KACX,OAAQ,KACR,UAAW,KACX,aAAc,KACd,UAAW,KACX,aAAc,KACd,UAAW,KACX,OAAQ,KACR,UAAW,KACX,OAAQ,KACR,UAAW,KACX,OAAQ,KACR,UAAW,KACX,OAAQ,KACR,UAAW,KACX,aAAc,KACd,gBAAiB,KACjB,OAAQ,KACR,UAAW,KACX,OAAQ,KACR,UAAW,KACX,OAAQ,KACR,UAAW,KACX,OAAQ,KACR,UAAW,KACX,OAAQ,KACR,UAAW,KACX,UAAW,KACX,aAAc,KACd,OAAQ,KACR,UAAW,KACX,OAAQ,KACR,UAAW,KACX,OAAQ,KACR,UAAW,KACX,aAAc,KACd,UAAW,KACX,OAAQ,KACR,UAAW,KACX,OAAQ,KACR,UAAW,KACX,OAAQ,KACR,UAAW,KACX,OAAQ,KACR,UAAW,KACX,OAAQ,KACR,UAAW,KACX,OAAQ,KACR,UAAW,KACX,OAAQ,KACR,UAAW,KACX,OAAQ,KACR,UAAW,KACX,OAAQ,KACR,UAAW,KACX,OAAQ,KACR,UAAW,KACX,OAAQ,KACR,UAAW,KACX,OAAQ,KACR,UAAW,KACX,OAAQ,KACR,UAAW,KACX,OAAQ,KACR,UAAW,KACX,OAAQ,KACR,UAAW,KACX,OAAQ,KACR,UAAW,KACX,OAAQ,KACR,UAAW,KACX,OAAQ,KACR,UAAW,KACX,OAAQ,KACR,UAAW,KACX,OAAQ,KACR,UAAW,KACX,aAAc,KACd,UAAW,KACX,OAAQ,KACR,UAAW,KACX,OAAQ,KACR,UAAW,KACX,OAAQ,KACR,UAAW,KACX,OAAQ,KACR,UAAW,KACX,OAAQ,KACR,UAAW,KACX,aAAc,KACd,UAAW,KACX,OAAQ,KACR,UAAW,KACX,UAAW,KACX,aAAc,KACd,OAAQ,KACR,UAAW,KACX,OAAQ,KACR,UAAW,KACX,aAAc,KACd,UAAW,KACX,OAAQ,KACR,UAAW,KACX,OAAQ,KACR,UAAW,KACX,OAAQ,KACR,UAAW,KACX,OAAQ,KACR,UAAW,KACX,OAAQ,KACR,UAAW,KACX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","file":"default.bundle.js?8455f6cd47c5676ed3c3","sourcesContent":["import { CreditCardIssuer } from \"src/api\";\nimport { CreditCardType } from \"src/invoice/types/types\";\n\n\nexport const getCardType = (cardNumber: string) => {\n if (cardNumber.match(/^4[0-9]{6,}$/)) {\n return CreditCardType.Visa;\n } else if (cardNumber.match(/^3[47][0-9]{5,}$/)) {\n return CreditCardType.AmericanExpress;\n } else if (cardNumber.match(/^6(?:011|5[0-9]{2})[0-9]{3,}$/)) {\n return CreditCardType.Discover;\n } else if (cardNumber.match(/^5[1-5][0-9]{5,}|222[1-9][0-9]{3,}|22[3-9][0-9]{4,}|2[3-6][0-9]{5,}|27[01][0-9]{4,}|2720[0-9]{3,}$/)) {\n return CreditCardType.MasterCard;\n }\n\n return CreditCardType.Other;\n};\n\nexport const getCardIcon = (cardType: string) => {\n return cardType === CreditCardType.Visa ? 'assets/images/visa.svg' :\n cardType === CreditCardType.AmericanExpress ? 'assets/images/american-express.svg' :\n cardType === CreditCardType.Discover ? 'assets/images/discover-card.svg' :\n cardType === CreditCardType.MasterCard ? 'assets/images/mastercard.svg' : '';\n};\n\nexport const getCardNameByIssuer = (issuer: CreditCardIssuer) => {\n return issuer === CreditCardIssuer.NUMBER_3 ? CreditCardType.AmericanExpress :\n issuer === CreditCardIssuer.NUMBER_4 ? CreditCardType.Visa :\n issuer === CreditCardIssuer.NUMBER_5 ? CreditCardType.MasterCard :\n issuer === CreditCardIssuer.NUMBER_6 ? CreditCardType.Discover :\n CreditCardType.Other;\n};\n\nexport const getIssuerByCardType = (cardType: string | undefined) => {\n return cardType === CreditCardType.AmericanExpress ? CreditCardIssuer.NUMBER_3 :\n cardType === CreditCardType.Visa ? CreditCardIssuer.NUMBER_4 :\n cardType === CreditCardType.MasterCard ? CreditCardIssuer.NUMBER_5 :\n cardType === CreditCardType.Discover ? CreditCardIssuer.NUMBER_6 :\n CreditCardIssuer.NUMBER_0;\n}","import React, { useState, useEffect, useRef } from 'react';\nimport {\n Modal,\n Button,\n ButtonGroup,\n Card,\n BodyText,\n Link,\n Spinner\n} from '@servicetitan/design-system';\nimport { ModalSizes } from '@servicetitan/design-system/dist/components/Modal/components';\nimport * as styles from './payment-method-modal.less';\nimport { paymentMethodsContainer } from 'src/payment-method/ioc';\nimport { ConnectedBankAccount, PaymentMethodType, PaymentMethodInfo } from 'src/invoice/types/types';\nimport { SavedPaymentItem } from '../payment-methods/desktop/saved-payment-item';\nimport { PaymentMethods } from '../payment-methods/desktop/payment-methods';\nimport { CardInfoFormState } from '../card-info/card-info/card-info';\nimport { PGCardInfoFormState } from '../card-info/pg-card-info/pg-card-info';\nimport { AchInfoFormState } from '../ach-info/ach-info/ach-info';\nimport { PaymentGateway } from 'src/statement/stores/payment-gateway.store';\nimport { SavedPaymentMethodsStore } from 'src/payment-method/stores/saved-payment-methods.store';\nimport { ChargeType, SplitInfo } from 'src/api';\n\ninterface PaymentMethodModalProps {\n selectedPaymentMethodId?: number;\n onPaymentMethodSelected: (paymentMethod: PaymentMethodInfo) => void;\n onClose: () => void;\n isOpen: boolean;\n usePaymentGateway: () => boolean;\n usePaymentsService: boolean | undefined;\n invoiceId?: string;\n store: SavedPaymentMethodsStore;\n chargeType: ChargeType;\n splits?: SplitInfo[];\n statementId?: string;\n}\n\nenum PaymentMethodViewType {\n SelectPaymentMethod = 'select-payment-method',\n AddPaymentMethod = 'add-payment-method'\n}\n\nexport const PaymentMethodModal: React.FC = ({\n selectedPaymentMethodId,\n onPaymentMethodSelected,\n onClose,\n isOpen,\n usePaymentGateway,\n usePaymentsService,\n invoiceId,\n store,\n chargeType,\n splits,\n statementId\n}) => {\n const paymentMethodType = useRef(PaymentMethodType.PayByBank);\n const creditCardInfo = useRef(new CardInfoFormState);\n const achInfo = useRef(new AchInfoFormState);\n const pgCreditCardInfo = useRef(new PGCardInfoFormState({ id: invoiceId || '', skipIFrameMessageHandler: true }));\n const [savePaymentChecked, setSavePaymentChecked] = useState(true);\n const [useAsPrimaryPaymentChecked, setUseAsPrimaryPaymentChecked] = useState(true);\n const [paymentMethodDialogTitle, setPaymentMethodDialogTitle] = useState('Select A Different Payment Method');\n const [addPaymentMethodButtonTitle, setAddPaymentMethodButtonTitle] = useState('Add Card');\n const [paymentMethodViewType, setPaymentMethodViewType] = useState(PaymentMethodViewType.SelectPaymentMethod);\n const currentSelectedPaymentMethod = useRef();\n const [currentSelectedPaymentMethodId, setCurrentSelectedPaymentMethodId] = useState(selectedPaymentMethodId);\n const initialSelectedPaymentMethodId = useRef(selectedPaymentMethodId);\n const [isCurrentSelectedPaymentInValid, setIsCurrentSelectedPaymentInValid] = useState(false)\n\n const connectedAccounts = useRef([]);\n const paymentMethodAction = useRef<(() => void) | undefined>(undefined);\n\n const handleSelect = () => {\n handleSelectPaymentMethod(currentSelectedPaymentMethod.current)\n };\n\n const handleSelectPaymentMethod = (paymentMethod?: PaymentMethodInfo) => {\n if (paymentMethod) {\n // Update initial selected payment method if it is changed\n initialSelectedPaymentMethodId.current = paymentMethod.paymentMethodId;\n onPaymentMethodSelected(paymentMethod);\n }\n onClose();\n }\n\n\n const setPaymentMethodAction = (action: () => void) => {\n paymentMethodAction.current = action;\n };\n\n const paymentGateway = paymentMethodsContainer.get(PaymentGateway);\n const iframeMessageHandler = paymentGateway.iframeMessageHandler;\n React.useEffect(() => {\n window.addEventListener('message', iframeMessageHandler);\n return () => {\n window.removeEventListener('message', iframeMessageHandler);\n };\n });\n\n const handleAddPayment = () => {\n creditCardInfo.current = new CardInfoFormState;\n achInfo.current = new AchInfoFormState;\n pgCreditCardInfo.current = new PGCardInfoFormState({ id: invoiceId || '', skipIFrameMessageHandler: true });\n pgCreditCardInfo.current.desktopPaymentGatewayUrl = paymentGateway.getDesktopPaymentGatewayUrl(usePaymentsService);\n pgCreditCardInfo.current.iframeMessageHandler = iframeMessageHandler;\n setPaymentMethodViewType(PaymentMethodViewType.AddPaymentMethod);\n };\n\n const redirectToCardManagePage = () => {\n onClose();\n gotoSavedCardPage();\n }\n\n const {\n init,\n gotoSavedCardPage\n } = store;\n\n const [isLoadingSavedPaymentMethods, setIsLoadingSavedPaymentMethods] = useState(true);\n\n const preparePaymentOptions = (paymentMethodId: number | undefined) => {\n store.savedPaymentMethods?.forEach(paymentMethod => {\n paymentMethod.selected = paymentMethod.paymentMethodId === paymentMethodId;\n if (paymentMethod.selected) {\n currentSelectedPaymentMethod.current = paymentMethod;\n setIsCurrentSelectedPaymentInValid(store.isExpired(paymentMethod));\n }\n });\n };\n\n const updateDialogView = () => {\n setPaymentMethodDialogTitle(paymentMethodViewType === PaymentMethodViewType.AddPaymentMethod ?\n 'Add Payment Method' : 'Select A Different Payment Method');\n }\n\n const onBackForAddPaymentMethod = () => {\n setPaymentMethodViewType(PaymentMethodViewType.SelectPaymentMethod);\n }\n\n const onAddForAddPaymentMethod = async () => {\n if (!paymentMethodAction.current) {\n return;\n }\n\n // Pay-By-Bank after adding account action\n if (paymentMethodType.current === PaymentMethodType.PayByBank) {\n if (connectedAccounts.current.length > 0) {\n\n const connectedAccount = connectedAccounts.current\n .filter(account => account.selected)[0];\n\n const payByBankPaymentMethod = store.connectedBankAccountToPaymentMethod(connectedAccount,\n useAsPrimaryPaymentChecked && savePaymentChecked\n );\n\n addPaymentMethod(payByBankPaymentMethod);\n return;\n } else {\n paymentMethodAction.current();\n }\n }\n\n if (paymentMethodType.current === PaymentMethodType.CreditCard) {\n if (usePaymentGateway()) {\n const cardResult = await pgCreditCardInfo.current.form.validate();\n if (cardResult.hasError) {\n return;\n }\n\n const paymentMethod = { paymentMethodId: 0 } as PaymentMethodInfo;\n paymentMethod.paymentMethodType = PaymentMethodType.CreditCard;\n\n addPaymentMethod(paymentMethod);\n } else {\n const paymentMethod = await store.cardInfoToPaymentMethod(creditCardInfo.current,\n useAsPrimaryPaymentChecked && savePaymentChecked\n );\n\n if (!paymentMethod) {\n return;\n }\n\n addPaymentMethod(paymentMethod);\n }\n }\n\n if (paymentMethodType.current === PaymentMethodType.ACH) {\n const achPaymentMethod = await store.achInfoToPaymentMethod(achInfo.current,\n useAsPrimaryPaymentChecked && savePaymentChecked\n );\n\n if (!achPaymentMethod) {\n return;\n }\n\n addPaymentMethod(achPaymentMethod);\n }\n\n // paymentMethodAction.current();\n };\n\n const addPaymentMethod = (paymentMethod: PaymentMethodInfo) => {\n // reset selected if newly added payment is selected\n if (paymentMethod.selected) {\n store.savedPaymentMethods?.forEach(paymentMethod => { paymentMethod.selected = false; });\n }\n\n // reset primary if newly added payment is primary\n if (paymentMethod.primary) {\n store.savedPaymentMethods?.forEach(paymentMethod => { paymentMethod.primary = false; });\n }\n\n if (savePaymentChecked) {\n store.setOnActionComplete(success => {\n if (!success) {\n return;\n }\n\n\n const lastSavedPayment = store.getLastSavedPaymentMethod();\n currentSelectedPaymentMethod.current = lastSavedPayment;\n setCurrentSelectedPaymentMethodId(currentSelectedPaymentMethod.current?.paymentMethodId);\n\n handleSelectPaymentMethod(lastSavedPayment);\n });\n\n store.needToStoreAsPrimary = useAsPrimaryPaymentChecked;\n store.addPaymentMethod(paymentMethod);\n } else if (paymentMethod.paymentMethodType === PaymentMethodType.CreditCard && usePaymentGateway()) {\n store.processGatewayAddNewCard(p => {\n currentSelectedPaymentMethod.current = p;\n setCurrentSelectedPaymentMethodId(p!.paymentMethodId);\n handleSelect();\n });\n } else {\n currentSelectedPaymentMethod.current = paymentMethod;\n setCurrentSelectedPaymentMethodId(paymentMethod.paymentMethodId);\n handleSelect();\n }\n };\n\n const updateButtonTitleForPayByBank = () => {\n setAddPaymentMethodButtonTitle(connectedAccounts.current.length > 0 ?\n 'Add Bank Account' : 'Connect Bank Account'\n );\n }\n\n const setPaymentMethodType = (type: PaymentMethodType) => {\n paymentMethodType.current = type;\n if (type === PaymentMethodType.CreditCard) {\n setAddPaymentMethodButtonTitle('Add Card');\n } else if (type === PaymentMethodType.ACH) {\n setAddPaymentMethodButtonTitle('Add ACH');\n } else {\n updateButtonTitleForPayByBank();\n }\n };\n\n const updateConnectedAccounts = (accounts: ConnectedBankAccount[]) => {\n connectedAccounts.current = accounts;\n updateButtonTitleForPayByBank();\n };\n\n const onModalClose = () => {\n if (initialSelectedPaymentMethodId.current) {\n // Set original selected payment if closing dialog without selection\n const initialPaymentMethod = store.savedPaymentMethods?.find(p => p.paymentMethodId === initialSelectedPaymentMethodId.current);\n if (initialPaymentMethod) {\n onPaymentMethodSelected(initialPaymentMethod);\n }\n }\n\n onClose();\n }\n\n useEffect(() => {\n store.currentInvoiceId = invoiceId;\n store.currentStatementId = statementId;\n store.currentSplits = splits;\n store.setOnSelectedPaymentMethodChange(() => {\n setIsLoadingSavedPaymentMethods(false);\n });\n init();\n }, [init]);\n\n useEffect(() => {\n preparePaymentOptions(currentSelectedPaymentMethodId);\n }, [currentSelectedPaymentMethodId, store.savedPaymentMethods]);\n\n useEffect(() => {\n pgCreditCardInfo.current.desktopPaymentGatewayUrl = paymentGateway.getDesktopPaymentGatewayUrl(usePaymentsService);\n pgCreditCardInfo.current.mobilePaymentGatewayUrl = paymentGateway.getMobilePaymentGatewayUrl(usePaymentsService);\n pgCreditCardInfo.current.iframeMessageHandler = iframeMessageHandler;\n }, []);\n\n useEffect(() => {\n updateDialogView();\n }, [paymentMethodViewType]);\n\n return (\n \n \n \n ) :\n (\n \n \n )\n }\n >\n {paymentMethodViewType === PaymentMethodViewType.SelectPaymentMethod &&\n (\n You can also {' '}\n \n manage\n {' '} your saved payment methods.\n )}\n {isLoadingSavedPaymentMethods ? (\n
\n \n \n Loading saved payment methods...\n \n
\n ) : (paymentMethodViewType === PaymentMethodViewType.SelectPaymentMethod ?\n (\n {\n store.savedPaymentMethods?.map(\n (paymentMethod, index) =>\n {\n paymentMethod.selected = true;\n preparePaymentOptions(paymentMethod.paymentMethodId);\n setCurrentSelectedPaymentMethodId(paymentMethodId);\n }} />\n )}\n ) : (\n { }}\n setPaymentMethodAction={setPaymentMethodAction}\n setConnectedAccounts={updateConnectedAccounts}\n setPaymentMethodType={setPaymentMethodType}\n showPrimaryOption={store.getIsCPEnabled()}\n showSavePaymentOption={store.getIsCPEnabled()}\n savePaymentChecked={savePaymentChecked}\n setSavePaymentChecked={setSavePaymentChecked}\n useAsPrimaryPaymentChecked={useAsPrimaryPaymentChecked}\n setUseAsPrimaryPaymentChecked={setUseAsPrimaryPaymentChecked}\n paymentMethodStore={store}\n />\n )\n )}\n \n );\n}\n","import React, { FC } from 'react';\n\n\nimport styles from './saved-payment-item.less';\nimport { PaymentMethodType, PaymentMethodInfo } from 'src/invoice/types/types';\nimport { Radio } from '@material-ui/core';\n\ninterface SavedPaymentItemProps {\n paymentMethod: PaymentMethodInfo;\n showDivider: boolean;\n selected: boolean;\n onSelectPaymentMethod: (paymentMethodId: number) => void;\n}\n\nexport const SavedPaymentItem: FC = ({\n paymentMethod: {\n paymentMethodId,\n primary,\n icon,\n expires,\n bankName,\n customerName,\n paymentMethodType,\n displayText\n },\n selected,\n showDivider,\n onSelectPaymentMethod\n}) => (\n <>\n \n {showDivider && (\n
\n )}\n \n);","import React, { useState, useEffect, useRef } from 'react';\nimport {\n Button,\n ButtonGroup,\n BodyText,\n Link,\n Spinner,\n Takeover\n} from '@servicetitan/design-system';\nimport { ModalSizes } from '@servicetitan/design-system/dist/components/Modal/components';\nimport * as styles from './payment-method-modal.less';\nimport { paymentMethodsContainer } from 'src/payment-method/ioc';\nimport { ConnectedBankAccount, PaymentMethodType, PaymentMethodInfo } from 'src/invoice/types/types';\nimport { SavedPaymentItem } from '../../payment-methods/mobile/saved-payment-item';\nimport { PaymentMethods } from '../../payment-methods/desktop/payment-methods';\nimport { CardInfoFormState } from '../../card-info/card-info/card-info';\nimport { PGCardInfoFormState } from '../../card-info/pg-card-info/pg-card-info';\nimport { AchInfoFormState } from '../../ach-info/ach-info/ach-info';\nimport { PaymentGateway } from 'src/statement/stores/payment-gateway.store';\nimport { SavedPaymentMethodsStore } from 'src/payment-method/stores/saved-payment-methods.store';\nimport { ChargeType, SplitInfo } from 'src/api';\n\ninterface PaymentMethodModalProps {\n selectedPaymentMethodId?: number;\n onPaymentMethodSelected: (paymentMethod: PaymentMethodInfo) => void;\n onClose: () => void;\n isOpen: boolean;\n usePaymentGateway: () => boolean;\n usePaymentsService: boolean | undefined;\n invoiceId?: string;\n store: SavedPaymentMethodsStore;\n chargeType: ChargeType;\n splits?: SplitInfo[];\n statementId?: string;\n}\n\nenum PaymentMethodViewType {\n SelectPaymentMethod = 'select-payment-method',\n AddPaymentMethod = 'add-payment-method'\n}\n\nexport const PaymentMethodModal: React.FC = ({\n selectedPaymentMethodId,\n onPaymentMethodSelected,\n onClose,\n isOpen,\n usePaymentGateway,\n usePaymentsService,\n invoiceId,\n store,\n chargeType,\n splits,\n statementId\n}) => {\n const paymentMethodType = useRef(PaymentMethodType.PayByBank);\n const creditCardInfo = useRef(new CardInfoFormState);\n const achInfo = useRef(new AchInfoFormState);\n const pgCreditCardInfo = useRef(new PGCardInfoFormState({ id: invoiceId || '', skipIFrameMessageHandler: true }));\n const [savePaymentChecked, setSavePaymentChecked] = useState(true);\n const [useAsPrimaryPaymentChecked, setUseAsPrimaryPaymentChecked] = useState(true);\n const [paymentMethodDialogTitle, setPaymentMethodDialogTitle] = useState('Select Payment Method');\n const [addPaymentMethodButtonTitle, setAddPaymentMethodButtonTitle] = useState('Add Card');\n const [paymentMethodViewType, setPaymentMethodViewType] = useState(PaymentMethodViewType.SelectPaymentMethod);\n const currentSelectedPaymentMethod = useRef();\n const [currentSelectedPaymentMethodId, setCurrentSelectedPaymentMethodId] = useState(selectedPaymentMethodId);\n const initialSelectedPaymentMethodId = useRef(selectedPaymentMethodId);\n const [isCurrentSelectedPaymentInValid, setIsCurrentSelectedPaymentInValid] = useState(false);\n\n const connectedAccounts = useRef([]);\n const paymentMethodAction = useRef<(() => void) | undefined>(undefined);\n\n const handleSelect = () => {\n handleSelectPaymentMethod(currentSelectedPaymentMethod.current)\n };\n\n const handleSelectPaymentMethod = (paymentMethod?: PaymentMethodInfo) => {\n if (paymentMethod) {\n // Update initial selected payment method if it is changed\n initialSelectedPaymentMethodId.current = paymentMethod.paymentMethodId;\n onPaymentMethodSelected(paymentMethod);\n }\n onClose();\n }\n\n\n const setPaymentMethodAction = (action: () => void) => {\n paymentMethodAction.current = action;\n };\n\n const paymentGateway = paymentMethodsContainer.get(PaymentGateway);\n const iframeMessageHandler = paymentGateway.iframeMessageHandler;\n React.useEffect(() => {\n window.addEventListener('message', iframeMessageHandler);\n return () => {\n window.removeEventListener('message', iframeMessageHandler);\n };\n });\n\n const handleAddPayment = () => {\n creditCardInfo.current = new CardInfoFormState;\n achInfo.current = new AchInfoFormState;\n pgCreditCardInfo.current = new PGCardInfoFormState({ id: invoiceId || '', skipIFrameMessageHandler: true });\n pgCreditCardInfo.current.desktopPaymentGatewayUrl = paymentGateway.getDesktopPaymentGatewayUrl(usePaymentsService);\n pgCreditCardInfo.current.iframeMessageHandler = iframeMessageHandler;\n setPaymentMethodViewType(PaymentMethodViewType.AddPaymentMethod);\n };\n\n const redirectToCardManagePage = () => {\n onClose();\n gotoSavedCardPage();\n }\n\n const {\n init,\n gotoSavedCardPage\n } = store;\n\n const [isLoadingSavedPaymentMethods, setIsLoadingSavedPaymentMethods] = useState(true);\n\n const preparePaymentOptions = (paymentMethodId: number | undefined) => {\n store.savedPaymentMethods?.forEach(paymentMethod => {\n paymentMethod.selected = paymentMethod.paymentMethodId === paymentMethodId;\n if (paymentMethod.selected) {\n currentSelectedPaymentMethod.current = paymentMethod;\n setIsCurrentSelectedPaymentInValid(store.isExpired(paymentMethod));\n }\n });\n };\n\n const updateDialogView = () => {\n setPaymentMethodDialogTitle(paymentMethodViewType === PaymentMethodViewType.AddPaymentMethod ?\n 'Add Payment Method' : 'Select Payment Method');\n }\n\n const onBackForAddPaymentMethod = () => {\n setPaymentMethodViewType(PaymentMethodViewType.SelectPaymentMethod);\n }\n\n const onAddForAddPaymentMethod = async () => {\n if (!paymentMethodAction.current) {\n return;\n }\n\n // Pay-By-Bank after adding account action\n if (paymentMethodType.current === PaymentMethodType.PayByBank) {\n if (connectedAccounts.current.length > 0) {\n\n const connectedAccount = connectedAccounts.current\n .filter(account => account.selected)[0];\n\n const payByBankPaymentMethod = store.connectedBankAccountToPaymentMethod(connectedAccount,\n useAsPrimaryPaymentChecked && savePaymentChecked\n );\n\n addPaymentMethod(payByBankPaymentMethod);\n return;\n } else {\n paymentMethodAction.current();\n }\n }\n\n if (paymentMethodType.current === PaymentMethodType.CreditCard) {\n if (usePaymentGateway()) {\n const cardResult = await pgCreditCardInfo.current.form.validate();\n if (cardResult.hasError) {\n return;\n }\n\n const paymentMethod = { paymentMethodId: 0 } as PaymentMethodInfo;\n paymentMethod.paymentMethodType = PaymentMethodType.CreditCard;\n\n addPaymentMethod(paymentMethod);\n } else {\n const paymentMethod = await store.cardInfoToPaymentMethod(creditCardInfo.current,\n useAsPrimaryPaymentChecked && savePaymentChecked\n );\n\n if (!paymentMethod) {\n return;\n }\n\n addPaymentMethod(paymentMethod);\n }\n }\n\n if (paymentMethodType.current === PaymentMethodType.ACH) {\n const achPaymentMethod = await store.achInfoToPaymentMethod(achInfo.current,\n useAsPrimaryPaymentChecked && savePaymentChecked\n );\n\n if (!achPaymentMethod) {\n return;\n }\n\n addPaymentMethod(achPaymentMethod);\n }\n\n // paymentMethodAction.current();\n };\n\n const addPaymentMethod = (paymentMethod: PaymentMethodInfo) => {\n // reset selected if newly added payment is selected\n if (paymentMethod.selected) {\n store.savedPaymentMethods?.forEach(paymentMethod => { paymentMethod.selected = false; });\n }\n\n // reset primary if newly added payment is primary\n if (paymentMethod.primary) {\n store.savedPaymentMethods?.forEach(paymentMethod => { paymentMethod.primary = false; });\n }\n\n if (savePaymentChecked) {\n store.setOnActionComplete(success => {\n if (!success) {\n return;\n }\n\n const lastSavedPayment = store.getLastSavedPaymentMethod();\n currentSelectedPaymentMethod.current = lastSavedPayment;\n setCurrentSelectedPaymentMethodId(currentSelectedPaymentMethod.current?.paymentMethodId);\n\n handleSelectPaymentMethod(lastSavedPayment);\n });\n\n store.needToStoreAsPrimary = useAsPrimaryPaymentChecked;\n store.addPaymentMethod(paymentMethod);\n } else if (paymentMethod.paymentMethodType === PaymentMethodType.CreditCard && usePaymentGateway()) {\n store.processGatewayAddNewCard(p => {\n currentSelectedPaymentMethod.current = p;\n setCurrentSelectedPaymentMethodId(p!.paymentMethodId);\n handleSelect();\n });\n } else {\n currentSelectedPaymentMethod.current = paymentMethod;\n setCurrentSelectedPaymentMethodId(paymentMethod.paymentMethodId);\n handleSelect();\n }\n };\n\n const updateButtonTitleForPayByBank = () => {\n setAddPaymentMethodButtonTitle(connectedAccounts.current.length > 0 ?\n 'Add Bank Account' : 'Connect Bank Account'\n );\n }\n\n const setPaymentMethodType = (type: PaymentMethodType) => {\n paymentMethodType.current = type;\n if (type === PaymentMethodType.CreditCard) {\n setAddPaymentMethodButtonTitle('Add Card');\n } else if (type === PaymentMethodType.ACH) {\n setAddPaymentMethodButtonTitle('Add ACH');\n } else {\n updateButtonTitleForPayByBank();\n }\n };\n\n const updateConnectedAccounts = (accounts: ConnectedBankAccount[]) => {\n connectedAccounts.current = accounts;\n updateButtonTitleForPayByBank();\n };\n\n const onModalClose = () => {\n if (initialSelectedPaymentMethodId.current) {\n // Set original selected payment if closing dialog without selection\n const initialPaymentMethod = store.savedPaymentMethods?.find(p => p.paymentMethodId === initialSelectedPaymentMethodId.current);\n if (initialPaymentMethod) {\n onPaymentMethodSelected(initialPaymentMethod);\n }\n }\n\n onClose();\n }\n\n useEffect(() => {\n store.currentInvoiceId = invoiceId;\n store.currentStatementId = statementId;\n store.currentSplits = splits;\n store.setOnSelectedPaymentMethodChange(() => {\n setIsLoadingSavedPaymentMethods(false);\n });\n init();\n }, [init]);\n\n useEffect(() => {\n preparePaymentOptions(currentSelectedPaymentMethodId);\n }, [currentSelectedPaymentMethodId, store.savedPaymentMethods]);\n\n useEffect(() => {\n pgCreditCardInfo.current.desktopPaymentGatewayUrl = paymentGateway.getDesktopPaymentGatewayUrl(usePaymentsService);\n pgCreditCardInfo.current.mobilePaymentGatewayUrl = paymentGateway.getMobilePaymentGatewayUrl(usePaymentsService);\n pgCreditCardInfo.current.iframeMessageHandler = iframeMessageHandler;\n }, []);\n\n useEffect(() => {\n updateDialogView();\n }, [paymentMethodViewType]);\n\n return (\n \n {paymentMethodDialogTitle}\n \n }\n footer={\n paymentMethodViewType === PaymentMethodViewType.SelectPaymentMethod ? (\n \n \n \n ) :\n (\n \n \n )\n }\n >\n {paymentMethodViewType === PaymentMethodViewType.SelectPaymentMethod &&\n (\n To manage your payment methods,{' '}\n \n click here\n .\n )}\n {isLoadingSavedPaymentMethods ? (\n
\n \n \n Loading saved payment methods...\n \n
\n ) : (paymentMethodViewType === PaymentMethodViewType.SelectPaymentMethod ?\n (
\n {\n store.savedPaymentMethods?.map(\n (paymentMethod, index) =>\n {\n paymentMethod.selected = true;\n preparePaymentOptions(paymentMethod.paymentMethodId);\n setCurrentSelectedPaymentMethodId(paymentMethodId);\n }} />\n )}\n
) : (\n { }}\n setPaymentMethodAction={setPaymentMethodAction}\n setConnectedAccounts={updateConnectedAccounts}\n setPaymentMethodType={setPaymentMethodType}\n showPrimaryOption={store.getIsCPEnabled()}\n showSavePaymentOption={store.getIsCPEnabled()}\n savePaymentChecked={savePaymentChecked}\n setSavePaymentChecked={setSavePaymentChecked}\n useAsPrimaryPaymentChecked={useAsPrimaryPaymentChecked}\n setUseAsPrimaryPaymentChecked={setUseAsPrimaryPaymentChecked}\n paymentMethodStore={store}\n />\n )\n )}\n \n );\n}\n","import classNames from 'classnames';\nimport React, { useRef, FC, useEffect, useState } from 'react';\n\n\nimport styles from '../desktop/saved-payment-method.less';\nimport { PaymentMethodInfo, PaymentMethodType } from 'src/invoice/types/types';\nimport { PaymentMethodModal } from '../../payment-method-modal/payment-method-modal';\nimport { Chip } from '@material-ui/core';\nimport { PaymentAmountFormState } from '../../payment-amount/payment-amount';\nimport { PendingInvoicePayment, SavedPaymentMethodsStore } from 'src/payment-method/stores/saved-payment-methods.store';\nimport { ChargeType, SplitInfo } from 'src/api';\nimport { MatField } from 'src/core/components/mat-field';\nimport { FieldState } from 'formstate';\n\ninterface SavedPaymentMethodProps {\n paymentMethod: PaymentMethodInfo;\n setPaymentMethod: (paymentMethod: PaymentMethodInfo) => void;\n setPaymentMethodAction: (action: () => void) => void;\n setSecurityCodeValid: (isValid: boolean) => void;\n paymentAmountData: PaymentAmountFormState;\n usePaymentGateway: () => boolean;\n invoiceId?: string;\n splits?: SplitInfo[];\n store: SavedPaymentMethodsStore;\n chargeType: ChargeType;\n statementId?: string;\n}\n\nexport const SavedPaymentMethod: FC = ({\n paymentMethod,\n setPaymentMethod,\n usePaymentGateway,\n paymentAmountData,\n setSecurityCodeValid,\n setPaymentMethodAction,\n invoiceId,\n store,\n chargeType,\n splits,\n statementId\n}) => {\n\n const [isModalOpen, setIsModalOpen] = useState(false);\n\n const securityCodeValidator = (value: String) => {\n let message = '';\n const code = Number(value);\n\n if (!value) {\n message = 'Security code is required.';\n }\n else if (isNaN(code)) {\n message = 'Security code must be a number.';\n }\n else if (value.length < 3) {\n message = 'Security code must be at least 3 digits'\n }\n\n if (message) {\n return message;\n }\n };\n\n const securityCode = useRef(new FieldState('').validators(securityCodeValidator));\n const [showCvc, setShowCvc] = useState(false);\n const useCvc = useRef(false);\n const currentPaymentMethod = useRef(paymentMethod);\n const [currentPaymentMethodId, setCurrentPaymentMethodId] = useState(paymentMethod.paymentMethodId);\n\n const onChangePaymentMethod = () => {\n setIsModalOpen(true);\n };\n\n const onModalClose = () => {\n setIsModalOpen(false);\n };\n\n const updateCurrentPaymentMethod = (paymentMethod: PaymentMethodInfo) => {\n setPaymentMethod(paymentMethod);\n\n if (currentPaymentMethod.current.paymentMethodId !== paymentMethod.paymentMethodId) {\n securityCode.current.value = '';\n setSecurityCodeValid(!showCvc);\n }\n\n currentPaymentMethod.current = paymentMethod;\n setCurrentPaymentMethodId(paymentMethod.paymentMethodId);\n };\n\n const paymentMethodAction = async () => {\n const paymentMethod = currentPaymentMethod.current;\n const amount = (!paymentAmountData.isFullBalance.value\n ? parseFloat(paymentAmountData.customAmount.value)\n : paymentAmountData.fullBalance) || 0;\n\n const payment: PendingInvoicePayment = {\n amount,\n invoiceNumber: invoiceId!,\n amountRemaining: paymentAmountData.fullBalance! - amount,\n chargeType,\n splits,\n statementId\n };\n\n if (useCvc.current && paymentMethod.paymentMethodType === PaymentMethodType.CreditCard) {\n paymentMethod.cvv = securityCode.current.value;\n }\n\n await store.chargePaymentMethod(paymentMethod, payment);\n };\n\n const securityCodeChanged = async () => {\n const validation = await securityCode.current.validate();\n setSecurityCodeValid(!showCvc || !validation.hasError)\n };\n\n const showOrHideCvc = async () => {\n const invoice = invoiceId ? await store.getInvoice(invoiceId || '')\n : await store.getInvoiceByStatement(statementId || '');\n const shouldShowCvc = invoice?.usesPaymentsService || false;\n setShowCvc(shouldShowCvc);\n setSecurityCodeValid(!shouldShowCvc);\n useCvc.current = shouldShowCvc;\n };\n\n useEffect(() => {\n setPaymentMethodAction(paymentMethodAction);\n showOrHideCvc();\n }, []);\n\n return (\n <>\n
\n
\n {paymentMethod.displayText}\n
\n {paymentMethod.displayText}\n
\n {(paymentMethod.primary || paymentMethod.disconnected) && (\n
\n {paymentMethod.primary && ()}\n {paymentMethod.disconnected && ()}\n
\n )}\n
\n {showCvc && paymentMethod.paymentMethodType === PaymentMethodType.CreditCard && (
\n Enter the security code on this card to finish payment.\n \n
)}\n
\n \n Change payment method\n \n\n {isModalOpen && (\n \n )}\n \n )\n};","import React, { FC } from 'react';\n\n\nimport styles from './saved-payment-item.less';\nimport { PaymentMethodType, PaymentMethodInfo } from 'src/invoice/types/types';\nimport { Radio } from '@material-ui/core';\n\ninterface SavedPaymentItemProps {\n paymentMethod: PaymentMethodInfo;\n showDivider: boolean;\n selected: boolean;\n onSelectPaymentMethod: (paymentMethodId: number) => void;\n}\n\nexport const SavedPaymentItem: FC = ({\n paymentMethod: {\n paymentMethodId,\n primary,\n icon,\n expires,\n bankName,\n customerName,\n paymentMethodType,\n displayText\n },\n selected,\n showDivider,\n onSelectPaymentMethod\n}) => (\n <>\n \n {showDivider && (\n
\n )}\n \n);","import classNames from 'classnames';\nimport React, { useRef, FC, useEffect, useState } from 'react';\n\n\nimport styles from './saved-payment-method.less';\nimport { PaymentMethodInfo, PaymentMethodType } from 'src/invoice/types/types';\nimport { PaymentMethodModal } from '../../payment-method-modal/mobile/payment-method-modal';\nimport { Chip } from '@material-ui/core';\nimport { PaymentAmountFormState } from '../../payment-amount/payment-amount';\nimport { PendingInvoicePayment, SavedPaymentMethodsStore } from 'src/payment-method/stores/saved-payment-methods.store';\nimport { ChargeType, SplitInfo } from 'src/api';\nimport { MatField } from 'src/core/components/mat-field';\nimport { FieldState } from 'formstate';\n\ninterface SavedPaymentMethodProps {\n paymentMethod: PaymentMethodInfo;\n setPaymentMethod: (paymentMethod: PaymentMethodInfo) => void;\n setPaymentMethodAction: (action: () => void) => void;\n setSecurityCodeValid: (isValid: boolean) => void;\n paymentAmountData: PaymentAmountFormState;\n usePaymentGateway: () => boolean;\n invoiceId?: string;\n splits?: SplitInfo[];\n store: SavedPaymentMethodsStore;\n chargeType: ChargeType;\n statementId?: string;\n}\n\nexport const SavedPaymentMethod: FC = ({\n paymentMethod,\n setPaymentMethod,\n usePaymentGateway,\n paymentAmountData,\n setPaymentMethodAction,\n setSecurityCodeValid,\n invoiceId,\n store,\n chargeType,\n splits,\n statementId\n}) => {\n\n const [isModalOpen, setIsModalOpen] = useState(false);\n\n const securityCodeValidator = (value: String) => {\n let message = '';\n const code = Number(value);\n\n if (!value) {\n message = 'Security code is required.';\n }\n else if (isNaN(code)) {\n message = 'Security code must be a number.';\n }\n else if (value.length < 3) {\n message = 'Security code must be at least 3 digits'\n }\n\n if (message) {\n return message;\n }\n };\n\n const securityCode = useRef(new FieldState('').validators(securityCodeValidator));\n const [showCvc, setShowCvc] = useState(false);\n const useCvc = useRef(false);\n const currentPaymentMethod = useRef(paymentMethod);\n const [currentPaymentMethodId, setCurrentPaymentMethodId] = useState(paymentMethod.paymentMethodId);\n\n const onChangePaymentMethod = () => {\n setIsModalOpen(true);\n };\n\n const onModalClose = () => {\n setIsModalOpen(false);\n };\n\n const updateCurrentPaymentMethod = (paymentMethod: PaymentMethodInfo) => {\n setPaymentMethod(paymentMethod);\n\n if (currentPaymentMethod.current.paymentMethodId !== paymentMethod.paymentMethodId) {\n securityCode.current.value = '';\n setSecurityCodeValid(!showCvc);\n }\n\n currentPaymentMethod.current = paymentMethod;\n setCurrentPaymentMethodId(paymentMethod.paymentMethodId);\n };\n\n const paymentMethodAction = async () => {\n const paymentMethod = currentPaymentMethod.current;\n const amount = (!paymentAmountData.isFullBalance.value\n ? parseFloat(paymentAmountData.customAmount.value)\n : paymentAmountData.fullBalance) || 0;\n\n const payment: PendingInvoicePayment = {\n amount,\n invoiceNumber: invoiceId!,\n amountRemaining: paymentAmountData.fullBalance! - amount,\n chargeType,\n splits,\n statementId\n };\n\n if (useCvc.current && paymentMethod.paymentMethodType === PaymentMethodType.CreditCard) {\n paymentMethod.cvv = securityCode.current.value;\n }\n\n await store.chargePaymentMethod(paymentMethod, payment);\n };\n\n const securityCodeChanged = async () => {\n const validation = await securityCode.current.validate();\n setSecurityCodeValid(!showCvc || !validation.hasError)\n };\n\n const showOrHideCvc = async () => {\n const invoice = invoiceId ? await store.getInvoice(invoiceId || '')\n : await store.getInvoiceByStatement(statementId || '');\n const shouldShowCvc = invoice?.usesPaymentsService || false;\n setShowCvc(shouldShowCvc);\n setSecurityCodeValid(!shouldShowCvc);\n useCvc.current = shouldShowCvc;\n };\n\n useEffect(() => {\n setPaymentMethodAction(paymentMethodAction);\n showOrHideCvc();\n }, []);\n\n return (\n <>\n
\n
\n {paymentMethod.displayText}\n
\n {(paymentMethod.primary || paymentMethod.disconnected) && (\n
\n {paymentMethod.primary && ()}\n {paymentMethod.disconnected && ()}\n
\n )}\n
\n {paymentMethod.displayText}\n
\n
\n
\n {showCvc && paymentMethod.paymentMethodType === PaymentMethodType.CreditCard && (
\n Enter the security code on this card to finish payment.\n \n
)}\n
\n \n Change payment method\n \n\n {isModalOpen && (\n \n )}\n \n )\n};","import React, { FC, useEffect, useState } from 'react';\nimport { AchInfoFormState } from '../../ach-info/ach-info/ach-info';\nimport { CardInfoFormState } from '../../card-info/card-info/card-info';\nimport { PGCardInfoFormState } from '../../card-info/pg-card-info/pg-card-info';\nimport { PaymentAmountFormState } from '../../payment-amount/payment-amount';\nimport styles from './payment-method-container.less';\nimport classnames from 'classnames';\nimport { ConnectedBankAccount, PaymentMethodInfo, PaymentMethodType } from 'src/invoice/types/types';\n\nimport { PaymentMethods } from './payment-methods';\nimport { SavedPaymentMethod } from './saved-payment-method';\nimport { SavedPaymentMethod as MobileSavedPaymentMethod } from '../mobile/saved-payment-method';\nimport { BodyText, IconNameType, Spinner } from '@servicetitan/design-system';\nimport { paymentMethodsContainer } from 'src/payment-method/ioc';\nimport { SavedPaymentMethodsStore } from 'src/payment-method/stores/saved-payment-methods.store';\nimport { ChargeType, SplitInfo } from 'src/api';\n\ninterface PaymentMethodProps {\n paymentAmountData: PaymentAmountFormState;\n cardInfoData: CardInfoFormState;\n pgcardInfoData: PGCardInfoFormState;\n achInfoData: AchInfoFormState;\n usePaymentGateway: () => boolean;\n showLoginLink: boolean;\n setPaymentMethodValid: (isValid: boolean) => void;\n setSecurityCodeValid: (isValid: boolean) => void;\n setPaymentMethodAction: (action: () => void) => void;\n setConnectedAccounts: (accounts: ConnectedBankAccount[]) => void;\n setPaymentButtonTextIcon: (text: string, icon?: IconNameType | undefined) => void;\n invoiceId?: string;\n splits?: SplitInfo[];\n setPaymentMethodSubmit?: (submit: () => void) => void;\n chargeType: ChargeType;\n statementId?: string;\n cardView?: boolean;\n setPaymentMethodType?: ((paymentMethodType: PaymentMethodType) => void) | undefined;\n};\n\n\nexport const PaymentMethodContainer: FC = ({\n paymentAmountData,\n cardInfoData,\n pgcardInfoData,\n achInfoData,\n usePaymentGateway,\n setPaymentMethodValid,\n setSecurityCodeValid,\n setPaymentMethodAction,\n setConnectedAccounts,\n setPaymentButtonTextIcon,\n showLoginLink,\n invoiceId,\n setPaymentMethodSubmit,\n splits,\n chargeType,\n statementId,\n setPaymentMethodType, cardView = true\n}) => {\n const store = paymentMethodsContainer.get(SavedPaymentMethodsStore);\n\n const [savePaymentChecked, setSavePaymentChecked] = useState(store.getIsLoggedIn());\n const [useAsPrimaryPaymentChecked, setUseAsPrimaryPaymentChecked] = useState(store.getIsLoggedIn());\n const [savedPayment, setSavedPayment] = useState(undefined);\n\n const isLoggedIn = store.getIsLoggedIn();\n\n const isSavedPaymentOptionEnabled = store.getIsSavedPaymentOptionEnabled();\n\n const [errorMessage, setErrorMessage] = useState(undefined);\n\n const [isReady, setIsReady] = useState(false);\n\n const prepareSelectedPaymentMethod = async () => {\n if (savedPayment && isLoggedIn) {\n setPaymentMethodValid(!savedPayment.disconnected);\n setErrorMessage(savedPayment.disconnected ?\n 'Please update your payment method to continue.' : undefined);\n setPaymentButtonTextIcon(`Pay with ${savedPayment.name} Ending in *${savedPayment.number}`);\n if (setPaymentMethodType) {\n setPaymentMethodType(savedPayment.paymentMethodType);\n }\n }\n };\n\n useEffect(() => {\n store.setOnSelectedPaymentMethodChange(paymentMethod => {\n setSavedPayment(paymentMethod);\n setIsReady(true);\n });\n store.setOnPbbErrorMessage(error => {\n setErrorMessage(error);\n });\n store.currentInvoiceId = invoiceId;\n store.currentStatementId = statementId;\n store.currentSplits = splits;\n store.init(() => {\n if (!store.getIsLoggedIn() || !store.getIsSavedPaymentOptionEnabled()) {\n // Set ready when not signed-in or no saved payment option exists\n setIsReady(true);\n }\n });\n }, [store.init]);\n\n useEffect(() => {\n prepareSelectedPaymentMethod();\n }, [savedPayment]);\n\n return (isReady ?\n (
\n

Payment Method

\n\n {isLoggedIn && !savedPayment && (\n There are no saved payment methods associated with this account. When submitting a payment, you can choose to save the payment information for a faster checkout in the future.\n )}\n\n {errorMessage && (\n
\n
\n \n \n Payment Method Error\n \n
\n
\n {errorMessage}\n
\n
)}\n\n {isLoggedIn && savedPayment ?\n (cardView ? : ) :\n ()}\n
) :\n
\n \n \n Loading payment method options...\n \n
)\n}","import classnames from 'classnames';\nimport * as React from 'react';\nimport { observer } from 'mobx-react';\nimport { Radio } from '@material-ui/core';\n\nimport { PaymentAmountContainer } from '../payment-amount';\nimport { currency, twoDigitsAmount } from 'src/util/formatters';\nimport { MatField } from 'src/core/components/mat-field';\n\nimport styles from './payment-amount.less';\n\ninterface Props {\n container: PaymentAmountContainer;\n}\n\nexport const PaymentAmount = observer>(({ container: { data } }) => {\n if (data.errorMessage || !data.fullBalance) {\n return null;\n }\n\n return (\n
\n

Payment Amount

\n\n \n \n Full balance\n \n {currency(data.fullBalance)}\n \n \n {data.partialPaymentEnabled && (\n \n )}\n
\n );\n});\n","import { observable } from 'mobx';\nimport { observer } from 'mobx-react';\nimport { FormState, FieldState, Validator } from 'formstate';\nimport * as React from 'react';\nimport { RouteComponentProps } from 'react-router';\n\nimport { currency } from 'src/util/formatters';\nimport { lazyInject } from '../../ioc';\nimport { InvoiceStore } from '../../stores/invoice.store';\nimport { RouterStore } from 'src/core/stores/router.store';\n\nimport { PaymentAmount } from './desktop/payment-amount';\n\nexport class PaymentAmountFormState {\n @lazyInject(InvoiceStore) private invoiceStore!: InvoiceStore;\n @lazyInject(RouterStore) private router!: RouterStore;\n\n @observable errorMessage: string | undefined;\n @observable fullBalance: number | undefined;\n @observable partialPaymentEnabled: boolean | undefined;\n @observable onStateChanged?: () => void | undefined;\n\n customAmountValidator: Validator = (value) => {\n if (this.onStateChanged) {\n this.onStateChanged();\n }\n\n if (this.isFullBalance.value) {\n return false;\n }\n\n if (!value) {\n return 'This field is required.';\n }\n\n const amount = Number(value);\n if (isNaN(amount)) {\n return 'Amount must be a number.';\n }\n\n let minimumAmount = 1;\n if (this.fullBalance !== undefined && this.fullBalance < 1) {\n minimumAmount = this.fullBalance;\n }\n if (amount < minimumAmount) {\n return `Amount must be at least ${currency(minimumAmount)}.`;\n }\n\n if (this.fullBalance !== undefined && amount > this.fullBalance) {\n return 'Amount must be less than full balance.';\n }\n };\n\n isFullBalance = new FieldState(true);\n customAmount = new FieldState('').validators(this.customAmountValidator);\n\n form = new FormState({\n isFullBalance: this.isFullBalance,\n customAmount: this.customAmount,\n });\n\n constructor(private props?: RouteComponentProps,\n private amount?: number\n ) {\n // Initialize with fixed amount\n if (amount) {\n this.fullBalance = amount\n this.isFullBalance.value = true\n return;\n }\n\n this.form.validate();\n\n this.isFullBalance.onDidChange(() => {\n this.customAmount.validate();\n });\n\n const id = props?.match.params.id;\n if (!id) {\n return;\n }\n\n if (!this.invoiceStore.payment) {\n this.invoiceStore.payment = {\n invoiceNumber: id,\n };\n } else if (this.invoiceStore.payment.invoiceNumber !== id) {\n this.invoiceStore.payment.invoiceNumber = id;\n this.invoiceStore.payment.amount = undefined;\n }\n\n this.invoiceStore.getInvoice(id).then(\n (invoice) => {\n if (invoice.balance <= 0) {\n this.router.history.replace(`/invoice/${id}`);\n return;\n }\n\n this.fullBalance = invoice.balance;\n this.partialPaymentEnabled = !invoice.partialPaymentDisabled;\n },\n (err) => {\n this.errorMessage = err;\n }\n );\n }\n\n clearError = () => {\n this.errorMessage = undefined;\n };\n\n handleSubmit = (e?: React.FormEvent, isSubcomponent?: boolean) => {\n e && e.preventDefault();\n\n if (!this.props) {\n // Handle scenario where amount is hardcoded\n return true;\n }\n\n if (this.form.hasError || !this.fullBalance || !this.invoiceStore.payment) {\n return false;\n }\n\n this.invoiceStore.payment.amount = this.isFullBalance.$\n ? this.fullBalance\n : Number(this.customAmount.$);\n\n if (!isSubcomponent) {\n this.props.history.push(`/invoice/${this.props.match.params.id}/payment-info`);\n }\n\n return true;\n };\n\n handleFullAmountTrue = () => {\n this.isFullBalance.onChange(true);\n if (this.onStateChanged) {\n this.onStateChanged();\n }\n };\n\n handleFullAmountFalse = () => {\n this.isFullBalance.onChange(false);\n if (this.onStateChanged) {\n this.onStateChanged();\n }\n };\n}\n\ninterface RouteParams {\n id: string;\n}\n\ninterface Props extends RouteComponentProps {\n isSubcomponent?: boolean;\n data?: PaymentAmountFormState;\n}\n\n@observer\nexport class PaymentAmountContainer extends React.Component {\n @observable data: PaymentAmountFormState;\n\n constructor(props: Props) {\n super(props);\n\n this.data = this.props.data || new PaymentAmountFormState(props);\n }\n\n render() {\n return ;\n }\n}\n","var map = {\n\t\"./af\": 1051,\n\t\"./af.js\": 1051,\n\t\"./ar\": 1052,\n\t\"./ar-dz\": 1053,\n\t\"./ar-dz.js\": 1053,\n\t\"./ar-kw\": 1054,\n\t\"./ar-kw.js\": 1054,\n\t\"./ar-ly\": 1055,\n\t\"./ar-ly.js\": 1055,\n\t\"./ar-ma\": 1056,\n\t\"./ar-ma.js\": 1056,\n\t\"./ar-sa\": 1057,\n\t\"./ar-sa.js\": 1057,\n\t\"./ar-tn\": 1058,\n\t\"./ar-tn.js\": 1058,\n\t\"./ar.js\": 1052,\n\t\"./az\": 1059,\n\t\"./az.js\": 1059,\n\t\"./be\": 1060,\n\t\"./be.js\": 1060,\n\t\"./bg\": 1061,\n\t\"./bg.js\": 1061,\n\t\"./bm\": 1062,\n\t\"./bm.js\": 1062,\n\t\"./bn\": 1063,\n\t\"./bn.js\": 1063,\n\t\"./bo\": 1064,\n\t\"./bo.js\": 1064,\n\t\"./br\": 1065,\n\t\"./br.js\": 1065,\n\t\"./bs\": 1066,\n\t\"./bs.js\": 1066,\n\t\"./ca\": 1067,\n\t\"./ca.js\": 1067,\n\t\"./cs\": 1068,\n\t\"./cs.js\": 1068,\n\t\"./cv\": 1069,\n\t\"./cv.js\": 1069,\n\t\"./cy\": 1070,\n\t\"./cy.js\": 1070,\n\t\"./da\": 1071,\n\t\"./da.js\": 1071,\n\t\"./de\": 1072,\n\t\"./de-at\": 1073,\n\t\"./de-at.js\": 1073,\n\t\"./de-ch\": 1074,\n\t\"./de-ch.js\": 1074,\n\t\"./de.js\": 1072,\n\t\"./dv\": 1075,\n\t\"./dv.js\": 1075,\n\t\"./el\": 1076,\n\t\"./el.js\": 1076,\n\t\"./en-SG\": 1077,\n\t\"./en-SG.js\": 1077,\n\t\"./en-au\": 1078,\n\t\"./en-au.js\": 1078,\n\t\"./en-ca\": 1079,\n\t\"./en-ca.js\": 1079,\n\t\"./en-gb\": 1080,\n\t\"./en-gb.js\": 1080,\n\t\"./en-ie\": 1081,\n\t\"./en-ie.js\": 1081,\n\t\"./en-il\": 1082,\n\t\"./en-il.js\": 1082,\n\t\"./en-nz\": 1083,\n\t\"./en-nz.js\": 1083,\n\t\"./eo\": 1084,\n\t\"./eo.js\": 1084,\n\t\"./es\": 1085,\n\t\"./es-do\": 1086,\n\t\"./es-do.js\": 1086,\n\t\"./es-us\": 1087,\n\t\"./es-us.js\": 1087,\n\t\"./es.js\": 1085,\n\t\"./et\": 1088,\n\t\"./et.js\": 1088,\n\t\"./eu\": 1089,\n\t\"./eu.js\": 1089,\n\t\"./fa\": 1090,\n\t\"./fa.js\": 1090,\n\t\"./fi\": 1091,\n\t\"./fi.js\": 1091,\n\t\"./fo\": 1092,\n\t\"./fo.js\": 1092,\n\t\"./fr\": 1093,\n\t\"./fr-ca\": 1094,\n\t\"./fr-ca.js\": 1094,\n\t\"./fr-ch\": 1095,\n\t\"./fr-ch.js\": 1095,\n\t\"./fr.js\": 1093,\n\t\"./fy\": 1096,\n\t\"./fy.js\": 1096,\n\t\"./ga\": 1097,\n\t\"./ga.js\": 1097,\n\t\"./gd\": 1098,\n\t\"./gd.js\": 1098,\n\t\"./gl\": 1099,\n\t\"./gl.js\": 1099,\n\t\"./gom-latn\": 1100,\n\t\"./gom-latn.js\": 1100,\n\t\"./gu\": 1101,\n\t\"./gu.js\": 1101,\n\t\"./he\": 1102,\n\t\"./he.js\": 1102,\n\t\"./hi\": 1103,\n\t\"./hi.js\": 1103,\n\t\"./hr\": 1104,\n\t\"./hr.js\": 1104,\n\t\"./hu\": 1105,\n\t\"./hu.js\": 1105,\n\t\"./hy-am\": 1106,\n\t\"./hy-am.js\": 1106,\n\t\"./id\": 1107,\n\t\"./id.js\": 1107,\n\t\"./is\": 1108,\n\t\"./is.js\": 1108,\n\t\"./it\": 1109,\n\t\"./it-ch\": 1110,\n\t\"./it-ch.js\": 1110,\n\t\"./it.js\": 1109,\n\t\"./ja\": 1111,\n\t\"./ja.js\": 1111,\n\t\"./jv\": 1112,\n\t\"./jv.js\": 1112,\n\t\"./ka\": 1113,\n\t\"./ka.js\": 1113,\n\t\"./kk\": 1114,\n\t\"./kk.js\": 1114,\n\t\"./km\": 1115,\n\t\"./km.js\": 1115,\n\t\"./kn\": 1116,\n\t\"./kn.js\": 1116,\n\t\"./ko\": 1117,\n\t\"./ko.js\": 1117,\n\t\"./ku\": 1118,\n\t\"./ku.js\": 1118,\n\t\"./ky\": 1119,\n\t\"./ky.js\": 1119,\n\t\"./lb\": 1120,\n\t\"./lb.js\": 1120,\n\t\"./lo\": 1121,\n\t\"./lo.js\": 1121,\n\t\"./lt\": 1122,\n\t\"./lt.js\": 1122,\n\t\"./lv\": 1123,\n\t\"./lv.js\": 1123,\n\t\"./me\": 1124,\n\t\"./me.js\": 1124,\n\t\"./mi\": 1125,\n\t\"./mi.js\": 1125,\n\t\"./mk\": 1126,\n\t\"./mk.js\": 1126,\n\t\"./ml\": 1127,\n\t\"./ml.js\": 1127,\n\t\"./mn\": 1128,\n\t\"./mn.js\": 1128,\n\t\"./mr\": 1129,\n\t\"./mr.js\": 1129,\n\t\"./ms\": 1130,\n\t\"./ms-my\": 1131,\n\t\"./ms-my.js\": 1131,\n\t\"./ms.js\": 1130,\n\t\"./mt\": 1132,\n\t\"./mt.js\": 1132,\n\t\"./my\": 1133,\n\t\"./my.js\": 1133,\n\t\"./nb\": 1134,\n\t\"./nb.js\": 1134,\n\t\"./ne\": 1135,\n\t\"./ne.js\": 1135,\n\t\"./nl\": 1136,\n\t\"./nl-be\": 1137,\n\t\"./nl-be.js\": 1137,\n\t\"./nl.js\": 1136,\n\t\"./nn\": 1138,\n\t\"./nn.js\": 1138,\n\t\"./pa-in\": 1139,\n\t\"./pa-in.js\": 1139,\n\t\"./pl\": 1140,\n\t\"./pl.js\": 1140,\n\t\"./pt\": 1141,\n\t\"./pt-br\": 1142,\n\t\"./pt-br.js\": 1142,\n\t\"./pt.js\": 1141,\n\t\"./ro\": 1143,\n\t\"./ro.js\": 1143,\n\t\"./ru\": 1144,\n\t\"./ru.js\": 1144,\n\t\"./sd\": 1145,\n\t\"./sd.js\": 1145,\n\t\"./se\": 1146,\n\t\"./se.js\": 1146,\n\t\"./si\": 1147,\n\t\"./si.js\": 1147,\n\t\"./sk\": 1148,\n\t\"./sk.js\": 1148,\n\t\"./sl\": 1149,\n\t\"./sl.js\": 1149,\n\t\"./sq\": 1150,\n\t\"./sq.js\": 1150,\n\t\"./sr\": 1151,\n\t\"./sr-cyrl\": 1152,\n\t\"./sr-cyrl.js\": 1152,\n\t\"./sr.js\": 1151,\n\t\"./ss\": 1153,\n\t\"./ss.js\": 1153,\n\t\"./sv\": 1154,\n\t\"./sv.js\": 1154,\n\t\"./sw\": 1155,\n\t\"./sw.js\": 1155,\n\t\"./ta\": 1156,\n\t\"./ta.js\": 1156,\n\t\"./te\": 1157,\n\t\"./te.js\": 1157,\n\t\"./tet\": 1158,\n\t\"./tet.js\": 1158,\n\t\"./tg\": 1159,\n\t\"./tg.js\": 1159,\n\t\"./th\": 1160,\n\t\"./th.js\": 1160,\n\t\"./tl-ph\": 1161,\n\t\"./tl-ph.js\": 1161,\n\t\"./tlh\": 1162,\n\t\"./tlh.js\": 1162,\n\t\"./tr\": 1163,\n\t\"./tr.js\": 1163,\n\t\"./tzl\": 1164,\n\t\"./tzl.js\": 1164,\n\t\"./tzm\": 1165,\n\t\"./tzm-latn\": 1166,\n\t\"./tzm-latn.js\": 1166,\n\t\"./tzm.js\": 1165,\n\t\"./ug-cn\": 1167,\n\t\"./ug-cn.js\": 1167,\n\t\"./uk\": 1168,\n\t\"./uk.js\": 1168,\n\t\"./ur\": 1169,\n\t\"./ur.js\": 1169,\n\t\"./uz\": 1170,\n\t\"./uz-latn\": 1171,\n\t\"./uz-latn.js\": 1171,\n\t\"./uz.js\": 1170,\n\t\"./vi\": 1172,\n\t\"./vi.js\": 1172,\n\t\"./x-pseudo\": 1173,\n\t\"./x-pseudo.js\": 1173,\n\t\"./yo\": 1174,\n\t\"./yo.js\": 1174,\n\t\"./zh-cn\": 1175,\n\t\"./zh-cn.js\": 1175,\n\t\"./zh-hk\": 1176,\n\t\"./zh-hk.js\": 1176,\n\t\"./zh-tw\": 1177,\n\t\"./zh-tw.js\": 1177\n};\n\n\nfunction webpackContext(req) {\n\tvar id = webpackContextResolve(req);\n\treturn __webpack_require__(id);\n}\nfunction webpackContextResolve(req) {\n\tif(!__webpack_require__.o(map, req)) {\n\t\tvar e = new Error(\"Cannot find module '\" + req + \"'\");\n\t\te.code = 'MODULE_NOT_FOUND';\n\t\tthrow e;\n\t}\n\treturn map[req];\n}\nwebpackContext.keys = function webpackContextKeys() {\n\treturn Object.keys(map);\n};\nwebpackContext.resolve = webpackContextResolve;\nmodule.exports = webpackContext;\nwebpackContext.id = 1382;","// extracted by mini-css-extract-plugin\nmodule.exports = {\"card\":\"_1YCkU146QuoKePpadSztgb\",\"right-label\":\"_2bKvZG8-3aYXAdPjzQWYy2\",\"rightLabel\":\"_2bKvZG8-3aYXAdPjzQWYy2\"};","// extracted by mini-css-extract-plugin\nmodule.exports = {\"card\":\"gsraSuOEB6H7VnzpMf1Rs\",\"payment-methods-pay-by-bank-error\":\"_1O9-b7d2L96fwAjULnHHwH\",\"paymentMethodsPayByBankError\":\"_1O9-b7d2L96fwAjULnHHwH\",\"pay-by-bank-error-header\":\"_5xGNMJ_qvwgHFONxqyTSm\",\"payByBankErrorHeader\":\"_5xGNMJ_qvwgHFONxqyTSm\",\"pay-by-bank-error-header-title\":\"reDb6aF_Z6QBJk45QAWaj\",\"payByBankErrorHeaderTitle\":\"reDb6aF_Z6QBJk45QAWaj\",\"pay-by-bank-error-body\":\"_Gfmdb-BcBDAhS_VPtfUa\",\"payByBankErrorBody\":\"_Gfmdb-BcBDAhS_VPtfUa\",\"pay-by-bank-error-warning\":\"_3TqC0TdYaVuDP1Fq4KJ7XY\",\"payByBankErrorWarning\":\"_3TqC0TdYaVuDP1Fq4KJ7XY\",\"loading-message\":\"_2xb3_wZrWkcMSqDAe8N_f5\",\"loadingMessage\":\"_2xb3_wZrWkcMSqDAe8N_f5\",\"spinner\":\"_38uDJO_aMn0kd0vw-bCFVt\",\"non-card-view\":\"_1iuzUkW8pAM2IAsfZ9m_ex\",\"nonCardView\":\"_1iuzUkW8pAM2IAsfZ9m_ex\"};","// extracted by mini-css-extract-plugin\nmodule.exports = {\"decline-button\":\"_1AjHsFX1IvdZ8fXWFg-SJl\",\"declineButton\":\"_1AjHsFX1IvdZ8fXWFg-SJl\",\"ach-table\":\"_1JgpZMKLjKW-abrHixdV1Y\",\"achTable\":\"_1JgpZMKLjKW-abrHixdV1Y\"};","// extracted by mini-css-extract-plugin\nmodule.exports = {\"ach\":\"_2BFbhU14pOg534rPDnxoHO\",\"card\":\"_29PTMimwJlr8dmO8sRid9-\",\"field-title\":\"Hdge2ets9ybCaYBeIoaUR\",\"fieldTitle\":\"Hdge2ets9ybCaYBeIoaUR\",\"amount-error\":\"_3BnUVoqzRnqOEm0EWy--U1\",\"amountError\":\"_3BnUVoqzRnqOEm0EWy--U1\",\"warning-icon\":\"_2dMbzz8XozOQqgohKZdwq5\",\"warningIcon\":\"_2dMbzz8XozOQqgohKZdwq5\",\"info-tooltip\":\"_1k8kbL4G_si0DKry02ENfj\",\"infoTooltip\":\"_1k8kbL4G_si0DKry02ENfj\",\"info-icon\":\"_1CMWIffBO030WKz4YyOgVH\",\"infoIcon\":\"_1CMWIffBO030WKz4YyOgVH\",\"row\":\"_1ghzFHB1JolPa9xm9q-ACT\",\"col\":\"_1BTiw8z_gC14q1fN_50LmQ\",\"first-row\":\"FICdZyVHjEVL2uxgiKrUm\",\"firstRow\":\"FICdZyVHjEVL2uxgiKrUm\",\"second-row\":\"_1vbJcvgIn_f0u2L_bg47kI\",\"secondRow\":\"_1vbJcvgIn_f0u2L_bg47kI\",\"agreement\":\"_1DDkfMMB5c5J11cbszxJry\",\"decline-button\":\"_1xBcCYy4SukxR6M5KtJL8\",\"declineButton\":\"_1xBcCYy4SukxR6M5KtJL8\"};","// extracted by mini-css-extract-plugin\nmodule.exports = {\"card\":\"_21lurrJrBJGOe4PLFYx3GO\",\"right-label\":\"RIuK0Y2x-5HZviPlZHtm-\",\"rightLabel\":\"RIuK0Y2x-5HZviPlZHtm-\",\"sign-in-message\":\"_2JSAS2fsJZAbAs_6oIAFjX\",\"signInMessage\":\"_2JSAS2fsJZAbAs_6oIAFjX\",\"payment-methods-connect-bank\":\"jyXBo8BJWzGeS7YqIUBlk\",\"paymentMethodsConnectBank\":\"jyXBo8BJWzGeS7YqIUBlk\",\"payment-methods-spacing\":\"M56xyMGrKZqqAHSdVIaJ9\",\"paymentMethodsSpacing\":\"M56xyMGrKZqqAHSdVIaJ9\",\"payment-methods-container\":\"UKJGMK5rOCI8qPza_n_T\",\"paymentMethodsContainer\":\"UKJGMK5rOCI8qPza_n_T\",\"payment-methods-pay-by-bank-error\":\"_218mUtk87co1drYA8dYr-F\",\"paymentMethodsPayByBankError\":\"_218mUtk87co1drYA8dYr-F\",\"pay-by-bank-error-header\":\"_22xukEfiuRiPmpQeE3DlMM\",\"payByBankErrorHeader\":\"_22xukEfiuRiPmpQeE3DlMM\",\"pay-by-bank-error-header-title\":\"_1iQYZulyHtA0JpQHSxz4rh\",\"payByBankErrorHeaderTitle\":\"_1iQYZulyHtA0JpQHSxz4rh\",\"pay-by-bank-error-body\":\"_1DyKHzqu1QVgtYi0Rq2x1e\",\"payByBankErrorBody\":\"_1DyKHzqu1QVgtYi0Rq2x1e\",\"pay-by-bank-error-warning\":\"_iM8_e9ZGxQnfD38csM7e\",\"payByBankErrorWarning\":\"_iM8_e9ZGxQnfD38csM7e\",\"payment-methods-checkbox\":\"Vjb376kE6uT_oY7XjxGsk\",\"paymentMethodsCheckbox\":\"Vjb376kE6uT_oY7XjxGsk\",\"payment-methods-checkbox-item\":\"_2Na6niBQ9dStj92ckXggtC\",\"paymentMethodsCheckboxItem\":\"_2Na6niBQ9dStj92ckXggtC\"};","// extracted by mini-css-extract-plugin\nmodule.exports = {\"connected-accounts-container\":\"_31zKV1Y6NtVFTzvHM8z8Pm\",\"connectedAccountsContainer\":\"_31zKV1Y6NtVFTzvHM8z8Pm\",\"connected-accounts-header\":\"kxcM5QqjtAHrnUzgdZPsx\",\"connectedAccountsHeader\":\"kxcM5QqjtAHrnUzgdZPsx\",\"connected-accounts-item\":\"_3d2HRQxchxjd5C35p07OQj\",\"connectedAccountsItem\":\"_3d2HRQxchxjd5C35p07OQj\"};","// extracted by mini-css-extract-plugin\nmodule.exports = {\"connected-account-container\":\"_2PzBqQgsxjzK8_FWrlQpz_\",\"connectedAccountContainer\":\"_2PzBqQgsxjzK8_FWrlQpz_\",\"selected\":\"_268M-elR8JGKp_p0o64-it\",\"connected-account-container-selected\":\"_1JJpYyo3pg-D7KzL5EsDe_\",\"connectedAccountContainerSelected\":\"_1JJpYyo3pg-D7KzL5EsDe_\",\"connected-account-logo\":\"qZCmjKeEdnOWsTjFdAjok\",\"connectedAccountLogo\":\"qZCmjKeEdnOWsTjFdAjok\",\"connected-account-text\":\"_2ImW4Ux_nt0yl8DBSXHdHu\",\"connectedAccountText\":\"_2ImW4Ux_nt0yl8DBSXHdHu\",\"connected-account-chip-holder\":\"_3go0CMl2tZ2rZ8On6F4Yob\",\"connectedAccountChipHolder\":\"_3go0CMl2tZ2rZ8On6F4Yob\",\"connected-account-chip-container\":\"_150ZW-0WV0GNH9eajpv1V\",\"connectedAccountChipContainer\":\"_150ZW-0WV0GNH9eajpv1V\",\"connected-account-chip\":\"_17XAYBUeNTgLfW_ouQuU7n\",\"connectedAccountChip\":\"_17XAYBUeNTgLfW_ouQuU7n\"};","// extracted by mini-css-extract-plugin\nmodule.exports = {\"card\":\"qhcv7wZpdkJIL_DEQ__Xr\",\"row\":\"_2xFvq4lx9LQVh53CtCzLbm\",\"col\":\"_3kpUCvr4ds39YaHE0XNdMY\",\"first-row\":\"_2wwUUNQArPu6yBJDh2Kje9\",\"firstRow\":\"_2wwUUNQArPu6yBJDh2Kje9\",\"second-row\":\"_3pPCoqgf_PLKtJ_an9Shfn\",\"secondRow\":\"_3pPCoqgf_PLKtJ_an9Shfn\",\"agreement\":\"_331HDrW5lhwEY5XelDYM4I\"};","// extracted by mini-css-extract-plugin\nmodule.exports = {\"card\":\"_3dlBK3zJPOkcIUwAHl2VU4\",\"row\":\"_2SCe9O8EXslfDQIA4Qb9y3\",\"col\":\"_30dayEfolUaTmwFIoZuruW\",\"first-row\":\"_1dc7HpupzbrdxLijVF-OSj\",\"firstRow\":\"_1dc7HpupzbrdxLijVF-OSj\",\"second-row\":\"eMfhcEjVJFH3QfzZXFiRW\",\"secondRow\":\"eMfhcEjVJFH3QfzZXFiRW\",\"agreement\":\"_3UjQP65oxsmrYg8JlqLxxJ\",\"iframe\":\"_3wMDAF6Ngw5h4-43UaJmlY\",\"signin\":\"_25_lzCBbZWeCGevKYR8XeP\",\"tags\":\"dgA0hfOtQVOVSQtlXwFrg\",\"left-card\":\"_2fqoiTvHYHMLIoflOCCNJY\",\"leftCard\":\"_2fqoiTvHYHMLIoflOCCNJY\",\"right-card\":\"_16oyOhkz2qvfKUzElYe1RE\",\"rightCard\":\"_16oyOhkz2qvfKUzElYe1RE\",\"card-item\":\"_1kbDj0QTmkrh7SUkYZN2cz\",\"cardItem\":\"_1kbDj0QTmkrh7SUkYZN2cz\",\"buttons\":\"_3pTWIdi1jWxHYZ52Ca3WT_\",\"expired\":\"_3NH9bdTUkwg5l3o7uRHKfo\",\"backward\":\"_2gZRRFNt15WjM2cyPLSGM2\",\"embedded\":\"oi2fPFzpJUhXbjkE6Kf3U\"};","// extracted by mini-css-extract-plugin\nmodule.exports = {\"divider\":\"_3dtHA6lfD9OiuWkTfHsVY9\",\"tags\":\"_1AwAgIlV_J1rtCURNkT6rM\",\"left-card\":\"_2PHfFjN68BVUs_W7eAJhey\",\"leftCard\":\"_2PHfFjN68BVUs_W7eAJhey\",\"right-card\":\"_1onyfQ4Hs8mZ4H0auHW9ln\",\"rightCard\":\"_1onyfQ4Hs8mZ4H0auHW9ln\",\"card-item\":\"_2EgLTdpHr1PEZFvsmLOPnF\",\"cardItem\":\"_2EgLTdpHr1PEZFvsmLOPnF\",\"radio-column\":\"_1LfpgWUx_3MfBG1wREE5jo\",\"radioColumn\":\"_1LfpgWUx_3MfBG1wREE5jo\",\"description\":\"_3PdeT8yzjcQftGSz-CcLj1\",\"expired\":\"_26So_JUGWa2AourJT5FiF1\"};","// extracted by mini-css-extract-plugin\nmodule.exports = {\"saved-account-container\":\"_2gf3EIPlbYeXh7nMVI-uDg\",\"savedAccountContainer\":\"_2gf3EIPlbYeXh7nMVI-uDg\",\"selected\":\"_2cz_G9uryc3K_iL4kEVAyt\",\"saved-account-container-top\":\"qbiYrTUN8VcU1Mdt3FT-E\",\"savedAccountContainerTop\":\"qbiYrTUN8VcU1Mdt3FT-E\",\"saved-account-container-bottom\":\"_2UdMuhj0H9iEhhPTFvsoA1\",\"savedAccountContainerBottom\":\"_2UdMuhj0H9iEhhPTFvsoA1\",\"security-code-field\":\"_9kD9UTxIoujB_OcYg8CBU\",\"securityCodeField\":\"_9kD9UTxIoujB_OcYg8CBU\",\"saved-account-logo\":\"_1BlbE0npCMhcuJwbHFXZjz\",\"savedAccountLogo\":\"_1BlbE0npCMhcuJwbHFXZjz\",\"saved-account-text\":\"_1KaKW-VCNN6ohTxml5G9AD\",\"savedAccountText\":\"_1KaKW-VCNN6ohTxml5G9AD\",\"saved-account-chip-holder\":\"_2502TngMnsqKpQkKBQvKBO\",\"savedAccountChipHolder\":\"_2502TngMnsqKpQkKBQvKBO\",\"saved-account-change-payment\":\"_3sKkpna75M1Y6oUKCIV82B\",\"savedAccountChangePayment\":\"_3sKkpna75M1Y6oUKCIV82B\",\"primary-chip-color\":\"_2ABy-e8pjJWOh0WKq9VkKP\",\"primaryChipColor\":\"_2ABy-e8pjJWOh0WKq9VkKP\",\"disconnected-chip-color\":\"_1IMCVFlQO5P8NB3EVjjlgZ\",\"disconnectedChipColor\":\"_1IMCVFlQO5P8NB3EVjjlgZ\"};","// extracted by mini-css-extract-plugin\nmodule.exports = {\"divider\":\"_21alaviSuMsR8My3qrkkoy\",\"tags\":\"_29mU4hmQw04pDqc7gDY1J-\",\"left-card\":\"jB36DmzCKSiBDYKARjzj7\",\"leftCard\":\"jB36DmzCKSiBDYKARjzj7\",\"right-card\":\"_2k3f42oaskbYkWj4YP7QEK\",\"rightCard\":\"_2k3f42oaskbYkWj4YP7QEK\",\"card-item\":\"_2zf2IwR1oD5cYq4xnMzDGK\",\"cardItem\":\"_2zf2IwR1oD5cYq4xnMzDGK\",\"radio-column\":\"_2K9xPlFZDlSoVixEurpzPT\",\"radioColumn\":\"_2K9xPlFZDlSoVixEurpzPT\",\"description\":\"_1hqNL3pVxgtjO4D3jqfdXv\",\"expired\":\"XwiNYv_o_-oj0TleVc28r\",\"loading-message\":\"poq8KpEoO-NntdmJPiTns\",\"loadingMessage\":\"poq8KpEoO-NntdmJPiTns\",\"spinner\":\"_2Hnj-JtmNdKl66qJcJTzkg\",\"full-height\":\"_1gzaYNejyuPuW-ct0jOMQ9\",\"fullHeight\":\"_1gzaYNejyuPuW-ct0jOMQ9\",\"payment-method-buttons\":\"_3Xs98lFRJffUnXhaojhtam\",\"paymentMethodButtons\":\"_3Xs98lFRJffUnXhaojhtam\"};","// extracted by mini-css-extract-plugin\nmodule.exports = {\"right-label\":\"UsHOxiRfcAthje3JSP9x0\",\"rightLabel\":\"UsHOxiRfcAthje3JSP9x0\",\"saved-item-container\":\"NdIacHJA9uks6eamlXrsg\",\"savedItemContainer\":\"NdIacHJA9uks6eamlXrsg\",\"selected\":\"Mghvt1e0w8cQgV7OL_-p\",\"saved-item-divider\":\"_1O58L10-Ze21Cq1zm5ScWS\",\"savedItemDivider\":\"_1O58L10-Ze21Cq1zm5ScWS\",\"saved-item-logo\":\"_31yRYEyvlSHjEalNISRuLg\",\"savedItemLogo\":\"_31yRYEyvlSHjEalNISRuLg\",\"saved-item-text\":\"hlEMTM_s8qlV-74_jq007\",\"savedItemText\":\"hlEMTM_s8qlV-74_jq007\",\"saved-item-sub-text\":\"_1qtb4xnyPrNHfCHjwO0Hs7\",\"savedItemSubText\":\"_1qtb4xnyPrNHfCHjwO0Hs7\",\"saved-item-chip-holder\":\"kDHoyB3utYd6dRbXpzjbj\",\"savedItemChipHolder\":\"kDHoyB3utYd6dRbXpzjbj\",\"saved-item-change-payment\":\"_1Kwd2D1pNzRXZjjKsFalze\",\"savedItemChangePayment\":\"_1Kwd2D1pNzRXZjjKsFalze\",\"saved-item-chip-container\":\"_3U_hTRlXwChkmdUc5Xt42\",\"savedItemChipContainer\":\"_3U_hTRlXwChkmdUc5Xt42\",\"saved-item-chip\":\"_2f3HEONErNTPV9xlT_GvX6\",\"savedItemChip\":\"_2f3HEONErNTPV9xlT_GvX6\",\"saved-item-details\":\"HRwT-u1l6gm8K3oiy636J\",\"savedItemDetails\":\"HRwT-u1l6gm8K3oiy636J\"};","// extracted by mini-css-extract-plugin\nmodule.exports = {\"saved-account-container\":\"_2gf3EIPlbYeXh7nMVI-uDg\",\"savedAccountContainer\":\"_2gf3EIPlbYeXh7nMVI-uDg\",\"selected\":\"_2cz_G9uryc3K_iL4kEVAyt\",\"saved-account-container-top\":\"qbiYrTUN8VcU1Mdt3FT-E\",\"savedAccountContainerTop\":\"qbiYrTUN8VcU1Mdt3FT-E\",\"saved-account-container-bottom\":\"_2UdMuhj0H9iEhhPTFvsoA1\",\"savedAccountContainerBottom\":\"_2UdMuhj0H9iEhhPTFvsoA1\",\"security-code-field\":\"_9kD9UTxIoujB_OcYg8CBU\",\"securityCodeField\":\"_9kD9UTxIoujB_OcYg8CBU\",\"saved-account-logo\":\"_1BlbE0npCMhcuJwbHFXZjz\",\"savedAccountLogo\":\"_1BlbE0npCMhcuJwbHFXZjz\",\"saved-account-logo-adjustment\":\"_10P54jQ9qUuALRBS7OLt41\",\"savedAccountLogoAdjustment\":\"_10P54jQ9qUuALRBS7OLt41\",\"saved-account-text\":\"_1KaKW-VCNN6ohTxml5G9AD\",\"savedAccountText\":\"_1KaKW-VCNN6ohTxml5G9AD\",\"saved-account-chip-holder-mobile\":\"_1BIuJ3R3x_ML-foxl0LF2b\",\"savedAccountChipHolderMobile\":\"_1BIuJ3R3x_ML-foxl0LF2b\",\"saved-account-change-payment\":\"_3sKkpna75M1Y6oUKCIV82B\",\"savedAccountChangePayment\":\"_3sKkpna75M1Y6oUKCIV82B\",\"primary-chip-color\":\"_2ABy-e8pjJWOh0WKq9VkKP\",\"primaryChipColor\":\"_2ABy-e8pjJWOh0WKq9VkKP\",\"disconnected-chip-color\":\"_1IMCVFlQO5P8NB3EVjjlgZ\",\"disconnectedChipColor\":\"_1IMCVFlQO5P8NB3EVjjlgZ\",\"saved-account-item\":\"SiM4KEYGiFUSljdjZWBEg\",\"savedAccountItem\":\"SiM4KEYGiFUSljdjZWBEg\"};","// extracted by mini-css-extract-plugin\nmodule.exports = {\"divider\":\"_21alaviSuMsR8My3qrkkoy\",\"tags\":\"_29mU4hmQw04pDqc7gDY1J-\",\"left-card\":\"jB36DmzCKSiBDYKARjzj7\",\"leftCard\":\"jB36DmzCKSiBDYKARjzj7\",\"right-card\":\"_2k3f42oaskbYkWj4YP7QEK\",\"rightCard\":\"_2k3f42oaskbYkWj4YP7QEK\",\"card-item\":\"_2zf2IwR1oD5cYq4xnMzDGK\",\"cardItem\":\"_2zf2IwR1oD5cYq4xnMzDGK\",\"radio-column\":\"_2K9xPlFZDlSoVixEurpzPT\",\"radioColumn\":\"_2K9xPlFZDlSoVixEurpzPT\",\"description\":\"_1hqNL3pVxgtjO4D3jqfdXv\",\"expired\":\"XwiNYv_o_-oj0TleVc28r\",\"loading-message\":\"poq8KpEoO-NntdmJPiTns\",\"loadingMessage\":\"poq8KpEoO-NntdmJPiTns\",\"spinner\":\"_2Hnj-JtmNdKl66qJcJTzkg\",\"full-height\":\"_1gzaYNejyuPuW-ct0jOMQ9\",\"fullHeight\":\"_1gzaYNejyuPuW-ct0jOMQ9\",\"payment-method-buttons\":\"_3Xs98lFRJffUnXhaojhtam\",\"paymentMethodButtons\":\"_3Xs98lFRJffUnXhaojhtam\",\"payment-method-takeover-header\":\"_1a1uKKuAbCeGVvadTZHU0Z\",\"paymentMethodTakeoverHeader\":\"_1a1uKKuAbCeGVvadTZHU0Z\",\"payment-method-takeover\":\"_3ycAOQPEdp5vFsscJ44Dvp\",\"paymentMethodTakeover\":\"_3ycAOQPEdp5vFsscJ44Dvp\",\"payment-method-card\":\"P5I1wwRQEkfrO8u-HlDVS\",\"paymentMethodCard\":\"P5I1wwRQEkfrO8u-HlDVS\",\"payment-method-left-button\":\"_1Rjsmuz-0Gjjr6jllQL4KH\",\"paymentMethodLeftButton\":\"_1Rjsmuz-0Gjjr6jllQL4KH\",\"payment-method-right-button\":\"_23UnXDq0N8TFFG2V6HG5HX\",\"paymentMethodRightButton\":\"_23UnXDq0N8TFFG2V6HG5HX\",\"payment-method-right-button-connect\":\"_2XR-AYW1AXrtOK2NlZN6ND\",\"paymentMethodRightButtonConnect\":\"_2XR-AYW1AXrtOK2NlZN6ND\"};","// extracted by mini-css-extract-plugin\nmodule.exports = {\"right-label\":\"UsHOxiRfcAthje3JSP9x0\",\"rightLabel\":\"UsHOxiRfcAthje3JSP9x0\",\"saved-item-container\":\"NdIacHJA9uks6eamlXrsg\",\"savedItemContainer\":\"NdIacHJA9uks6eamlXrsg\",\"selected\":\"Mghvt1e0w8cQgV7OL_-p\",\"saved-item-container-item\":\"_2W_H-CkmYHrvIumRE1JtJ8\",\"savedItemContainerItem\":\"_2W_H-CkmYHrvIumRE1JtJ8\",\"saved-item-divider\":\"_1O58L10-Ze21Cq1zm5ScWS\",\"savedItemDivider\":\"_1O58L10-Ze21Cq1zm5ScWS\",\"saved-item-logo\":\"_31yRYEyvlSHjEalNISRuLg\",\"savedItemLogo\":\"_31yRYEyvlSHjEalNISRuLg\",\"saved-item-text\":\"hlEMTM_s8qlV-74_jq007\",\"savedItemText\":\"hlEMTM_s8qlV-74_jq007\",\"saved-item-sub-text\":\"_1qtb4xnyPrNHfCHjwO0Hs7\",\"savedItemSubText\":\"_1qtb4xnyPrNHfCHjwO0Hs7\",\"saved-item-chip-holder\":\"kDHoyB3utYd6dRbXpzjbj\",\"savedItemChipHolder\":\"kDHoyB3utYd6dRbXpzjbj\",\"saved-item-change-payment\":\"_1Kwd2D1pNzRXZjjKsFalze\",\"savedItemChangePayment\":\"_1Kwd2D1pNzRXZjjKsFalze\",\"saved-item-chip-container\":\"_3U_hTRlXwChkmdUc5Xt42\",\"savedItemChipContainer\":\"_3U_hTRlXwChkmdUc5Xt42\",\"saved-item-chip\":\"_2f3HEONErNTPV9xlT_GvX6\",\"savedItemChip\":\"_2f3HEONErNTPV9xlT_GvX6\",\"saved-item-details\":\"HRwT-u1l6gm8K3oiy636J\",\"savedItemDetails\":\"HRwT-u1l6gm8K3oiy636J\"};","import { Address } from 'src/api';\n\nconst utcOptions: Intl.DateTimeFormatOptions = { timeZone: 'UTC' };\n\nexport function localeDate(date: string | undefined): string {\n if (!date) return '';\n return new Date(date).toLocaleDateString(undefined, utcOptions);\n}\n\nexport function longDate(date: string | undefined): string {\n if (!date) return '';\n const dateTime = new Date(date);\n const monthNames = [\n 'JAN',\n 'FEB',\n 'MAR',\n 'APR',\n 'MAY',\n 'JUN',\n 'JUL',\n 'AUG',\n 'SEP',\n 'OCT',\n 'NOV',\n 'DEC',\n ];\n const monthNumber = dateTime.getUTCMonth();\n const month = monthNames[monthNumber];\n const dateOfMonth = dateTime.getUTCDate();\n const year = dateTime.getUTCFullYear();\n\n return `${month}\\xa0${dateOfMonth}\\n${year}`;\n}\n\nexport function currency(num: number): string {\n return new Intl.NumberFormat('en-US', {\n style: 'currency',\n currency: 'USD',\n }).format(num);\n}\n\nexport function address(address: Address | undefined, isWrap?: boolean): string {\n if (!address) {\n return 'Unknown Address';\n }\n if (isWrap) {\n return `${address.streetAddress}${address.unit ? (' #' + address.unit) : ''}
${address.city}, ${address.state} ${address.zip}`;\n }\n return `${address.streetAddress}${address.unit ? (' #' + address.unit) : ''}, ${address.city}, ${address.state} ${address.zip}`;\n}\n\nexport function addressNoZip(address: Address | undefined): string {\n if (!address) {\n return 'Unknown Address';\n }\n if (address.unit) {\n return `${address.streetAddress} #${address.unit}, ${address.city}, ${address.state}`;\n }\n return `${address.streetAddress}, ${address.city}, ${address.state}`;\n}\n\nexport const twoDigitsAmount = (amount: string) => {\n let value: string = amount.replace(/[^\\d.]/gi, '');\n if (value.length === 0) {\n return value;\n }\n value = value.replace(/^0+/g, '');\n if (value.length === 0) {\n return '0';\n }\n if (value.startsWith('.')) {\n value = `0${value}`;\n }\n const numbers = value.split('.');\n if (numbers.length > 1) {\n return `${numbers[0]}.${numbers[1].slice(0, 2)}`;\n }\n return value;\n};\n\nexport const getDurationBillingString = (duration?: number, billingFrequency?: number) => {\n let result = '';\n if (duration === 1) {\n result = '1 month';\n } else if (duration) {\n result = `${duration} months`;\n } else {\n result = 'Ongoing';\n }\n return `${result} - ${getBillingFrequencyString(billingFrequency)}`;\n};\n\nexport const getBillingFrequencyString = (freq: number | undefined) => {\n switch (freq) {\n case 0:\n return 'One Time';\n case 1:\n return 'Monthly';\n case 2:\n return 'Every other month';\n case 3:\n return 'Quarterly';\n case 6:\n return 'Bi-Annual';\n case 12:\n return 'Annual';\n default:\n return 'Unknown';\n }\n};\n\nexport const toNumber = (value: string) => value.replace(/[^\\d]/gi, '');\n","import classnames from 'classnames';\nimport { FieldState } from 'formstate';\nimport { observable } from 'mobx';\nimport { observer } from 'mobx-react';\nimport * as React from 'react';\nimport { StandardTextFieldProps } from '@material-ui/core/TextField';\nimport { TextField } from '@material-ui/core';\n\nimport { rootContainer } from 'src/ioc';\nimport { IosFocusStore } from '../stores/ios-focus.store';\n\ninterface FieldProps extends StandardTextFieldProps {\n fieldState: FieldState;\n errorMap?: { [error: string]: string | null };\n startAdornment?: React.ReactNode;\n endAdornment?: React.ReactNode;\n endAdornmentFixed?: boolean;\n errorColor?: boolean;\n formatter?: (value: string) => string;\n validator?: (value: string) => boolean;\n maxLength?: number;\n readOnly?: boolean;\n}\n\nconst iosFocus = rootContainer.get(IosFocusStore);\n\n@observer\nexport class MatField extends React.Component {\n @observable private hadBlur = false;\n private hadBlurTimeout: any;\n private hasFocus = false;\n @observable private fixAdornment = false;\n\n componentWillReceiveProps(nextProps: Readonly) {\n const props = this.props;\n if (props.label !== nextProps.label || props.placeholder !== nextProps.placeholder) {\n // If label or placeholder changes, treat this as a new field.\n // (Useful for create / confirm password, for example.)\n clearTimeout(this.hadBlurTimeout);\n this.hadBlur = false;\n props.fieldState.dirty = false;\n }\n }\n\n private handleFocus = (e: React.FocusEvent) => {\n this.hasFocus = true;\n if (!this.props.readOnly) {\n iosFocus.handleFocus();\n }\n if (this.props.onFocus) {\n this.props.onFocus(e);\n }\n };\n\n private handleBlur = (e: React.FocusEvent) => {\n this.hasFocus = false;\n this.fixAdornment = false;\n if (!this.props.readOnly) {\n iosFocus.handleBlur();\n }\n this.hadBlurTimeout = setTimeout(\n () => {\n this.hadBlur = true;\n this.props.fieldState.dirty = true;\n },\n 200 // 200ms from FieldState default validation delay\n );\n if (this.props.onBlur) {\n this.props.onBlur(e);\n }\n };\n\n componentWillUnmount() {\n if (this.hasFocus) {\n iosFocus.handleBlur();\n }\n }\n\n private handleAdornmentEnter = () => {\n if (!this.hasFocus) {\n this.fixAdornment = true;\n }\n };\n\n private handleChange = (e: React.ChangeEvent) => {\n const { fieldState, formatter, validator } = this.props;\n if (!validator || validator(e.target.value)) {\n fieldState.onChange(formatter ? formatter(e.target.value) : e.target.value);\n }\n if (fieldState.dirty && !this.hadBlur) {\n fieldState.dirty = false;\n }\n };\n\n render() {\n const {\n fieldState,\n errorMap,\n startAdornment,\n endAdornment: endAdornmentOrig,\n endAdornmentFixed,\n errorColor,\n maxLength,\n readOnly,\n ...props\n } = this.props;\n const errorText =\n fieldState.dirty &&\n fieldState.error &&\n (!errorMap || errorMap[fieldState.error] !== null)\n ? (errorMap && errorMap[fieldState.error]) || fieldState.error\n : null;\n const endAdornment = endAdornmentOrig ? (\n \n {endAdornmentOrig}\n
\n ) : null;\n\n // 200ms delay from https://github.com/formstate/formstate/blob/master/src/core/fieldState.ts#L65\n return (\n \n );\n }\n}\n","\nexport enum PaymentMethodType {\n CreditCard = \"credit-card\",\n ACH = \"ach\",\n PayByBank = \"pay-by-bank\"\n};\n\nexport enum BankAccountType {\n Personal = \"personal\",\n Business = \"business\"\n}\n\nexport enum CreditCardType {\n Visa = \"Visa\",\n AmericanExpress = \"American Express\",\n Discover = \"Discover\",\n MasterCard = \"MasterCard\",\n Other = \"Card\"\n};\n\nexport interface ConnectedBankAccount {\n bankIcon: string;\n bankName?: string | undefined;\n accountName: string;\n accountMask: string;\n selected: boolean;\n accountType: string;\n bankId?: string | undefined;\n accountId?: string | undefined;\n publicToken?: string | undefined;\n verificationStatus?: string | undefined;\n}\n\nexport interface PaymentMethodInfo {\n paymentMethodId: number;\n primary: boolean;\n name: string;\n selected: boolean;\n icon: string;\n expires?: string | undefined;\n customerName?: string | undefined;\n bankName?: string | undefined;\n bankId?: string | undefined;\n number?: string | undefined;\n paymentMethodType: PaymentMethodType,\n displayText?: string | undefined;\n customerId?: number;\n membership?: boolean;\n disconnected?: boolean | undefined;\n routingNumber?: string | undefined;\n token?: string | undefined;\n accountId?: string | undefined;\n bankAccountType?: BankAccountType | undefined;\n postalCode?: string | undefined;\n cvv?: string | undefined;\n verificationStatus?: string | undefined;\n storePaymentMethod?: boolean | undefined; /* Only used for credit card to save and charge at same time */\n}","/**\n * Portal API\n * No description provided (generated by Swagger Codegen https://github.com/swagger-api/swagger-codegen)\n *\n * OpenAPI spec version: v1\n * \n *\n * NOTE: This class is auto generated by the swagger code generator program.\n * https://github.com/swagger-api/swagger-codegen.git\n * Do not edit the class manually.\n */\n\nexport type PlaidVerificationStatus = 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10;\n\nexport const PlaidVerificationStatus = {\n NUMBER_0: 0 as PlaidVerificationStatus,\n NUMBER_1: 1 as PlaidVerificationStatus,\n NUMBER_2: 2 as PlaidVerificationStatus,\n NUMBER_3: 3 as PlaidVerificationStatus,\n NUMBER_4: 4 as PlaidVerificationStatus,\n NUMBER_5: 5 as PlaidVerificationStatus,\n NUMBER_6: 6 as PlaidVerificationStatus,\n NUMBER_7: 7 as PlaidVerificationStatus,\n NUMBER_8: 8 as PlaidVerificationStatus,\n NUMBER_9: 9 as PlaidVerificationStatus,\n NUMBER_10: 10 as PlaidVerificationStatus\n}","import { inject, injectable } from \"inversify\";\nimport { BankAccountInfo, ChargeApiService, ChargeCreditCardRequest, ChargeCustomerACHRequest, ChargeCustomerCreditCardRequest, ChargeCustomerStoredPaymentMethodRequest, ChargeResponse, ChargeType, CreditCard, CreditCardInfo, CreditCardIssuer, EditCreditCard, HomeApiService, Invoice, InvoicesApiService, PortalUser, SavedCreditCardsApiService, SplitInfo, StatementsApiService } from \"src/api\";\nimport { ClientDataStore } from \"src/core/stores/client-data.store\";\nimport { MembershipNameTypeStore } from \"src/core/stores/membership-name-type.store\";\nimport { RouterStore } from \"src/core/stores/router.store\";\nimport { lazyInject } from \"src/ioc\";\nimport { PGResponse, PaymentGateway, PaymentGatewayResponseType } from \"src/statement/stores/payment-gateway.store\";\n\nimport * as Validators from 'src/invoice/components/card-info/cc-validators';\nimport { FieldState, FormState } from \"formstate\";\nimport { action, computed, observable, runInAction } from \"mobx\";\nimport { AnvilSelectOptionsProps } from \"@servicetitan/design-system\";\nimport { getCardIcon, getCardNameByIssuer, getCardType, getIssuerByCardType } from \"../util/credit-card-util\";\nimport { BankAccountType, ConnectedBankAccount, PaymentMethodType, PaymentMethodInfo } from \"src/invoice/types/types\";\nimport { EditBankAccount } from \"src/api/model/editBankAccount\";\nimport { BankAccount } from \"src/api/model/bankAccount\";\nimport { PayByBankApiService } from \"src/api/api/payByBankApi.service\";\nimport { SavedBankAccountApiService } from \"src/api/api/savedBankAccountApi.service\";\nimport { PayByBankAccount } from \"src/api/model/payByBankAccount\";\nimport { EditPayByBankAccount } from \"src/api/model/editPayByBankAccount\";\nimport { PlaidVerificationStatus } from \"src/api/model/plaidVerificationStatus\";\nimport { AnalyticsStore } from \"src/core/stores/analytics.store\";\nimport { PaymentConfirmation } from \"src/invoice/stores/invoice.store\";\nimport { AchInfoFormState } from \"src/invoice/components/ach-info/ach-info/ach-info\";\nimport { CardInfoFormState } from \"src/invoice/components/card-info/card-info/card-info\";\n\nexport interface PendingInvoicePayment {\n statementId?: string;\n invoiceNumber: string;\n amount: number;\n splits?: SplitInfo[];\n amountRemaining: number;\n chargeType: ChargeType;\n}\n\n@injectable()\nexport class SavedPaymentMethodsStore {\n\n private usesPaymentsServiceTokenizationStore: boolean | undefined;\n constructor(\n private savedCreditCardsApi: SavedCreditCardsApiService,\n private savedBankAccountsApi: SavedBankAccountApiService,\n private statementApiService: StatementsApiService,\n private payByBankApi: PayByBankApiService,\n private readonly paymentGatewayService: PaymentGateway,\n private readonly chargeApi: ChargeApiService,\n private readonly analytics: AnalyticsStore,\n private readonly invoicesApi: InvoicesApiService,\n private readonly homeApi: HomeApiService\n ) {\n this.usesPaymentsServiceTokenizationStore = undefined;\n }\n\n @lazyInject(RouterStore) router!: RouterStore;\n @lazyInject(ClientDataStore) private clientData!: ClientDataStore;\n @inject(MembershipNameTypeStore) private membershipNameTypeStore!: MembershipNameTypeStore;\n\n public get usesPaymentsService() {\n return this.usesPaymentsServiceTokenizationStore;\n }\n\n // Variables\n customerIds: number[] | undefined;\n\n customerInfos: PortalUser[] = [];\n\n postalCode = new FieldState('').validators(Validators.zipPostalCodeValidator);\n\n form = new FormState({ postalCode: this.postalCode });\n\n // Observable variables\n @observable\n onActionComplete?: (success: boolean) => void;\n\n @observable\n onSelectedPaymentMethodChange?: (paymentMethod: PaymentMethodInfo | undefined) => void;\n\n @observable\n savedPaymentMethods: PaymentMethodInfo[] | undefined;\n\n @observable\n isLoadingSavedPaymentMethods = true;\n\n @observable\n selectedPaymentMethod: PaymentMethodInfo | undefined;\n\n @observable\n lastSavedPaymentMethodId: number | undefined;\n\n @observable\n lastSavedPaymentMethod: PaymentMethodInfo | undefined;\n\n @observable\n lastPGResponse: PGResponse | undefined;\n\n @observable errorMessage?: string | any;\n\n @observable\n onPbbErrorMessage?: (errorMessage: string | any) => void;\n\n @observable processing: boolean = false;\n\n @observable\n needToStoreAsPrimary = false;\n\n @observable\n isSavedCreditCardEnabled = false;\n\n @observable\n isSavedCreditCardFeatureOn = false;\n\n @observable\n isCreditCardEnabled = false;\n\n @observable\n isPayByBankFeatureOn = false;\n\n @observable\n isPayByBankEnabled = false;\n\n @observable\n isSavedBankAccountFeatureOn = false;\n\n @observable\n isBankAccountEnabled = false;\n\n @observable\n isInSavedPaymentMethods = false;\n\n @observable\n currentInvoiceId?: string | undefined;\n\n @observable\n currentStatementId?: string | undefined;\n\n @observable\n currentSplits?: SplitInfo[] | undefined;\n\n @observable\n customerReference?: string | undefined;\n\n customerSelector = new FieldState(undefined).onDidChange(({ newValue }) =>\n this.getSavedPaymentMethodsForCustomer(newValue));\n\n\n @observable\n customerOptions: AnvilSelectOptionsProps = [];\n\n private invoiceCache: { [id: string]: Invoice } = {};\n\n private paymentConfirmationCache: { [id: string]: PaymentConfirmation } = {};\n\n // Methods\n init = (callback?: () => void) => {\n const invoiceId = this.currentInvoiceId;\n const statementId = this.currentStatementId;\n\n if (statementId) {\n this.initializeWithStatement(statementId, callback);\n }\n else if (invoiceId) {\n this.initializeWithInvoice(invoiceId, callback);\n } else {\n this.homeApi.getHomeData().then((homeResponse) => {\n const homeData = homeResponse.data;\n const creditCardEnabled = !homeData?.creditCardDisabled;\n const achEnabled = !homeData?.achDisabled;\n const payByBankEnabled = !homeData?.payByBankDisabled;\n this.customerReference = homeData.customerExternalId;\n this.initialize(creditCardEnabled, payByBankEnabled, achEnabled, callback);\n }).catch(() => {\n // Handle scenario where it is a non-logged in user using their invoiceId\n if (invoiceId) {\n this.initializeWithInvoice(invoiceId, callback);\n } else if (statementId) {\n this.initializeWithStatement(statementId, callback);\n }\n });\n }\n\n this.chargeApi.paymentGatewayConfig().then((response) => {\n this.paymentGatewayService.apiKey = response.data.apiKey || '';\n this.paymentGatewayService.baseUrl = response.data.baseUrl || '';\n this.paymentGatewayService.paymentsServiceJwt = response.data.paymentsServiceJwt || '';\n this.paymentGatewayService.paymentsServiceCreditCardProcessorExists = response.data.paymentsServiceCreditCardProcessorExists || false;\n });\n };\n\n private initializeWithStatement(statementId: string, callback?: () => void) {\n if (!statementId) {\n if (callback) {\n callback();\n }\n return;\n }\n if (statementId) {\n this.statementApiService.getCustomerStatementsById(statementId, true).then((response) => {\n const statementData = response.data;\n const customer = statementData.customers && statementData.customers.length > 0\n ? statementData.customers[0] : undefined;\n\n if (customer) {\n let customerReference = '00000000-0000-0000-0000-000000000000';\n // Select customer reference from available invoice\n for (let i = 0; i < customer.invoices.length; i++) {\n const invoice = customer.invoices[i];\n if (invoice && invoice.customerExternalId) {\n customerReference = invoice.customerExternalId;\n // If not set try to retrieve via invoice API\n if (customerReference === '00000000-0000-0000-0000-000000000000') {\n this.getInvoice(invoice.id).then(invoiceData => {\n this.customerReference = invoiceData.customerExternalId || customerReference;\n });\n } else {\n this.customerReference = customerReference;\n }\n break;\n }\n }\n\n this.usesPaymentsServiceTokenizationStore = this.currentSplits?.some(split => split.usesPaymentsService) || false;\n const creditCardEnabled = !customer?.creditCardDisabled;\n const achEnabled = !customer?.achDisabled;\n const payByBankEnabled = !customer?.payByBankDisabled;\n this.initialize(creditCardEnabled, payByBankEnabled, achEnabled, callback);\n } else {\n // Complete the callback to allow ui to fail if necessary\n if (callback) {\n callback();\n }\n }\n });\n }\n }\n\n private initializeWithInvoice(invoiceId: string, callback?: () => void) {\n if (!invoiceId) {\n if (callback) {\n callback();\n }\n return;\n }\n if (invoiceId) {\n this.invoicesApi.getInvoiceById(invoiceId, true).then((response) => {\n const invoiceData = response.data;\n const creditCardEnabled = !invoiceData?.creditCardDisabled;\n const achEnabled = !invoiceData?.achDisabled;\n const payByBankEnabled = !invoiceData?.payByBankDisabled;\n this.usesPaymentsServiceTokenizationStore = response.data.usesPaymentsService;\n this.customerReference = invoiceData.customerExternalId;\n this.initialize(creditCardEnabled, payByBankEnabled, achEnabled, callback);\n });\n }\n }\n\n private initialize(creditCardEnabled: boolean, payByBankEnabled: boolean, achEnabled: boolean, callback: (() => void) | undefined) {\n this.savedCreditCardsApi.feature().then((response) => {\n this.isSavedCreditCardFeatureOn = response.data;\n this.isCreditCardEnabled = creditCardEnabled;\n\n if (this.getIsLoggedIn()) {\n this.savedCreditCardsApi.isEnabled().then((creditResponse) => {\n let users = creditResponse.data;\n this.isSavedCreditCardEnabled = !!users.length;\n this.initializeFlags(payByBankEnabled, achEnabled, callback, creditCardEnabled);\n });\n } else {\n this.initializeFlags(payByBankEnabled, achEnabled, callback, creditCardEnabled);\n }\n });\n }\n\n private initializeFlags(payByBankEnabled: boolean, achEnabled: boolean, callback: (() => void) | undefined, creditCardEnabled: boolean) {\n this.payByBankApi.feature().then((payByBankReponse) => {\n this.isPayByBankFeatureOn = payByBankReponse.data;\n this.isPayByBankEnabled = payByBankEnabled;\n this.savedBankAccountsApi.achFeature().then((achReponse) => {\n this.isSavedBankAccountFeatureOn = achReponse.data;\n this.isBankAccountEnabled = achEnabled;\n if (callback) {\n callback();\n }\n if ((creditCardEnabled || achEnabled || payByBankEnabled || this.isSavedCreditCardFeatureOn || this.isPayByBankFeatureOn || this.isSavedBankAccountFeatureOn)\n && this.clientData.isLoggedIn) {\n this.getCustomerIds();\n }\n });\n });\n }\n\n getIsLoggedIn = () => {\n return this.clientData.isLoggedIn;\n };\n\n getShowLoginLink = () => {\n return this.getIsCPEnabled() && !this.getIsLoggedIn();\n };\n\n getIsCPEnabled = () => {\n return this.isSavedBankAccountFeatureOn || this.isSavedCreditCardFeatureOn || this.isPayByBankFeatureOn;\n };\n\n getIsSavedPaymentOptionEnabled = () => {\n return this.getIsLoggedIn() && (this.isSavedCreditCardEnabled || this.isSavedBankAccountFeatureOn || this.isPayByBankFeatureOn);\n }\n\n getCardIssuer = (issuer: CreditCardIssuer) => {\n switch (issuer) {\n case CreditCardIssuer.NUMBER_3:\n return 'AMEX';\n case CreditCardIssuer.NUMBER_4:\n return 'VISA';\n case CreditCardIssuer.NUMBER_5:\n return 'MC';\n case CreditCardIssuer.NUMBER_6:\n return 'Discover';\n default:\n return 'Card';\n }\n };\n\n isExpiringSoon = (year: number, month: number) => {\n const today = new Date();\n const currentYear = today.getFullYear();\n const currentMonth = today.getMonth() + 1;\n if (currentYear === year) {\n if (currentMonth === month || currentMonth + 1 === month) {\n return true;\n }\n } else if (currentYear + 1 === year && currentMonth === 12 && month === 1) {\n return true;\n }\n return false;\n };\n\n isPaymentMethodExpiringSoon = (paymentMethod: PaymentMethodInfo) => {\n if (paymentMethod.paymentMethodType !== PaymentMethodType.CreditCard || !paymentMethod.expires) {\n return false;\n }\n\n const token = paymentMethod.expires?.split('/');\n const month = parseInt(token[0]);\n const year = parseInt(token[1]);\n\n return this.isExpiringSoon(year, month);\n };\n\n convertToCardIssuer = (name: string | undefined): CreditCardIssuer => {\n if (name === undefined) {\n return CreditCardIssuer.NUMBER_0;\n }\n switch (name.toLowerCase()) {\n case 'americanexpress':\n return CreditCardIssuer.NUMBER_3;\n case 'visa':\n return CreditCardIssuer.NUMBER_4;\n case 'mastercard':\n return CreditCardIssuer.NUMBER_5;\n case 'discover':\n return CreditCardIssuer.NUMBER_6;\n default:\n return CreditCardIssuer.NUMBER_0;\n }\n };\n\n getLastSavedPaymentMethod = () => {\n const result = this.lastSavedPaymentMethod;\n this.resetLastSavedPaymentMethod();\n return result;\n };\n\n getLastPGResponse = () => {\n const result = this.lastPGResponse;\n this.lastPGResponse = undefined;\n return result;\n }\n\n private resetLastSavedPaymentMethod = () => {\n this.lastSavedPaymentMethod = undefined;\n this.lastSavedPaymentMethodId = undefined;\n };\n\n connectedBankAccountToPaymentMethod = (connectedAccount: ConnectedBankAccount, primary: boolean) => {\n const payByBankPaymentMethod: PaymentMethodInfo = {\n paymentMethodId: 0,\n primary: primary,\n displayText: `${connectedAccount.accountName} Ending in *${connectedAccount.accountMask}`,\n name: connectedAccount.accountName,\n selected: true,\n icon: connectedAccount.bankIcon,\n bankName: connectedAccount.bankName,\n number: connectedAccount.accountMask,\n token: connectedAccount.publicToken,\n accountId: connectedAccount.accountId,\n bankId: connectedAccount.bankId,\n paymentMethodType: PaymentMethodType.PayByBank,\n verificationStatus: connectedAccount.verificationStatus\n };\n\n return payByBankPaymentMethod;\n };\n\n cardInfoToPaymentMethod = async (cardInfo: CardInfoFormState, primary: boolean) => {\n const cardResult = await cardInfo.form.validate();\n if (cardResult.hasError) {\n return undefined;\n }\n\n const cardDetail = cardResult.value;\n const cardNumber = cardDetail.ccNumber.value;\n const cardName = getCardType(cardNumber);\n const customerName = cardDetail.ccName.value;\n const cardNumberEnding = cardNumber.substring(cardNumber.length - 4, cardNumber.length);\n const paymentMethod: PaymentMethodInfo = {\n paymentMethodId: 0,\n primary: primary,\n displayText: `${cardName} ending in *${cardNumberEnding}`,\n name: cardName,\n selected: true,\n icon: getCardIcon(cardName),\n expires: cardDetail.ccExp.value,\n customerName: customerName,\n bankName: cardName,\n number: cardNumber,\n paymentMethodType: PaymentMethodType.CreditCard\n };\n\n return paymentMethod;\n };\n\n achInfoToPaymentMethod = async (achInfo: AchInfoFormState, primary: boolean) => {\n const achResult = await achInfo.form.validate();\n if (achResult.hasError) {\n return undefined;\n }\n\n const achDetail = achResult.value;\n const achNumber = achDetail.accountNumber.value;\n const achNumberEnding = achNumber.substring(achNumber.length - 4, achNumber.length);\n const achPaymentMethod: PaymentMethodInfo = {\n paymentMethodId: 0,\n primary: primary,\n name: 'Bank Account',\n selected: true,\n icon: 'assets/images/ach-account.svg',\n displayText: `Account Number Ending in *${achNumberEnding}`,\n number: achNumber,\n customerName: achDetail.accountName.value,\n routingNumber: achDetail.routingNumber.value,\n paymentMethodType: PaymentMethodType.ACH,\n bankAccountType: achDetail.accountType.$.trim() === BankAccountType.Business ? BankAccountType.Business :\n BankAccountType.Personal\n };\n\n return achPaymentMethod;\n };\n\n creditCardToSavedPayment = (creditCard: CreditCard): PaymentMethodInfo => {\n const cardName = getCardNameByIssuer(creditCard.issuer);\n return {\n paymentMethodId: creditCard.id,\n primary: creditCard.primary,\n displayText: `${cardName} ending in *${creditCard.number}`,\n name: cardName,\n selected: creditCard.primary,\n icon: getCardIcon(cardName),\n expires: `${creditCard?.expMonth}/${creditCard?.expYear}`,\n customerName: creditCard.cardholderName,\n bankName: cardName,\n number: creditCard.number,\n paymentMethodType: PaymentMethodType.CreditCard,\n customerId: creditCard.customerId,\n membership: creditCard.membership\n }\n };\n\n bankAccountToSavedPayment = (bankAccount: BankAccount): PaymentMethodInfo => {\n const routing = bankAccount.routing;\n const routingEnding = routing && routing.length >= 4 ? routing.substring(routing.length - 4, routing.length) : routing;\n return {\n paymentMethodId: bankAccount.id,\n primary: bankAccount.primary,\n displayText: `Bank Account ending in *${bankAccount.number}`,\n name: 'Bank Account',\n selected: bankAccount.primary,\n icon: 'assets/images/ach-account.svg',\n customerName: bankAccount.customerName,\n bankName: 'Bank Account',\n routingNumber: routingEnding ? `Ending in *${routingEnding}` : routingEnding,\n number: bankAccount.number,\n paymentMethodType: PaymentMethodType.ACH,\n customerId: bankAccount.customerId,\n membership: bankAccount.membership\n }\n };\n\n payByBankToSavedPayment = async (bankAccount: BankAccount, payByBankAccount: PayByBankAccount) => {\n const institution = (await this.payByBankApi.getInstitution(payByBankAccount.pbbInstitutionId!)).data;\n const bankIcon = institution.logo ? `data:image/png;base64,${institution.logo}` : 'assets/images/ach-account.svg';\n return {\n paymentMethodId: bankAccount.id,\n primary: bankAccount.primary,\n displayText: `${payByBankAccount.accountName} Ending in *${bankAccount.number}`,\n name: payByBankAccount.accountName || '',\n selected: bankAccount.primary,\n icon: bankIcon,\n bankName: institution.name,\n number: bankAccount.number,\n customerId: bankAccount.customerId,\n membership: bankAccount.membership,\n paymentMethodType: PaymentMethodType.PayByBank,\n accountName: payByBankAccount.accountName,\n verificationStatus: this.verificationStatusEnumToString(payByBankAccount.verificationStatus),\n disconnected: (payByBankAccount.verificationStatus !== PlaidVerificationStatus.NUMBER_1 &&\n payByBankAccount.verificationStatus !== PlaidVerificationStatus.NUMBER_4)\n };\n };\n\n private verificationStatusEnumToString = (verificationStatus?: PlaidVerificationStatus | undefined) => {\n return verificationStatus === PlaidVerificationStatus.NUMBER_1 ? 'AutomaticallyVerified' :\n verificationStatus === PlaidVerificationStatus.NUMBER_2 ? 'PendingAutomaticVerification' :\n verificationStatus === PlaidVerificationStatus.NUMBER_3 ? 'PendingManualVerification' :\n verificationStatus === PlaidVerificationStatus.NUMBER_4 ? 'ManuallyVerified' :\n verificationStatus === PlaidVerificationStatus.NUMBER_5 ? 'VerificationExpired' :\n verificationStatus === PlaidVerificationStatus.NUMBER_6 ? 'VerificationFailed' :\n verificationStatus === PlaidVerificationStatus.NUMBER_7 ? 'DatabaseMatched' :\n verificationStatus === PlaidVerificationStatus.NUMBER_8 ? 'DatabaseInsightsPass' :\n verificationStatus === PlaidVerificationStatus.NUMBER_9 ? 'DatabaseInsightsPass' :\n verificationStatus === PlaidVerificationStatus.NUMBER_10 ? 'DatabaseInsightsFail' :\n 'Unknown';\n };\n\n private verificationStatusToEnum = (verificationStatus?: string | undefined) => {\n return verificationStatus === 'AutomaticallyVerified' ? PlaidVerificationStatus.NUMBER_1 :\n verificationStatus === 'PendingAutomaticVerification' ? PlaidVerificationStatus.NUMBER_2 :\n verificationStatus === 'PendingManualVerification' ? PlaidVerificationStatus.NUMBER_3 :\n verificationStatus === 'ManuallyVerified' ? PlaidVerificationStatus.NUMBER_4 :\n verificationStatus === 'VerificationExpired' ? PlaidVerificationStatus.NUMBER_5 :\n verificationStatus === 'VerificationFailed' ? PlaidVerificationStatus.NUMBER_6 :\n verificationStatus === 'DatabaseMatched' ? PlaidVerificationStatus.NUMBER_7 :\n verificationStatus === 'DatabaseInsightsPass' ? PlaidVerificationStatus.NUMBER_8 :\n verificationStatus === 'DatabaseInsightsPass' ? PlaidVerificationStatus.NUMBER_9 :\n verificationStatus === 'DatabaseInsightsFail' ? PlaidVerificationStatus.NUMBER_10 :\n PlaidVerificationStatus.NUMBER_0;\n };\n\n sortCreditCard = (cards: CreditCard[]) => {\n if (cards.length === 0) {\n return [];\n }\n const primaryCards = cards.filter(c => c.primary && !c.isExpired);\n const membershipCards = cards.filter(c => !c.primary && c.membership && !c.isExpired);\n const others = cards\n .filter(c => c.isExpired || (!c.primary && !c.membership))\n .sort((a, b) => b.expYear + b.expMonth - (a.expYear + a.expMonth));\n return [...primaryCards, ...membershipCards, ...others];\n };\n\n gotoSavedCardPage = () => {\n this.router.history.push('/savedpaymentmethod/paymentmethod');\n };\n\n gotoMembershipPage = () => {\n this.router.history.push('/memberships');\n }\n\n usePaymentGateway = () => {\n return this.paymentGatewayService && !!this.paymentGatewayService.baseUrl;\n };\n\n getCustomerId = () => {\n return this.customerIds && this.customerIds.length > 0 ?\n this.customerIds[0] : 0;\n };\n\n isExpired = (paymentMethod: PaymentMethodInfo): boolean => {\n if (paymentMethod.paymentMethodType !== PaymentMethodType.CreditCard || !paymentMethod.expires) {\n return false;\n }\n\n const today = new Date();\n const currentYear = today.getFullYear();\n const currentMonth = today.getMonth() + 1;\n\n const token = paymentMethod.expires?.split('/');\n const month = parseInt(token[0]);\n const year = parseInt(token[1]);\n\n if (currentYear > year) {\n return true;\n }\n\n if (currentYear === year && currentMonth > month) {\n return true;\n }\n\n return false;\n };\n\n private callCompleteAction = (success: boolean) => {\n if (this.onActionComplete) {\n this.onActionComplete(success);\n }\n\n this.onActionComplete = undefined;\n };\n\n @action\n private callPostError = (errorMessage: string | any) => {\n if (this.onPbbErrorMessage) {\n this.onPbbErrorMessage(errorMessage);\n }\n }\n\n // Action Methods\n\n @action\n getLinkToken = async () => {\n if (!this.isPayByBankEnabled && !this.isPayByBankFeatureOn) {\n return '';\n }\n const response = (await this.payByBankApi.getLinkToken(this.customerSelector.value || new Date().getTime())).data;\n return response.token;\n }\n\n @action\n getInstitution = async (institutionId: string) => {\n const response = (await this.payByBankApi.getInstitution(institutionId)).data;\n if (!response || !response.logo) {\n return response.logo;\n }\n return `data:image/png;base64,${response.logo}`;\n }\n\n @action\n getSavedPaymentMethodsForCustomer = async (id?: number) => {\n this.isLoadingSavedPaymentMethods = true;\n if (!id) {\n this.isLoadingSavedPaymentMethods = false;\n return;\n }\n\n const allCards = this.isSavedCreditCardFeatureOn && (this.isInSavedPaymentMethods || this.isCreditCardEnabled) ? (await this.savedCreditCardsApi.savedCreditCards(id)).data : [];\n const allBankAccounts = (this.isSavedBankAccountFeatureOn && (this.isInSavedPaymentMethods || this.isBankAccountEnabled)) || (this.isPayByBankFeatureOn && (this.isInSavedPaymentMethods || this.isPayByBankEnabled)) ? (await this.savedBankAccountsApi.savedBankAccounts(id)).data : [];\n const allPayByBanks = (this.isPayByBankFeatureOn && (this.isInSavedPaymentMethods || this.isPayByBankEnabled)) ? (await this.payByBankApi.savedPayByBanks(id, this.customerReference || ''/*Should never be null*/)).data : [];\n\n await runInAction(async () => {\n const creditCards = this.sortCreditCard(allCards).map(creditCard => this.creditCardToSavedPayment(creditCard));\n\n const achAccounts: BankAccount[] = [];\n const payByBankAccounts: BankAccount[] = [];\n const payByBankPaymentIdMapping =\n new Map(allPayByBanks.map(pbb => [pbb.paymentsServicePaymentMethodId, pbb] as const));\n\n allBankAccounts.forEach(bankAccount => {\n if (payByBankPaymentIdMapping.has(bankAccount.paymentsServicePaymentMethodId)) {\n if (this.isPayByBankFeatureOn && (this.isInSavedPaymentMethods || this.isPayByBankEnabled)) {\n payByBankAccounts.push(bankAccount);\n }\n } else {\n if (this.isSavedBankAccountFeatureOn && (this.isInSavedPaymentMethods || this.isBankAccountEnabled)) {\n //TODO: Figure a better way to distinguish between paybybank vs regular ach\n if (!bankAccount.paymentsServicePaymentMethodId) {\n achAccounts.push(bankAccount);\n }\n }\n }\n });\n\n const achs = achAccounts.map(ach => this.bankAccountToSavedPayment(ach));\n const payByBanks: PaymentMethodInfo[] = [];\n\n for (let i = 0; i < payByBankAccounts.length; i++) {\n const payByBankAccount = payByBankAccounts[i];\n const payByBankPaymentMethod = await this.payByBankToSavedPayment(payByBankAccount,\n payByBankPaymentIdMapping.get(payByBankAccount.paymentsServicePaymentMethodId)!\n );\n payByBanks.push(payByBankPaymentMethod);\n }\n\n const paymentMethods = [...payByBanks, ...creditCards, ...achs];\n const primaryPaymentMethods = paymentMethods.filter(paymentMethod => paymentMethod.primary);\n const otherPaymentMethods = paymentMethods.filter(paymentMethod => !paymentMethod.primary);\n\n // Add payment methods\n this.savedPaymentMethods = [...primaryPaymentMethods, ...otherPaymentMethods];\n\n if (this.lastSavedPaymentMethodId) {\n this.lastSavedPaymentMethod = this.savedPaymentMethods.find(p => p.paymentMethodId === this.lastSavedPaymentMethodId);\n }\n\n this.isLoadingSavedPaymentMethods = false;\n\n this.setDefaultSelectedPaymentMethodToPay();\n });\n };\n\n @action\n getCustomerIds = async () => {\n const response = await this.savedCreditCardsApi.isEnabled();\n let users = response.data;\n this.isSavedCreditCardEnabled = !!users.length;\n\n if (!this.isSavedCreditCardEnabled) {\n users = (await this.homeApi.getHomeData()).data.users || [];\n }\n\n runInAction(() => {\n this.customerIds = users.map(i => i.id);\n this.customerInfos = users.map(i => ({ id: i.id, name: i.name }));\n this.customerOptions = this.customerInfos.map(i => ({ value: i.id, text: i.name }));\n if (this.customerIds.length) {\n this.customerSelector.onChange(this.customerIds[0]);\n }\n });\n };\n\n @action\n setSelectedPaymentMethodToPay = (selectedPaymentMethod: PaymentMethodInfo | undefined) => {\n this.selectedPaymentMethod = selectedPaymentMethod;\n };\n\n @action\n setDefaultSelectedPaymentMethodToPay = () => {\n if (!this.savedPaymentMethods || this.savedPaymentMethods.length === 0) {\n if (this.onSelectedPaymentMethodChange) {\n this.onSelectedPaymentMethodChange(undefined);\n }\n return;\n }\n\n const availablePaymentMethods = this.savedPaymentMethods.filter(paymentMethod => !this.isExpired(paymentMethod));\n this.selectedPaymentMethod =\n availablePaymentMethods.length > 0\n ? availablePaymentMethods.find(c => c.primary) ||\n availablePaymentMethods[0]\n : undefined;\n\n if (this.onSelectedPaymentMethodChange) {\n this.onSelectedPaymentMethodChange(this.lastSavedPaymentMethod || this.selectedPaymentMethod);\n }\n };\n\n @action\n setPrimary = (value: boolean) => (this.needToStoreAsPrimary = value);\n\n @action\n setOnActionComplete = (value: (success: boolean) => void) => (this.onActionComplete = value);\n\n @action\n setOnPbbErrorMessage = (value: (errorMessage: string | any) => void) => (this.onPbbErrorMessage = value);\n\n @action\n setOnSelectedPaymentMethodChange = (value: (paymentMethod: PaymentMethodInfo | undefined) => void) => (this.onSelectedPaymentMethodChange = value);\n\n @action\n setPaymentMethodAsPrimary = async (paymentMethod: PaymentMethodInfo) => {\n if (paymentMethod.paymentMethodType === PaymentMethodType.CreditCard) {\n await this.savedCreditCardsApi.assignCreditCard(\n paymentMethod.customerId!,\n paymentMethod.paymentMethodId,\n true);\n } else if (paymentMethod.paymentMethodType === PaymentMethodType.ACH) {\n await this.savedBankAccountsApi.assignBankAccount(paymentMethod.customerId!, paymentMethod.paymentMethodId, {\n primary: true,\n membership: paymentMethod.membership || false\n });\n } else if (paymentMethod.paymentMethodType === PaymentMethodType.PayByBank) {\n await this.payByBankApi.assignPayByBank(paymentMethod.customerId!, paymentMethod.paymentMethodId, {\n primary: true,\n membership: paymentMethod.membership || false\n });\n }\n\n await this.getSavedPaymentMethodsForCustomer(this.customerSelector.value);\n this.callCompleteAction(true);\n };\n\n @action\n deletePaymentMethod = async (paymentMethod: PaymentMethodInfo) => {\n this.processing = true;\n this.resetErrorMessage();\n try {\n if (paymentMethod.paymentMethodType === PaymentMethodType.CreditCard) {\n await this.savedCreditCardsApi.deleteCreditCard(\n paymentMethod.customerId!,\n paymentMethod.paymentMethodId\n );\n } else if (paymentMethod.paymentMethodType === PaymentMethodType.ACH) {\n await this.savedBankAccountsApi.deleteBankAccount(paymentMethod.customerId!, paymentMethod.paymentMethodId);\n } else if (paymentMethod.paymentMethodType === PaymentMethodType.PayByBank) {\n await this.payByBankApi.deletePayByBank(paymentMethod.customerId!, paymentMethod.paymentMethodId);\n }\n } catch (e) {\n runInAction(() => {\n this.errorMessage = e;\n this.callCompleteAction(false);\n });\n } finally {\n runInAction(() => {\n this.processing = false;\n });\n\n await this.getSavedPaymentMethodsForCustomer(this.customerSelector.value);\n this.callCompleteAction(true);\n }\n };\n\n @action\n addPaymentMethod = async (paymentMethod: PaymentMethodInfo) => {\n this.resetErrorMessage();\n this.processing = true;\n if (paymentMethod.paymentMethodType === PaymentMethodType.CreditCard) {\n if (this.usePaymentGateway()) {\n await this.form.validate();\n this.paymentGatewayService.handleSubmit(this.processAddNewCard);\n } else {\n this.processNonGatewayCreditCard(paymentMethod);\n }\n } else if (paymentMethod.paymentMethodType === PaymentMethodType.ACH) {\n await this.processACH(paymentMethod);\n } else if (paymentMethod.paymentMethodType === PaymentMethodType.PayByBank) {\n await this.processPayByBank(paymentMethod);\n }\n };\n\n @action\n processNonGatewayCreditCard = async (paymentMethod: PaymentMethodInfo) => {\n const selectedCustomerId = this.customerSelector.value || 0;\n const expToken = paymentMethod.expires!.split('/');\n const cardInfo: EditCreditCard = {\n id: 0,\n customerId: selectedCustomerId,\n primary: this.needToStoreAsPrimary,\n membership: true,\n businessUnitId: 0,\n isExpired: false,\n issuer: getIssuerByCardType(paymentMethod.bankName),\n expYear: parseInt(expToken[1], 10),\n expMonth: parseInt(expToken[0], 10),\n cvv: paymentMethod.cvv,\n number: paymentMethod.number,\n cardholderName: paymentMethod.customerName,\n zip: paymentMethod.postalCode,\n token: paymentMethod.token,\n };\n\n await this.processCreditCard(cardInfo);\n }\n\n @action\n processPayByBank = async (paymentMethod: PaymentMethodInfo) => {\n const selectedCustomerId = this.customerSelector.value!;\n const selectedCustomer = this.customerInfos.find(c => c.id === selectedCustomerId);\n try {\n const payByBankAccount: EditPayByBankAccount = {\n id: 0,\n customerId: selectedCustomerId,\n primary: this.needToStoreAsPrimary,\n membership: true,\n businessUnitId: 0,\n number: paymentMethod.number,\n routing: paymentMethod.routingNumber,\n bankName: paymentMethod.bankName,\n accountName: paymentMethod.name,\n customerReference: this.customerReference,\n customerName: paymentMethod.customerName || selectedCustomer?.name,\n publicToken: paymentMethod.token,\n pbbAccountId: paymentMethod.accountId,\n pbbInstitutionId: paymentMethod.bankId,\n verificationStatus: this.verificationStatusToEnum(paymentMethod.verificationStatus)\n };\n\n const result = await this.payByBankApi.savePayByBank(selectedCustomerId, payByBankAccount);\n this.lastSavedPaymentMethodId = result.data.id;\n await this.getSavedPaymentMethodsForCustomer(selectedCustomerId);\n } catch (e) {\n runInAction(() => {\n this.errorMessage = e;\n this.callCompleteAction(false);\n });\n } finally {\n runInAction(() => {\n this.processing = false;\n this.callCompleteAction(true);\n });\n }\n };\n\n @action\n chargePaymentMethod = async (paymentMethod: PaymentMethodInfo, payment: PendingInvoicePayment) => {\n this.resetErrorMessage();\n\n if (!payment.invoiceNumber && payment.splits && payment.splits.length > 0) {\n // Pick first invoice in splits as invoice Id to handle scenario where statement is been paid\n payment.invoiceNumber = payment.splits[0].invoiceId!;\n }\n\n const invoice = await this.getInvoice(payment.invoiceNumber);\n const splits: SplitInfo[] = [\n {\n invoiceId: invoice.id,\n amountApplied: payment.amount,\n usesPaymentsService: invoice.usesPaymentsService\n }\n ];\n\n // Only replace split if not statement\n payment.splits = payment.splits || splits;\n\n // Retrieve invoice number for each invoice in split\n for (let i = 0; i < payment.splits.length; i++) {\n const paymentInvoiceId = payment.splits[i].invoiceId;\n if (!paymentInvoiceId) {\n continue;\n }\n\n const paymentInvoice = await this.getInvoice(paymentInvoiceId);\n payment.splits[i].invoiceNumber = paymentInvoice.number;\n }\n\n if (paymentMethod.paymentMethodType === PaymentMethodType.ACH) {\n await this.processBankAccountCharge(paymentMethod, payment, invoice);\n } else if (paymentMethod.paymentMethodType === PaymentMethodType.CreditCard) {\n await this.processCreditCardCharge(paymentMethod, payment, invoice);\n } else if (paymentMethod.paymentMethodType === PaymentMethodType.PayByBank) {\n await this.processPayByBankCharge(paymentMethod, payment, invoice);\n }\n };\n\n @action\n getInvoicesById = async (invoiceIds: string[]) => {\n const result: Invoice[] = [];\n\n // TODO: Create API to retrieve invoices by Ids in one call (the statement api already does this)\n for (let i = 0; i < invoiceIds.length; i++) {\n const invoiceId = invoiceIds[i];\n const invoice = (await this.invoicesApi.getInvoiceById(invoiceId)).data;\n result.push(invoice);\n }\n\n return result;\n }\n\n @action\n getInvoiceByStatement = async (statementId: string) => {\n const statementData = (await this.statementApiService.getCustomerStatementsById(statementId, true)).data;\n const customer = statementData.customers && statementData.customers.length > 0\n ? statementData.customers[0] : undefined;\n\n if (customer) {\n for (let i = 0; i < customer.invoices.length; i++) {\n const invoice = customer.invoices[i];\n if (invoice) {\n return invoice;\n }\n }\n }\n\n return null;\n };\n\n @action\n getInvoice = async (id: string, forceRefresh?: boolean): Promise => {\n const trimmedId = id.trim();\n\n if (!forceRefresh) {\n const cachedInvoice = this.invoiceCache[trimmedId];\n if (cachedInvoice) {\n return Promise.resolve(cachedInvoice);\n }\n }\n\n return this.invoicesApi.getInvoiceById(trimmedId, true).then(\n (resp) => {\n if (\n resp.data.creditCardDisabled &&\n resp.data.achDisabled &&\n resp.data.payByBankDisabled &&\n this.clientData.isAnonymousPayments\n ) {\n this.router.history.replace('/invoice/expired-link');\n return new Promise(() => { });\n }\n\n this.invoiceCache[trimmedId] = resp.data;\n return Promise.resolve(resp.data);\n },\n (err) => {\n if (this.clientData.isAnonymousPayments) {\n this.router.history.replace('/invoice/expired-link');\n return new Promise(() => { });\n }\n\n throw err;\n }\n );\n };\n\n @action\n private processBankAccountCharge = async (paymentMethod: PaymentMethodInfo, payment: PendingInvoicePayment, invoice: Invoice) => {\n this.processing = true;\n const amount = payment.amount;\n\n const invoiceId = payment.chargeType === ChargeType.NUMBER_0 ? invoice.id : undefined;\n\n if (this.clientData.isLoggedIn && paymentMethod.paymentMethodId) {\n const request: ChargeCustomerStoredPaymentMethodRequest = {\n method: { id: paymentMethod.paymentMethodId },\n amount: amount,\n invoice: invoiceId,\n notificationEmail: this.clientData.loginData.email,\n splits: payment.splits,\n chargeType: payment.chargeType,\n storePaymentMethod: false,\n isCreditCard: false\n };\n try {\n const response = await this.chargeApi.chargeStoredPaymentMethod(request, true, {\n 400: 'Failed to charge bank account. Verify the information you’ve entered or try a different bank account.',\n });\n this.processChargeResponse(invoice, payment, response.data);\n }\n catch (e) {\n const errorMessage = e as string;\n this.callPostError(errorMessage);\n this.processChargeFailure(errorMessage, invoice, payment)\n }\n finally {\n runInAction(() => {\n this.processing = false;\n });\n }\n } else {\n const bankAccount: BankAccountInfo = {\n name: paymentMethod.customerName!,\n routing: (paymentMethod.routingNumber || '').replace(/[^0-9]/g, ''),\n number: (paymentMethod.number || '').replace(/[^0-9]/g, ''),\n checkNumber: '',\n };\n\n const request: ChargeCustomerACHRequest = {\n isBusinessPayment: paymentMethod.bankAccountType == BankAccountType.Business,\n chargeType: payment.chargeType,\n method: bankAccount,\n amount: amount,\n invoice: invoiceId,\n notificationEmail: this.clientData.loginData.email,\n splits: payment.splits,\n storePaymentMethod: false\n };\n\n try {\n const response = await this.chargeApi.chargeBankAccount(request, true, {\n 400: 'Failed to charge bank account. Verify the information you’ve entered or try a different bank account.',\n });\n this.processChargeResponse(invoice, payment, response.data);\n } catch (e) {\n const errorMessage = e as string;\n this.callPostError(errorMessage);\n this.processChargeFailure(errorMessage, invoice, payment)\n } finally {\n runInAction(() => {\n this.processing = false;\n });\n }\n }\n }\n\n @action\n private processCreditCardCharge = async (paymentMethod: PaymentMethodInfo, payment: PendingInvoicePayment, invoice: Invoice) => {\n this.processing = true;\n const amount = payment.amount;\n const invoiceId = payment.chargeType === ChargeType.NUMBER_0 ? invoice.id : undefined;\n\n if (this.clientData.isLoggedIn && paymentMethod.paymentMethodId) {\n const request: ChargeCustomerStoredPaymentMethodRequest = {\n method: { id: paymentMethod.paymentMethodId, cvc: paymentMethod.cvv },\n amount: amount,\n invoice: invoiceId,\n notificationEmail: this.clientData.loginData.email,\n splits: payment.splits,\n chargeType: payment.chargeType,\n storePaymentMethod: false,\n isCreditCard: true\n };\n try {\n const response = await this.chargeApi.chargeStoredPaymentMethod(request, true, {\n 400: 'Failed to charge card. Verify the information you’ve entered or try a different card.',\n 500: 'Insufficient funds'\n });\n this.processChargeResponse(invoice, payment, response.data);\n }\n catch (e) {\n const errorMessage = e as string;\n this.callPostError(errorMessage);\n this.processChargeFailure(errorMessage, invoice, payment)\n }\n finally {\n runInAction(() => {\n this.processing = false;\n });\n }\n } else {\n const lastPGResponse = this.getLastPGResponse();\n if (lastPGResponse) {\n // Used for handling scenario where iframe is closed after selection\n await this.processCharge(lastPGResponse, payment, invoice, paymentMethod.storePaymentMethod || false);\n } else {\n this.paymentGatewayService.handleSubmit(async (pgResponse: PGResponse) => {\n await this.processCharge(pgResponse, payment, invoice, paymentMethod.storePaymentMethod || false);\n });\n }\n }\n };\n\n @action\n processCharge = async (pgResponse: PGResponse, payment: PendingInvoicePayment, invoice: Invoice, storePaymentMethod: boolean) => {\n if (pgResponse.Type === PaymentGatewayResponseType.Error) {\n this.processing = false;\n return;\n }\n\n const invoiceId = payment.chargeType === ChargeType.NUMBER_0 ? invoice.id : undefined;\n\n const responseData = pgResponse.Data;\n const card: CreditCardInfo = {\n token: responseData.Token,\n billingZip: this.postalCode.$.trim(),\n number: responseData.Number,\n name: responseData.CardholderName,\n expMonth: responseData.ExpMonth,\n expYear: responseData.ExpYear,\n cvc: responseData.Cvc,\n issuerName: this.convertToCardIssuer(responseData.IssuerName),\n };\n\n const request: ChargeCreditCardRequest = {\n method: card,\n amount: payment.amount,\n notificationEmail: this.clientData.loginData.email,\n invoice: invoiceId || '',\n storePaymentMethod: storePaymentMethod,\n chargeType: payment.chargeType\n };\n\n const isStatementCharge = payment.chargeType === ChargeType.NUMBER_1;\n const statementRequest = isStatementCharge ? request as unknown as ChargeCustomerCreditCardRequest : undefined;\n\n if (statementRequest) {\n statementRequest.splits = payment.splits;\n statementRequest.customer = payment.statementId;\n statementRequest.chargeType = payment.chargeType\n }\n\n try {\n const response = statementRequest ?\n await this.chargeApi.chargeCreditCardMultiple(statementRequest, true,\n {\n 400: 'Failed to charge card. Verify the information you’ve entered or try a different card.',\n 500: 'Insufficient funds'\n })\n : await this.chargeApi.chargeCreditCard(request, true,\n {\n 400: 'Failed to charge card. Verify the information you’ve entered or try a different card.',\n 500: 'Insufficient funds'\n });\n this.processChargeResponse(invoice, payment, response.data);\n } catch (e) {\n const errorMessage = e as string;\n this.callPostError(errorMessage);\n this.processChargeFailure(errorMessage, invoice, payment)\n } finally {\n runInAction(() => {\n this.processing = false;\n });\n }\n };\n\n @action\n private processPayByBankCharge = async (paymentMethod: PaymentMethodInfo, payment: PendingInvoicePayment, invoice: Invoice) => {\n this.processing = true;\n const amount = payment.amount;\n const selectedCustomerId = this.customerSelector.value!;\n this.callPostError(undefined);\n\n const invoiceId = payment.chargeType === ChargeType.NUMBER_0 ? invoice.id : undefined;\n\n if (this.clientData.isLoggedIn && paymentMethod.paymentMethodId) {\n const request: ChargeCustomerStoredPaymentMethodRequest = {\n method: { id: paymentMethod.paymentMethodId },\n amount: amount,\n invoice: invoiceId,\n customerId: selectedCustomerId,\n customerExternalId: invoice.customerExternalId,\n notificationEmail: this.clientData.loginData.email,\n splits: payment.splits,\n chargeType: payment.chargeType,\n storePaymentMethod: false,\n isCreditCard: false,\n };\n try {\n const response = await this.payByBankApi.chargeStoredPaymentMethod(request);\n if (!response.data.transaction) {\n // Show error if no transaction is set\n this.callPostError(response.data.message || 'Failed to charge bank account. Verify your bank account or try a different bank account.');\n } else {\n this.processChargeResponse(invoice, payment, response.data);\n }\n }\n catch (e) {\n runInAction(() => {\n this.callPostError('Failed to charge bank account. Verify your bank account or try a different bank account.');\n this.processChargeFailure(e as string, invoice, payment);\n this.errorMessage = undefined;\n });\n }\n finally {\n runInAction(() => {\n this.processing = false;\n });\n }\n } else {\n const selectedCustomerId = this.customerSelector.value!;\n const selectedCustomer = this.customerInfos.find(c => c.id === selectedCustomerId);\n const bankAccount: BankAccountInfo = {\n name: invoice.customerName || selectedCustomer?.name || this.clientData.loginData.customerName || '',\n routing: (paymentMethod.routingNumber || '').replace(/[^0-9]/g, ''),\n number: (paymentMethod.number || '').replace(/[^0-9]/g, ''),\n checkNumber: '',\n publicToken: paymentMethod.token,\n accountId: paymentMethod.accountId\n };\n\n const request: ChargeCustomerACHRequest = {\n isBusinessPayment: paymentMethod.bankAccountType == BankAccountType.Business,\n chargeType: payment.chargeType,\n method: bankAccount,\n amount: amount,\n customerId: selectedCustomerId || invoice.customerId || Math.abs(this.hashCode(invoice.id)),\n customerExternalId: invoice.customerExternalId,\n invoice: invoiceId,\n notificationEmail: this.clientData.loginData.email,\n splits: payment.splits,\n storePaymentMethod: false\n };\n\n try {\n const response = await this.payByBankApi.charge(request, true);\n\n if (!response.data.transaction) {\n // Show error if no transaction is set\n this.callPostError(response.data.message || 'Failed to charge bank account. Verify your bank account or try a different bank account.');\n } else {\n this.processChargeResponse(invoice, payment, response.data);\n }\n } catch (e) {\n runInAction(() => {\n this.callPostError('Failed to charge bank account. Verify your bank account or try a different bank account.');\n this.processChargeFailure(e as string, invoice, payment);\n this.errorMessage = undefined;\n });\n } finally {\n runInAction(() => {\n this.processing = false;\n });\n }\n }\n };\n\n @action\n private hashCode = (s: string) => {\n return s.split(\"\").reduce(function (a, b) {\n a = ((a << 5) - a) + b.charCodeAt(0);\n return a & a;\n }, 0);\n };\n\n @action\n private processChargeResponse = (invoice: Invoice, payment: PendingInvoicePayment, response: ChargeResponse) => {\n const data = response;\n const amount = payment.amount;\n runInAction(() => {\n const invoiceNumber = invoice.number || invoice.id.toString();\n const confirmation: PaymentConfirmation = {\n number: data.payment,\n amountPaid: amount,\n remainingBalance: data.remainingBalance || payment.amountRemaining,\n notificationEmail: data.notificationEmail,\n transaction: data.transaction,\n invoiceNumber: invoiceNumber,\n customerId: invoice.customerId,\n };\n\n // invalidate cached invoice after successful payment is made\n if (payment.invoiceNumber) {\n delete this.invoiceCache[payment.invoiceNumber];\n }\n\n const isStatement = payment.chargeType === ChargeType.NUMBER_1;\n\n if (isStatement) {\n this.addPaymentConfirmationToCache(payment.statementId!!, confirmation);\n this.router.history.replace(\n `/statement/${payment.statementId}/confirm-payment/${confirmation.transaction}`\n );\n } else {\n this.addPaymentConfirmationToCache(confirmation.number, confirmation);\n\n this.analytics.paymentAttemptSuccess(\n invoiceNumber,\n invoice.customerId,\n amount\n );\n\n this.router.history.replace(\n `/invoice/${invoice.id}/confirm-payment/${confirmation.number}`\n );\n }\n });\n };\n\n @action\n private addPaymentConfirmationToCache = (confirmId: string, confirmation: PaymentConfirmation) => {\n sessionStorage.setItem(confirmId, JSON.stringify(confirmation));\n this.paymentConfirmationCache[confirmation.number] = confirmation;\n };\n\n @action\n private processChargeFailure = (error: string, invoice: Invoice, payment: PendingInvoicePayment) => {\n runInAction(() => {\n if (invoice) {\n this.analytics.paymentAttemptFail(\n invoice.number || invoice.id.toString(),\n invoice.customerId,\n payment.amount,\n error\n );\n }\n });\n };\n\n @action\n getCachedConfirmation = (confirmationNumber: string): PaymentConfirmation | undefined => {\n let confirmation: PaymentConfirmation | undefined = this.paymentConfirmationCache[confirmationNumber];\n if (!confirmation) {\n // Backup for cache failure\n var item = sessionStorage.getItem(confirmationNumber);\n confirmation = item ? JSON.parse(item) as PaymentConfirmation : undefined;\n sessionStorage.removeItem(confirmationNumber);\n }\n return confirmation;\n }\n\n @action\n processACH = async (paymentMethod: PaymentMethodInfo) => {\n const selectedCustomerId = this.customerSelector.value!;\n try {\n const bankAccountInfo: EditBankAccount = {\n id: 0,\n customerId: selectedCustomerId,\n primary: this.needToStoreAsPrimary,\n membership: true,\n businessUnitId: 0,\n customerName: paymentMethod.customerName,\n number: paymentMethod.number,\n routing: paymentMethod.routingNumber,\n zip: this.postalCode.$.trim()\n };\n\n const result = await this.savedBankAccountsApi.saveBankAccount(selectedCustomerId, bankAccountInfo, true,\n {\n 500: 'Failed to store bank account. Verify the information you’ve entered or try a different bank account.',\n }\n );\n this.lastSavedPaymentMethodId = result.data.id;\n await this.getSavedPaymentMethodsForCustomer(selectedCustomerId);\n } catch (e) {\n runInAction(() => {\n this.errorMessage = e;\n this.callCompleteAction(false);\n });\n } finally {\n runInAction(() => {\n this.processing = false;\n this.callCompleteAction(true);\n });\n }\n };\n\n @action\n processGatewayAddNewCard = async (callback: (paymentMethod: PaymentMethodInfo | undefined) => void) => {\n this.paymentGatewayService.handleSubmit(async (pgResponse: PGResponse) => {\n if (pgResponse.Type === PaymentGatewayResponseType.Error) {\n this.processing = false;\n callback(undefined);\n return;\n }\n\n this.lastPGResponse = pgResponse;\n\n const responseData = pgResponse.Data;\n\n const cardNumber = responseData.Number;\n const cardName = getCardNameByIssuer(this.convertToCardIssuer(responseData.IssuerName));\n const customerName = responseData.CardholderName;\n const cardNumberEnding = cardNumber.substring(cardNumber.length - 4, cardNumber.length);\n\n const paymentMethod: PaymentMethodInfo = {\n paymentMethodId: 0,\n primary: this.needToStoreAsPrimary,\n displayText: `${cardName} ending in *${cardNumberEnding}`,\n name: cardName,\n selected: true,\n icon: getCardIcon(cardName),\n expires: `${parseInt(responseData.ExpMonth, 10)}/${parseInt(responseData.ExpYear, 10)}`,\n customerName: customerName,\n bankName: cardName,\n number: cardNumber,\n paymentMethodType: PaymentMethodType.CreditCard\n };\n\n callback(paymentMethod);\n });\n }\n\n @action\n processAddNewCard = async (pgResponse: PGResponse) => {\n if (pgResponse.Type === PaymentGatewayResponseType.Error) {\n this.processing = false;\n this.callCompleteAction(false);\n return;\n }\n\n const responseData = pgResponse.Data;\n const selectedCustomerId = this.customerSelector.value!;\n\n const cardInfo: EditCreditCard = {\n id: 0,\n customerId: selectedCustomerId,\n primary: this.needToStoreAsPrimary,\n membership: true,\n businessUnitId: 0,\n isExpired: false,\n issuer: this.convertToCardIssuer(responseData.IssuerName),\n expYear: parseInt(responseData.ExpYear, 10),\n expMonth: parseInt(responseData.ExpMonth, 10),\n cvv: responseData.Cvc,\n number: responseData.Number,\n cardholderName: responseData.CardholderName,\n zip: this.postalCode.$.trim(),\n token: responseData.Token,\n };\n\n await this.processCreditCard(cardInfo);\n };\n\n @action\n processCreditCard = async (cardInfo: EditCreditCard) => {\n const selectedCustomerId = this.customerSelector.value!;\n try {\n const result = await this.savedCreditCardsApi.saveCreditCard(selectedCustomerId, cardInfo);\n this.lastSavedPaymentMethodId = result.data.id;\n await this.getSavedPaymentMethodsForCustomer(selectedCustomerId);\n } catch (e) {\n runInAction(() => {\n this.errorMessage = e;\n this.callCompleteAction(false);\n });\n } finally {\n runInAction(() => {\n this.processing = false;\n this.callCompleteAction(true);\n });\n }\n };\n\n @action\n resetErrorMessage() {\n this.errorMessage = undefined;\n };\n\n // Computed\n @computed get phone() {\n return this.clientData.portalData ? this.clientData.portalData.brandData.phone : undefined;\n };\n\n @computed get membershipName() {\n return this.membershipNameTypeStore.name || 'Membership';\n };\n\n @computed get availablePaymentMethodsCount() {\n return this.savedPaymentMethods?.filter(paymentMethod => !this.isExpired(paymentMethod)).length || 0;\n };\n}\n","import getDecorators from 'inversify-inject-decorators';\n\nimport { rootContainer } from '../ioc';\n\nimport { StatementStore } from './stores/statement.store';\nimport { ChargeStore } from './stores/charge.store';\nimport { PaymentGateway } from './stores/payment-gateway.store';\nimport { SavedCreditCardsStore } from 'src/payment-method/stores/saved-credit-cards.store';\nimport { SavedPaymentMethodsStore } from 'src/payment-method/stores/saved-payment-methods.store';\n\nexport const statementContainer = rootContainer.createChild();\nexport const { lazyInject } = getDecorators(statementContainer);\n\nstatementContainer.bind(StatementStore).toSelf().inSingletonScope();\nstatementContainer.bind(ChargeStore).toSelf().inSingletonScope();\nstatementContainer.bind(PaymentGateway).toSelf().inSingletonScope();\nstatementContainer.bind(SavedCreditCardsStore).toSelf().inSingletonScope();\nstatementContainer.bind(SavedPaymentMethodsStore).toSelf().inSingletonScope();","import { injectable } from '@servicetitan/react-ioc';\nimport { observable, computed } from 'mobx';\n\nexport interface PGResponse {\n Type: PaymentGatewayResponseType;\n Data: ResponseData;\n}\n\ninterface ResponseData {\n Token: string;\n Number: string;\n CardholderName: string;\n ExpMonth: string;\n ExpYear: string;\n Cvc: string;\n IssuerName: string | undefined;\n}\n\nexport enum PaymentGatewayResponseType {\n Error = 0,\n Submit = 1,\n SearsCard = 2,\n}\n\n@injectable()\nexport class PaymentGateway {\n @observable baseUrl: string = '';\n @observable apiKey: string = '';\n @observable paymentsServiceJwt: string = '';\n @observable paymentsServiceCreditCardProcessorExists: boolean = false;\n\n private tokenizationCompleteCallback?: (response: PGResponse) => void;\n\n getDesktopPaymentGatewayUrl(usePaymentsService: boolean | undefined = undefined): string {\n return this.getPaymentGatewayUrl('PortalDesktop', usePaymentsService);\n }\n\n getMobilePaymentGatewayUrl(usePaymentsService: boolean | undefined = undefined): string {\n return this.getPaymentGatewayUrl('PortalMobile', usePaymentsService);\n }\n\n getPaymentGatewayUrl = (view: string, usePaymentsService: boolean | undefined = undefined) => {\n // tslint:disable-next-line: prefer-template\n let url = `${this.baseUrl}/Forms/CreditCard?view=${view}&key=${this.apiKey}&origin=${window.location.origin}`;\n\n if (usePaymentsService === true || (usePaymentsService !== false && this.paymentsServiceJwt?.length && this.paymentsServiceCreditCardProcessorExists)) {\n url +=\n `&paymentsServiceJwt=${encodeURIComponent(this.paymentsServiceJwt)}` +\n '&processor=PaymentsService';\n }\n\n return url;\n }\n iframeMessageHandler = (event: MessageEvent) => {\n if (!this.postMessageEventIsValid(event)) {\n return;\n }\n\n if (this.tokenizationCompleteCallback) {\n this.tokenizationCompleteCallback!(event.data);\n // reset the callback after every execution.\n this.tokenizationCompleteCallback = undefined;\n }\n };\n\n postMessageEventIsValid = (event: MessageEvent) => {\n const iframe = document.getElementById('payment-gateway') as HTMLIFrameElement;\n return event.origin === this.baseUrl && event.source === iframe.contentWindow;\n };\n\n handleSubmit = (\n callback: (response: PGResponse) => void,\n e?: React.FormEvent\n ) => {\n e && e.preventDefault();\n\n const pgIframe = document.getElementById('payment-gateway') as HTMLIFrameElement | null;\n if (!pgIframe || !pgIframe.contentWindow) {\n return;\n }\n\n pgIframe.contentWindow.postMessage({ key: 'st.paymentgateway.submit' }, this.baseUrl);\n this.tokenizationCompleteCallback = callback;\n };\n}\n","import getDecorators from 'inversify-inject-decorators';\nimport { rootContainer } from '../ioc';\n\nimport { SavedCreditCardsStore } from './stores/saved-credit-cards.store';\nimport { PaymentGateway } from 'src/statement/stores/payment-gateway.store';\nimport { SavedPaymentMethodsStore } from './stores/saved-payment-methods.store';\nimport { ClientDataStore } from 'src/core/stores/client-data.store';\n\nexport const paymentMethodsContainer = rootContainer.createChild();\nexport const { lazyInject } = getDecorators(paymentMethodsContainer);\n\npaymentMethodsContainer.bind(SavedCreditCardsStore).toSelf().inSingletonScope();\npaymentMethodsContainer.bind(PaymentGateway).toSelf().inSingletonScope();\npaymentMethodsContainer.bind(SavedPaymentMethodsStore).toSelf().inSingletonScope();\npaymentMethodsContainer.bind(ClientDataStore).toSelf().inSingletonScope();\n","import getDecorators from 'inversify-inject-decorators';\n\nimport { rootContainer } from '../ioc';\n\nimport { LoginStore } from './stores/login.store';\n\nexport const loginContainer = rootContainer.createChild();\nexport const { lazyInject } = getDecorators(loginContainer);\n\nloginContainer.bind(LoginStore).toSelf().inSingletonScope();\n","import { injectable } from 'inversify';\nimport { computed } from 'mobx';\nimport {\n CreditCardInfo,\n Invoice,\n InvoicesApiService,\n ChargeApiService,\n ChargeCustomerACHRequest,\n BankAccountInfo,\n ChargeType,\n ChargeCustomerStoredPaymentMethodRequest,\n PaymentLinkApiService,\n} from 'src/api';\nimport { AnalyticsStore } from 'src/core/stores/analytics.store';\nimport { ClientDataStore } from 'src/core/stores/client-data.store';\nimport { HomeStore } from 'src/core/stores/home.store';\nimport { RouterStore } from 'src/core/stores/router.store';\nimport { SavedCreditCardsStore } from 'src/payment-method/stores/saved-credit-cards.store';\n\nexport interface PendingPayment {\n invoiceNumber: string;\n amount?: number;\n card?: Partial;\n bankAccount?: Partial;\n needToSaveCard?: boolean;\n}\n\nexport interface PaymentConfirmation {\n number: string;\n amountPaid: number;\n remainingBalance: number;\n notificationEmail: string;\n transaction: string;\n invoiceNumber: string;\n customerId: number;\n}\n\n@injectable()\nexport class InvoiceStore {\n payment: PendingPayment | undefined;\n\n private invoiceCache: { [id: string]: Invoice } = {};\n private paymentConfirmationCache: { [id: string]: PaymentConfirmation } = {};\n\n constructor(\n private invoicesApi: InvoicesApiService,\n private chargeApi: ChargeApiService,\n private readonly paymentLinkApi: PaymentLinkApiService,\n private analytics: AnalyticsStore,\n private clientData: ClientDataStore,\n private router: RouterStore,\n private readonly home: HomeStore,\n private savedCreditCardsStore: SavedCreditCardsStore\n ) { }\n\n getInvoice(id: string, forceRefresh?: boolean): Promise {\n const trimmedId = id.trim();\n\n if (!forceRefresh) {\n const cachedInvoice = this.invoiceCache[trimmedId];\n if (cachedInvoice) {\n return Promise.resolve(cachedInvoice);\n }\n }\n\n return this.invoicesApi.getInvoiceById(trimmedId, true).then(\n (resp) => {\n return this.paymentLinkApi.isInvoicePaymentLinkExpired(true).then((linkResp) => {\n const isInvoiceDisabled = resp.data.creditCardDisabled &&\n resp.data.achDisabled &&\n resp.data.payByBankDisabled;\n\n // Redirect if payment link is expired\n const isExpired = linkResp.data || (isInvoiceDisabled && this.clientData.isAnonymousPayments);\n if (isExpired) {\n this.router.history.replace('/invoice/expired-link');\n return new Promise(() => { });\n }\n\n this.invoiceCache[trimmedId] = resp.data;\n return Promise.resolve(resp.data);\n }, (linkErr) => {\n if (this.clientData.isAnonymousPayments) {\n this.router.history.replace('/invoice/expired-link');\n return new Promise(() => { });\n }\n\n throw linkErr;\n })\n },\n (err) => {\n if (this.clientData.isAnonymousPayments) {\n this.router.history.replace('/invoice/expired-link');\n return new Promise(() => { });\n }\n\n throw err;\n }\n );\n }\n\n submitAchPayment(\n payment: PendingPayment,\n isBusinessPayment: boolean\n ): Promise {\n if (!payment || !payment.amount || !payment.bankAccount) {\n return Promise.reject('Invalid input');\n }\n\n const invoice = this.invoiceCache[payment.invoiceNumber];\n if (!invoice) {\n return Promise.reject('Missing invoice');\n }\n const amount = payment.amount;\n const bankAccount: BankAccountInfo = {\n name: payment.bankAccount!.name!,\n routing: payment.bankAccount!.routing!,\n number: payment.bankAccount!.number!,\n checkNumber: '',\n };\n\n const request: ChargeCustomerACHRequest = {\n isBusinessPayment,\n amount,\n invoice: payment.invoiceNumber,\n chargeType: ChargeType.NUMBER_0,\n method: bankAccount,\n notificationEmail: this.clientData.loginData.email,\n splits: [\n {\n invoiceId: payment.invoiceNumber,\n amountApplied: payment.amount,\n usesPaymentsService: false,\n },\n ],\n storePaymentMethod: false,\n };\n return this.chargeApi\n .chargeBankAccount(request, true, {\n 400: 'Failed to charge bank account. Verify the information you’ve entered or try a different bank account.',\n })\n .then(\n (resp) => {\n // payment has been submitted, do not reuse\n this.payment = undefined;\n // invalidate cached invoice because there's a new payment\n delete this.invoiceCache[payment.invoiceNumber];\n\n const { data } = resp;\n const confirmation: PaymentConfirmation = {\n number: data.payment,\n amountPaid: amount,\n remainingBalance: invoice.balance - amount,\n notificationEmail: data.notificationEmail,\n transaction: data.transaction,\n invoiceNumber: invoice.number || invoice.id.toString(),\n customerId: invoice.customerId,\n };\n\n this.paymentConfirmationCache[confirmation.number] = confirmation;\n this.analytics.paymentAttemptSuccess(\n invoice.number || invoice.id.toString(),\n invoice.customerId,\n amount\n );\n\n return confirmation;\n },\n (err) => {\n this.analytics.paymentAttemptFail(\n invoice.number || invoice.id.toString(),\n invoice.customerId,\n amount,\n err.message\n );\n throw err;\n }\n );\n }\n\n submitPaymentToUseStoredPaymentMethod(\n payment: PendingPayment | undefined\n ): Promise {\n if (!payment || !payment.amount || !(payment.card || payment.bankAccount)) {\n return Promise.reject('Invalid input');\n }\n const amount = payment.amount;\n const invoice = this.invoiceCache[payment.invoiceNumber];\n if (!invoice) {\n return Promise.reject('Missing invoice');\n }\n\n if (!this.savedCreditCardsStore.selectedCardToPay) {\n return Promise.reject('Need to selected a stored payment method');\n }\n\n const request: ChargeCustomerStoredPaymentMethodRequest = {\n amount,\n method: { id: this.savedCreditCardsStore.selectedCardToPay.id },\n notificationEmail: this.clientData.loginData.email,\n chargeType: ChargeType.NUMBER_0,\n splits: [\n {\n invoiceId: payment.invoiceNumber,\n amountApplied: payment.amount,\n usesPaymentsService: false, // this doesn't matter because it's a stored payment method so no need for gateway\n },\n ],\n invoice: payment.invoiceNumber,\n storePaymentMethod: false,\n isCreditCard: true\n };\n\n return this.chargeApi\n .chargeStoredPaymentMethod(request, true, {\n 400: 'Failed to charge card. Verify the stored card you’ve selected or try a different card.',\n })\n .then(\n (resp) => {\n // payment has been submitted, do not reuse\n this.payment = undefined;\n // invalidate cached invoice because there's a new payment\n delete this.invoiceCache[payment.invoiceNumber];\n\n const { data } = resp;\n const confirmation: PaymentConfirmation = {\n number: data.payment,\n amountPaid: amount,\n remainingBalance: invoice.balance - amount,\n notificationEmail: data.notificationEmail,\n transaction: data.transaction,\n invoiceNumber: invoice.number || invoice.id.toString(),\n customerId: invoice.customerId,\n };\n\n this.paymentConfirmationCache[confirmation.number] = confirmation;\n this.analytics.paymentAttemptSuccess(\n invoice.number || invoice.id.toString(),\n invoice.customerId,\n amount\n );\n\n return confirmation;\n },\n (err) => {\n this.analytics.paymentAttemptFail(\n invoice.number || invoice.id.toString(),\n invoice.customerId,\n amount,\n err.message\n );\n throw err;\n }\n );\n }\n\n submitPayment(payment: PendingPayment): Promise {\n if (!payment || !payment.amount || !(payment.card || payment.bankAccount)) {\n return Promise.reject('Invalid input');\n }\n\n const invoice = this.invoiceCache[payment.invoiceNumber];\n if (!invoice) {\n return Promise.reject('Missing invoice');\n }\n\n const amount = payment.amount;\n\n return this.chargeApi\n .chargeCreditCard(\n {\n amount,\n storePaymentMethod: payment.needToSaveCard || false,\n invoice: payment.invoiceNumber,\n method: payment.card as CreditCardInfo,\n notificationEmail: this.clientData.loginData.email,\n },\n true,\n {\n 400: 'Failed to charge card. Verify the information you’ve entered or try a different card.',\n }\n )\n .then(\n (resp) => {\n // payment has been submitted, do not reuse\n this.payment = undefined;\n // invalidate cached invoice because there's a new payment\n delete this.invoiceCache[payment.invoiceNumber];\n\n const { data } = resp;\n const confirmation: PaymentConfirmation = {\n number: data.payment,\n amountPaid: amount,\n remainingBalance: invoice.balance - amount,\n notificationEmail: data.notificationEmail,\n transaction: data.transaction,\n invoiceNumber: invoice.number || invoice.id.toString(),\n customerId: invoice.customerId,\n };\n\n this.paymentConfirmationCache[confirmation.number] = confirmation;\n this.analytics.paymentAttemptSuccess(\n invoice.number || invoice.id.toString(),\n invoice.customerId,\n amount\n );\n\n return confirmation;\n },\n (err) => {\n this.analytics.paymentAttemptFail(\n invoice.number || invoice.id.toString(),\n invoice.customerId,\n amount,\n err.message\n );\n throw err;\n }\n );\n }\n\n getCachedConfirmation(confirmationNumber: string): PaymentConfirmation | undefined {\n return this.paymentConfirmationCache[confirmationNumber];\n }\n\n getCachedInvoice(id: string): Invoice | undefined {\n return this.invoiceCache[id];\n }\n\n setCachedConfirmation(confirmationNumber: string, paymentConfirmation: PaymentConfirmation) {\n this.paymentConfirmationCache[confirmationNumber] = paymentConfirmation;\n }\n\n getOpenInvoices(): Promise {\n return this.invoicesApi.getInvoices(true).then((resp) => {\n const invoices = resp.data;\n invoices.forEach((invoice) => {\n return (this.invoiceCache[invoice.id] = invoice);\n });\n return invoices;\n });\n }\n\n getSavedCreditCardStore = () => this.savedCreditCardsStore;\n\n @computed get showLoginLink() {\n return !this.clientData.isLoggedIn && this.savedCreditCardsStore.isSavedCreditCardFeatureOn;\n }\n\n @computed get needToChargeStoredCard() {\n return this.showStoreOption && this.savedCreditCardsStore.selectedCardToPay;\n }\n\n @computed get showStoreOption() {\n return this.clientData.isLoggedIn && this.savedCreditCardsStore.isSavedCreditCardFeatureOn;\n }\n}\n","import { injectable } from '@servicetitan/react-ioc';\nimport { observable, runInAction, action, computed } from 'mobx';\nimport {\n SplitInfo,\n CreditCardInfo,\n ChargeCustomerCreditCardRequest,\n ChargeApiService,\n CustomerStatementModel,\n BankAccountInfo,\n ChargeCustomerACHRequest,\n ChargeType,\n CreditCardIssuer,\n} from 'src/api';\nimport { FormState, FieldState } from 'formstate';\nimport * as Validators from 'src/invoice/components/card-info/cc-validators';\nimport { RouterStore } from 'src/core/stores/router.store';\nimport { ClientDataStore } from 'src/core/stores/client-data.store';\nimport { PaymentGateway, PGResponse, PaymentGatewayResponseType } from './payment-gateway.store';\nimport { HomeStore } from 'src/core/stores/home.store';\nimport { SavedCreditCardsStore } from 'src/payment-method/stores/saved-credit-cards.store';\nimport { ChargeCustomerStoredPaymentMethodRequest } from 'src/api/model/chargeCustomerStoredPaymentMethodRequest';\n\n@injectable()\nexport class ChargeStore {\n @observable splits: SplitInfo[] = [];\n @observable outstandingBalance: number = 0;\n @observable statementBalance: number = 0;\n @observable paymentAmount: number = 0;\n @observable errorMessage?: string | any;\n @observable id?: string;\n @observable paymentCompleted: boolean = false;\n @observable authCode: string = '';\n @observable paymentProcessing: boolean = false;\n @observable remainingBalance: number = 0;\n @observable creditCardDisabled: boolean = false;\n @observable achDisabled: boolean = false;\n @observable multiplePaymentOptionsEnabled: boolean = false;\n @observable needToStoreCreditCard: boolean = false;\n @observable useNewCard: boolean = false;\n\n constructor(\n private readonly chargeApiService: ChargeApiService,\n private readonly router: RouterStore,\n private readonly clientData: ClientDataStore,\n private readonly paymentGatewayService: PaymentGateway,\n private readonly savedCreditCardsStore: SavedCreditCardsStore,\n private readonly homeStore: HomeStore\n ) {}\n\n postalCode = new FieldState('').validators(Validators.zipPostalCodeValidator);\n\n form = new FormState({\n postalCode: this.postalCode,\n });\n\n @action\n initialize = (id: string) => {\n // if statement invoices have not been selected, redirect.\n if (this.paymentAmount <= 0) {\n this.router.history.replace(`/statement/${id}`);\n }\n\n this.id = id;\n this.postalCode.dirty = true;\n this.useNewCard = false;\n this.savedCreditCardsStore.setDefaultSelectedCardToPay();\n };\n\n initializeConfirmationPage = (id: string) => {\n if (this.paymentAmount <= 0) {\n this.router.history.replace(`/statement/${id}`);\n }\n this.id = id;\n\n this.homeStore.refreshHomeData(); // remove \"Pay your balance\" from SidenavWrapperImpl\n this.paymentCompleted = true; // will make StatementStore refresh its data\n };\n\n backToSelectionPage = (id: string) => {\n this.router.history.replace(`/statement/${id}`);\n };\n\n initializeFromStatementModel = (statementModel: CustomerStatementModel) => {\n if (statementModel.customers && statementModel.customers.length > 0) {\n this.creditCardDisabled = statementModel.customers[0].creditCardDisabled;\n this.achDisabled = statementModel.customers[0].achDisabled;\n this.multiplePaymentOptionsEnabled =\n statementModel.customers[0].multiplePaymentOptionsEnabled;\n }\n };\n\n @action\n clearError = () => {\n this.errorMessage = undefined;\n };\n\n convertToCardIssuer = (name: string | undefined): CreditCardIssuer => {\n if (name === undefined) {\n return CreditCardIssuer.NUMBER_0;\n }\n switch (name.toLowerCase()) {\n case 'americanexpress':\n return CreditCardIssuer.NUMBER_3;\n case 'visa':\n return CreditCardIssuer.NUMBER_4;\n case 'mastercard':\n return CreditCardIssuer.NUMBER_5;\n case 'discover':\n return CreditCardIssuer.NUMBER_6;\n default:\n return CreditCardIssuer.NUMBER_0;\n }\n };\n\n @action\n handleSubmit = async () => {\n this.paymentProcessing = true;\n if (this.isLoggedIn && this.savedCreditCardsStore.selectedCardToPay) {\n const request: ChargeCustomerStoredPaymentMethodRequest = {\n method: { id: this.savedCreditCardsStore.selectedCardToPay.id },\n amount: this.paymentAmount,\n customer: this.id!,\n chargeType: ChargeType.NUMBER_1,\n notificationEmail: this.clientData.loginData.email,\n splits: this.splits,\n storePaymentMethod: this.needToStoreCreditCard,\n isCreditCard: true\n };\n const response = await this.chargeApiService.chargeStoredPaymentMethod(request);\n runInAction(() => {\n this.paymentProcessing = false;\n this.remainingBalance = response.data.remainingBalance;\n this.authCode = response.data.transaction;\n this.paymentCompleted = true;\n this.router.history.replace(\n `/statement/${this.id}/confirm-payment/${response.data.transaction}`\n );\n });\n } else {\n await this.form.validate();\n this.paymentGatewayService.handleSubmit(this.processCharge);\n }\n };\n\n @action\n processCharge = async (pgResponse: PGResponse) => {\n if (pgResponse.Type === PaymentGatewayResponseType.Error || this.form.hasError) {\n this.paymentProcessing = false;\n return;\n }\n const responseData = pgResponse.Data;\n const card: CreditCardInfo = {\n token: responseData.Token,\n billingZip: this.postalCode.$.trim(),\n number: responseData.Number,\n name: responseData.CardholderName,\n expMonth: responseData.ExpMonth,\n expYear: responseData.ExpYear,\n cvc: responseData.Cvc,\n issuerName: this.convertToCardIssuer(responseData.IssuerName),\n };\n\n const request: ChargeCustomerCreditCardRequest = {\n method: card,\n amount: this.paymentAmount,\n customer: this.id!,\n notificationEmail: this.clientData.loginData.email,\n splits: this.splits,\n storePaymentMethod: this.needToStoreCreditCard,\n };\n try {\n const response = await this.chargeApiService.chargeCreditCardMultiple(request);\n runInAction(() => {\n this.remainingBalance = response.data.remainingBalance;\n this.authCode = response.data.transaction;\n this.paymentCompleted = true;\n this.router.history.replace(\n `/statement/${this.id}/confirm-payment/${response.data.transaction}`\n );\n });\n } catch (e) {\n runInAction(() => {\n this.errorMessage = e;\n });\n } finally {\n runInAction(() => {\n this.paymentProcessing = false;\n });\n }\n };\n\n @action\n processMultiBankAccount = async (bankAccount: BankAccountInfo, businessPayment: boolean) => {\n const request: ChargeCustomerACHRequest = {\n isBusinessPayment: businessPayment,\n chargeType: ChargeType.NUMBER_1,\n method: bankAccount,\n amount: this.paymentAmount,\n customer: this.id!,\n notificationEmail: this.clientData.loginData.email,\n splits: this.splits,\n storePaymentMethod: false,\n };\n try {\n const response = await this.chargeApiService.chargeBankAccount(request);\n runInAction(() => {\n this.remainingBalance = response.data.remainingBalance;\n this.authCode = response.data.transaction;\n this.paymentCompleted = true;\n this.router.history.replace(\n `/statement/${this.id}/confirm-payment/${response.data.transaction}`\n );\n });\n } catch (e) {\n runInAction(() => {\n this.errorMessage = e;\n });\n } finally {\n runInAction(() => {\n this.paymentProcessing = false;\n });\n }\n };\n\n @action\n updateStoreCreditCardOption = (checked: boolean) => (this.needToStoreCreditCard = checked);\n\n @action\n setUseNewCard = (value: boolean) => (this.useNewCard = value);\n\n @computed\n get isLoggedIn() {\n return this.clientData.isLoggedIn && this.savedCreditCardsStore.isSavedCreditCardFeatureOn;\n }\n\n @computed get showLoginLink() {\n return !this.clientData.isLoggedIn && this.savedCreditCardsStore.isSavedCreditCardFeatureOn;\n }\n}\n","import getDecorators from 'inversify-inject-decorators';\n\nimport { rootContainer } from '../ioc';\n\nimport { InvoiceStore } from './stores/invoice.store';\nimport { SavedCreditCardsStore } from 'src/payment-method/stores/saved-credit-cards.store';\nimport { PaymentGateway } from 'src/statement/stores/payment-gateway.store';\nimport { SavedPaymentMethodsStore } from 'src/payment-method/stores/saved-payment-methods.store';\n\nexport const invoiceContainer = rootContainer.createChild();\nexport const { lazyInject } = getDecorators(invoiceContainer);\n\ninvoiceContainer.bind(InvoiceStore).toSelf().inSingletonScope();\ninvoiceContainer.bind(SavedCreditCardsStore).toSelf().inSingletonScope();\ninvoiceContainer.bind(PaymentGateway).toSelf().inSingletonScope();\ninvoiceContainer.bind(SavedPaymentMethodsStore).toSelf().inSingletonScope();","import { injectable } from 'inversify';\nimport { observable, computed } from 'mobx';\n\nimport { AuthenticateRequest, LoginApiService } from 'src/api';\nimport { ClientDataStore } from 'src/core/stores/client-data.store';\nimport { RouterStore } from 'src/core/stores/router.store';\nimport { lazyInject } from '../../ioc';\n\n@injectable()\nexport class LoginStore {\n @lazyInject(ClientDataStore) clientData!: ClientDataStore;\n @lazyInject(LoginApiService) loginApi!: LoginApiService;\n @lazyInject(RouterStore) router!: RouterStore;\n\n @observable pwFormEmail: string | undefined;\n @observable pwFormPassword: string | undefined;\n @observable pwFormToken: string | undefined;\n @computed get pwFormFirstName() {\n return this.loginApi.checkTokenObservable\n ? this.loginApi.checkTokenObservable.firstName\n : undefined;\n }\n\n authenticate(req: AuthenticateRequest): Promise {\n return this.loginApi.authenticate(req).then((resp) => {\n if (resp.data.success) {\n this.clientData.updateLoginData();\n } else {\n throw 'Those credentials don’t look right. Please try again.';\n }\n });\n }\n\n checkToken(token: string): Promise {\n if (this.pwFormToken === token && this.pwFormEmail) {\n return Promise.resolve(this.pwFormEmail);\n }\n\n this.pwFormToken = undefined;\n this.pwFormEmail = undefined;\n this.pwFormPassword = undefined;\n return this.loginApi.checkToken({ token }, true).then(\n (result) => {\n if (!result.data.success) {\n throw 'Invalid token';\n }\n if (!result.data.email) {\n throw 'Invalid email for token';\n }\n this.pwFormToken = token;\n this.pwFormEmail = result.data.email;\n return this.pwFormEmail;\n },\n (err) => {\n throw 'Failed to validate token';\n }\n );\n }\n\n loginWithReturn = () => {\n this.loginApi.logOut();\n this.clientData.removeLoginCookie();\n this.router.history.push('/login/', { from: { pathname: this.router.location.pathname } });\n }\n}\n","import * as React from 'react';\nimport { observable, computed } from 'mobx';\nimport { FormState, FieldState } from 'formstate';\nimport { lazyInject } from 'src/invoice/ioc';\nimport { InvoiceStore } from 'src/invoice/stores/invoice.store';\nimport { RouterStore } from 'src/core/stores/router.store';\nimport { FormValidators } from '@servicetitan/form';\nimport { BusyFormState } from 'src/util/busy-form';\nimport { ClientDataStore } from '../../../../core/stores/client-data.store';\nimport { statementContainer } from '../../../../statement/ioc';\nimport { ChargeStore } from '../../../../statement/stores/charge.store';\nimport { BankAccountInfo } from 'src/api';\n\nexport const BankAccountType = {\n Business: 'business',\n Personal: 'personal',\n};\n\nexport class AchInfoFormState extends BusyFormState {\n @lazyInject(InvoiceStore) private invoiceStore!: InvoiceStore;\n @lazyInject(RouterStore) private router!: RouterStore;\n @lazyInject(ClientDataStore) private clientData!: ClientDataStore;\n\n @observable errorMessage: string | undefined;\n\n @observable modalIsOpen = false;\n @observable isProcessing = false;\n\n currentInputAccountNumber: string = '';\n accountType = new FieldState('').validators(FormValidators.required);\n accountName = new FieldState('').validators(FormValidators.required);\n\n routingNumber = new FieldState('').validators((value) => {\n if (!value) {\n return 'Field is required.';\n }\n const valid = value.length === 9 && value.replace(/\\D/g, '').length === value.length;\n return valid ? null : 'Routing number is 9 digits.';\n });\n\n accountNumber = new FieldState('').validators((value) => {\n if (!value) {\n return 'Field is required.';\n }\n const valid =\n value.length > 3 &&\n value.length < 18 &&\n value.replace(/\\D/g, '').length === value.length;\n // Here the value hasn't been assigned to accountNumber, so need the intermediate value to validate the confirmAccountNumber.\n this.currentInputAccountNumber = value;\n this.form.$.confirmAccountNumber.validate();\n return valid ? null : 'Account number is between 4 and 17 digits.';\n });\n\n confirmAccountNumber = new FieldState('').validators((value) => {\n if (!value) {\n return 'Field is required.';\n }\n const valid = value === this.currentInputAccountNumber;\n return valid ? null : 'Must match account number.';\n });\n\n @computed get phone() {\n return this.clientData.portalData ? this.clientData.portalData.brandData.phone : undefined;\n }\n\n @computed get companyName() {\n return this.clientData.portalData\n ? this.clientData.portalData.brandData.officialName\n : undefined;\n }\n\n form = new FormState({\n accountType: this.accountType,\n accountName: this.accountName,\n routingNumber: this.routingNumber,\n accountNumber: this.accountNumber,\n confirmAccountNumber: this.confirmAccountNumber,\n isBusy: this.isBusy,\n });\n\n constructor() {\n super();\n const payment = this.invoiceStore.payment;\n this.form.validate();\n if (!payment) {\n return;\n }\n\n if (!payment.bankAccount) {\n payment.bankAccount = {};\n }\n\n const bankAccount = payment.bankAccount;\n\n this.accountType.reset('');\n this.accountName.reset(bankAccount.name || '');\n this.routingNumber.reset(bankAccount.routing || '');\n this.accountNumber.reset(bankAccount.number || '');\n this.confirmAccountNumber.reset('');\n }\n\n clearError = () => {\n this.errorMessage = undefined;\n };\n\n changeAccountType = (e: any, val: string) => {\n this.accountType.reset(val);\n };\n\n closeConfirmationModal = () => {\n this.modalIsOpen = false;\n };\n\n showConfirmationModal = () => {\n this.modalIsOpen = true;\n };\n\n handleSubmit = async (e?: React.FormEvent) => {\n e && e.preventDefault();\n this.closeConfirmationModal();\n const payment = this.invoiceStore.payment;\n await this.form.validate();\n if (this.form.hasError) {\n return;\n }\n const bankAccount: BankAccountInfo = {\n name: this.accountName.$.trim(),\n routing: this.routingNumber.$.replace(/[^0-9]/g, ''),\n number: this.accountNumber.$.replace(/[^0-9]/g, ''),\n checkNumber: '',\n };\n if (payment) {\n payment.bankAccount = bankAccount;\n this.withBusy(\n this.invoiceStore.submitAchPayment(\n payment,\n this.accountType.$.trim() === BankAccountType.Business\n )\n ).then(\n (confirmation) => {\n this.router.history.push(\n `/invoice/${payment.invoiceNumber}/confirm-payment/${confirmation.number}`\n );\n },\n (err) => {\n this.errorMessage = err;\n }\n );\n } else {\n this.isProcessing = true;\n const { processMultiBankAccount } = statementContainer.get(ChargeStore);\n await processMultiBankAccount(\n bankAccount,\n this.accountType.$.trim() === BankAccountType.Business\n );\n this.isProcessing = false;\n }\n };\n}\n","import { injectable } from 'inversify';\nimport { AnvilSelectOptionsProps } from '@servicetitan/design-system';\nimport { TableState, InMemoryDataSource as InMemoryGridDataSource } from '@servicetitan/table';\nimport { DropdownState, IDropdownState, InMemoryDataSource } from '@servicetitan/form';\nimport { FieldState } from 'formstate';\nimport { computed, observable, runInAction, action } from 'mobx';\nimport { StatementsApiService } from '../../api/api/statementsApi.service';\nimport { CustomerModel, PaymentLinkApiService } from 'src/api';\nimport { address } from 'src/util/formatters';\nimport { ChargeStore } from './charge.store';\nimport moment from 'moment';\nimport { Invoice } from 'src/api/model/invoice';\nimport { RouterStore } from 'src/core/stores/router.store';\nimport { ClientDataStore } from 'src/core/stores/client-data.store';\n\nexport interface InvoiceRowModel {\n invoiceId: string;\n invoiceNumber?: string;\n serviceDate?: Date;\n serviceAddress?: string;\n dueDate?: Date;\n invoiceDate?: Date;\n invoiceTotal: number;\n paymentTotal: number;\n invoiceBalance: number;\n usesPaymentsService: boolean;\n}\n\nexport enum InvoiceFilter {\n All = 1,\n PastDue = 2,\n Statement = 3,\n}\n\nexport interface ExtendedCustomerModel extends CustomerModel {\n balance: number;\n}\n\nexport interface CustomerAnvilSelectOptionsProps extends AnvilSelectOptionsProps {\n text: string;\n value: string;\n}\n\nconst DEFAULT_FILTER = InvoiceFilter.Statement;\n\n@injectable()\nexport class StatementStore {\n public gridState = new TableState({\n pageSize: 20,\n });\n @observable selectedCustomer?: CustomerModel;\n @observable selectedFilter: InvoiceFilter = DEFAULT_FILTER;\n @observable customerDropdownState!: IDropdownState;\n @observable customerMap: Map = new Map<\n string,\n ExtendedCustomerModel\n >();\n searchTerm: FieldState = new FieldState('').onUpdate(\n async (state) => await this.customerDropdownState.onSearchChange(state.value)\n );\n\n constructor(\n private readonly statementApiService: StatementsApiService,\n private paymentLinkApi: PaymentLinkApiService,\n private readonly chargeInfoService: ChargeStore,\n private readonly router: RouterStore,\n private readonly clientData: ClientDataStore\n ) { }\n\n initialize = async (statementId?: string) => {\n try {\n if (this.clientData.isAnonymousStatement) {\n const statementExpired = (await this.paymentLinkApi.isStatementPaymentLinkExpired(true)).data;\n if (statementExpired) {\n await runInAction(() => {\n this.router.history.replace('/statement/expired-link');\n });\n return;\n }\n }\n\n if (!this.selectedCustomer || this.chargeInfoService.paymentCompleted) {\n const response = statementId\n ? await this.statementApiService.getCustomerStatementsById(statementId, true)\n : await this.statementApiService.getCustomerStatements(true);\n\n const preSelectedCustomerId =\n statementId || response.data.customers!.length === 1\n ? response.data.customers![0].id\n : undefined;\n\n await runInAction(async () => {\n this.chargeInfoService.paymentCompleted = false;\n this.chargeInfoService.initializeFromStatementModel(response.data!);\n this.initCustomerMap(response.data.customers);\n this.initCustomerDropdownState(response.data.customers);\n this.selectCustomer(preSelectedCustomerId);\n });\n }\n } catch (e) {\n await runInAction(() => {\n this.router.history.replace('/statement/not-found');\n });\n }\n };\n\n @action selectCustomer = async (customerId?: string) => {\n !customerId\n ? (this.selectedCustomer = undefined)\n : (this.selectedCustomer = this.customerMap.get(customerId!));\n this.initInvoiceFilter();\n this.clearSearch();\n await this.setDataSource();\n };\n\n initInvoiceFilter = () => {\n this.selectedFilter = this.clientData.isLoggedIn\n ? InvoiceFilter.All\n : this.clientData.isAnonymousStatement\n ? InvoiceFilter.Statement\n : InvoiceFilter.PastDue;\n };\n\n @action reset = () => {\n this.selectedCustomer = undefined;\n this.selectedFilter = DEFAULT_FILTER;\n };\n\n @action clearSearch = async () => {\n this.searchTerm.reset();\n };\n\n private initCustomerMap = (customers?: CustomerModel[]) => {\n this.customerMap.clear();\n customers?.forEach((customer) => {\n const extendedCustomer = customer as ExtendedCustomerModel;\n extendedCustomer.balance = customer.invoices.reduce((sum, inv) => sum + inv.balance, 0);\n this.customerMap.set(customer.id, extendedCustomer);\n });\n };\n\n private initCustomerDropdownState = (customers?: CustomerModel[]) => {\n if (!customers) return;\n const options = customers.map(\n (customer: CustomerModel) =>\n ({\n value: customer.id,\n text: `${customer.name} ${customer.address.streetAddress} ${customer.address.city}, ${customer.address.state} ${customer.address.city}`,\n } as CustomerAnvilSelectOptionsProps)\n );\n const dropdownDataSource = new InMemoryDataSource(\n options\n );\n this.customerDropdownState = new DropdownState(dropdownDataSource);\n };\n\n private setDataSource = async () => {\n this.gridState.reset();\n await this.gridState.setDataSource(\n new InMemoryGridDataSource(\n this.filteredInvoices,\n (row) => row.invoiceId\n )\n );\n };\n\n private mapInvoiceColumns = (invoices: Invoice[]): InvoiceRowModel[] => {\n if (!invoices) return [];\n return invoices.map((invoice) => {\n return {\n invoiceId: invoice.id,\n invoiceNumber: invoice.number,\n serviceDate: invoice.serviceDate ? Date.parse(invoice.serviceDate) : undefined,\n serviceAddress: address(invoice.address),\n dueDate: invoice.dueDate ? Date.parse(invoice.dueDate) : undefined,\n invoiceDate: invoice.billingDate ? Date.parse(invoice.billingDate) : undefined,\n invoiceTotal: invoice.total,\n paymentTotal: invoice.paymentTotal,\n invoiceBalance: invoice.balance,\n usesPaymentsService: invoice.usesPaymentsService,\n };\n });\n };\n\n @action changeFilter = async (filter: InvoiceFilter) => {\n this.selectedFilter = filter;\n await this.setDataSource();\n };\n\n @action makePayment = () => {\n this.chargeInfoService.paymentAmount = parseFloat(this.paymentAmountTotal.toFixed(2));\n this.chargeInfoService.statementBalance = this.statementBalance;\n this.chargeInfoService.outstandingBalance = this.outstandingBalance;\n this.chargeInfoService.splits = Array.from(this.selectedInvoices).map((invoice) => {\n return { invoiceId: invoice.invoiceId, amountApplied: invoice.invoiceBalance, usesPaymentsService: invoice.usesPaymentsService };\n });\n };\n\n @computed get isMultipleCustomers(): boolean {\n return this.customerMap.size > 1;\n }\n\n @computed get isPaymentAllowed(): boolean {\n if (!this.selectedCustomer) return false;\n return !this.selectedCustomer!.creditCardDisabled || !this.selectedCustomer!.achDisabled || !this.selectedCustomer!.payByBankDisabled;\n }\n\n @computed get overdueInvoices(): Invoice[] {\n if (!this.selectedCustomer) return [];\n const overdue =\n this.selectedCustomer!.invoices.filter(\n (inv) => !!inv.dueDate && moment().isAfter(inv.dueDate, 'd')\n ) || [];\n return overdue;\n }\n\n @computed get statementInvoices(): Invoice[] {\n if (!this.selectedCustomer) return [];\n const statementInvoices =\n this.selectedCustomer!.invoices.filter(\n (inv) =>\n !!inv.dueDate &&\n moment(this.selectedCustomer!.statementSentDate).isSameOrAfter(\n inv.invoiceDate,\n 'd'\n )\n ) || [];\n return statementInvoices;\n }\n\n @computed get filteredInvoices(): InvoiceRowModel[] {\n switch (this.selectedFilter) {\n case InvoiceFilter.PastDue:\n return this.mapInvoiceColumns(this.overdueInvoices);\n case InvoiceFilter.Statement:\n return this.mapInvoiceColumns(this.statementInvoices);\n case InvoiceFilter.All:\n if (!this.selectedCustomer) return [];\n return this.mapInvoiceColumns(this.selectedCustomer!.invoices);\n }\n }\n\n @computed get shouldShowDueDate(): boolean {\n return this.filteredInvoices.some(x => !!x.dueDate);\n }\n\n @computed get selectedInvoices(): Set {\n if (this.gridState.selectedCount > 0) {\n return new Set(\n this.filteredInvoices.filter((inv) => this.gridState.selectedIds.has(inv.invoiceId))\n );\n }\n return new Set(this.filteredInvoices);\n }\n\n @computed get selectedInvoiceCount(): number {\n return this.selectedInvoices.size;\n }\n\n @computed get filteredInvoiceCount(): number {\n return this.filteredInvoices.length;\n }\n\n @computed get overdueInvoiceCount(): number {\n return this.overdueInvoices.length;\n }\n\n @computed get invoiceAmountTotal(): number {\n return this.filteredInvoices.reduce((sum, inv) => sum + inv.invoiceTotal, 0);\n }\n\n @computed get previousPaymentTotal(): number {\n return this.filteredInvoices.reduce((sum, inv) => sum + inv.paymentTotal, 0);\n }\n\n @computed get invoiceBalanceTotal(): number {\n return this.filteredInvoices.reduce((sum, inv) => sum + inv.invoiceBalance, 0);\n }\n\n @computed get paymentAmountTotal(): number {\n return Array.from(this.selectedInvoices).reduce((sum, inv) => sum + inv.invoiceBalance, 0);\n }\n\n @computed get statementBalance(): number {\n return this.statementInvoices.reduce((sum, inv) => sum + inv.balance, 0);\n }\n\n @computed get outstandingBalance(): number {\n if (!this.selectedCustomer) return 0;\n return this.selectedCustomer.invoices.reduce((sum, inv) => sum + inv.balance, 0);\n }\n}\n","export const cloneDeep = require('lodash/cloneDeep') as (value: T) => T;\n","import { inject, injectable } from '@servicetitan/react-ioc';\nimport {\n SavedCreditCardsApiService,\n CreditCard,\n CreditCardIssuer,\n EditCreditCard,\n ChargeApiService,\n PortalUser,\n} from 'src/api';\nimport { computed, observable, action, runInAction } from 'mobx';\nimport { cloneDeep } from 'src/util/clone-deep';\nimport { RouterStore } from 'src/core/stores/router.store';\nimport { lazyInject } from 'src/ioc';\nimport { ClientDataStore } from 'src/core/stores/client-data.store';\nimport {\n PaymentGateway,\n PGResponse,\n PaymentGatewayResponseType,\n} from 'src/statement/stores/payment-gateway.store';\nimport { FieldState, FormState } from 'formstate';\nimport * as Validators from 'src/invoice/components/card-info/cc-validators';\nimport { MembershipNameTypeStore } from 'src/core/stores/membership-name-type.store';\nimport { DropdownFieldState } from '@servicetitan/form';\nimport { AnvilSelectOptionsProps } from '@servicetitan/design-system';\n\n// Interfaces\n\n@injectable()\nexport class SavedCreditCardsStore {\n constructor(\n private savedCreditCardsApi: SavedCreditCardsApiService,\n private readonly paymentGatewayService: PaymentGateway,\n private readonly chargeApi: ChargeApiService\n ) {\n this.init();\n }\n\n @lazyInject(RouterStore) router!: RouterStore;\n @lazyInject(ClientDataStore) private clientData!: ClientDataStore;\n @inject(MembershipNameTypeStore) private membershipNameTypeStore!: MembershipNameTypeStore;\n\n // Variables\n customerIds: number[] | undefined;\n\n customerInfos: PortalUser[] = [];\n\n postalCode = new FieldState('').validators(Validators.zipPostalCodeValidator);\n\n form = new FormState({ postalCode: this.postalCode });\n\n // Observable variables\n @observable\n savedCreditCards: CreditCard[] | undefined;\n\n @observable\n isLoadingSavedCreditCards = true;\n\n @observable\n isChangeCardDialogOpen = false;\n\n @observable\n isAddNewCardDialogOpen = false;\n\n @observable\n isDeleteCardDialogOpen = false;\n\n @observable\n isSetPrimaryModalOpen = false;\n\n @observable\n isDeleteModalOpen = false;\n\n @observable\n isAddNewCardModalOpen = false;\n\n @observable\n currentEditingCard: CreditCard | undefined;\n\n @observable\n selectedCardToPay: CreditCard | undefined;\n\n @observable\n selectedCardToUpdate: CreditCard | undefined;\n\n @observable errorMessage?: string;\n\n @observable cardProcessing: boolean = false;\n\n @observable\n isMobileCardSelectTakeoverOpen = false;\n\n @observable\n isMobileCardDeleteTakeoverOpen = false;\n\n @observable\n isMobileCardAddTakeoverOpen = false;\n\n @observable\n isMobileSetPrimaryTakeoverOpen = false;\n\n @observable\n needToStoreAsPrimary = false;\n\n @observable\n isSavedCreditCardEnabled = false;\n\n @observable\n isSavedCreditCardFeatureOn = false;\n\n\n customerSelector = new FieldState(undefined).onDidChange(({ newValue }) =>\n this.getSavedCreditCardsForCustomer(newValue));\n\n @observable\n customerOptions: AnvilSelectOptionsProps = [];\n\n // Methods\n init = () => {\n this.savedCreditCardsApi.feature().then((response) => {\n this.isSavedCreditCardFeatureOn = response.data;\n if (this.isSavedCreditCardFeatureOn && this.clientData.isLoggedIn) {\n this.getCustomerIds();\n }\n });\n this.chargeApi.paymentGatewayConfig().then((response) => {\n this.paymentGatewayService.apiKey = response.data.apiKey || '';\n this.paymentGatewayService.baseUrl = response.data.baseUrl || '';\n this.paymentGatewayService.paymentsServiceJwt = response.data.paymentsServiceJwt || '';\n this.paymentGatewayService.paymentsServiceCreditCardProcessorExists = response.data.paymentsServiceCreditCardProcessorExists || false;\n });\n }\n\n getCardIssuer = (issuer: CreditCardIssuer) => {\n switch (issuer) {\n case CreditCardIssuer.NUMBER_3:\n return 'AMEX';\n case CreditCardIssuer.NUMBER_4:\n return 'VISA';\n case CreditCardIssuer.NUMBER_5:\n return 'MC';\n case CreditCardIssuer.NUMBER_6:\n return 'Discover';\n default:\n return 'Card';\n }\n }\n\n isExpiringSoon = (year: number, month: number) => {\n const today = new Date();\n const currentYear = today.getFullYear();\n const currentMonth = today.getMonth() + 1;\n if (currentYear === year) {\n if (currentMonth === month || currentMonth + 1 === month) {\n return true;\n }\n } else if (currentYear + 1 === year && currentMonth === 12 && month === 1) {\n return true;\n }\n return false;\n }\n\n convertToCardIssuer = (name: string | undefined): CreditCardIssuer => {\n if (name === undefined) {\n return CreditCardIssuer.NUMBER_0;\n }\n switch (name.toLowerCase()) {\n case 'americanexpress':\n return CreditCardIssuer.NUMBER_3;\n case 'visa':\n return CreditCardIssuer.NUMBER_4;\n case 'mastercard':\n return CreditCardIssuer.NUMBER_5;\n case 'discover':\n return CreditCardIssuer.NUMBER_6;\n default:\n return CreditCardIssuer.NUMBER_0;\n }\n }\n\n sortCreditCard = (cards: CreditCard[]) => {\n if (cards.length === 0) {\n return [];\n }\n const primaryCards = cards.filter(c => c.primary && !c.isExpired);\n const membershipCards = cards.filter(c => !c.primary && c.membership && !c.isExpired);\n const others = cards\n .filter(c => c.isExpired || (!c.primary && !c.membership))\n .sort((a, b) => b.expYear + b.expMonth - (a.expYear + a.expMonth));\n return [...primaryCards, ...membershipCards, ...others];\n }\n\n gotoSavedCardPage = () => {\n this.router.history.push('/savedpaymentmethod/paymentmethod');\n }\n\n isSelectedToUpdate = (card: CreditCard) => {\n if (this.selectedCardToUpdate) {\n return card.id === this.selectedCardToUpdate.id;\n }\n return undefined;\n }\n\n usePaymentGateway = () => {\n return this.paymentGatewayService && !!this.paymentGatewayService.baseUrl;\n }\n\n getCustomerId = () => {\n return this.customerIds && this.customerIds.length > 0 ?\n this.customerIds[0] : 0;\n }\n\n // Action Methods\n\n @action\n getSavedCreditCardsForCustomer = async (id?: number) => {\n this.isLoadingSavedCreditCards = true;\n if (!id) {\n this.isLoadingSavedCreditCards = false;\n return;\n }\n const allCards = (await this.savedCreditCardsApi.savedCreditCards(id)).data;\n const availableCards = allCards.filter(c => !c.isExpired);\n\n runInAction(() => {\n this.savedCreditCards = this.sortCreditCard(allCards);\n this.isLoadingSavedCreditCards = false;\n this.selectedCardToPay =\n availableCards.length > 0\n ? availableCards.find(c => c.primary) || availableCards[0]\n : undefined;\n });\n }\n\n @action\n openSetPrimaryModal = (card: CreditCard) => {\n this.currentEditingCard = cloneDeep(card);\n this.isSetPrimaryModalOpen = true;\n }\n\n @action\n closeSetPrimaryModal = () => {\n this.currentEditingCard = undefined;\n this.isSetPrimaryModalOpen = false;\n }\n\n @action\n openDeleteModal = (card: CreditCard) => {\n this.resetErrorMessage();\n this.currentEditingCard = cloneDeep(card);\n this.isDeleteModalOpen = true;\n }\n\n @action\n closeDeleteModal = () => {\n this.currentEditingCard = undefined;\n this.isDeleteModalOpen = false;\n this.selectedCardToUpdate = undefined;\n this.form.$.postalCode.onChange('');\n this.form.$.postalCode.dirty = false;\n }\n\n @action\n openAddNewCardModal = () => {\n this.resetErrorMessage();\n this.isAddNewCardModalOpen = true;\n this.needToStoreAsPrimary = false;\n }\n\n @action\n closeAddNewCardModal = () => {\n this.isAddNewCardModalOpen = false;\n this.form.$.postalCode.onChange('');\n this.form.$.postalCode.dirty = false;\n }\n\n @action\n openMobileCardSelectTakeover = () => {\n this.resetErrorMessage();\n this.isMobileCardSelectTakeoverOpen = true;\n }\n\n @action\n closeMobileCardSelectTakeover = () => {\n this.isMobileCardSelectTakeoverOpen = false;\n }\n\n @action\n openMobileCardDeleteTakeover = (card: CreditCard) => {\n this.resetErrorMessage();\n this.currentEditingCard = cloneDeep(card);\n this.isMobileCardDeleteTakeoverOpen = true;\n }\n\n @action\n closeMobileCardDeleteTakeover = () => {\n this.isMobileCardDeleteTakeoverOpen = false;\n }\n\n @action\n openMobileSetPrimaryTakeover = (card: CreditCard) => {\n this.currentEditingCard = cloneDeep(card);\n this.isMobileSetPrimaryTakeoverOpen = true;\n }\n\n @action\n closeMobileSetPrimaryTakeover = () => {\n this.isMobileSetPrimaryTakeoverOpen = false;\n }\n\n @action\n openMobileCardAddTakeover = () => {\n this.resetErrorMessage();\n this.needToStoreAsPrimary = false;\n this.isMobileCardAddTakeoverOpen = true;\n }\n\n @action\n closeMobileCardAddTakeover = () => {\n this.isMobileCardAddTakeoverOpen = false;\n this.form.$.postalCode.onChange('');\n this.form.$.postalCode.dirty = false;\n }\n\n @action\n getCustomerIds = async () => {\n const response = await this.savedCreditCardsApi.isEnabled();\n runInAction(() => {\n this.isSavedCreditCardEnabled = !!response.data.length;\n this.customerIds = response.data.map(i => i.id);\n this.customerInfos = response.data.map(i => ({ id: i.id, name: i.name }));\n this.customerOptions = this.customerInfos.map(i => ({ value: i.id, text: i.name }));\n if (this.customerIds.length) {\n this.customerSelector.onChange(this.customerIds[0]);\n }\n });\n }\n\n /// If user choose to use a new card instead of the default primary card, reset the value to undefined.\n @action\n setSelectedCardToPay = (selectedCard: CreditCard | undefined) => {\n this.selectedCardToPay = selectedCard;\n }\n\n @action\n setSelectedCardToUpdate = (selectedCard: CreditCard | undefined) => {\n this.selectedCardToUpdate = selectedCard;\n }\n\n @action\n setDefaultSelectedCardToPay = () => {\n if (!this.savedCreditCards || this.savedCreditCards.length === 0) {\n return undefined;\n }\n const availableCards = this.savedCreditCards.filter(c => !c.isExpired);\n this.selectedCardToPay =\n availableCards.length > 0\n ? availableCards.find(c => c.primary) || availableCards[0]\n : undefined;\n }\n\n @action\n setPrimary = (value: boolean) => (this.needToStoreAsPrimary = value)\n\n @action\n setAsPrimary = async (card: CreditCard) => {\n await this.savedCreditCardsApi.assignCreditCard(\n card.customerId,\n card.id,\n true,\n card.membership\n );\n runInAction(() => {\n this.currentEditingCard = undefined;\n this.isSetPrimaryModalOpen = false;\n this.isMobileSetPrimaryTakeoverOpen = false;\n });\n await this.getSavedCreditCardsForCustomer(this.customerSelector.value);\n }\n\n @action\n handleDelete = async () => {\n this.cardProcessing = true;\n this.resetErrorMessage();\n try {\n await this.savedCreditCardsApi.deleteCreditCard(\n this.currentEditingCard!.customerId,\n this.currentEditingCard!.id\n );\n } catch (e) {\n runInAction(() => {\n this.errorMessage = e;\n });\n } finally {\n runInAction(() => {\n this.cardProcessing = false;\n this.closeDeleteModal();\n });\n await this.getSavedCreditCardsForCustomer(this.customerSelector.value);\n }\n }\n\n @action\n handleAdd = async () => {\n this.resetErrorMessage();\n this.cardProcessing = true;\n await this.form.validate();\n this.paymentGatewayService.handleSubmit(this.processAddNewCard);\n }\n\n @action\n processAddNewCard = async (pgResponse: PGResponse) => {\n if (pgResponse.Type === PaymentGatewayResponseType.Error || this.form.hasError) {\n this.cardProcessing = false;\n return;\n }\n const responseData = pgResponse.Data;\n const selectedCustomerId = this.customerSelector.value!;\n try {\n const cardInfo: EditCreditCard = {\n id: 0,\n customerId: selectedCustomerId,\n primary: this.needToStoreAsPrimary,\n membership: true,\n businessUnitId: 0,\n isExpired: false,\n issuer: this.convertToCardIssuer(responseData.IssuerName),\n expYear: parseInt(responseData.ExpYear, 10),\n expMonth: parseInt(responseData.ExpMonth, 10),\n cvv: responseData.Cvc,\n number: responseData.Number,\n cardholderName: responseData.CardholderName,\n zip: this.postalCode.$.trim(),\n token: responseData.Token,\n };\n\n await this.savedCreditCardsApi.saveCreditCard(selectedCustomerId, cardInfo);\n await this.getSavedCreditCardsForCustomer(selectedCustomerId);\n } catch (e) {\n runInAction(() => {\n this.errorMessage = e;\n });\n } finally {\n runInAction(() => {\n this.cardProcessing = false;\n if (this.isAddNewCardModalOpen) {\n this.closeAddNewCardModal();\n }\n if (this.isMobileCardAddTakeoverOpen) {\n this.closeMobileCardAddTakeover();\n }\n });\n }\n }\n\n @action\n resetErrorMessage() {\n this.errorMessage = undefined\n }\n\n // Computed\n @computed get phone() {\n return this.clientData.portalData ? this.clientData.portalData.brandData.phone : undefined;\n }\n\n @computed get membershipName() {\n return this.membershipNameTypeStore.name || 'Membership';\n }\n\n @computed get availableCardsCount() {\n return this.savedCreditCards?.filter(c => !c.isExpired).length || 0;\n }\n}\n","import * as CardValidator from 'card-validator';\nimport { Validator } from 'formstate';\n\nexport const ccNameValidator: Validator = (value) => {\n if (!value) {\n return \"You can't leave this field empty\";\n }\n const valid = /^\\s*[\\u0020-\\u005f]{1,26}\\s*$/i.test(value);\n return valid ? null : 'Invalid characters';\n};\n\nexport const ccNumberValidator: Validator = (value) => {\n if (!value) {\n return \"You can't leave this field empty\";\n }\n return CardValidator.number(value).isValid ? null : 'Invalid card number';\n};\n\nexport const ccExpValidator: Validator = (value) => {\n if (!value) {\n return \"You can't leave this field empty\";\n }\n return /^[01]\\d\\/?\\d\\d$/.test(value) && CardValidator.expirationDate(value).isValid\n ? null\n : 'Invalid expiration date';\n};\n\nexport const ccCscValidator: Validator = (value) => {\n if (!value) {\n return \"You can't leave this field empty\";\n }\n const valid = /^\\d{3,4}$/.test(value);\n return valid ? null : 'Invalid security code';\n};\n\n/**\n * Checks for a valid US or Canadian or Australian zip/postal code\n */\nexport const zipPostalCodeValidator: Validator = (value) => {\n if (!value) {\n return \"You can't leave this field empty\";\n }\n const valid = /^(\\d{4}|\\d{5}(-\\d{4})?|[a-z]\\d[a-z] ?\\d[a-z]\\d)$/i.test(value);\n return valid ? null : 'Invalid postal code';\n};\n","import * as React from 'react';\nimport { observable } from 'mobx';\nimport { FormState, FieldState } from 'formstate';\nimport * as Validators from '../cc-validators';\nimport { lazyInject } from 'src/invoice/ioc';\nimport { InvoiceStore } from 'src/invoice/stores/invoice.store';\nimport { RouterStore } from 'src/core/stores/router.store';\nimport { BusyFormState } from 'src/util/busy-form';\n\nexport class CardInfoFormState extends BusyFormState {\n @lazyInject(InvoiceStore) private invoiceStore!: InvoiceStore;\n @lazyInject(RouterStore) private router!: RouterStore;\n\n @observable errorMessage: string | undefined;\n\n ccName = new FieldState('').validators(Validators.ccNameValidator);\n ccNumber = new FieldState('').validators(Validators.ccNumberValidator);\n ccExp = new FieldState('').validators(Validators.ccExpValidator);\n ccCsc = new FieldState('').validators(Validators.ccCscValidator);\n postalCode = new FieldState('').validators(Validators.zipPostalCodeValidator);\n\n form = new FormState({\n ccName: this.ccName,\n ccNumber: this.ccNumber,\n ccExp: this.ccExp,\n ccCsc: this.ccCsc,\n postalCode: this.postalCode,\n isBusy: this.isBusy\n });\n\n constructor() {\n super();\n const payment = this.invoiceStore.payment;\n if (!payment) {\n return;\n }\n\n if (!payment.card) {\n payment.card = {};\n }\n\n const card = payment.card;\n\n const existingCcExp = card.expMonth && card.expYear ? card.expMonth + card.expYear : '';\n this.ccName.reset(card.name || '');\n this.ccNumber.reset(card.number || '');\n this.ccExp.reset(existingCcExp || '');\n this.ccCsc.reset(card.cvc || '');\n this.postalCode.reset(card.billingZip || '');\n\n this.form.validate();\n }\n\n clearError = () => {\n this.errorMessage = undefined;\n };\n\n handleSubmit = (e?: React.FormEvent) => {\n e && e.preventDefault();\n\n const payment = this.invoiceStore.payment;\n if (!payment || this.form.hasError) {\n return;\n }\n\n payment.card = {\n name: this.ccName.$.trim(),\n number: this.ccNumber.$.replace(/[^0-9]/g, ''),\n expMonth: this.ccExp.$.replace(/[^0-9]/g, '').substr(0, 2),\n expYear: this.ccExp.$.replace(/[^0-9]/g, '').substr(2, 2),\n cvc: this.ccCsc.$.trim(),\n billingZip: this.postalCode.$.trim(),\n };\n\n this.withBusy(this.invoiceStore.submitPayment(payment)).then(\n (confirmation) => {\n this.router.history.push(\n `/invoice/${payment.invoiceNumber}/confirm-payment/${confirmation.number}`\n );\n },\n (err) => {\n this.errorMessage = err;\n }\n );\n };\n}\n","import { FormState, FieldState } from 'formstate';\nimport { observable, computed, action } from 'mobx';\nimport * as React from 'react';\n\nimport * as Validators from '../cc-validators';\nimport { lazyInject } from '../../../ioc';\nimport { InvoiceStore } from '../../../stores/invoice.store';\nimport { RouterStore } from 'src/core/stores/router.store';\nimport { BusyFormState } from 'src/util/busy-form';\nimport { CreditCardIssuer } from 'src/api';\nimport { PaymentGateway } from 'src/statement/stores/payment-gateway.store';\n\ninterface Props {\n id: string;\n skipIFrameMessageHandler?: boolean;\n}\n\nexport class PGCardInfoFormState extends BusyFormState {\n @lazyInject(InvoiceStore) private invoiceStore!: InvoiceStore;\n @lazyInject(RouterStore) private router!: RouterStore;\n @lazyInject(PaymentGateway) private paymentGateway!: PaymentGateway;\n\n paymentGatewayBaseUrl = '';\n @observable errorMessage?: string;\n @observable mobilePaymentGatewayUrl?: string;\n @observable desktopPaymentGatewayUrl?: string;\n @observable useNewCard: boolean = false;\n @observable needToSelectAnotherCard: boolean = false;\n @observable needToStoreCreditCard: boolean = false;\n @observable isSavedCreditCardFeatureEnabled: boolean = false;\n @observable skipIFrameMessageHandler: boolean = false;\n\n paymentGatewayResponseType = {\n Error: 0,\n Submit: 1,\n SearsCard: 2,\n };\n\n postalCode = new FieldState('').validators(Validators.zipPostalCodeValidator);\n\n form = new FormState({\n postalCode: this.postalCode,\n isBusy: this.isBusy,\n });\n\n constructor(props: Props) {\n super();\n const payment = this.invoiceStore.payment;\n this.skipIFrameMessageHandler = props.skipIFrameMessageHandler || false;\n if (!payment) {\n return;\n }\n\n if (!payment.card) {\n payment.card = {};\n }\n\n const card = payment.card;\n this.postalCode.reset(card.billingZip || '');\n\n this.form.validate();\n\n this.invoiceStore.getInvoice(props.id).then((invoice) => {\n this.paymentGatewayBaseUrl = invoice.paymentGatewayBaseUrl || '';\n this.mobilePaymentGatewayUrl = this.paymentGateway.getMobilePaymentGatewayUrl(invoice.usesPaymentsService);\n this.desktopPaymentGatewayUrl = this.paymentGateway.getDesktopPaymentGatewayUrl(invoice.usesPaymentsService);\n });\n }\n\n convertToCardIssuer = (name: string | undefined): CreditCardIssuer => {\n if (name === undefined) {\n return CreditCardIssuer.NUMBER_0;\n }\n switch (name.toLowerCase()) {\n case 'americanexpress':\n return CreditCardIssuer.NUMBER_3;\n case 'visa':\n return CreditCardIssuer.NUMBER_4;\n case 'mastercard':\n return CreditCardIssuer.NUMBER_5;\n case 'discover':\n return CreditCardIssuer.NUMBER_6;\n default:\n return CreditCardIssuer.NUMBER_0;\n }\n }\n\n iframeMessageHandler = (event: MessageEvent) => {\n if (this.skipIFrameMessageHandler || !this.postMessageEventIsValid(event)) {\n return;\n }\n\n const responseType = event.data.Type;\n const responseData = event.data.Data;\n if (responseType === this.paymentGatewayResponseType.Error) {\n // eslint-disable-next-line no-alert\n alert(responseData);\n return;\n }\n\n if (responseType !== this.paymentGatewayResponseType.Submit) {\n return;\n }\n\n const payment = this.invoiceStore.payment;\n if (!payment || this.form.hasError || !responseData.Token) {\n return;\n }\n\n payment.card = {\n token: responseData.Token,\n billingZip: this.postalCode.$.trim(),\n number: responseData.Number,\n name: responseData.CardholderName,\n expMonth: responseData.ExpMonth,\n expYear: responseData.ExpYear,\n issuerName: this.convertToCardIssuer(responseData.IssuerName)\n };\n\n payment.needToSaveCard = this.needToStoreCreditCard;\n this.withBusy(this.invoiceStore.submitPayment(payment)).then(\n (confirmation) => {\n this.router.history.push(\n `/invoice/${payment.invoiceNumber}/confirm-payment/${confirmation.number}`\n );\n },\n (err) => {\n this.errorMessage = err;\n }\n );\n };\n\n postMessageEventIsValid = (event: MessageEvent) => {\n const iframe = document.getElementById('payment-gateway') as HTMLIFrameElement;\n return event.origin === this.paymentGatewayBaseUrl && event.source === iframe.contentWindow;\n };\n\n clearError = () => {\n this.errorMessage = undefined;\n };\n\n handleSubmit = (e?: React.FormEvent) => {\n e && e.preventDefault();\n if (this.invoiceStore.needToChargeStoredCard) {\n const payment = this.invoiceStore.payment;\n if (!payment) { return; }\n this.invoiceStore.submitPaymentToUseStoredPaymentMethod(payment).then(\n (confirmation) => {\n this.router.history.push(`/invoice/${payment.invoiceNumber}/confirm-payment/${confirmation.number}`);\n },\n (err) => {\n this.errorMessage = err;\n }\n );\n } else {\n const pgIframe = document.getElementById('payment-gateway') as HTMLIFrameElement | null;\n if (!pgIframe || !pgIframe.contentWindow) { return; }\n pgIframe.contentWindow.postMessage({ key: 'st.paymentgateway.submit' }, this.paymentGatewayBaseUrl);\n }\n }\n\n @action\n setUseNewCard = (value: boolean) => { this.useNewCard = value; }\n\n @action\n setNeedToSelectAnotherCard = (value: boolean) => { this.needToSelectAnotherCard = value; }\n\n @action\n setNeedToStoreCreditCard = (value: boolean) => { this.needToStoreCreditCard = value; }\n\n @computed\n get showLoginLink() {\n return this.invoiceStore.showLoginLink;\n }\n\n @computed\n get loggedIn() {\n return this.invoiceStore.showStoreOption;\n }\n\n @computed\n get cardInfo() {\n return this.invoiceStore.payment?.card;\n }\n}\n","import { currency } from 'src/util/formatters';\nimport moment from 'moment';\n\nexport const toPrettyAmount = (amount: number) => currency(amount);\n\nexport const getPrettyDate = () => moment().format('L');\n\nexport const last4AccountNumber = (accountNumber: string) =>\n accountNumber.length > 0 ? accountNumber.substr(accountNumber.length - 4) : '';\n\nexport const getLimitText = (isInvoicePayment: boolean, amount: number): string => {\n return isInvoicePayment\n ? `ACH Payments are limited to ${toPrettyAmount(\n amount\n )}. The amount you've selected to pay is greater than this amount.`\n : `ACH Payments are limited to ${toPrettyAmount(\n amount\n )} per transaction. The amount you've selected to pay is greater than this amount. Please go back and select individual invoices to pay or choose a different payment option.`;\n};\n","import * as React from 'react';\nimport { observer } from 'mobx-react';\nimport {\n Button,\n Dialog,\n DialogActions,\n DialogContent,\n DialogContentText,\n DialogTitle,\n} from '@material-ui/core';\nimport { currency } from 'src/util/formatters';\nimport moment from 'moment';\nimport styles from './confirmation-modal.less';\n\ninterface Props {\n companyName: string;\n companyPhoneNumber: string;\n amount: number;\n accountNumber: string;\n onClose: () => void;\n onSubmit: () => void;\n}\n\nexport const ConfirmationModal = observer>(\n ({ amount, accountNumber, companyName, companyPhoneNumber, onClose, onSubmit }) => {\n const prettyAmount = currency(amount);\n const prettyDate = moment().format('L');\n return (\n \n ACH Payment Authorization\n \n \n I authorize {companyName}, herein called COMPANY, to debit my bank account\n for {prettyAmount} according to the following details:\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n
Amount Authorized{prettyAmount}
Date of Authorization{prettyDate}
Date of Debit{prettyDate}
Bank Account Number\n Ending in{' '}\n {accountNumber.length > 0\n ? accountNumber.substr(accountNumber.length - 4)\n : ''}\n
\n \n I understand that this authorization will remain in full force and effect\n until I cancel this transaction by contacting COMPANY at{' '}\n {companyPhoneNumber}. To complete this transaction, click the \"Authorize\"\n button.\n \n
\n \n \n \n \n \n );\n }\n);\n","import classnames from 'classnames';\nimport * as React from 'react';\nimport { observer } from 'mobx-react';\nimport { Radio, FormControlLabel, RadioGroup, Tooltip, Icon } from '@material-ui/core';\n\nimport { AchInfoContainer } from '../../../../invoice/components/ach-info/ach-info';\nimport { BankAccountType } from '../../../../invoice/components/ach-info/ach-info/ach-info';\nimport * as Utils from '../ach-utils';\nimport { ConfirmationModal } from './confirmation-modal';\nimport { toNumber } from 'src/util/formatters';\nimport { MatField } from 'src/core/components/mat-field';\n\nimport styles from './ach-info.less';\n\ninterface Props {\n container: AchInfoContainer;\n amount?: number;\n containerStyles?: object;\n isInvoicePayment: boolean;\n redirectToPayPage?: () => void;\n isEmbedded?: boolean\n}\n\nexport const AchInfo = observer>(\n ({ amount, containerStyles, container: { data }, isInvoicePayment, isEmbedded }) => {\n const maxAchPayment = 250000;\n const paymentAmount = amount || 0;\n return (\n
\n {paymentAmount > maxAchPayment ? (\n
\n warning\n {Utils.getLimitText(isInvoicePayment, maxAchPayment)}\n
\n ) : (\n <>\n
\n Bank Account Type\n \n info\n \n
\n \n }\n label=\"Personal Account\"\n />\n }\n label=\"Business Account\"\n />\n \n
\n
\n \n
\n
\n \n
\n
\n
\n
\n \n
\n
\n \n
\n
\n {data.modalIsOpen ? (\n \n ) : null}\n \n )}\n
\n );\n }\n);\n","import { observable } from 'mobx';\nimport { observer } from 'mobx-react';\nimport * as React from 'react';\n\nimport { AchInfo } from './ach-info/desktop/ach-info';\nimport { AchInfoFormState } from './ach-info/ach-info';\n\ninterface Props {\n data?: AchInfoFormState;\n amount?: number;\n isInvoicePayment: boolean;\n redirectToPayPage?: () => void;\n isEmbedded?: boolean;\n}\n\n@observer\nexport class AchInfoContainer extends React.Component {\n @observable data!: AchInfoFormState;\n\n constructor(props: Props) {\n super(props);\n this.data = this.props.data || new AchInfoFormState();\n }\n\n render() {\n return this.data ? (\n \n ) : null;\n }\n}\n","import classNames from 'classnames';\nimport React, { FC } from 'react';\n\n\nimport styles from './connected-account.less';\nimport { ConnectedBankAccount } from 'src/invoice/types/types';\n\ninterface ConnectedAccountProps {\n account: ConnectedBankAccount;\n\n}\n\nexport const ConnectedAccount: FC = ({\n account: {\n bankIcon,\n bankName,\n accountName,\n accountMask,\n selected\n },\n}) => (\n
\n {bankName}\n
\n {bankName}{' '}{accountName} •••• {accountMask}\n
\n {selected && (\n
\n
\n
\n Selected\n
\n
\n
)}\n
\n);","import classnames from 'classnames';\nimport React, { FC, useState } from 'react';\nimport { ConnectedBankAccount } from 'src/invoice/types/types';\n\nimport styles from './connected-accounts.less';\nimport { ConnectedAccount } from './connected-account';\n\ninterface ConnectedAccountsProps {\n accounts: ConnectedBankAccount[];\n setAccounts: (accounts: ConnectedBankAccount[]) => void;\n}\n\nexport const ConnectedAccounts: FC = ({\n accounts,\n setAccounts\n}) => {\n\n const [, setConnectedAccounts] = useState(accounts);\n\n const onSelectConnectedAccount = (index: number) => {\n accounts.forEach(account => { account.selected = false; });\n accounts[index].selected = true;\n setConnectedAccounts([...accounts]);\n setAccounts(accounts);\n }\n\n return (\n <>\n {accounts.length > 0 && (\n
\n
Connected Account(s)
\n {accounts.map((account, idx) => (\n
onSelectConnectedAccount(idx)}>\n \n
\n ))}\n
\n )}\n \n );\n}","import * as CardValidator from 'card-validator';\n\nexport const ccNumberFormatter = getHandler((value) => {\n const result = CardValidator.number(value);\n const maxLength =\n result.card && result.card.lengths ? Math.max.apply(null, result.card.lengths) : 19;\n const gaps = result.card && result.card.gaps ? result.card.gaps : [4, 8, 12];\n const digitsValue = value.replace(/[^\\d]/g, '').substr(0, maxLength);\n let newValue = '';\n let lastGap = 0;\n for (let i = 0; i <= gaps.length; i += 1) {\n const gap = gaps[i] || digitsValue.length;\n newValue += digitsValue.substring(lastGap, gap);\n if (gap < digitsValue.length) {\n newValue += ' ';\n }\n lastGap = gap;\n }\n return newValue;\n});\n\nexport const ccExpFormatter = getHandler((value) => {\n if (/\\d\\d\\//.test(value)) {\n // Skip if current input is `MM/` to preserve slash\n return null;\n }\n\n const digitsValue = value.replace(/[^\\d]/g, '');\n if (digitsValue.length <= 2) {\n return digitsValue;\n }\n return `${digitsValue.substring(0, 2)}/${digitsValue.substring(2, 4)}`;\n});\n\ntype TransformFunc = (value: string) => string | null;\n\nfunction getHandler(func: TransformFunc) {\n return (element?: HTMLInputElement) => {\n if (element) {\n element.addEventListener('keyup', (event) => handleEvent(event, true, func));\n element.addEventListener('blur', (event) => handleEvent(event, true, func));\n }\n };\n}\n\nfunction handleEvent(event: Event, isKeyUp: boolean, formatter: TransformFunc) {\n const elem = event.currentTarget as HTMLInputElement;\n const value = elem.value;\n\n if (\n isKeyUp &&\n (elem.selectionStart !== elem.selectionEnd || elem.selectionEnd !== elem.value.length)\n ) {\n // Skip if cursor is not at end of text\n return;\n }\n\n const newValue = formatter(value);\n\n if (newValue != null && newValue !== value) {\n elem.value = newValue;\n elem.setSelectionRange(newValue.length, newValue.length);\n }\n}\n","import classnames from 'classnames';\nimport * as React from 'react';\nimport { observer } from 'mobx-react';\n\nimport { ccNumberFormatter, ccExpFormatter } from '../../cc-formatters';\nimport { MatField } from 'src/core/components/mat-field';\n\nimport styles from './card-info.less';\nimport { CardInfoFormState } from '../card-info';\n\ninterface Props {\n data: CardInfoFormState;\n isAnonymousPayments: boolean;\n}\n\nexport const CardInfo = observer>(\n ({ data, isAnonymousPayments }) => (\n <>\n
\n
\n
\n \n
\n
\n ccNumberFormatter(ref)}\n />\n
\n
\n\n
\n
\n ccExpFormatter(ref)}\n />\n
\n
\n \n
\n
\n
\n \n
\n
\n
\n
\n\n {isAnonymousPayments && (\n
\n

\n I agree to pay the above amount in accordance with my cardholder agreement.\n By clicking “Submit Payment,” you confirm that you accept the{' '}\n \n Terms of Service\n {' '}\n &{' '}\n \n Privacy Policy\n \n .\n

\n
\n )}\n \n )\n);\n","import React, { useState } from 'react';\nimport classnames from 'classnames';\nimport * as styles from './card-select-modal.less';\nimport { CreditCard, CreditCardIssuer } from 'src/api';\nimport {\n Modal,\n Button,\n ButtonGroup,\n Card,\n Stack,\n BodyText,\n Tag,\n Radio,\n Link,\n} from '@servicetitan/design-system';\nimport { ModalSizes } from '@servicetitan/design-system/dist/components/Modal/components';\nimport { Divider } from '@material-ui/core';\n\ninterface CardSelectModalProps {\n cards: CreditCard[] | undefined;\n selectedCard: CreditCard;\n setSelectedCard: (selectedCard: CreditCard) => void;\n close: () => void;\n gotoNewCard: () => void;\n getCardIssuer: (issuer: CreditCardIssuer) => string;\n isOpen: boolean;\n gotoSavedCardPage: () => void;\n membershipNameType: string;\n isExpiringSoon: (year: number, month: number) => boolean;\n}\n\nexport const CardSelectModal: React.FC = ({\n cards,\n selectedCard,\n setSelectedCard,\n close,\n gotoNewCard,\n getCardIssuer,\n isOpen,\n gotoSavedCardPage,\n membershipNameType,\n isExpiringSoon,\n}) => {\n const [replacedCard, setReplacedCard] = useState(selectedCard);\n const handleSave = () => {\n setSelectedCard(replacedCard);\n close();\n };\n const renderCard = (card: CreditCard, index: number) => (\n
\n {index > 0 && }\n \n \n {!card.isExpired && (\n {\n setReplacedCard(card);\n }}\n checked={replacedCard?.id === card.id}\n />\n )}\n \n \n \n \n \n {getCardIssuer(card.issuer)} ending in {card.number}\n \n \n Expires {card.expMonth.toString().padStart(2, '0')}/{card.expYear}\n \n \n {card.cardholderName}\n \n \n \n {card.primary && (\n \n Primary Card\n \n )}\n {card.membership && (\n \n {membershipNameType}\n \n )}\n {card.isExpired && (\n \n Expired\n \n )}\n {!card.isExpired && isExpiringSoon(card.expYear, card.expMonth) && (\n \n Expiring Soon\n \n )}\n \n \n \n \n
\n );\n\n return (\n \n \n \n \n \n \n \n }\n footerAlign=\"space-between\"\n >\n \n \n To manage your saved cards,{' '}\n \n click here.\n \n \n {cards?.map((card, index) => renderCard(card, index))}\n \n \n );\n};\n","import classnames from 'classnames';\nimport * as React from 'react';\nimport { observer } from 'mobx-react';\n\nimport { loginContainer } from 'src/login/ioc';\nimport { MatField } from 'src/core/components/mat-field';\nimport { invoiceContainer } from '../../../../ioc';\n\nimport styles from './pg-card-info.less';\nimport { LoginStore } from 'src/login/stores/login.store';\nimport { InvoiceStore } from 'src/invoice/stores/invoice.store';\nimport { CreditCard } from 'src/api';\nimport {\n Card,\n Stack,\n BodyText,\n ButtonGroup,\n Button,\n Tag,\n Form,\n Icon,\n} from '@servicetitan/design-system';\nimport { SavedCreditCardsStore } from 'src/payment-method/stores/saved-credit-cards.store';\nimport { PGCardInfoFormState } from '../pg-card-info';\nimport { CardSelectModal } from 'src/payment-method/components/card-select-modal/card-select-modal';\n\ninterface Props {\n pgdata: PGCardInfoFormState;\n isAnonymousPayments: boolean;\n showSavePaymentInformation?: boolean | undefined;\n isEmbedded?: boolean | undefined;\n}\n\n@observer\nexport class PGCardInfo extends React.Component {\n private formState: PGCardInfoFormState;\n private isAnonymousPayments: boolean;\n private loginStore: LoginStore;\n private savedCreditCardsStore: SavedCreditCardsStore;\n private invoiceStore: InvoiceStore;\n private showSavePaymentInformation: boolean;\n private isEmbeded: boolean;\n\n constructor(props: Props) {\n super(props);\n this.formState = this.props.pgdata;\n this.isAnonymousPayments = this.props.isAnonymousPayments;\n this.loginStore = loginContainer.get(LoginStore);\n this.invoiceStore = invoiceContainer.get(InvoiceStore);\n this.savedCreditCardsStore = this.invoiceStore.getSavedCreditCardStore();\n this.showSavePaymentInformation =\n this.props.showSavePaymentInformation === undefined ? true :\n this.props.showSavePaymentInformation;\n this.isEmbeded = this.props.isEmbedded === undefined ? false :\n this.props.isEmbedded;\n }\n\n componentDidMount() {\n window.addEventListener('message', this.props.pgdata.iframeMessageHandler);\n if (this.formState.loggedIn) {\n this.savedCreditCardsStore.init();\n }\n }\n\n componentWillUnmount() {\n window.removeEventListener('message', this.props.pgdata.iframeMessageHandler);\n }\n\n renderStoredPaymentCard(card: CreditCard) {\n const goToNewCard = () => {\n this.formState.setUseNewCard(true);\n this.formState.setNeedToSelectAnotherCard(false);\n this.savedCreditCardsStore.setSelectedCardToPay(undefined);\n };\n const openCardSelect = () => {\n this.formState.setNeedToSelectAnotherCard(true);\n };\n return card && this.showSavePaymentInformation ? (\n
\n \n \n \n \n {this.savedCreditCardsStore.getCardIssuer(card.issuer)} ending in{' '}\n {card.number}\n \n \n Expires {card.expMonth.toString().padStart(2, '0')}/{card.expYear}\n \n \n {card.cardholderName}\n \n \n \n {card.primary && (\n \n Primary Card\n \n )}\n {card.membership && (\n \n {this.savedCreditCardsStore.membershipName}\n \n )}\n {card.isExpired && (\n \n Expired\n \n )}\n {!card.isExpired &&\n this.savedCreditCardsStore.isExpiringSoon(\n card.expYear,\n card.expMonth\n ) && (\n \n Expiring Soon{' '}\n \n )}\n \n \n \n \n \n \n \n \n \n
\n ) : null;\n }\n\n renderUseNewCard() {\n return (\n
\n
\n
\n \n
\n
\n \n
\n {this.formState.loggedIn &&\n this.savedCreditCardsStore.isSavedCreditCardEnabled &&\n this.showSavePaymentInformation && (\n \n Save payment information\n \n }\n checked={this.formState.needToStoreCreditCard}\n onChange={(_, checked) => {\n this.formState.setNeedToStoreCreditCard(checked);\n }}\n />\n )}\n {this.formState.showLoginLink && this.showSavePaymentInformation && (\n
\n \n Sign in\n \n {' to access your saved credit card information.'}\n
\n )}\n
\n
\n );\n }\n\n render() {\n const goToNewCard = () => {\n this.formState.setUseNewCard(true);\n this.formState.setNeedToSelectAnotherCard(false);\n this.savedCreditCardsStore.setSelectedCardToPay(undefined);\n };\n\n const needToDisplayBackwardIcon = () =>\n !!this.savedCreditCardsStore.savedCreditCards?.length &&\n this.formState.useNewCard &&\n this.formState.loggedIn &&\n !this.savedCreditCardsStore.selectedCardToPay;\n\n const goBackToNewCard = () => {\n this.formState.setUseNewCard(false);\n this.savedCreditCardsStore.setDefaultSelectedCardToPay();\n };\n\n return (\n <>\n
\n {needToDisplayBackwardIcon() && (\n \n )}\n {!this.isEmbeded && (

Card Information

)}\n {this.formState.loggedIn &&\n this.savedCreditCardsStore.selectedCardToPay &&\n !this.formState.useNewCard && this.showSavePaymentInformation\n ? this.renderStoredPaymentCard(this.savedCreditCardsStore.selectedCardToPay)\n : this.renderUseNewCard()}\n
\n\n {this.isAnonymousPayments && (\n
\n

\n I agree to pay the above amount in accordance with my cardholder\n agreement. By clicking “Submit Payment,” you confirm that you accept the{' '}\n \n Terms of Service\n {' '}\n &{' '}\n \n Privacy Policy\n \n .\n

\n
\n )}\n {this.formState.needToSelectAnotherCard &&\n this.savedCreditCardsStore.selectedCardToPay && this.showSavePaymentInformation && (\n this.formState.setNeedToSelectAnotherCard(false)}\n gotoNewCard={goToNewCard}\n isOpen={this.formState.needToSelectAnotherCard}\n getCardIssuer={this.savedCreditCardsStore.getCardIssuer}\n gotoSavedCardPage={this.savedCreditCardsStore.gotoSavedCardPage}\n membershipNameType={this.savedCreditCardsStore.membershipName}\n isExpiringSoon={this.savedCreditCardsStore.isExpiringSoon}\n />\n )}\n \n );\n }\n}\n","import React, { FC, useEffect, useRef, useState } from 'react';\nimport { AchInfoFormState } from '../../ach-info/ach-info/ach-info';\nimport { CardInfoFormState } from '../../card-info/card-info/card-info';\nimport { PGCardInfoFormState } from '../../card-info/pg-card-info/pg-card-info';\nimport { PaymentAmountFormState } from '../../payment-amount/payment-amount';\nimport { AchInfoContainer } from '../../ach-info/ach-info';\n\nimport styles from './payment-methods.less';\nimport classnames from 'classnames';\nimport { Radio } from '@material-ui/core';\n\nimport {\n usePlaidLink,\n PlaidLinkOptions,\n PlaidLinkOnSuccessMetadata,\n} from 'react-plaid-link';\nimport { ConnectedBankAccount, PaymentMethodType, PaymentMethodInfo } from 'src/invoice/types/types';\n\nimport { ConnectedAccounts } from '../../connected-accounts/connected-accounts';\nimport { Checkbox, IconNameType } from '@servicetitan/design-system';\nimport { CardInfo } from '../../card-info/card-info/desktop/card-info';\nimport { PGCardInfo } from '../../card-info/pg-card-info/desktop/pg-card-info';\nimport { paymentMethodsContainer } from 'src/payment-method/ioc';\nimport { PaymentGateway } from 'src/statement/stores/payment-gateway.store';\nimport { PendingInvoicePayment, SavedPaymentMethodsStore } from 'src/payment-method/stores/saved-payment-methods.store';\nimport { ChargeType, SplitInfo } from 'src/api';\nimport { ConfirmationModal } from 'src/payment/components/ach/desktop/confirmation-modal';\nimport { ClientDataStore } from 'src/core/stores/client-data.store';\n\ninterface PaymentMethodProps {\n paymentAmountData?: PaymentAmountFormState | undefined;\n cardInfoData: CardInfoFormState;\n pgcardInfoData: PGCardInfoFormState;\n achInfoData: AchInfoFormState;\n usePaymentGateway: () => boolean;\n showLoginLink: boolean;\n setPaymentMethodType?: ((paymentMethodType: PaymentMethodType) => void) | undefined;\n setPaymentMethodValid: (isValid: boolean) => void;\n setPaymentMethodAction: (action: () => void) => void;\n setPaymentMethodSubmit?: (submit: () => void) => void;\n setConnectedAccounts: (accounts: ConnectedBankAccount[]) => void;\n setPaymentButtonTextIcon?: (text: string, icon?: IconNameType | undefined) => void;\n showPrimaryOption?: boolean;\n showSavePaymentOption?: boolean;\n savePaymentChecked?: boolean;\n setSavePaymentChecked?: (checked: boolean) => void;\n useAsPrimaryPaymentChecked?: boolean;\n setUseAsPrimaryPaymentChecked?: (checked: boolean) => void;\n invoiceId?: string | undefined;\n statementId?: string;\n splits?: SplitInfo[];\n paymentMethodStore?: SavedPaymentMethodsStore;\n chargeType: ChargeType;\n setPayByBankReady?: (ready: boolean) => void;\n useFeatureGate?: boolean;\n};\n\ninterface PlaidLinkViewProps {\n linkToken: string | null;\n processPlaidSuccess: (publicToken: string, metadata: PlaidLinkOnSuccessMetadata) => void;\n setFailedBankName: (name: string | undefined) => void;\n setReady: (ready: boolean) => void;\n setOpen: (calback: Function) => void;\n}\n\nconst PlaidLinkView: FC = ({\n linkToken,\n processPlaidSuccess,\n setFailedBankName,\n setReady,\n setOpen\n}) => {\n\n const config: PlaidLinkOptions = {\n onSuccess: (publicToken, metadata) => {\n processPlaidSuccess(publicToken, metadata);\n },\n onExit: (_err, metadata) => {\n setFailedBankName(metadata.institution?.name);\n },\n onEvent: () => {\n },\n token: linkToken\n };\n\n const { open, ready } = usePlaidLink(config);\n\n useEffect(() => {\n setOpen(open);\n setReady(ready);\n }, [ready, open]);\n\n return (\n <>\n );\n}\n\nexport const PaymentMethods: FC = ({\n paymentAmountData,\n cardInfoData,\n pgcardInfoData,\n achInfoData,\n usePaymentGateway,\n showLoginLink,\n setPaymentMethodValid,\n setPaymentMethodAction,\n setConnectedAccounts,\n setPaymentButtonTextIcon,\n setPaymentMethodType,\n showPrimaryOption,\n showSavePaymentOption,\n savePaymentChecked,\n useAsPrimaryPaymentChecked,\n setSavePaymentChecked,\n setUseAsPrimaryPaymentChecked,\n invoiceId,\n statementId,\n paymentMethodStore,\n setPaymentMethodSubmit,\n splits,\n chargeType,\n setPayByBankReady,\n useFeatureGate\n}) => {\n\n const [isCreditCard, setIsCreditCard] = useState(false);\n const [isAch, setIsAch] = useState(false);\n const [isPayByBank, setIsPayByBank] = useState(true);\n const accountsRef = useRef([]);\n const [accounts, setAccounts] = useState([]);\n const [failedBankName, setFailedBankName] = useState(undefined);\n const store = paymentMethodStore || paymentMethodsContainer.get(SavedPaymentMethodsStore);\n const clientDataStore = paymentMethodsContainer.get(ClientDataStore);\n const paymentMethodTypeRef = useRef(PaymentMethodType.PayByBank);\n const paymentMethodLoadedRef = useRef(false);\n const [isACHModelOpen, setIsACHModelOpen] = useState(false);\n const [linkToken, setLinkToken] = useState(undefined);\n const [ready, setReady] = useState(false);\n const open = useRef(() => { });\n const [, setIsAchExceeded] = useState(null);\n const isSavedPaymentChecked = useRef(savePaymentChecked);\n const isUseAsPrimaryPaymentChecked = useRef(useAsPrimaryPaymentChecked);\n\n const paymentGateway = paymentMethodsContainer.get(PaymentGateway);\n const iframeMessageHandler = paymentGateway.iframeMessageHandler;\n\n useEffect(() => {\n if(!clientDataStore.isInitialized) clientDataStore.init();\n }, [clientDataStore.init]);\n\n useEffect(() => {\n window.addEventListener('message', iframeMessageHandler);\n return () => {\n window.removeEventListener('message', iframeMessageHandler);\n };\n }, []);\n\n const setOpen = (callback: Function) => {\n open.current = callback;\n }\n\n const fetchLinkToken = async () => {\n // Only set token once\n if (linkToken) {\n return;\n }\n\n const token = await store.getLinkToken();\n // Update link token\n setLinkToken(token);\n };\n\n useEffect(() => {\n store.currentInvoiceId = invoiceId;\n store.currentSplits = splits;\n store.currentStatementId = statementId;\n store.init(() => {\n fetchLinkToken();\n if ((!useFeatureGate && store.isPayByBankEnabled) || (useFeatureGate && store.isPayByBankFeatureOn)) {\n onPayByBankSelected();\n } else if ((!useFeatureGate && store.isCreditCardEnabled) || (useFeatureGate && store.isSavedCreditCardEnabled)) {\n onCreditCardSelected();\n } else if ((!useFeatureGate && store.isBankAccountEnabled) || (useFeatureGate && store.isSavedBankAccountFeatureOn)) {\n onACHSelected();\n }\n });\n }, [store.init]);\n\n\n const processPlaidSuccess = (publicToken: string, metadata: PlaidLinkOnSuccessMetadata) => {\n const connectedAccounts = metadata.accounts;\n const institution = metadata.institution;\n const institutionId = institution?.institution_id || '';\n if (!connectedAccounts) {\n return;\n }\n\n store.getInstitution(institutionId).then((institutionLogo) => {\n const updatedAccounts = accountsRef.current.filter(account => account.bankId !== institutionId);\n connectedAccounts.forEach(account => {\n // TODO: Switch to account.verification_status\n const verificationStatus = 'AutomaticallyVerified';\n console.log(account.verification_status);\n\n updatedAccounts.push({\n bankIcon: institutionLogo || 'assets/images/ach-account.svg',\n bankName: institution?.name,\n accountName: account.name,\n accountMask: account.mask,\n verificationStatus,\n selected: false,\n bankId: institutionId,\n accountType: account.subtype,\n accountId: account.id,\n publicToken\n });\n });\n\n const selectedAccount = updatedAccounts.find(account => account.selected);\n\n if (!selectedAccount && updatedAccounts.length > 0) {\n // Default first connected account to selected if previous account was replaced\n updatedAccounts[0].selected = true;\n }\n\n updateConnectedAccounts(updatedAccounts);\n });\n }\n\n const onPayByBankAction = () => {\n if (accountsRef.current.length > 0) {\n return;\n }\n\n if (ready) {\n setFailedBankName(undefined);\n connectAnotherAccount();\n }\n };\n\n const onCreditCardAction = async () => {\n usePaymentGateway()\n ? await pgcardInfoData.form.validate()\n : await cardInfoData.form.validate();\n };\n\n const onACHAction = async () => {\n await achInfoData.form.validate();\n };\n\n const getPaymentAmount = (): number => {\n if (!paymentAmountData) {\n return 0;\n }\n\n return (!paymentAmountData.isFullBalance.value\n ? parseFloat(paymentAmountData.customAmount.value)\n : paymentAmountData.fullBalance) || 0;\n };\n\n const resetSelectedStates = () => {\n setIsAch(false);\n setIsCreditCard(false);\n setIsPayByBank(false);\n }\n\n const onCreditCardSelected = () => {\n resetSelectedStates();\n setIsCreditCard(true);\n updatePaymentMethodType(PaymentMethodType.CreditCard);\n setButtonTextIcon('Pay');\n setPaymentMethodValid(true);\n setPaymentMethodAction(onCreditCardAction);\n };\n\n const onPayByBankSelected = () => {\n resetSelectedStates();\n setIsPayByBank(true);\n updatePaymentMethodType(PaymentMethodType.PayByBank);\n updateConnectedAccounts(accounts);\n setPaymentMethodValid(true);\n setPaymentMethodAction(onPayByBankAction);\n };\n\n const updatePaymentMethodType = (paymentMethodType: PaymentMethodType) => {\n if (setPaymentMethodType) {\n setPaymentMethodType(paymentMethodType);\n }\n paymentMethodTypeRef.current = paymentMethodType;\n }\n\n const setPaymentButtonForPayByBank = () => {\n let icon: IconNameType | undefined = 'lock';\n let text = 'Connect Bank Account';\n if (accountsRef.current.length > 0) {\n const selectedAccount = accountsRef.current.filter(acct => acct.selected)[0];\n icon = undefined;\n text = `Pay with ${selectedAccount.accountName} Ending *${selectedAccount.accountMask}`;\n }\n\n setButtonTextIcon(text, icon);\n };\n\n const onACHSelected = () => {\n resetSelectedStates();\n setIsAch(true);\n updatePaymentMethodType(PaymentMethodType.ACH);\n setButtonTextIcon('Pay');\n setPaymentMethodValid(true);\n setPaymentMethodAction(onACHAction);\n };\n\n const setButtonTextIcon = (text: string, icon?: IconNameType | undefined) => {\n if (setPaymentButtonTextIcon) {\n setPaymentButtonTextIcon(text, icon);\n }\n };\n\n const updateConnectedAccounts = (connectedAccounts: ConnectedBankAccount[]) => {\n setAccounts(connectedAccounts);\n setConnectedAccounts(connectedAccounts);\n accountsRef.current = connectedAccounts;\n setPaymentButtonForPayByBank();\n };\n\n const connectAnotherAccount = () => {\n setFailedBankName(undefined);\n open.current();\n };\n\n const onConfirmACHPaymentMethod = async () => {\n const amount = getPaymentAmount();\n const payment: PendingInvoicePayment = {\n amount,\n invoiceNumber: invoiceId!,\n amountRemaining: paymentAmountData?.fullBalance! - amount,\n chargeType,\n splits,\n statementId\n };\n const achPaymentMethod = await store.achInfoToPaymentMethod(achInfoData, false);\n if (!achPaymentMethod) {\n return;\n }\n\n setIsACHModelOpen(false);\n\n if (showPrimaryOption && isUseAsPrimaryPaymentChecked.current) {\n store.needToStoreAsPrimary = true;\n achPaymentMethod.primary = true;\n }\n\n if (showSavePaymentOption && isSavedPaymentChecked.current) {\n await store.addPaymentMethod(achPaymentMethod!);\n }\n\n await store.chargePaymentMethod(achPaymentMethod, payment);\n\n }\n\n const onPaymentMethodSubmit = async () => {\n const amount = getPaymentAmount();\n const type = paymentMethodTypeRef.current;\n\n const payment: PendingInvoicePayment = {\n amount,\n invoiceNumber: invoiceId!,\n amountRemaining: paymentAmountData?.fullBalance! - amount,\n chargeType,\n splits,\n statementId\n };\n\n if (type === PaymentMethodType.ACH) {\n const achPaymentMethod = await store.achInfoToPaymentMethod(achInfoData, false);\n if (!achPaymentMethod) {\n return;\n }\n\n setIsACHModelOpen(true);\n } else if (type === PaymentMethodType.CreditCard) {\n if (usePaymentGateway()) {\n const result = await pgcardInfoData.form.validate();\n\n if (result.hasError) {\n return;\n }\n\n const paymentMethod = { paymentMethodId: 0 } as PaymentMethodInfo;\n paymentMethod.paymentMethodType = PaymentMethodType.CreditCard;\n\n await store.processGatewayAddNewCard(async (gatewayPaymentMethod) => {\n if (gatewayPaymentMethod) {\n if (showPrimaryOption && isUseAsPrimaryPaymentChecked.current && isSavedPaymentChecked.current) {\n gatewayPaymentMethod!.primary = true;\n store.needToStoreAsPrimary = true;\n }\n\n if (showSavePaymentOption && isSavedPaymentChecked.current) {\n gatewayPaymentMethod!.storePaymentMethod = true;\n }\n store.chargePaymentMethod(gatewayPaymentMethod!, payment);\n }\n });\n\n } else {\n const creditCardPaymentMethod = await store.cardInfoToPaymentMethod(cardInfoData, false);\n if (!creditCardPaymentMethod) {\n return;\n }\n\n if (showPrimaryOption && isUseAsPrimaryPaymentChecked.current) {\n creditCardPaymentMethod.primary = true;\n store.needToStoreAsPrimary = true;\n }\n\n if (showSavePaymentOption && isSavedPaymentChecked.current) {\n creditCardPaymentMethod.storePaymentMethod = true;\n }\n\n await store.chargePaymentMethod(creditCardPaymentMethod, payment);\n }\n } else if (type === PaymentMethodType.PayByBank) {\n if (accountsRef.current.length < 1) {\n return;\n }\n\n const connectedAccount = accountsRef.current.filter(account => account.selected)[0];\n\n const payByBankPaymentMethod = store.connectedBankAccountToPaymentMethod(connectedAccount,\n false);\n\n if (showPrimaryOption && isUseAsPrimaryPaymentChecked.current) {\n payByBankPaymentMethod.primary = true;\n store.needToStoreAsPrimary = true;\n }\n\n if (showSavePaymentOption && isSavedPaymentChecked.current) {\n await store.addPaymentMethod(payByBankPaymentMethod!);\n }\n\n await store.chargePaymentMethod(payByBankPaymentMethod, payment);\n }\n };\n\n const onAmountStateChanged = () => {\n // Use for triggering refresh for amount change with regards to ACH amount\n setIsAchExceeded(isAchAmountExceeded);\n };\n\n const isAchAmountExceeded = () => {\n const maxAmount = 250000;\n return paymentMethodTypeRef.current === PaymentMethodType.ACH && getPaymentAmount() > maxAmount;\n }\n\n useEffect(() => {\n store.postalCode = store.usePaymentGateway() ? pgcardInfoData.postalCode : cardInfoData.postalCode;\n\n if (paymentAmountData) {\n paymentAmountData.onStateChanged = onAmountStateChanged;\n }\n\n if (!paymentMethodLoadedRef.current) {\n paymentMethodLoadedRef.current = true;\n\n if (setPaymentMethodSubmit) {\n setPaymentMethodSubmit(onPaymentMethodSubmit);\n }\n\n if (isCreditCard) {\n onCreditCardSelected()\n }\n\n if (isAch) {\n onACHSelected();\n }\n\n if (isPayByBank) {\n onPayByBankSelected();\n }\n\n pgcardInfoData.desktopPaymentGatewayUrl = paymentGateway.getDesktopPaymentGatewayUrl(store.usesPaymentsService);\n pgcardInfoData.mobilePaymentGatewayUrl = paymentGateway.getMobilePaymentGatewayUrl(store.usesPaymentsService);\n pgcardInfoData.iframeMessageHandler =\n pgcardInfoData.iframeMessageHandler || iframeMessageHandler;\n }\n }, []);\n\n useEffect(() => {\n if (ready && paymentMethodTypeRef.current === PaymentMethodType.PayByBank) {\n setPaymentMethodAction(onPayByBankAction);\n }\n if (ready && setPayByBankReady) {\n setPayByBankReady(ready);\n }\n }, [ready, open]);\n\n return (\n <>\n {linkToken && ()}\n {((!useFeatureGate && store.isCreditCardEnabled) || (useFeatureGate && store.isSavedCreditCardEnabled)) && \n
\n onCreditCardSelected()} />\n Credit Card\n
\n {isCreditCard && (usePaymentGateway() ? (\n pgcardInfoData ? (\n \n ) : null\n ) : cardInfoData ? (\n \n ) : null)}\n
\n
\n\n }\n\n {((!useFeatureGate && store.isPayByBankEnabled) || (useFeatureGate && store.isPayByBankFeatureOn)) && \n
\n onPayByBankSelected()} />\n Pay By Bank\n
\n \n Securely connect to your bank for faster payments and easier refund.\n \n {isPayByBank && (\n <>\n \n {accounts.length > 0 && (\n \n {accounts.length > 1 ? 'Connect a Different Account' : 'Connect Another Account'}\n \n )}\n\n {failedBankName && (\n
\n
\n \n \n Plaid had an issue connecting to your bank ({failedBankName})\n \n
\n
\n You can try connecting to the bank again later, try connecting to another bank, or use a different payment method.\n
\n
)}\n \n )}\n
\n
\n }\n\n {((!useFeatureGate && store.isBankAccountEnabled) || (useFeatureGate && store.isSavedBankAccountFeatureOn)) && (\n
\n onACHSelected()} />\n ACH\n
\n {(isAch && \n )}\n
\n
\n )}\n\n {showSavePaymentOption && (\n
\n {\n isSavedPaymentChecked.current = checked;\n if (setSavePaymentChecked) {\n setSavePaymentChecked(checked)\n }\n }} />\n Save Payment Information\n
\n )}\n\n {showPrimaryOption && (\n
\n {\n isUseAsPrimaryPaymentChecked.current = checked;\n if (setUseAsPrimaryPaymentChecked) {\n setUseAsPrimaryPaymentChecked!(checked);\n }\n }} />\n Use as Primary Payment Method\n
\n )}\n\n {showLoginLink && (\n Sign in to access your saved payment information.)}\n\n {isACHModelOpen && (\n setIsACHModelOpen(false)}\n onSubmit={onConfirmACHPaymentMethod}\n accountNumber={achInfoData.accountNumber.value || ''}\n />\n )}\n \n )\n};\n","import * as React from 'react';\nimport { observable, computed, action } from 'mobx';\nimport { observer } from 'mobx-react';\n\nexport interface IViewMore {\n currentHtml: string;\n isExpanded: boolean;\n showViewMore: boolean;\n toggleExpanded: () => void;\n setTextDiv: (div: HTMLDivElement | null) => IViewMore;\n}\n\ninterface ChildProps {\n viewMore: IViewMore;\n}\n\ninterface Props {\n dangerouslySetInnerHTML: string;\n component: React.ComponentType;\n}\n\n@observer\nexport class ViewMore extends React.Component implements IViewMore {\n @observable private fullHtml: string;\n @observable private shortHtml: string;\n @observable isExpanded = false;\n @observable showViewMore = false;\n @computed get currentHtml() {\n return this.isExpanded ? this.fullHtml : this.shortHtml;\n }\n private textDiv: HTMLDivElement | null = null;\n\n constructor(props: Props) {\n super(props);\n this.fullHtml = this.props.dangerouslySetInnerHTML;\n this.shortHtml = this.fullHtml;\n }\n\n @action\n componentWillUpdate(nextProps: Props) {\n if (this.fullHtml !== nextProps.dangerouslySetInnerHTML) {\n this.fullHtml = nextProps.dangerouslySetInnerHTML;\n this.shortHtml = this.fullHtml;\n this.isExpanded = false;\n this.showViewMore = false;\n if (this.textDiv) {\n setTimeout(() => this.calculateShortHtml());\n }\n }\n }\n\n setTextDiv = (div: HTMLDivElement | null) => {\n this.textDiv = div;\n this.calculateShortHtml();\n return this;\n };\n\n private calculateShortHtml() {\n const div = this.textDiv;\n if (!div) {\n return;\n }\n\n while (div.clientHeight < div.scrollHeight - 1) {\n // 1px allowance for Edge\n const index = div.innerHTML.lastIndexOf(' ');\n if (index >= 0) {\n div.innerHTML = `${div.innerHTML.substr(0, index)}…`;\n } else {\n break;\n }\n }\n this.shortHtml = div.innerHTML;\n this.showViewMore = this.shortHtml !== this.fullHtml;\n }\n\n toggleExpanded = () => {\n this.isExpanded = !this.isExpanded;\n };\n\n render() {\n const Component = this.props.component;\n return ;\n }\n}\n"],"sourceRoot":""}