{"version":3,"sources":["hooks/use-produce.ts","auth/authorization-helpers.tsx","components/tooltip.tsx","gateways/tokenization-context.tsx","components/card-brand.tsx","components/confirm-button.tsx","api/generated/EmbeddedService.ts","api/generated/PaymentSourcesService.ts","api/generated/TermsOfServiceService.ts","gateways/index.ts","components/copy-button.tsx","payments/payment-source-utils.ts","gateways/billing-address-form-fields.tsx","accounts/account-field-label.tsx","components/address.tsx","api/generated/PaymentChannelsService.ts","customer-portal/autopay-enrollment-terms.tsx","utils/history.ts","components/terms-of-service.tsx","components/data-list.tsx","customer-portal/business-unit-provider.tsx","gateways/ach-form.tsx","gateways/credit-card-form-resolver.tsx","payments/payment-source-form.tsx","styles/copy-element-styles.ts","gateways/card-connect/tokenizer.tsx","hooks/use-mobile-detect.ts","gateways/card-connect/credit-card-form.tsx","gateways/plaid/link.ts","gateways/plaid/link-button.tsx","styles/theme-provider.tsx","assets/icon-cvv.svg","embedded/bridge.ts","hooks/use-debounced-state.ts","customer-portal/autopay-terms.ts","gateways/plaid/link-form.tsx","hooks/use-post-message-handler.ts","gateways/nmi/credit-card-form.tsx","payments/payment-utils.ts","api/generated/ServiceFeesService.ts","payments/payment-field-utils.ts","components/zero-width.tsx","components/payment-source-preview.tsx","gateways/card-connect/card-readers.ts","service-fees/calculated-service-fees.tsx","components/accepted-card-types.tsx","payments/payment-source-selection.tsx","utils/accessibility-helpers.tsx","hooks/user-path-params.ts","payments/card-swipe-modal.tsx","payment-intents/payment-intent-payment-source-form.tsx","payments/product-selection-form.tsx","payment-intents/account-charges-form.tsx","accounts/multi-account-payment-form.tsx","messages/message-display.tsx","accounts/account-search-input.tsx","payment-intents/payment-intent-fields.tsx","payment-intents/open-charge-form.tsx","payment-intents/pos-map-charges-form.tsx","payment-intents/product-charge-form.tsx","payment-intents/payment-intent-charges-form.tsx","payments/payment-terms.tsx","payment-intents/payment-intent-review.tsx","api/generated/CheckoutService.ts","checkout/checkout-payment-source.tsx","checkout/countdown.tsx","checkout/initiate.tsx","checkout/details.tsx","checkout/status.tsx","checkout/review.tsx","checkout/app.tsx"],"names":["useProduce","initialState","useState","state","_setState","stateRef","useRef","current","useCallback","mutationFn","produce","draft","AgentUsers","useIsAgentUser","useHasAuthorization","role","loggedPermissionMismatchCache","Set","permission","strict","user","useUser","permissions","Array","isArray","roles","userPermissions","RoleTemplates","hasPermission","every","some","x","includes","hasRole","isGlobalAdmin","key","id","join","has","add","analytics","trackEvent","subject","userId","userRole","AuthorizedComponent","children","rest","isAuthorized","Tooltip","label","css","styles","TokenizationContext","createContext","TokenizationContextProvider","props","value","useMemo","cardConfig","plaidLinkStatus","hostingMode","embeddedContext","Provider","useTokenizationConfig","useContext","Error","usePlaidLinkConfig","useTokenizationContext","cardImages","Visa","card","imageVisaCard","logo","imageVisa","Mastercard","imageMastercardCard","imageMastercard","Amex","imageAmexCard","imageAmex","Discover","imageDiscoverCard","imageDiscover","CardBrandImage","type","hideUnknown","logoOnly","src","undefined","imageDefaultCard","className","creditCardTypeMap","CardBrands","binInfoCache","fetchBinInfo","guard","cardConnectToken","cardBrandInput","substring","results","creditCardType","knownCardType","find","validateEnumOptions","niceType","result","NullToolTip","ConfirmButton","onConfirm","loading","negative","fluid","text","loadingText","confirmText","confirmPosition","confirmContent","tooltip","icon","iconSize","popupButtonSize","open","setOpen","onClose","TooltipComponent","trigger","basic","disabled","cx","primary","onClick","size","position","on","popperDependencies","EmbeddedService","params","options","Promise","resolve","reject","url","basePath","replace","configs","getConfigs","signature","expiration","channel","dataToSign","accountId","data","axios","BusinessUnitId","BaseAmount","Channel","Scope","PaymentSourceTypes","PaymentSourcesService","IncludeCustomerAutopayPaymentSources","TermsOfServiceService","Page","PageSize","Filtered","Sorted","businessUnitId","creditCardKeys","accountNumberToken","accountNumberMasked","cardExpiration","cardExpirationMonth","cardExpirationYear","cardCvv","addressKeys","streetAddress","streetAddress2","city","zipCode","fieldKeys","accountHolderName","accountType","achAccountHolderType","achRoutingNumber","achAccountNumber","achConfirmAccountNumber","CopyButton","description","buttonProps","notifications","useNotification","copy","info","faCopy","getAvailablePaymentSourceTypesByChannel","account","savedPaymentSources","currentSource","creditCard","ach","availablePaymentSourceTypes","enabled","paymentMerchantAccountId","blockAchPayment","push","blockCreditCardPayment","availablePaymentSources","filter","paymentSourceType","paymentSourceTypes","getAvailablePaymentSourceTypes","paymentSourceConfig","paymentSources","accounts","parseExpirationData","invalidExpiration","hasErrors","errors","propertyName","errorMessage","formattedExpiration","length","error","yearPattern","moment","endOf","isValid","format","isPaymentSourceExpired","paymentSource","expirationDate","isAfter","BillingAddressFormFields","billingAddressCollectionType","optionalZip","isRequired","Input","fieldName","fieldLabel","fieldRequired","AccountFieldMap","Map","getAccountFieldMap","accountFields","map","get","calculatedMap","reduce","field","set","useAccountFieldConfig","titleCase","isDisplayField","isIvrLookupField","isQuickPayLookupField","useAccountFieldConfigMap","accountFieldMap","useAccountField","AccountFieldLabelWithContext","businessUnit","useBusinessUnitContext","config","force","AccountFieldDisplayMap","AccountNumber","SubAccountNumber","Name","Zip","Balance","LateFee","Description","IssueDate","DueDate","PhoneNumber","EmailAddress","Note","Address","PastDueAmountMinor","AccountFieldDisplayWithContext","display","AddressFields","address","cityStateZip","line","mapPaymentSourceAddress","obj","pick","modifiedPaymentSource","omit","PaymentChannelsService","includeInactive","AutoPayEnrollmentTermsOfUse","Modal","Button","as","closeIcon","Form","circular","color","faTimes","Header","Content","scrolling","source","terms","linkTarget","AutoPayServiceFeeInfo","achFees","achShow","ccFees","ccShow","Popup","flowing","autopayModalStyles","Table","compact","structured","Row","HeaderCell","Cell","startRange","amount","endRange","percentageFee","decimalValueConverter","flatFee","Fragment","Media","payStarColors","blue","removeUrlHash","window","history","pushState","document","title","location","pathname","search","substituteRegex","formatRegex","ElectronicDebitAuthorizationModal","href","identifier","StandardTermsOfServiceIdentifiers","AccountWalletTermsModal","formatterMap","serviceFeeTierInformation","ElectronicDebitAuthorization","AccountWalletTerms","formatSection","currentSection","keyFormatterRegex","variableValues","exec","match","keys","formatter","splitKeys","split","canFormat","mappedData","TermsOfService","rawTerms","useAsync","a","getNewestPublishedTermsByIdentifier","response","renderedTerms","variables","pointer","variable","index","indexOf","section","formattedVariable","renderTerms","i","BusinessUnitTerms","DataList","align","colonAfterLabel","ShouldIgnoreTranslate","unstackable","datumStyles","Body","verticalAlign","collapsing","textAlign","INITIAL_STATE","BusinessUnitContext","BusinessUnitProvider","slug","useMatch","rootRoutes","customer","channelType","PaymentChannels","POS","QuickPay","fetchBusinessUnitContext","BusinessUnitsService","getContextBySlug","businessUnitContext","header","context","AchAccountTypes","CheckingAccount","SavingsAccount","AchAccountHolderTypes","Business","Personal","preventCopyPaste","onDrag","e","preventDefault","onDrop","onCopy","onCut","onPaste","autoComplete","AchFields","values","layout","setState","form","useForm","useEffect","batch","change","routingNumber","expired","Axios","code","routing_number","routingInfo","Group","widths","active","RadioGroup","fieldConfig","autoFocus","fieldHint","customer_name","onBlur","CreditCardFormResolver","tokenizerConfig","strategy","PaymentGatewayTypes","NMI","logger","warn","PaymentSourceForm","onCardInfo","cvv","content","isCreditCard","achEnabled","creditCardEnabled","Message","style","justifyContent","PaymentSourceTypeSelector","creditCardBlocked","achBlocked","isAch","ACH","ShowPaymentMethod","faCreditCard","faMoneyCheck","convertToLookup","array","acc","log","DEFAULT_IFRAME_TOKENIZER_PROPS","invalidinputevent","tokenizewheninactive","enhancedresponse","placeholder","formatinput","tokenpropname","inactivityto","CardConnectTokenizer","target","onCapture","onLoad","onError","tokenizerContext","isMobile","isIOS","test","navigator","platform","maxTouchPoints","MSStream","isMobileSize","useBreakpoint","useMobileDetect","parentWindowWidth","isEmbedded","tokenizeWhenInactive","urlOrigin","properties","Env","cardConnectBaseUrl","subdomain","parseUrl","host","messageFilter","event","origin","usePostMessageHandler","onMessage","parseCardConnectMessage","entry","errorCode","original","cardInfo","token","clonedStyles","styleWhitelist","explicitValues","targetStyles","getComputedStyle","filterMap","computedValue","getPropertyValue","object","copyElementStyles","acceptedCssProperties","height","offsetHeight","width","outline","inputHeight","inputStyles","timeEvent","tokenizerProps","qs","stringify","name","frameBorder","exception","Sentry","documentedCardConnectResponseKeys","messageJsonString","parseJson","enhancedToken","Number","last4","takeRight","tokenParts","CardconnectFields","setCardInfo","targetInputRef","isCheckoutPage","routes","checkout","base","render","input","meta","Field","submitError","htmlFor","ref","tokenizerStyles","onChange","CardExpirationAndCvv","Fill","InputMasked","delimiter","blocks","Box","CvvField","inputWithImageStyles","Image","imageCvv","initialize","once","r","scriptConfig","onload","loadScript","initiateLink","sessionIdentifier","onSuccess","onExit","onEvent","getPlaidLinkToken","body","linkToken","linkHandler","Plaid","create","metadata","destroy","eventName","PlaidLinkButton","status","onAccountSelected","plaidBusy","activatePlaid","success","faBuilding","ThemeContainer","styled","div","theme","primaryButtonBg","lighten","secondaryButtonBg","secondaryButtonShadow","secondaryButtonText","textLabel","primaryColor","globalStyles","textInputs","grey2","grey1","lightBlue","errorText","mutedText","warningText","blue1","darken","basicBoxShadow","transparentize","white1","black","transparent","transparentHover","warningBackground","warningBoxShadow","warning","GlobalStyles","ThemeProvider","resolveTheme","fetchTheme","delayInMs","inline","defaultProps","defaultTheme","ChildBridge","xprops","useDebouncedState","defaultValue","delay","val","setVal","debouncedValue","setDebouncedValue","useDebounce","trim","PlaidLinkForm","vAlign","Subheader","Item","plaidLinkData","mask","readOnly","Dropdown","enum","Checkbox","first","DEFAULT_FILTER","receiveMessage","addEventListener","removeEventListener","cardBrandMap","amex","discover","mastercard","visa","buildCollectJsToken","number","exp","hash","NmiFields","initialized","tokenizing","fieldState","ccnumber","valid","message","touched","ccexp","tokenizationKey","collectJsConfig","attributes","CollectJS","configure","customCss","validationCallback","fieldsAvailableCallback","fields","selector","variant","callback","tokenizeCallback","initializeCollectJs","tokenizationReponse","tokenInfo","brand","Unknown","useScript","canTokenize","startPaymentRequest","cardBrand","upperFirst","nmiStyles","paymentSourceIsAvailableForGateway","creditCardConfig","accountNumberTokenMasked","gatewayType","startsWith","tokenizerProperties","tokenizer","tokenizerUrl","URL","hostname","pop","ServiceFeesService","accountKeys","Object","AccountSummaryDto","usePaymentFields","paymentIntentConfig","paymentIntentOrAccount","renderPaymentDescriptor","renderAllAccountMappedFields","renderAllUnmappedFields","isPaymentIntent","isPaymentIntentDetailDto","sourceData","paymentFields","configField","camelCase","initialValue","getInitialValueForField","shouldShow","shouldShowField","initialValues","visibleFields","hiddenFields","arg","paymentFieldConfig","camelCasedKey","accountFieldMappingKey","JSON","zipKey","addressKey","hasValue","renderAccountMappedFields","renderUnmappedFields","toLowerCase","ZeroWidthSpace","PaymentSourceMiniPreview","onEdit","miniStyles","preserveLength","preserveSide","maskCharacter","totalLength","maskStart","Math","max","maskEnd","min","masked","char","idx","preservedStartLeft","maskLeft","PaymentSourcePreview","onDelete","hideExpiration","showAutopay","hideActions","disabledMessage","deleteConfirmModal","setDeleteConfirmModal","useAsyncFn","deleteById","deletePaymentSourceState","deletePaymentSource","isExpired","isAutopay","faQuestion","Actions","PaymentSourceMiniJsonPreview","paymentSourceJson","isString","accountNumberLast4","getTokenizationData","trackData","useExplicitMsrEncryption","cardSecureParams","tokeinzationType","pan","isEmv","isDataEmvOrNonAugustaMsr","devicedata","parseValidCardData","unique","encryptionhandler","year","month","getNameOnCard","textData","startOfNameTLV","startOfLength","startOfValue","valueLengthHexDigits","substr","valueLengthInNumChars","parseInt","valueHexDigits","nameArray","charValInHex","asciiInValOfChar","String","fromCharCode","splitName","lastName","track","startOfLengthType","lengthType","msrLengthInChars","startOfMSRData","lengthAmountHexCharSize","startOfLengthHexAmountSize","lengthHexChars","useCalculatedServiceFees","intent","payload","baseAmount","subtotal","scope","PaymentIntentConfigScopes","Embedded","calculateServiceFees","businessUnitSlug","res","CalculatedServiceFeesSegment","fetchServiceFees","y","tier","AcceptedCardTypes","brands","getBusinessUnitPaymentChannel","paymentMerchantAccount","acceptedCardBrands","pickBy","_","SavedPaymentSourceSelector","selectedId","selectable","isUsable","buttonAccessibilityProps","onSelect","checked","PaymentSourceSelection","payerProvidedPaymentSources","accountWalletsEnabled","organizationName","payerProvidedWallets","showPayerProvided","payerProvidedExists","addNewPaymentSource","addNewPaymentSourceClicked","getFieldState","savePaymentSource","tabIndex","onKeyDown","keyCode","usePathParams","useParams","CardSwipeInput","onActivate","mode","attempt","inputRef","opened","onCardRead","useDebouncedCallback","tokenizeCardSwipe","Boolean","errorcode","cancel","buttonStyles","marginTop","setTimeout","focus","onKeyUp","CardSwipeFormFields","cardData","FormField","BillingAddressCollectionTypes","TokenizationTypes","cardSecureUrl","tokenizationData","post","buildPaymentSourceRequest","newPaymentSource","paymentSourceId","savedPaymentSourceId","entryMethod","CardEntryMethods","Swiped","cardEntryMethod","setExpiration","Keyed","DEFAULT_ACH_PAYMENT_SOURCE","waitingForToken","isPlaidRequest","plaidAccountId","plaidExchangeToken","PaymentIntentPaymentSourceForm","paymentIntent","onPaymentValidated","onCancel","isAgentRole","isCustomer","businessUnitPayerProvidedWallets","useAsyncRetry","getPayerProvidedForAccount","includeCustomerAutopayPaymentSources","accountPaymentSources","fetchAccountPaymentSources","getAllForAccount","customerPaymentSource","customerAutopayPaymentSource","derivedPaymentSourceConfig","sources","onlySource","plaidLinkState","DEFAULT_CARD_PAYMENT_SOURCE","avsValidation","cardSwipeEnabled","plaidAccountLinkEnabled","plaidPayerAccountLinkRequiredAch","PaymentIntentsService","updatePaymentSourceFromPlaid","updateSessionResponse","updateFromPlaidState","updateFromPlaid","onSubmit","plaidResponse","request","updatePaymentSource","Dimmer","page","Loader","businessUnitDisplayServiceFees","Container","binInfo","previous","visible","DEFAULT_PAYMENT_SOURCE","emailAddress","mapProductToLineItem","product","productId","price","variablePrice","allowPriceModification","required","ProductionSelectionForm","products","optionalProducts","fieldArray","useFieldArray","productMap","keyBy","actions","centered","faPlus","actionsPosition","ErrorMessage","element","remove","InputCurrency","AccountChargeForm","resolvedState","allowsFreeFormPayment","accountConfig","freeFormPaymentEnabled","showAmountOptions","outstandingBalance","radio","option","shouldUsePastDueAmount","onFocus","useAccountChargeOptions","canMakeAccountCharge","totalOutstandingBalance","accountBalanceOnly","noOutstandingBalance","useAccountChargeInitialValues","requiresMinimumOfBalance","pastDueAmountMinor","balance","paymentType","businessUnitPastDueAccounts","minimumBalanceRequired","GetMappedAccountsForMultiAccountPaymentForm","subaccount","subAccountNumber","accountDisplay","accountNumber","autopayEnrolled","enrolledInAutopay","hasBalance","channelDisabled","preventPayments","accountLocked","isArchived","blockedByAllPaymentTypes","canMakePayment","upcomingPayment","upcomingPayments","showRecentPayment","dateToProcess","lastPaymentDate","diff","includeInMulti","MultiAccountPaymentForm","mappedAccounts","showSubtotal","dueDateConfigured","AccountFieldTypes","formValues","useFormState","total","entries","selected","cur","subAccount","accountNumberDisplay","accountState","mobileTableStyles","dueDate","date","fontWeight","multiAccountFormFooterTableStyles","multiAccountFormStyles","blue6","MessageDisplay","messages","showOnPayment","showOnConfirmation","member","messageBody","SearchResult","AccountSearchInput","onAccountResults","selectedResult","setSelectedResult","setSearch","args","term","searchMethod","customAccountSyncStrategy","searchAccountsCustom","searchAccounts","searchAccountState","searchAccount","useHotkeys","filterPreventDefault","enableOnTags","iconPosition","getSelectedAccount","action","autocomplete","aria-label","searchParams","searchFieldNames","searchSearchText","AccountsService","getAll","pageSize","isPos","items","query","PaymentIntentFields","onUpdate","updatePaymentFields","useMergeStrategy","Default","PaymentIntentPaymentFields","fieldClassName","OpenChargeForm","embedded","productConfig","PosMultiAccountChargeForm","counter","accountKey","formAmount","selectedAccount","Divider","ProductChargeForm","PaymentIntentChargesForm","multipleAccountPosEnabled","StandardPaymentIntentChargesForm","calculatedAmount","calculateTotal","chargeType","openChargeEnabled","accountPayment","productTotal","sum","lineItem","isNaN","mapFormToCharges","usePastDueAmount","accountCharges","paymentAmount","openCharges","PaymentTerms","serviceFee","isAccountless","authorizer","termsIdentifier","variableData","PaymentIntentReview","executeRecaptcha","useGoogleReCaptcha","onComplete","processFunction","recaptchaToken","process","headers","getDistinctId","recaptchaAction","notify","fees","serviceFeeCalculation","hasFees","Icon","fontSize","CheckoutService","base64Info","CheckoutPaymentSource","submitRequested","canSubmit","hasRequiredInfo","submit","Countdown","pathParams","useInterval","duration","Date","asMinutes","utc","asMilliseconds","arrayMutators","ArrayMutators","CheckoutInitiate","onCreated","navigate","useNavigate","queryParams","useQueryParams","multiAccountInfo","getAccounts","eligibleAccounts","selectionCount","item","getInitialValues","forEach","path","review","sessionId","buildPath","Label","attached","mutators","CheckoutDetails","paymentFieldsDisplay","lineItems","CheckoutStatus","useLocation","emailSent","setEmailSent","fetchPaymentSessionResult","getResult","paymentSessionResult","basePaymentStatus","PaymentStatuses","Succeeded","faCheck","faExclamationTriangle","isCard","basePaymentReference","basePaymentAmountMinor","serviceFeeAmountMinor","paymentDate","Declined","basePaymentId","sendReceipt","faEnvelopeOpenText","receipt","referenceNumber","marginRight","dashboard","CheckoutReview","fetchSession","PaymentSessionStatuses","Complete","RequiresConfirmation","retry","CheckoutThemeProvider","businessUnitPrimaryColor","CheckoutFooter","businessUnitAddress","businessUnitPhoneNumber","businessUnitWebsiteUrl","rel","HostedCheckoutApp","recaptchaSiteKey","setCvv","paymentCompleted","setPaymentCompleted","breakpoint","showMobileLogo","getConfig","reCaptchaKey","Segment","businessUnitLogoUrl","alt","businessUnitMobileLogo","businessUnitHeader","businessUnitSubHeader","initiate"],"mappings":"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A,oBACA,gBACA,eACA,qBACA,qBACA,qBACA,iBACA,eACA,aACA,mBACA,yBACA,0BACA,mBACA,mBACA,eACA,aACA,aACA,eACA,QACA,MACA,YACA,aACA,YACA,YACA,cACA,OACA,cACA,YACA,eACA,aACA,eACA,cACA,SACA,iBACA,cACA,aACA,mBACA,sBACA,kBACA,SACA,gBACA,cACA,eACA,aACA,aACA,YACA,aACA,YACA,UACA,gBACA,gBACA,gBACA,UACA,iBACA,eACA,gBACA,cACA,QACA,cACA,eACA,QACA,cACA,SACA,WACA,QACA,eACA,gBACA,oBACA,cACA,SACA,eACA,aACA,kBACA,cACA,gBACA,cACA,iBACA,eACA,iBACA,eACA,SACA,cACA,QACA,eACA,aE9SK,IAAMuB,EAAkD,SAAC,GAKzD,IAJLnE,EAII,EAJJA,OACAhC,EAGI,EAHJA,WACA5N,EAEI,EAFJA,6BAEI,IADJ6N,WACI,SACJ,EAAgCpc,mBAAmB,CACjDmF,KAAM,YADR,mBAAOgb,EAAP,KAAiBoC,EAAjB,KAIMC,EAAiBpiB,iBAAyB,MAC1CqiB,EAAiBlK,YAASmK,IAAOC,SAASC,MAEhD,OACE,8BACE,YAAC,IAAD,CACE1gB,GAAI+I,IAAUC,kBACdwW,KAAMzW,IAAUC,kBAChB2X,OAAQ,YAAoB,IAAlBC,EAAiB,EAAjBA,MAAOC,EAAU,EAAVA,KACf,OACE,mBAAKtd,UAAU,cACb,YAAC,IAAaud,MAAd,CAAoBpV,QAASmV,EAAKE,aAChC,qBAAOC,QAASJ,EAAMpB,MAAtB,gBACA,mBAAKjc,UAAU,YACb,mCACMqd,EADN,CAEE5gB,GAAI4gB,EAAMpB,KACVyB,IAAKX,EACLjH,WAAYkH,OAIlB,YAAC,IAAD,CAAaf,KAAMoB,EAAMpB,WAMjC,YAAC,IAAD,CACExf,GAAI+I,IAAUX,mBACdoX,KAAMzW,IAAUX,mBAChBuY,OAAQ,YAAoB,IAAlBC,EAAiB,EAAjBA,MAAOC,EAAU,EAAVA,KACf,OACE,mBAAKtd,UAAU,cACb,YAAC,IAAaud,MAAd,CAAoBpV,QAASmV,EAAKE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","file":"static/js/15.b82dc1ed.chunk.js","sourcesContent":["import produce, {Draft} from 'immer';\r\nimport {useCallback, useRef, useState} from 'react';\r\n\r\ntype Producer = (currentState: Draft) => void;\r\n\r\nexport function useProduce(initialState: T | (() => T)) {\r\n const [state, _setState] = useState(initialState);\r\n\r\n const stateRef = useRef();\r\n stateRef.current = state;\r\n\r\n const producer = useCallback((mutationFn: Producer) => {\r\n _setState(\r\n produce(stateRef.current as T, (draft) => {\r\n mutationFn(draft);\r\n })\r\n );\r\n }, []);\r\n\r\n return [state, producer] as [T, typeof producer];\r\n}\r\n","import {every, includes, some} from 'lodash';\r\nimport React from 'react';\r\nimport {useUser} from './use-auth';\r\nimport {analytics} from '../analytics';\r\nimport {AllPermissions, Roles, RoleTemplates} from '../api/generated/enums';\r\n\r\ntype Permissions = (typeof AllPermissions)[number];\r\ntype PermissionParam = Permissions | Permissions[];\r\ntype RoleParam = Roles | Roles[];\r\n\r\ntype AuthorizationConditions =\r\n | {\r\n permission: PermissionParam;\r\n role?: RoleParam;\r\n }\r\n | {\r\n permission?: PermissionParam;\r\n role: RoleParam;\r\n }\r\n | {\r\n permission: PermissionParam;\r\n role: RoleParam;\r\n };\r\n\r\nexport type AuthorizationProps = AuthorizationConditions & {\r\n strict?: boolean;\r\n};\r\n\r\nexport const AgentUsers: Roles[] = ['Organization Admin', 'Organization User'];\r\n\r\nexport const useIsAgentUser = () => useHasAuthorization({role: AgentUsers});\r\n\r\nconst loggedPermissionMismatchCache: Set = new Set();\r\nexport const useHasAuthorization = ({permission, role, strict}: AuthorizationProps) => {\r\n const user = useUser();\r\n\r\n const permissions = Array.isArray(permission) ? permission : [permission];\r\n const roles = Array.isArray(role) ? role : [role];\r\n\r\n const userPermissions = [...RoleTemplates[user.role], ...(user.permissions ?? [])];\r\n\r\n const comparisonAction = strict ? every : some;\r\n const hasPermission = comparisonAction(permissions, (x) => includes(userPermissions, x));\r\n const hasRole = roles.includes(user.role);\r\n\r\n const isGlobalAdmin = !strict && user.role === 'Global Admin';\r\n\r\n if (hasPermission !== hasRole && !isGlobalAdmin) {\r\n const key = `${user.id}-${permissions.join(',')}-${roles.join(',')}`;\r\n if (!loggedPermissionMismatchCache.has(key)) {\r\n loggedPermissionMismatchCache.add(key);\r\n analytics.trackEvent('auth.permission-mismatch', {\r\n subject: 'Role/Permission mismatch',\r\n userId: user.id,\r\n userRole: user.role,\r\n roles,\r\n permissions,\r\n strict,\r\n key,\r\n });\r\n }\r\n }\r\n\r\n return isGlobalAdmin || hasRole || hasPermission;\r\n};\r\n\r\nexport const AuthorizedComponent: React.FC = ({children, ...rest}) => {\r\n const isAuthorized = useHasAuthorization({...rest});\r\n return <>{isAuthorized && children};\r\n};\r\n","import ReachTooltip from '@reach/tooltip';\r\nimport React from 'react';\r\nimport {css} from '@emotion/react/macro';\r\n\r\ntype Tooltip = {\r\n label: string;\r\n};\r\n\r\nexport const Tooltip: React.FC = ({label, children}) => (\r\n \r\n {children}\r\n \r\n);\r\n\r\nconst styles = css`\r\n margin-top: 0.4rem;\r\n z-index: 3;\r\n`;\r\n","import React, {createContext, useContext, useMemo} from 'react';\r\nimport {Overwrite} from 'utility-types';\r\nimport {TokenizerConfig} from '../api/generated/index.defs';\r\nimport {AnyObject} from '../types';\r\n\r\nexport type PlaidLinkStatus = 'Disabled' | 'Optional' | 'Required';\r\n\r\ninterface Context {\r\n cardConfig?: TokenizerConfig;\r\n plaidLinkStatus?: PlaidLinkStatus;\r\n hostingMode?: 'embedded' | 'default';\r\n embeddedContext?: {\r\n parentDomain?: string;\r\n parentWindowWidth?: number;\r\n };\r\n}\r\n\r\ntype TypedConfig = Overwrite<\r\n TokenizerConfig,\r\n {\r\n properties: T;\r\n }\r\n>;\r\ninterface TokenizationContextProvider extends Context {\r\n children: React.ReactNode;\r\n}\r\n\r\nexport const TokenizationContext = createContext({});\r\n\r\nconst TokenizationContextProvider: React.FC = (props) => {\r\n const value = useMemo(\r\n () => ({\r\n cardConfig: props.cardConfig,\r\n plaidLinkStatus: props.plaidLinkStatus,\r\n hostingMode: props.hostingMode,\r\n embeddedContext: props.embeddedContext,\r\n }),\r\n [props.cardConfig, props.embeddedContext, props.hostingMode, props.plaidLinkStatus]\r\n );\r\n return (\r\n {props.children}\r\n );\r\n};\r\n\r\nfunction useTokenizationConfig(): TypedConfig | undefined {\r\n const state = useContext(TokenizationContext);\r\n if (!state) {\r\n throw new Error(`useTokenizationConfig must be used within a TokenizationContextProvider`);\r\n }\r\n return state.cardConfig as unknown as TypedConfig;\r\n}\r\n\r\nfunction usePlaidLinkConfig() {\r\n const state = useContext(TokenizationContext);\r\n return state.plaidLinkStatus || 'Disabled';\r\n}\r\n\r\nfunction useTokenizationContext() {\r\n const state = useContext(TokenizationContext);\r\n return state;\r\n}\r\n\r\nexport {\r\n TokenizationContextProvider,\r\n useTokenizationConfig,\r\n usePlaidLinkConfig,\r\n useTokenizationContext,\r\n};\r\n","import creditCardType from 'credit-card-type';\r\nimport {find} from 'lodash';\r\nimport imageAmexCard from 'payment-icons/svg/flat/amex.svg';\r\nimport imageDefaultCard from 'payment-icons/svg/flat/default.svg';\r\nimport imageDiscoverCard from 'payment-icons/svg/flat/discover.svg';\r\nimport imageMastercardCard from 'payment-icons/svg/flat/mastercard.svg';\r\nimport imageVisaCard from 'payment-icons/svg/flat/visa.svg';\r\nimport imageAmex from 'payment-icons/svg/single/amex.svg';\r\nimport imageDiscover from 'payment-icons/svg/single/discover.svg';\r\nimport imageMastercard from 'payment-icons/svg/single/mastercard.svg';\r\nimport imageVisa from 'payment-icons/svg/single/visa.svg';\r\nimport React from 'react';\r\nimport {Image} from 'semantic-ui-react';\r\nimport {CardBrands} from '../api/generated/enums';\r\nimport {validateEnumOptions} from '../api/generated/utils';\r\nimport {CardInfo} from '../gateways/types';\r\nimport {guard} from '../utils/guard';\r\n\r\ntype CardBrandImage = {\r\n type: CardBrands | string;\r\n hideUnknown?: boolean;\r\n logoOnly?: boolean;\r\n className?: string;\r\n};\r\n\r\nconst cardImages = {\r\n Visa: {\r\n card: imageVisaCard,\r\n logo: imageVisa,\r\n },\r\n Mastercard: {\r\n card: imageMastercardCard,\r\n logo: imageMastercard,\r\n },\r\n Amex: {\r\n card: imageAmexCard,\r\n logo: imageAmex,\r\n },\r\n Discover: {\r\n card: imageDiscoverCard,\r\n logo: imageDiscover,\r\n },\r\n};\r\n\r\nexport const CardBrandImage: React.FC = (props) => {\r\n const type = cardImages[props.type];\r\n\r\n if (!type && (props.hideUnknown || props.logoOnly)) {\r\n return null;\r\n }\r\n\r\n const src = type ? (props.logoOnly ? type.logo : type.card) : undefined;\r\n\r\n return ;\r\n};\r\n\r\nconst defaultCardBrand: CardInfo = {type: 'Unknown'};\r\n\r\nconst creditCardTypeMap = {\r\n 'American Express': CardBrands.Amex,\r\n};\r\n\r\nconst binInfoCache = {};\r\nexport const fetchBinInfo = guard((cardConnectToken: string) => {\r\n const cardBrandInput = cardConnectToken.substring(1, 3);\r\n if (binInfoCache[cardBrandInput]) {\r\n return binInfoCache[cardBrandInput] as CardInfo;\r\n }\r\n const results = creditCardType(cardBrandInput);\r\n\r\n const knownCardType = find(results, (x) =>\r\n validateEnumOptions(CardBrands, creditCardTypeMap[x.niceType] || x.niceType)\r\n );\r\n\r\n if (!knownCardType) {\r\n throw new Error(`Unable to find card type for ${cardBrandInput}`);\r\n }\r\n\r\n const result = {\r\n type: creditCardTypeMap[knownCardType.niceType] || knownCardType.niceType,\r\n };\r\n\r\n binInfoCache[cardBrandInput] = result;\r\n\r\n return result as CardInfo;\r\n}, defaultCardBrand);\r\n","import {IconDefinition, SizeProp} from '@fortawesome/fontawesome-svg-core';\r\nimport {FontAwesomeIcon} from '@fortawesome/react-fontawesome';\r\nimport React, {useState} from 'react';\r\nimport {Popup, PopupProps} from 'semantic-ui-react';\r\nimport {Tooltip} from './tooltip';\r\nimport {Button} from '../forms/button';\r\nimport {cx} from '@emotion/css';\r\n\r\ntype ConfirmButton = Omit & {\r\n onConfirm: () => void;\r\n loading?: boolean;\r\n negative?: boolean;\r\n fluid?: boolean;\r\n text?: string;\r\n tooltip?: string;\r\n confirmPosition?: PopupProps['position'];\r\n loadingText?: string;\r\n confirmText?: string;\r\n confirmContent?: React.ReactNode;\r\n icon?: IconDefinition;\r\n iconSize?: SizeProp;\r\n};\r\n\r\nconst NullToolTip: React.FC<{label: string}> = ({label, children}) => <>{children};\r\n\r\nexport const ConfirmButton: React.FC = ({\r\n onConfirm,\r\n loading,\r\n negative,\r\n fluid,\r\n text,\r\n loadingText = 'Loading...',\r\n confirmText = 'Click to confirm',\r\n confirmPosition = 'right center',\r\n confirmContent,\r\n tooltip = '',\r\n icon,\r\n iconSize,\r\n popupButtonSize = undefined,\r\n ...props\r\n}) => {\r\n const [open, setOpen] = useState(false);\r\n\r\n const toggleOpen = () => {\r\n setOpen(!open);\r\n };\r\n\r\n const onClose = () => {\r\n setOpen(false);\r\n };\r\n\r\n const onConfirmClick = () => {\r\n onConfirm();\r\n onClose();\r\n };\r\n\r\n const TooltipComponent = tooltip ? Tooltip : NullToolTip;\r\n\r\n return (\r\n \r\n \r\n {!!icon && (\r\n <>\r\n {' '}\r\n \r\n )}\r\n {loading ? loadingText : text}\r\n \r\n \r\n }\r\n position={confirmPosition}\r\n on=\"click\"\r\n popperDependencies={[loading]}\r\n >\r\n <>\r\n {confirmContent}\r\n \r\n {confirmText}\r\n \r\n \r\n \r\n );\r\n};\r\n","/* eslint-disable */\r\n\r\nimport {\r\n EmbeddedPaymentIntentConfig,\r\n Address,\r\n PaymentFieldDetailDto,\r\n MessageDetailDto,\r\n AccountConfig,\r\n AccountFieldGetDto,\r\n PaymentSourceConfig,\r\n CreditCardConfig,\r\n TokenizerConfig,\r\n AcceptedCardBrands,\r\n AchConfig,\r\n PaymentSourceSummaryDto,\r\n OptionalAddress,\r\n ProductConfig,\r\n ProductSummaryDto,\r\n PaymentIntentDetailDto,\r\n PaymentSessionLineItemGetDto,\r\n Currency,\r\n AccountSummaryDto,\r\n ServiceFeeCalculationDto,\r\n ServiceFeeTierGetDto,\r\n UpdatedEmbeddedPaymentSessionPaymentSourceRequest,\r\n NewPaymentSource,\r\n UpdatedEmbeddedPaymentSessionChargesRequest,\r\n Charges,\r\n OpenCharge,\r\n AccountCharge,\r\n ProductCharge,\r\n UpdatePaymentIntentPaymentFieldsRequest,\r\n ProcessPaymentIntentRequest,\r\n PaymentIntentResultDto,\r\n SendPaymentReceiptRequest,\r\n EmptyResponse,\r\n Error,\r\n AccountDetailCustomerDto,\r\n CustomerAccountGetDto,\r\n AutopayEnrollmentSettings,\r\n ScheduledPaymentCustomerSummaryDto,\r\n AccountStateDto,\r\n AccountDetailDto,\r\n AccountAutopaySettingsDto,\r\n EmbeddedAutopayUpdateEnrollmentRequest,\r\n AutopayEnrollmentResponse,\r\n PaperlessBillingEnrollmentRequest,\r\n CreateEmbeddedPaymentSourceRequest,\r\n EmbeddedPaymentSourceDto,\r\n CardSourceDto,\r\n BankAccountSourceDto,\r\n IList,\r\n List,\r\n Response,\r\n AdvancedQueryPage,\r\n IRequestOptions,\r\n IRequestConfig,\r\n getConfigs,\r\n axios,\r\n basePath\r\n} from './index.defs';\r\n\r\nexport class EmbeddedService {\r\n /** Generate by swagger-axios-codegen */\r\n // @ts-nocheck\r\n /* eslint-disable */\r\n\r\n /**\r\n *\r\n */\r\n static getConfig(\r\n params: {\r\n /** */\r\n slug: string;\r\n /** */\r\n signature?: string;\r\n /** */\r\n expiration?: number;\r\n /** */\r\n channel?: string;\r\n /** */\r\n dataToSign?: string;\r\n /** */\r\n accountId?: number;\r\n } = {} as any,\r\n options: IRequestOptions = {}\r\n ): Promise> {\r\n return new Promise((resolve, reject) => {\r\n let url = basePath + '/api/embedded/{slug}/config';\r\n url = url.replace('{slug}', params['slug'] + '');\r\n\r\n const configs: IRequestConfig = getConfigs('get', 'application/json', url, options);\r\n configs.params = {\r\n signature: params['signature'],\r\n expiration: params['expiration'],\r\n channel: params['channel'],\r\n dataToSign: params['dataToSign'],\r\n accountId: params['accountId']\r\n };\r\n let data = null as any;\r\n\r\n configs.data = data;\r\n axios(configs, resolve, reject);\r\n });\r\n }\r\n /**\r\n *\r\n */\r\n static getPaymentSession(\r\n params: {\r\n /** */\r\n slug: string;\r\n /** */\r\n identifier: string;\r\n /** */\r\n signature?: string;\r\n /** */\r\n expiration?: number;\r\n /** */\r\n dataToSign?: string;\r\n } = {} as any,\r\n options: IRequestOptions = {}\r\n ): Promise> {\r\n return new Promise((resolve, reject) => {\r\n let url = basePath + '/api/embedded/{slug}/session/{identifier}';\r\n url = url.replace('{slug}', params['slug'] + '');\r\n url = url.replace('{identifier}', params['identifier'] + '');\r\n\r\n const configs: IRequestConfig = getConfigs('get', 'application/json', url, options);\r\n configs.params = {\r\n signature: params['signature'],\r\n expiration: params['expiration'],\r\n dataToSign: params['dataToSign']\r\n };\r\n let data = null as any;\r\n\r\n configs.data = data;\r\n axios(configs, resolve, reject);\r\n });\r\n }\r\n /**\r\n *\r\n */\r\n static updatePaymentSource(\r\n params: {\r\n /** */\r\n slug: string;\r\n /** */\r\n identifier: string;\r\n /** */\r\n signature?: string;\r\n /** */\r\n expiration?: number;\r\n /** */\r\n dataToSign?: string;\r\n /** */\r\n channel?: string;\r\n /** */\r\n body?: UpdatedEmbeddedPaymentSessionPaymentSourceRequest;\r\n } = {} as any,\r\n options: IRequestOptions = {}\r\n ): Promise> {\r\n return new Promise((resolve, reject) => {\r\n let url = basePath + '/api/embedded/{slug}/session/{identifier}/payment-source';\r\n url = url.replace('{slug}', params['slug'] + '');\r\n url = url.replace('{identifier}', params['identifier'] + '');\r\n\r\n const configs: IRequestConfig = getConfigs('put', 'application/json', url, options);\r\n configs.params = {\r\n signature: params['signature'],\r\n expiration: params['expiration'],\r\n dataToSign: params['dataToSign'],\r\n channel: params['channel']\r\n };\r\n let data = params['body'];\r\n\r\n configs.data = data;\r\n axios(configs, resolve, reject);\r\n });\r\n }\r\n /**\r\n *\r\n */\r\n static updatePaymentCharges(\r\n params: {\r\n /** */\r\n slug: string;\r\n /** */\r\n identifier: string;\r\n /** */\r\n signature?: string;\r\n /** */\r\n expiration?: number;\r\n /** */\r\n dataToSign?: string;\r\n /** */\r\n channel?: string;\r\n /** */\r\n body?: UpdatedEmbeddedPaymentSessionChargesRequest;\r\n } = {} as any,\r\n options: IRequestOptions = {}\r\n ): Promise> {\r\n return new Promise((resolve, reject) => {\r\n let url = basePath + '/api/embedded/{slug}/session/{identifier}/charges';\r\n url = url.replace('{slug}', params['slug'] + '');\r\n url = url.replace('{identifier}', params['identifier'] + '');\r\n\r\n const configs: IRequestConfig = getConfigs('put', 'application/json', url, options);\r\n configs.params = {\r\n signature: params['signature'],\r\n expiration: params['expiration'],\r\n dataToSign: params['dataToSign'],\r\n channel: params['channel']\r\n };\r\n let data = params['body'];\r\n\r\n configs.data = data;\r\n axios(configs, resolve, reject);\r\n });\r\n }\r\n /**\r\n *\r\n */\r\n static updatePaymentFields(\r\n params: {\r\n /** */\r\n slug: string;\r\n /** */\r\n identifier: string;\r\n /** */\r\n signature?: string;\r\n /** */\r\n expiration?: number;\r\n /** */\r\n dataToSign?: string;\r\n /** */\r\n channel?: string;\r\n /** */\r\n body?: UpdatePaymentIntentPaymentFieldsRequest;\r\n } = {} as any,\r\n options: IRequestOptions = {}\r\n ): Promise> {\r\n return new Promise((resolve, reject) => {\r\n let url = basePath + '/api/embedded/{slug}/session/{identifier}/payment-fields';\r\n url = url.replace('{slug}', params['slug'] + '');\r\n url = url.replace('{identifier}', params['identifier'] + '');\r\n\r\n const configs: IRequestConfig = getConfigs('put', 'application/json', url, options);\r\n configs.params = {\r\n signature: params['signature'],\r\n expiration: params['expiration'],\r\n dataToSign: params['dataToSign'],\r\n channel: params['channel']\r\n };\r\n let data = params['body'];\r\n\r\n configs.data = data;\r\n axios(configs, resolve, reject);\r\n });\r\n }\r\n /**\r\n *\r\n */\r\n static process(\r\n params: {\r\n /** */\r\n slug: string;\r\n /** */\r\n identifier: string;\r\n /** */\r\n signature?: string;\r\n /** */\r\n expiration?: number;\r\n /** */\r\n dataToSign?: string;\r\n /** */\r\n channel?: string;\r\n /** */\r\n body?: ProcessPaymentIntentRequest;\r\n } = {} as any,\r\n options: IRequestOptions = {}\r\n ): Promise> {\r\n return new Promise((resolve, reject) => {\r\n let url = basePath + '/api/embedded/{slug}/session/{identifier}/process';\r\n url = url.replace('{slug}', params['slug'] + '');\r\n url = url.replace('{identifier}', params['identifier'] + '');\r\n\r\n const configs: IRequestConfig = getConfigs('post', 'application/json', url, options);\r\n configs.params = {\r\n signature: params['signature'],\r\n expiration: params['expiration'],\r\n dataToSign: params['dataToSign'],\r\n channel: params['channel']\r\n };\r\n let data = params['body'];\r\n\r\n configs.data = data;\r\n axios(configs, resolve, reject);\r\n });\r\n }\r\n /**\r\n *\r\n */\r\n static getResult(\r\n params: {\r\n /** */\r\n slug: string;\r\n /** */\r\n identifier: string;\r\n /** */\r\n signature?: string;\r\n /** */\r\n expiration?: number;\r\n /** */\r\n dataToSign?: string;\r\n } = {} as any,\r\n options: IRequestOptions = {}\r\n ): Promise> {\r\n return new Promise((resolve, reject) => {\r\n let url = basePath + '/api/embedded/{slug}/session/{identifier}/result';\r\n url = url.replace('{slug}', params['slug'] + '');\r\n url = url.replace('{identifier}', params['identifier'] + '');\r\n\r\n const configs: IRequestConfig = getConfigs('get', 'application/json', url, options);\r\n configs.params = {\r\n signature: params['signature'],\r\n expiration: params['expiration'],\r\n dataToSign: params['dataToSign']\r\n };\r\n let data = null as any;\r\n\r\n configs.data = data;\r\n axios(configs, resolve, reject);\r\n });\r\n }\r\n /**\r\n *\r\n */\r\n static sendReceipt(\r\n params: {\r\n /** */\r\n slug: string;\r\n /** */\r\n identifier: string;\r\n /** */\r\n signature?: string;\r\n /** */\r\n expiration?: number;\r\n /** */\r\n dataToSign?: string;\r\n /** */\r\n body?: SendPaymentReceiptRequest;\r\n } = {} as any,\r\n options: IRequestOptions = {}\r\n ): Promise {\r\n return new Promise((resolve, reject) => {\r\n let url = basePath + '/api/embedded/{slug}/session/{identifier}/email';\r\n url = url.replace('{slug}', params['slug'] + '');\r\n url = url.replace('{identifier}', params['identifier'] + '');\r\n\r\n const configs: IRequestConfig = getConfigs('post', 'application/json', url, options);\r\n configs.params = {\r\n signature: params['signature'],\r\n expiration: params['expiration'],\r\n dataToSign: params['dataToSign']\r\n };\r\n let data = params['body'];\r\n\r\n configs.data = data;\r\n axios(configs, resolve, reject);\r\n });\r\n }\r\n /**\r\n *\r\n */\r\n static getAccountById(\r\n params: {\r\n /** */\r\n accountId: number;\r\n /** */\r\n slug: string;\r\n /** */\r\n signature?: string;\r\n /** */\r\n expiration?: number;\r\n /** */\r\n dataToSign?: string;\r\n } = {} as any,\r\n options: IRequestOptions = {}\r\n ): Promise> {\r\n return new Promise((resolve, reject) => {\r\n let url = basePath + '/api/embedded/{slug}/account/{accountId}';\r\n url = url.replace('{accountId}', params['accountId'] + '');\r\n url = url.replace('{slug}', params['slug'] + '');\r\n\r\n const configs: IRequestConfig = getConfigs('get', 'application/json', url, options);\r\n configs.params = {\r\n signature: params['signature'],\r\n expiration: params['expiration'],\r\n dataToSign: params['dataToSign']\r\n };\r\n let data = null as any;\r\n\r\n configs.data = data;\r\n axios(configs, resolve, reject);\r\n });\r\n }\r\n /**\r\n *\r\n */\r\n static getAccountAutopayState(\r\n params: {\r\n /** */\r\n accountId: number;\r\n /** */\r\n slug: string;\r\n /** */\r\n signature?: string;\r\n /** */\r\n expiration?: number;\r\n /** */\r\n dataToSign?: string;\r\n } = {} as any,\r\n options: IRequestOptions = {}\r\n ): Promise> {\r\n return new Promise((resolve, reject) => {\r\n let url = basePath + '/api/embedded/{slug}/account/{accountId}/autopay-status';\r\n url = url.replace('{accountId}', params['accountId'] + '');\r\n url = url.replace('{slug}', params['slug'] + '');\r\n\r\n const configs: IRequestConfig = getConfigs('get', 'application/json', url, options);\r\n configs.params = {\r\n signature: params['signature'],\r\n expiration: params['expiration'],\r\n dataToSign: params['dataToSign']\r\n };\r\n let data = null as any;\r\n\r\n configs.data = data;\r\n axios(configs, resolve, reject);\r\n });\r\n }\r\n /**\r\n *\r\n */\r\n static updateAutopaySettings(\r\n params: {\r\n /** */\r\n slug: string;\r\n /** */\r\n signature?: string;\r\n /** */\r\n expiration?: number;\r\n /** */\r\n dataToSign?: string;\r\n /** */\r\n accountId: string;\r\n /** */\r\n body?: EmbeddedAutopayUpdateEnrollmentRequest;\r\n } = {} as any,\r\n options: IRequestOptions = {}\r\n ): Promise> {\r\n return new Promise((resolve, reject) => {\r\n let url = basePath + '/api/embedded/{slug}/account/{accountId}/autopay';\r\n url = url.replace('{slug}', params['slug'] + '');\r\n url = url.replace('{accountId}', params['accountId'] + '');\r\n\r\n const configs: IRequestConfig = getConfigs('post', 'application/json', url, options);\r\n configs.params = {\r\n signature: params['signature'],\r\n expiration: params['expiration'],\r\n dataToSign: params['dataToSign']\r\n };\r\n let data = params['body'];\r\n\r\n configs.data = data;\r\n axios(configs, resolve, reject);\r\n });\r\n }\r\n /**\r\n *\r\n */\r\n static cancelAutopay(\r\n params: {\r\n /** */\r\n slug: string;\r\n /** */\r\n signature?: string;\r\n /** */\r\n expiration?: number;\r\n /** */\r\n dataToSign?: string;\r\n /** */\r\n accountId: string;\r\n } = {} as any,\r\n options: IRequestOptions = {}\r\n ): Promise {\r\n return new Promise((resolve, reject) => {\r\n let url = basePath + '/api/embedded/{slug}/account/{accountId}/autopay-cancel';\r\n url = url.replace('{slug}', params['slug'] + '');\r\n url = url.replace('{accountId}', params['accountId'] + '');\r\n\r\n const configs: IRequestConfig = getConfigs('post', 'application/json', url, options);\r\n configs.params = {\r\n signature: params['signature'],\r\n expiration: params['expiration'],\r\n dataToSign: params['dataToSign']\r\n };\r\n let data = null as any;\r\n\r\n configs.data = data;\r\n axios(configs, resolve, reject);\r\n });\r\n }\r\n /**\r\n *\r\n */\r\n static updatePaperlessSettings(\r\n params: {\r\n /** */\r\n slug: string;\r\n /** */\r\n signature?: string;\r\n /** */\r\n expiration?: number;\r\n /** */\r\n dataToSign?: string;\r\n /** */\r\n accountId: string;\r\n /** */\r\n body?: PaperlessBillingEnrollmentRequest;\r\n } = {} as any,\r\n options: IRequestOptions = {}\r\n ): Promise {\r\n return new Promise((resolve, reject) => {\r\n let url = basePath + '/api/embedded/{slug}/account/{accountId}/paperless';\r\n url = url.replace('{slug}', params['slug'] + '');\r\n url = url.replace('{accountId}', params['accountId'] + '');\r\n\r\n const configs: IRequestConfig = getConfigs('post', 'application/json', url, options);\r\n configs.params = {\r\n signature: params['signature'],\r\n expiration: params['expiration'],\r\n dataToSign: params['dataToSign']\r\n };\r\n let data = params['body'];\r\n\r\n configs.data = data;\r\n axios(configs, resolve, reject);\r\n });\r\n }\r\n /**\r\n *\r\n */\r\n static cancelPaperlessSettings(\r\n params: {\r\n /** */\r\n slug: string;\r\n /** */\r\n signature?: string;\r\n /** */\r\n expiration?: number;\r\n /** */\r\n dataToSign?: string;\r\n /** */\r\n accountId: string;\r\n } = {} as any,\r\n options: IRequestOptions = {}\r\n ): Promise {\r\n return new Promise((resolve, reject) => {\r\n let url = basePath + '/api/embedded/{slug}/account/{accountId}/cancel-paperless';\r\n url = url.replace('{slug}', params['slug'] + '');\r\n url = url.replace('{accountId}', params['accountId'] + '');\r\n\r\n const configs: IRequestConfig = getConfigs('post', 'application/json', url, options);\r\n configs.params = {\r\n signature: params['signature'],\r\n expiration: params['expiration'],\r\n dataToSign: params['dataToSign']\r\n };\r\n let data = null as any;\r\n\r\n configs.data = data;\r\n axios(configs, resolve, reject);\r\n });\r\n }\r\n /**\r\n *\r\n */\r\n static getPaymentSources(\r\n params: {\r\n /** */\r\n slug: string;\r\n /** */\r\n signature?: string;\r\n /** */\r\n expiration?: number;\r\n /** */\r\n dataToSign?: string;\r\n } = {} as any,\r\n options: IRequestOptions = {}\r\n ): Promise>> {\r\n return new Promise((resolve, reject) => {\r\n let url = basePath + '/api/embedded/{slug}/payment-sources';\r\n url = url.replace('{slug}', params['slug'] + '');\r\n\r\n const configs: IRequestConfig = getConfigs('get', 'application/json', url, options);\r\n configs.params = {\r\n signature: params['signature'],\r\n expiration: params['expiration'],\r\n dataToSign: params['dataToSign']\r\n };\r\n let data = null as any;\r\n\r\n configs.data = data;\r\n axios(configs, resolve, reject);\r\n });\r\n }\r\n /**\r\n *\r\n */\r\n static createPaymentSource(\r\n params: {\r\n /** */\r\n slug: string;\r\n /** */\r\n signature?: string;\r\n /** */\r\n expiration?: number;\r\n /** */\r\n dataToSign?: string;\r\n /** */\r\n body?: CreateEmbeddedPaymentSourceRequest;\r\n } = {} as any,\r\n options: IRequestOptions = {}\r\n ): Promise> {\r\n return new Promise((resolve, reject) => {\r\n let url = basePath + '/api/embedded/{slug}/payment-source';\r\n url = url.replace('{slug}', params['slug'] + '');\r\n\r\n const configs: IRequestConfig = getConfigs('post', 'application/json', url, options);\r\n configs.params = {\r\n signature: params['signature'],\r\n expiration: params['expiration'],\r\n dataToSign: params['dataToSign']\r\n };\r\n let data = params['body'];\r\n\r\n configs.data = data;\r\n axios(configs, resolve, reject);\r\n });\r\n }\r\n /**\r\n *\r\n */\r\n static deletePaymentSource(\r\n params: {\r\n /** */\r\n slug: string;\r\n /** */\r\n id: number;\r\n /** */\r\n signature?: string;\r\n /** */\r\n expiration?: number;\r\n /** */\r\n dataToSign?: string;\r\n } = {} as any,\r\n options: IRequestOptions = {}\r\n ): Promise {\r\n return new Promise((resolve, reject) => {\r\n let url = basePath + '/api/embedded/{slug}/payment-source/{id}';\r\n url = url.replace('{slug}', params['slug'] + '');\r\n url = url.replace('{id}', params['id'] + '');\r\n\r\n const configs: IRequestConfig = getConfigs('delete', 'application/json', url, options);\r\n configs.params = {\r\n signature: params['signature'],\r\n expiration: params['expiration'],\r\n dataToSign: params['dataToSign']\r\n };\r\n let data = null as any;\r\n\r\n configs.data = data;\r\n axios(configs, resolve, reject);\r\n });\r\n }\r\n /**\r\n *\r\n */\r\n static cancelScheduledPayment(\r\n params: {\r\n /** */\r\n slug: string;\r\n /** */\r\n id: number;\r\n /** */\r\n signature?: string;\r\n /** */\r\n expiration?: number;\r\n /** */\r\n dataToSign?: string;\r\n } = {} as any,\r\n options: IRequestOptions = {}\r\n ): Promise {\r\n return new Promise((resolve, reject) => {\r\n let url = basePath + '/api/embedded/{slug}/payments/{id}/cancel';\r\n url = url.replace('{slug}', params['slug'] + '');\r\n url = url.replace('{id}', params['id'] + '');\r\n\r\n const configs: IRequestConfig = getConfigs('post', 'application/json', url, options);\r\n configs.params = {\r\n signature: params['signature'],\r\n expiration: params['expiration'],\r\n dataToSign: params['dataToSign']\r\n };\r\n let data = null as any;\r\n\r\n configs.data = data;\r\n axios(configs, resolve, reject);\r\n });\r\n }\r\n /**\r\n *\r\n */\r\n static calculateServiceFees(\r\n params: {\r\n /** */\r\n businessUnitId?: number;\r\n /** */\r\n baseAmount?: number;\r\n /** */\r\n channel?: string;\r\n /** */\r\n scope?: string;\r\n /** */\r\n paymentSourceTypes?: string[];\r\n /** */\r\n slug: string;\r\n } = {} as any,\r\n options: IRequestOptions = {}\r\n ): Promise>> {\r\n return new Promise((resolve, reject) => {\r\n let url = basePath + '/api/embedded/{slug}/calculate-service-fees';\r\n url = url.replace('{slug}', params['slug'] + '');\r\n\r\n const configs: IRequestConfig = getConfigs('post', 'application/json', url, options);\r\n configs.params = {\r\n BusinessUnitId: params['businessUnitId'],\r\n BaseAmount: params['baseAmount'],\r\n Channel: params['channel'],\r\n Scope: params['scope'],\r\n PaymentSourceTypes: params['paymentSourceTypes']\r\n };\r\n let data = null as any;\r\n\r\n configs.data = data;\r\n axios(configs, resolve, reject);\r\n });\r\n }\r\n}\r\n","/* eslint-disable */\r\n\r\nimport {\r\n PaymentSourceSummaryDto,\r\n OptionalAddress,\r\n GetAccountPaymentSourcesResponse,\r\n CreateAccountPaymentSourceRequest,\r\n GetPayerProvidedPaymentSourcesResponse,\r\n CreateCustomerPaymentSourceRequest,\r\n CreatePlaidPaymentSourceRequest,\r\n EmptyResponse,\r\n Error,\r\n GetPlaidLinkTokenRequest,\r\n PlaidLinkTokenDto,\r\n IList,\r\n List,\r\n Response,\r\n AdvancedQueryPage,\r\n IRequestOptions,\r\n IRequestConfig,\r\n getConfigs,\r\n axios,\r\n basePath\r\n} from './index.defs';\r\n\r\nexport class PaymentSourcesService {\r\n /** Generate by swagger-axios-codegen */\r\n // @ts-nocheck\r\n /* eslint-disable */\r\n\r\n /**\r\n *\r\n */\r\n static getAllForCurrentUser(options: IRequestOptions = {}): Promise>> {\r\n return new Promise((resolve, reject) => {\r\n let url = basePath + '/api/payment-sources/mine';\r\n\r\n const configs: IRequestConfig = getConfigs('get', 'application/json', url, options);\r\n\r\n let data = null as any;\r\n\r\n configs.data = data;\r\n axios(configs, resolve, reject);\r\n });\r\n }\r\n /**\r\n *\r\n */\r\n static getAllForCurrentUserByBusinessUnitId(\r\n params: {\r\n /** */\r\n businessUnitId: number;\r\n } = {} as any,\r\n options: IRequestOptions = {}\r\n ): Promise>> {\r\n return new Promise((resolve, reject) => {\r\n let url = basePath + '/api/payment-sources/mine/{businessUnitId}';\r\n url = url.replace('{businessUnitId}', params['businessUnitId'] + '');\r\n\r\n const configs: IRequestConfig = getConfigs('get', 'application/json', url, options);\r\n\r\n let data = null as any;\r\n\r\n configs.data = data;\r\n axios(configs, resolve, reject);\r\n });\r\n }\r\n /**\r\n *\r\n */\r\n static getAllForAccount(\r\n params: {\r\n /** */\r\n accountId: number;\r\n /** */\r\n includeCustomerAutopayPaymentSources?: boolean;\r\n } = {} as any,\r\n options: IRequestOptions = {}\r\n ): Promise> {\r\n return new Promise((resolve, reject) => {\r\n let url = basePath + '/api/payment-sources/account/{accountId}';\r\n url = url.replace('{accountId}', params['accountId'] + '');\r\n\r\n const configs: IRequestConfig = getConfigs('get', 'application/json', url, options);\r\n configs.params = { IncludeCustomerAutopayPaymentSources: params['includeCustomerAutopayPaymentSources'] };\r\n let data = null as any;\r\n\r\n configs.data = data;\r\n axios(configs, resolve, reject);\r\n });\r\n }\r\n /**\r\n *\r\n */\r\n static createAccountSource(\r\n params: {\r\n /** */\r\n accountId: number;\r\n /** */\r\n body?: CreateAccountPaymentSourceRequest;\r\n } = {} as any,\r\n options: IRequestOptions = {}\r\n ): Promise> {\r\n return new Promise((resolve, reject) => {\r\n let url = basePath + '/api/payment-sources/account/{accountId}';\r\n url = url.replace('{accountId}', params['accountId'] + '');\r\n\r\n const configs: IRequestConfig = getConfigs('post', 'application/json', url, options);\r\n\r\n let data = params['body'];\r\n\r\n configs.data = data;\r\n axios(configs, resolve, reject);\r\n });\r\n }\r\n /**\r\n *\r\n */\r\n static getPayerProvidedForAccount(\r\n params: {\r\n /** */\r\n accountId: number;\r\n /** */\r\n includeCustomerAutopayPaymentSources?: boolean;\r\n } = {} as any,\r\n options: IRequestOptions = {}\r\n ): Promise> {\r\n return new Promise((resolve, reject) => {\r\n let url = basePath + '/api/payment-sources/account/{accountId}/payer-provided';\r\n url = url.replace('{accountId}', params['accountId'] + '');\r\n\r\n const configs: IRequestConfig = getConfigs('get', 'application/json', url, options);\r\n configs.params = { IncludeCustomerAutopayPaymentSources: params['includeCustomerAutopayPaymentSources'] };\r\n let data = null as any;\r\n\r\n configs.data = data;\r\n axios(configs, resolve, reject);\r\n });\r\n }\r\n /**\r\n *\r\n */\r\n static create(\r\n params: {\r\n /** */\r\n body?: CreateCustomerPaymentSourceRequest;\r\n } = {} as any,\r\n options: IRequestOptions = {}\r\n ): Promise> {\r\n return new Promise((resolve, reject) => {\r\n let url = basePath + '/api/payment-sources';\r\n\r\n const configs: IRequestConfig = getConfigs('post', 'application/json', url, options);\r\n\r\n let data = params['body'];\r\n\r\n configs.data = data;\r\n axios(configs, resolve, reject);\r\n });\r\n }\r\n /**\r\n *\r\n */\r\n static createPlaidSource(\r\n params: {\r\n /** */\r\n body?: CreatePlaidPaymentSourceRequest;\r\n } = {} as any,\r\n options: IRequestOptions = {}\r\n ): Promise> {\r\n return new Promise((resolve, reject) => {\r\n let url = basePath + '/api/payment-sources/plaid';\r\n\r\n const configs: IRequestConfig = getConfigs('post', 'application/json', url, options);\r\n\r\n let data = params['body'];\r\n\r\n configs.data = data;\r\n axios(configs, resolve, reject);\r\n });\r\n }\r\n /**\r\n *\r\n */\r\n static deleteById(\r\n params: {\r\n /** */\r\n id: number;\r\n } = {} as any,\r\n options: IRequestOptions = {}\r\n ): Promise {\r\n return new Promise((resolve, reject) => {\r\n let url = basePath + '/api/payment-sources/{id}';\r\n url = url.replace('{id}', params['id'] + '');\r\n\r\n const configs: IRequestConfig = getConfigs('delete', 'application/json', url, options);\r\n\r\n let data = null as any;\r\n\r\n configs.data = data;\r\n axios(configs, resolve, reject);\r\n });\r\n }\r\n /**\r\n *\r\n */\r\n static getPlaidLinkToken(\r\n params: {\r\n /** */\r\n businessUnitId: number;\r\n /** */\r\n body?: GetPlaidLinkTokenRequest;\r\n } = {} as any,\r\n options: IRequestOptions = {}\r\n ): Promise> {\r\n return new Promise((resolve, reject) => {\r\n let url = basePath + '/api/payment-sources/{businessUnitId}/plaid-link';\r\n url = url.replace('{businessUnitId}', params['businessUnitId'] + '');\r\n\r\n const configs: IRequestConfig = getConfigs('post', 'application/json', url, options);\r\n\r\n let data = params['body'];\r\n\r\n configs.data = data;\r\n axios(configs, resolve, reject);\r\n });\r\n }\r\n}\r\n","/* eslint-disable */\r\n\r\nimport {\r\n AdvancedQueryColumnFilter,\r\n AdvancedQueryColumnSort,\r\n ViewTermsOfService,\r\n TermsOfServiceDetailDto,\r\n EmptyResponse,\r\n Error,\r\n CreateNewTermsOfServiceRequest,\r\n CreateTermsOfServiceRequest,\r\n UpdateTermsOfServiceRequest,\r\n TermsOfServiceGetDto,\r\n IList,\r\n List,\r\n Response,\r\n AdvancedQueryPage,\r\n IRequestOptions,\r\n IRequestConfig,\r\n getConfigs,\r\n axios,\r\n basePath\r\n} from './index.defs';\r\n\r\nexport class TermsOfServiceService {\r\n /** Generate by swagger-axios-codegen */\r\n // @ts-nocheck\r\n /* eslint-disable */\r\n\r\n /**\r\n *\r\n */\r\n static getAllStandardView(\r\n params: {\r\n /** */\r\n page?: number;\r\n /** */\r\n pageSize?: number;\r\n /** */\r\n searchFieldNames?: string[];\r\n /** */\r\n searchSearchText?: string;\r\n /** */\r\n searchExactMatch?: boolean;\r\n /** */\r\n filtered?: AdvancedQueryColumnFilter[];\r\n /** */\r\n sorted?: AdvancedQueryColumnSort[];\r\n } = {} as any,\r\n options: IRequestOptions = {}\r\n ): Promise>> {\r\n return new Promise((resolve, reject) => {\r\n let url = basePath + '/api/terms-of-service';\r\n\r\n const configs: IRequestConfig = getConfigs('get', 'application/json', url, options);\r\n configs.params = {\r\n Page: params['page'],\r\n PageSize: params['pageSize'],\r\n 'Search.FieldNames': params['searchFieldNames'],\r\n 'Search.SearchText': params['searchSearchText'],\r\n 'Search.ExactMatch': params['searchExactMatch'],\r\n Filtered: params['filtered'],\r\n Sorted: params['sorted']\r\n };\r\n let data = null as any;\r\n\r\n configs.data = data;\r\n axios(configs, resolve, reject);\r\n });\r\n }\r\n /**\r\n *\r\n */\r\n static getAllViewByBusinessUnit(\r\n params: {\r\n /** */\r\n page?: number;\r\n /** */\r\n pageSize?: number;\r\n /** */\r\n searchFieldNames?: string[];\r\n /** */\r\n searchSearchText?: string;\r\n /** */\r\n searchExactMatch?: boolean;\r\n /** */\r\n filtered?: AdvancedQueryColumnFilter[];\r\n /** */\r\n sorted?: AdvancedQueryColumnSort[];\r\n /** */\r\n businessUnitId?: number;\r\n } = {} as any,\r\n options: IRequestOptions = {}\r\n ): Promise>> {\r\n return new Promise((resolve, reject) => {\r\n let url = basePath + '/api/terms-of-service/business-unit';\r\n\r\n const configs: IRequestConfig = getConfigs('get', 'application/json', url, options);\r\n configs.params = {\r\n Page: params['page'],\r\n PageSize: params['pageSize'],\r\n 'Search.FieldNames': params['searchFieldNames'],\r\n 'Search.SearchText': params['searchSearchText'],\r\n 'Search.ExactMatch': params['searchExactMatch'],\r\n Filtered: params['filtered'],\r\n Sorted: params['sorted'],\r\n businessUnitId: params['businessUnitId']\r\n };\r\n let data = null as any;\r\n\r\n configs.data = data;\r\n axios(configs, resolve, reject);\r\n });\r\n }\r\n /**\r\n *\r\n */\r\n static getByIdentifier(\r\n params: {\r\n /** */\r\n identifier: string;\r\n /** */\r\n page?: number;\r\n /** */\r\n pageSize?: number;\r\n /** */\r\n searchFieldNames?: string[];\r\n /** */\r\n searchSearchText?: string;\r\n /** */\r\n searchExactMatch?: boolean;\r\n /** */\r\n filtered?: AdvancedQueryColumnFilter[];\r\n /** */\r\n sorted?: AdvancedQueryColumnSort[];\r\n } = {} as any,\r\n options: IRequestOptions = {}\r\n ): Promise>> {\r\n return new Promise((resolve, reject) => {\r\n let url = basePath + '/api/terms-of-service/view/{identifier}';\r\n url = url.replace('{identifier}', params['identifier'] + '');\r\n\r\n const configs: IRequestConfig = getConfigs('get', 'application/json', url, options);\r\n configs.params = {\r\n Page: params['page'],\r\n PageSize: params['pageSize'],\r\n 'Search.FieldNames': params['searchFieldNames'],\r\n 'Search.SearchText': params['searchSearchText'],\r\n 'Search.ExactMatch': params['searchExactMatch'],\r\n Filtered: params['filtered'],\r\n Sorted: params['sorted']\r\n };\r\n let data = null as any;\r\n\r\n configs.data = data;\r\n axios(configs, resolve, reject);\r\n });\r\n }\r\n /**\r\n *\r\n */\r\n static getByIdentifierAndBusinessUnit(\r\n params: {\r\n /** */\r\n identifier: string;\r\n /** */\r\n businessUnitId?: number;\r\n /** */\r\n page?: number;\r\n /** */\r\n pageSize?: number;\r\n /** */\r\n searchFieldNames?: string[];\r\n /** */\r\n searchSearchText?: string;\r\n /** */\r\n searchExactMatch?: boolean;\r\n /** */\r\n filtered?: AdvancedQueryColumnFilter[];\r\n /** */\r\n sorted?: AdvancedQueryColumnSort[];\r\n } = {} as any,\r\n options: IRequestOptions = {}\r\n ): Promise>> {\r\n return new Promise((resolve, reject) => {\r\n let url = basePath + '/api/business-units/terms-of-service/view/{identifier}';\r\n url = url.replace('{identifier}', params['identifier'] + '');\r\n\r\n const configs: IRequestConfig = getConfigs('get', 'application/json', url, options);\r\n configs.params = {\r\n businessUnitId: params['businessUnitId'],\r\n Page: params['page'],\r\n PageSize: params['pageSize'],\r\n 'Search.FieldNames': params['searchFieldNames'],\r\n 'Search.SearchText': params['searchSearchText'],\r\n 'Search.ExactMatch': params['searchExactMatch'],\r\n Filtered: params['filtered'],\r\n Sorted: params['sorted']\r\n };\r\n let data = null as any;\r\n\r\n configs.data = data;\r\n axios(configs, resolve, reject);\r\n });\r\n }\r\n /**\r\n *\r\n */\r\n static getNewestPublishedTermsByIdentifier(\r\n params: {\r\n /** */\r\n identifier: string;\r\n /** */\r\n businessUnitId?: number;\r\n } = {} as any,\r\n options: IRequestOptions = {}\r\n ): Promise> {\r\n return new Promise((resolve, reject) => {\r\n let url = basePath + '/api/terms-of-service/{identifier}/published';\r\n url = url.replace('{identifier}', params['identifier'] + '');\r\n\r\n const configs: IRequestConfig = getConfigs('get', 'application/json', url, options);\r\n configs.params = { businessUnitId: params['businessUnitId'] };\r\n let data = null as any;\r\n\r\n configs.data = data;\r\n axios(configs, resolve, reject);\r\n });\r\n }\r\n /**\r\n *\r\n */\r\n static getById(\r\n params: {\r\n /** */\r\n id: number;\r\n } = {} as any,\r\n options: IRequestOptions = {}\r\n ): Promise> {\r\n return new Promise((resolve, reject) => {\r\n let url = basePath + '/api/terms-of-service/{id}';\r\n url = url.replace('{id}', params['id'] + '');\r\n\r\n const configs: IRequestConfig = getConfigs('get', 'application/json', url, options);\r\n\r\n let data = null as any;\r\n\r\n configs.data = data;\r\n axios(configs, resolve, reject);\r\n });\r\n }\r\n /**\r\n *\r\n */\r\n static delete(\r\n params: {\r\n /** */\r\n id: number;\r\n } = {} as any,\r\n options: IRequestOptions = {}\r\n ): Promise {\r\n return new Promise((resolve, reject) => {\r\n let url = basePath + '/api/terms-of-service/{id}';\r\n url = url.replace('{id}', params['id'] + '');\r\n\r\n const configs: IRequestConfig = getConfigs('delete', 'application/json', url, options);\r\n\r\n let data = null as any;\r\n\r\n configs.data = data;\r\n axios(configs, resolve, reject);\r\n });\r\n }\r\n /**\r\n *\r\n */\r\n static createNew(\r\n params: {\r\n /** */\r\n body?: CreateNewTermsOfServiceRequest;\r\n } = {} as any,\r\n options: IRequestOptions = {}\r\n ): Promise> {\r\n return new Promise((resolve, reject) => {\r\n let url = basePath + '/api/terms-of-service/create/new';\r\n\r\n const configs: IRequestConfig = getConfigs('post', 'application/json', url, options);\r\n\r\n let data = params['body'];\r\n\r\n configs.data = data;\r\n axios(configs, resolve, reject);\r\n });\r\n }\r\n /**\r\n *\r\n */\r\n static createFromExisting(\r\n params: {\r\n /** */\r\n body?: CreateTermsOfServiceRequest;\r\n } = {} as any,\r\n options: IRequestOptions = {}\r\n ): Promise> {\r\n return new Promise((resolve, reject) => {\r\n let url = basePath + '/api/terms-of-service/create/from-existing';\r\n\r\n const configs: IRequestConfig = getConfigs('post', 'application/json', url, options);\r\n\r\n let data = params['body'];\r\n\r\n configs.data = data;\r\n axios(configs, resolve, reject);\r\n });\r\n }\r\n /**\r\n *\r\n */\r\n static update(\r\n params: {\r\n /** */\r\n id: number;\r\n /** */\r\n body?: UpdateTermsOfServiceRequest;\r\n } = {} as any,\r\n options: IRequestOptions = {}\r\n ): Promise> {\r\n return new Promise((resolve, reject) => {\r\n let url = basePath + '/api/terms-of-service/update/{id}';\r\n url = url.replace('{id}', params['id'] + '');\r\n\r\n const configs: IRequestConfig = getConfigs('put', 'application/json', url, options);\r\n\r\n let data = params['body'];\r\n\r\n configs.data = data;\r\n axios(configs, resolve, reject);\r\n });\r\n }\r\n /**\r\n *\r\n */\r\n static publish(\r\n params: {\r\n /** */\r\n id: number;\r\n } = {} as any,\r\n options: IRequestOptions = {}\r\n ): Promise> {\r\n return new Promise((resolve, reject) => {\r\n let url = basePath + '/api/terms-of-service/publish/{id}';\r\n url = url.replace('{id}', params['id'] + '');\r\n\r\n const configs: IRequestConfig = getConfigs('put', 'application/json', url, options);\r\n\r\n let data = null as any;\r\n\r\n configs.data = data;\r\n axios(configs, resolve, reject);\r\n });\r\n }\r\n}\r\n","export const creditCardKeys = {\r\n accountNumberToken: 'accountNumberToken',\r\n accountNumberMasked: 'accountNumberMasked',\r\n cardExpiration: 'cardExpiration',\r\n cardExpirationMonth: 'cardExpirationMonth',\r\n cardExpirationYear: 'cardExpirationYear',\r\n cardCvv: 'cardCvv',\r\n};\r\n\r\nexport const achKeys = {\r\n accountType: 'accountType',\r\n achAccountHolderType: 'achAccountHolderType',\r\n achRoutingNumber: 'achRoutingNumber',\r\n achAccountNumber: 'achAccountNumber',\r\n achConfirmAccountNumber: 'achConfirmAccountNumber',\r\n};\r\n\r\nexport const addressKeys = {\r\n streetAddress: 'streetAddress',\r\n streetAddress2: 'streetAddress2',\r\n city: 'city',\r\n state: 'state',\r\n zipCode: 'zipCode',\r\n};\r\n\r\nexport const fieldKeys = {\r\n accountHolderName: 'accountHolderName',\r\n ...creditCardKeys,\r\n ...achKeys,\r\n ...addressKeys,\r\n};\r\n","import {faCopy} from '@fortawesome/pro-regular-svg-icons';\r\nimport {FontAwesomeIcon} from '@fortawesome/react-fontawesome';\r\nimport copy from 'copy-to-clipboard';\r\nimport {cx} from '@emotion/css';\r\nimport React from 'react';\r\nimport {Button, ButtonProps} from 'semantic-ui-react';\r\nimport {useNotification} from '../hooks/use-notifications';\r\nimport {analytics} from '../analytics';\r\n\r\ntype CopyButton = {\r\n value: string;\r\n description?: string;\r\n} & ButtonProps;\r\n\r\nexport const CopyButton: React.FC = (props) => {\r\n let {value, description, className, ...buttonProps} = props;\r\n const notifications = useNotification();\r\n\r\n if (!description) {\r\n description = `\"${value}\"`;\r\n }\r\n\r\n return (\r\n {\r\n copy(value);\r\n notifications.info(`${description} copied to clipboard`);\r\n analytics.trackEvent('feature.copy-button');\r\n }}\r\n className={cx('clear no-focus copy-button', className)}\r\n {...buttonProps}\r\n >\r\n \r\n \r\n );\r\n};\r\n","import moment from 'moment';\r\nimport {analytics} from '../analytics';\r\nimport {PaymentSourceTypes} from '../api/generated/enums';\r\nimport {\r\n AccountDetailDto,\r\n AccountSummaryDto,\r\n PaymentChannelSummaryDto,\r\n PaymentSourceConfig,\r\n PaymentSourceSummaryDto,\r\n} from '../api/generated/index.defs';\r\nimport {ApiResponse} from '../types';\r\n\r\nexport function getAvailablePaymentSourceTypesByChannel(\r\n channel: PaymentChannelSummaryDto,\r\n account: AccountDetailDto,\r\n savedPaymentSources?: PaymentSourceSummaryDto[],\r\n currentSource?: PaymentSourceSummaryDto\r\n) {\r\n const {creditCard, ach} = channel;\r\n const availablePaymentSourceTypes: PaymentSourceTypes[] = [];\r\n\r\n if (ach.enabled && ach.paymentMerchantAccountId && !account.blockAchPayment) {\r\n availablePaymentSourceTypes.push('ACH');\r\n }\r\n\r\n if (\r\n creditCard.enabled &&\r\n creditCard.paymentMerchantAccountId &&\r\n !account.blockCreditCardPayment\r\n ) {\r\n availablePaymentSourceTypes.push('Credit Card');\r\n }\r\n\r\n const availablePaymentSources = (savedPaymentSources || []).filter((x) =>\r\n availablePaymentSourceTypes.includes(x.paymentSourceType as PaymentSourceTypes)\r\n );\r\n\r\n if (currentSource && !availablePaymentSources.find((x) => x.id === currentSource.id)) {\r\n availablePaymentSources.push(currentSource);\r\n }\r\n\r\n return {\r\n availablePaymentSources,\r\n paymentSourceTypes: availablePaymentSourceTypes,\r\n };\r\n}\r\n\r\nexport function getAvailablePaymentSourceTypes(\r\n paymentSourceConfig: PaymentSourceConfig,\r\n account?: AccountSummaryDto | AccountSummaryDto[],\r\n currentSource?: PaymentSourceSummaryDto\r\n) {\r\n const {creditCard, ach, paymentSources} = paymentSourceConfig;\r\n const availablePaymentSourceTypes: PaymentSourceTypes[] = [];\r\n\r\n const accounts = Array.isArray(account) ? account : account ? [account] : []; // FIXME: Think about this\r\n\r\n if (ach.enabled && accounts.every((account) => account?.blockAchPayment !== true)) {\r\n availablePaymentSourceTypes.push('ACH');\r\n }\r\n\r\n if (creditCard.enabled && accounts.every((account) => account?.blockCreditCardPayment !== true)) {\r\n availablePaymentSourceTypes.push('Credit Card');\r\n }\r\n\r\n let availablePaymentSources = (paymentSources || []).filter((x) =>\r\n availablePaymentSourceTypes.includes(x.paymentSourceType as PaymentSourceTypes)\r\n );\r\n\r\n if (currentSource && !availablePaymentSources.find((x) => x.id === currentSource.id)) {\r\n availablePaymentSources.push(currentSource as PaymentSourceSummaryDto);\r\n }\r\n\r\n return {\r\n availablePaymentSources,\r\n paymentSourceTypes: availablePaymentSourceTypes,\r\n };\r\n}\r\n\r\nexport const parseExpirationData = (cardExpiration: string) => {\r\n const invalidExpiration: ApiResponse = {\r\n hasErrors: true,\r\n data: undefined,\r\n errors: [\r\n {\r\n propertyName: 'CardExpiration',\r\n errorMessage: 'Invalid Card Expiration',\r\n },\r\n ],\r\n };\r\n\r\n const formattedExpiration = cardExpiration.replace(/\\s+/g, '');\r\n if (!(formattedExpiration?.length === 5 || formattedExpiration?.length === 7)) {\r\n return {\r\n error: invalidExpiration,\r\n };\r\n }\r\n\r\n try {\r\n const yearPattern = formattedExpiration.length === 5 ? 'MM/YY' : 'MM/YYYY';\r\n const expiration = moment(formattedExpiration, yearPattern).endOf('month');\r\n if (!expiration.isValid()) {\r\n throw new Error('Invalid date');\r\n }\r\n\r\n return {\r\n expiration: {\r\n cardExpirationMonth: expiration.format('MM'),\r\n cardExpirationYear: expiration.format('YY'),\r\n },\r\n };\r\n } catch (error) {\r\n analytics.trackEvent('card-connect.invalid-expiration-entered', {\r\n subject: formattedExpiration,\r\n });\r\n\r\n return {\r\n error: {\r\n hasErrors: true,\r\n data: undefined,\r\n errors: [\r\n {\r\n propertyName: 'CardExpiration',\r\n errorMessage: 'Invalid Card Expiration',\r\n },\r\n ],\r\n } as ApiResponse,\r\n };\r\n }\r\n};\r\n\r\nexport const isPaymentSourceExpired = (paymentSource: PaymentSourceSummaryDto): boolean => {\r\n const expirationDate = moment(\r\n paymentSource.cardExpirationMonth + '/' + paymentSource.cardExpirationYear,\r\n 'MM/YY'\r\n ).endOf('M');\r\n\r\n return moment().isAfter(expirationDate);\r\n};\r\n","import {addressKeys} from '.';\r\nimport React from 'react';\r\nimport {Header} from 'semantic-ui-react';\r\nimport {Form} from '../forms';\r\nimport {BillingAddressCollectionTypes, PaymentSourceTypes} from '../api/generated/enums';\r\n\r\ntype BillingAddressFormFields = {\r\n billingAddressCollectionType: BillingAddressCollectionTypes;\r\n paymentSourceType: PaymentSourceTypes;\r\n optionalZip?: boolean;\r\n};\r\n\r\nexport const BillingAddressFormFields: React.FC = (props) => {\r\n const {billingAddressCollectionType, optionalZip = false} = props;\r\n if (billingAddressCollectionType === 'None') {\r\n return null;\r\n }\r\n\r\n const isRequired =\r\n props.paymentSourceType === 'Credit Card' && billingAddressCollectionType === 'Full Address';\r\n\r\n return (\r\n <>\r\n {billingAddressCollectionType === 'Full Address' && (\r\n <>\r\n
Billing Address
\r\n \r\n \r\n \r\n \r\n \r\n )}\r\n \r\n \r\n );\r\n};\r\n","import React, {useMemo} from 'react';\r\nimport {AccountFieldGetDto, AccountSummaryDto} from '../api/generated/index.defs';\r\nimport {AccountFieldTypes} from '../api/generated/enums';\r\nimport {useBusinessUnitContext} from '../paystar-portal/selectors';\r\nimport {LiteralKeyedObject} from '../types';\r\nimport {titleCase} from '../utils';\r\n\r\ntype AccountFieldLabel = {\r\n accountFields: AccountFieldGetDto[];\r\n type: AccountFieldTypes;\r\n};\r\n\r\ntype AccountFieldTypeMap = LiteralKeyedObject;\r\n\r\nconst AccountFieldMap = new Map();\r\n\r\nconst getAccountFieldMap = (accountFields: AccountFieldGetDto[]) => {\r\n if (AccountFieldMap.has(accountFields)) {\r\n const map = AccountFieldMap.get(accountFields);\r\n if (map) {\r\n return map;\r\n }\r\n }\r\n const calculatedMap = accountFields.reduce((map, field) => {\r\n map[field.type] = field;\r\n return map;\r\n }, {}) as AccountFieldTypeMap;\r\n\r\n AccountFieldMap.set(accountFields, calculatedMap);\r\n\r\n return calculatedMap;\r\n};\r\n\r\nexport const useAccountFieldConfig = (\r\n accountFields: AccountFieldGetDto[],\r\n type: AccountFieldTypes\r\n) => {\r\n const accountFieldMap = useMemo(() => {\r\n return getAccountFieldMap(accountFields);\r\n }, [accountFields]);\r\n\r\n return (\r\n accountFieldMap[type] || {\r\n label: titleCase(type),\r\n isDisplayField: false,\r\n isIvrLookupField: false,\r\n isQuickPayLookupField: false,\r\n }\r\n );\r\n};\r\n\r\nexport const useAccountFieldConfigMap = (accountFields: AccountFieldGetDto[]) => {\r\n const accountFieldMap = useMemo(() => {\r\n return getAccountFieldMap(accountFields);\r\n }, [accountFields]);\r\n\r\n return (type: AccountFieldTypes) =>\r\n accountFieldMap[type] || {\r\n label: titleCase(type),\r\n isDisplayField: false,\r\n isIvrLookupField: false,\r\n isQuickPayLookupField: false,\r\n };\r\n};\r\n\r\nexport const useAccountField = (accountFields: AccountFieldGetDto[], type: AccountFieldTypes) =>\r\n useAccountFieldConfig(accountFields, type).label;\r\n\r\nexport const AccountFieldLabel: React.FC = (props) => {\r\n const label = useAccountField(props.accountFields, props.type);\r\n return <>{label};\r\n};\r\n\r\ntype AccountFieldLabelWithContext = {\r\n type: AccountFieldTypes;\r\n force?: boolean;\r\n};\r\n\r\nexport const AccountFieldLabelWithContext: React.FC = (props) => {\r\n const {businessUnit} = useBusinessUnitContext();\r\n const config = useAccountFieldConfig(businessUnit.accountFields, props.type);\r\n\r\n if (!props.force && !config.isDisplayField) {\r\n return null;\r\n }\r\n\r\n return <>{config.label};\r\n};\r\n\r\ntype AccountFieldDisplayMap = {\r\n [key in AccountFieldTypes]: string;\r\n};\r\n\r\nconst AccountFieldDisplayMap: AccountFieldDisplayMap = {\r\n AccountNumber: 'accountNumber',\r\n SubAccountNumber: 'subAccountNumber',\r\n Name: 'name',\r\n Zip: 'zip',\r\n Balance: 'balance',\r\n LateFee: 'lateFee',\r\n Description: 'description',\r\n IssueDate: 'issueDate',\r\n DueDate: 'dueDate',\r\n PhoneNumber: 'phoneNumber',\r\n EmailAddress: 'emailAddress',\r\n Note: 'note',\r\n Address: 'address',\r\n PastDueAmountMinor: 'pastDueAmountMinor',\r\n};\r\n\r\ntype AccountFieldDisplayWithContext = {\r\n type: AccountFieldTypes;\r\n account: AccountSummaryDto;\r\n force?: boolean;\r\n};\r\n\r\nexport const AccountFieldDisplayWithContext: React.FC = (props) => {\r\n const {businessUnit} = useBusinessUnitContext();\r\n const config = useAccountFieldConfig(businessUnit.accountFields, props.type);\r\n\r\n if (!props.force && !config.isDisplayField) {\r\n return null;\r\n }\r\n\r\n const display = props.account[AccountFieldDisplayMap[props.type]];\r\n return <>{display};\r\n};\r\n","import {omit, pick} from 'lodash';\r\nimport React from 'react';\r\nimport {NewPaymentSource, OptionalAddress} from '../api/generated/index.defs';\r\nimport {AnyObject, KeyOf} from '../types';\r\n\r\ntype Address = {\r\n address?: OptionalAddress;\r\n};\r\n\r\nexport type AddressFields = KeyOf[];\r\n\r\nexport const AddressFields: AddressFields = [\r\n 'streetAddress',\r\n 'streetAddress2',\r\n 'city',\r\n 'state',\r\n 'zipCode',\r\n];\r\n\r\nexport const Address: React.FC
= ({address}) => {\r\n if (!address) {\r\n return null;\r\n }\r\n\r\n let cityStateZip = '';\r\n if (address.city || address.state || address.zipCode) {\r\n let line: string[] = [];\r\n if (address.city) line.push(address.city);\r\n if (address.state) line.push(address.state);\r\n if (line.length) {\r\n line = [line.join(', ')];\r\n }\r\n if (address.zipCode) line.push(address.zipCode);\r\n cityStateZip = line.join(' ');\r\n }\r\n return (\r\n
\r\n {address.streetAddress &&
{address.streetAddress}
}\r\n {address.streetAddress2 &&
{address.streetAddress2}
}\r\n {cityStateZip &&
{cityStateZip}
}\r\n
\r\n );\r\n};\r\n\r\nexport function mapPaymentSourceAddress(obj: AnyObject) {\r\n const address = pick(obj, AddressFields);\r\n const modifiedPaymentSource = omit(obj, AddressFields) as unknown as NewPaymentSource;\r\n\r\n modifiedPaymentSource.address = address;\r\n\r\n return modifiedPaymentSource as unknown as T;\r\n}\r\n","/* eslint-disable */\r\n\r\nimport {\r\n BusinessUnitPaymentChannelSummaryDto,\r\n PaymentChannelSummaryDto,\r\n PaymentChannelSourceSummaryDto,\r\n MerchantAccountChannelSummaryDto,\r\n AcceptedCardBrands,\r\n TokenizerConfig,\r\n UpdatePaymentChannelRequest,\r\n IList,\r\n List,\r\n Response,\r\n AdvancedQueryPage,\r\n IRequestOptions,\r\n IRequestConfig,\r\n getConfigs,\r\n axios,\r\n basePath\r\n} from './index.defs';\r\n\r\nexport class PaymentChannelsService {\r\n /** Generate by swagger-axios-codegen */\r\n // @ts-nocheck\r\n /* eslint-disable */\r\n\r\n /**\r\n *\r\n */\r\n static getBusinessUnitPaymentChannels(\r\n params: {\r\n /** */\r\n businessUnitId: number;\r\n } = {} as any,\r\n options: IRequestOptions = {}\r\n ): Promise> {\r\n return new Promise((resolve, reject) => {\r\n let url = basePath + '/api/business-units/{businessUnitId}/payment-channels';\r\n url = url.replace('{businessUnitId}', params['businessUnitId'] + '');\r\n\r\n const configs: IRequestConfig = getConfigs('get', 'application/json', url, options);\r\n\r\n let data = null as any;\r\n\r\n configs.data = data;\r\n axios(configs, resolve, reject);\r\n });\r\n }\r\n /**\r\n *\r\n */\r\n static getBusinessUnitPaymentChannel(\r\n params: {\r\n /** */\r\n businessUnitId: number;\r\n /** */\r\n channelType: string;\r\n /** */\r\n includeInactive?: boolean;\r\n } = {} as any,\r\n options: IRequestOptions = {}\r\n ): Promise> {\r\n return new Promise((resolve, reject) => {\r\n let url = basePath + '/api/business-units/{businessUnitId}/payment-channels/{channelType}';\r\n url = url.replace('{businessUnitId}', params['businessUnitId'] + '');\r\n url = url.replace('{channelType}', params['channelType'] + '');\r\n\r\n const configs: IRequestConfig = getConfigs('get', 'application/json', url, options);\r\n configs.params = { includeInactive: params['includeInactive'] };\r\n let data = null as any;\r\n\r\n configs.data = data;\r\n axios(configs, resolve, reject);\r\n });\r\n }\r\n /**\r\n *\r\n */\r\n static getById(\r\n params: {\r\n /** */\r\n id: number;\r\n } = {} as any,\r\n options: IRequestOptions = {}\r\n ): Promise> {\r\n return new Promise((resolve, reject) => {\r\n let url = basePath + '/api/payment-channels/{id}';\r\n url = url.replace('{id}', params['id'] + '');\r\n\r\n const configs: IRequestConfig = getConfigs('get', 'application/json', url, options);\r\n\r\n let data = null as any;\r\n\r\n configs.data = data;\r\n axios(configs, resolve, reject);\r\n });\r\n }\r\n /**\r\n *\r\n */\r\n static update(\r\n params: {\r\n /** */\r\n id: number;\r\n /** */\r\n body?: UpdatePaymentChannelRequest;\r\n } = {} as any,\r\n options: IRequestOptions = {}\r\n ): Promise> {\r\n return new Promise((resolve, reject) => {\r\n let url = basePath + '/api/payment-channels/{id}';\r\n url = url.replace('{id}', params['id'] + '');\r\n\r\n const configs: IRequestConfig = getConfigs('put', 'application/json', url, options);\r\n\r\n let data = params['body'];\r\n\r\n configs.data = data;\r\n axios(configs, resolve, reject);\r\n });\r\n }\r\n}\r\n","import React from 'react';\r\nimport ReactMarkdown from 'react-markdown';\r\nimport {Button, Form, Modal, Popup, Table} from 'semantic-ui-react';\r\nimport {css} from '@emotion/react/macro';\r\nimport {faTimes} from '@fortawesome/pro-regular-svg-icons';\r\nimport {FontAwesomeIcon} from '@fortawesome/react-fontawesome';\r\nimport {ServiceFeeTierGetDto} from '../api/generated/index.defs';\r\nimport Currency from '../components/currency';\r\nimport {decimalValueConverter} from '../forms/value-converters';\r\nimport {Media} from '../styles/breakpoints';\r\nimport {payStarColors} from '../styles/styled';\r\nimport {terms} from './autopay-terms';\r\n\r\nexport type ServiceFeeTierInformation = {\r\n achFees: ServiceFeeTierGetDto[];\r\n achShow: boolean;\r\n ccFees: ServiceFeeTierGetDto[];\r\n ccShow: boolean;\r\n};\r\n\r\nexport const AutoPayEnrollmentTermsOfUse = () => (\r\n \r\n Paystar Automatic Payment Terms of Use\r\n \r\n }\r\n closeIcon={\r\n \r\n \r\n \r\n \r\n \r\n }\r\n >\r\n Paystar Automatic Payment Terms of Use\r\n \r\n \r\n \r\n \r\n);\r\n\r\nexport const AutoPayServiceFeeInfo = ({\r\n achFees,\r\n achShow,\r\n ccFees,\r\n ccShow,\r\n}: ServiceFeeTierInformation) =>\r\n achShow || ccShow ? (\r\n service fee}\r\n position=\"top center\"\r\n css={autopayModalStyles}\r\n >\r\n {achShow && (\r\n \r\n ACH\r\n \r\n \r\n Payment Amount\r\n \r\n \r\n Fee\r\n \r\n \r\n {achFees?.map((x) => (\r\n \r\n \r\n {!!x.startRange && }\r\n {' to '}\r\n {!!x.endRange && }\r\n \r\n \r\n {!!x.percentageFee && `${decimalValueConverter.format(x.percentageFee)}%`}\r\n {!!x.flatFee && !!x.percentageFee && ' + '}{' '}\r\n {!!x.flatFee && }\r\n \r\n \r\n ))}\r\n
\r\n )}\r\n {ccShow && (\r\n \r\n Credit Card\r\n \r\n \r\n Payment Amount\r\n \r\n \r\n Fee\r\n \r\n \r\n {ccFees?.map((x) => (\r\n \r\n \r\n {!!x.startRange && }\r\n {' to '}\r\n {!!x.endRange && }\r\n \r\n \r\n {!!x.percentageFee && `${decimalValueConverter.format(x.percentageFee)}%`}\r\n {!!x.flatFee && !!x.percentageFee && ' + '}{' '}\r\n {!!x.flatFee && }\r\n \r\n \r\n ))}\r\n
\r\n )}\r\n \r\n ) : (\r\n service fee\r\n );\r\n\r\nconst autopayModalStyles = css`\r\n .payment-sources {\r\n margin-top: 0.2rem;\r\n }\r\n\r\n ${Media('MobileMax')} {\r\n .autopay-info {\r\n font-size: 0.8rem;\r\n ul {\r\n padding-left: 1rem;\r\n }\r\n }\r\n }\r\n\r\n .create-customer-payment-source .ui.segment:not(.plaid-link-form-container) {\r\n border: none;\r\n box-shadow: none;\r\n padding: 0;\r\n\r\n .ui.header {\r\n margin-top: 2rem;\r\n margin-bottom: 1rem;\r\n }\r\n }\r\n\r\n .ui.action.left .ui.checkbox {\r\n width: 3rem;\r\n border: solid 2px #cbcfd1;\r\n border-top-left-radius: 0.26666667rem;\r\n border-bottom-left-radius: 0.26666667rem;\r\n margin-right: -1px;\r\n }\r\n\r\n .ui.action.left.icon.input > i.icon {\r\n left: 3rem;\r\n }\r\n\r\n .ui.action.left .ui.checkbox label {\r\n top: 0.6rem;\r\n left: 0.8rem;\r\n }\r\n .checkbox-style {\r\n top: 2px;\r\n margin-right: 3px;\r\n }\r\n\r\n .form-actions {\r\n .ui.button:not(.terms-link) {\r\n display: block !important;\r\n width: 100%;\r\n }\r\n\r\n .terms-link {\r\n display: inline !important;\r\n color: ${payStarColors.primary.blue} !important;\r\n font-weight: bold;\r\n }\r\n\r\n .ui.button + .ui.button {\r\n margin-top: 1rem;\r\n }\r\n\r\n .ui.button.clear,\r\n .ui.button.tertiary {\r\n box-shadow: 0px 0px 0px 1px rgba(34, 36, 38, 0.15) !important;\r\n }\r\n }\r\n`;\r\n","export const removeUrlHash = () => {\r\n if (window?.history) {\r\n window.history.pushState('', document.title, window.location.pathname + window.location.search);\r\n }\r\n};\r\n","import React, {useMemo} from 'react';\r\nimport ReactMarkdown, {ReactMarkdownProps} from 'react-markdown';\r\nimport {useAsync} from 'react-use';\r\nimport {Modal} from 'semantic-ui-react';\r\nimport {css} from '@emotion/react/macro';\r\nimport {faTimes} from '@fortawesome/pro-regular-svg-icons';\r\nimport {FontAwesomeIcon} from '@fortawesome/react-fontawesome';\r\nimport {TermsOfServiceService} from '../api/generated/TermsOfServiceService';\r\nimport {StandardTermsOfServiceIdentifiers} from '../api/generated/enums';\r\nimport {\r\n AutoPayEnrollmentTermsOfUse,\r\n AutoPayServiceFeeInfo,\r\n} from '../customer-portal/autopay-enrollment-terms';\r\nimport {Form} from '../forms';\r\nimport {AnyObject} from '../types';\r\nimport {removeUrlHash} from '../utils/history';\r\n\r\ntype TermsOfServiceProps = ReactMarkdownProps & {\r\n identifier?: StandardTermsOfServiceIdentifiers;\r\n title?: string;\r\n data?: AnyObject;\r\n businessUnitId?: number;\r\n};\r\n\r\nconst substituteRegex: RegExp = /(\\{\\{.*?\\}\\})/g;\r\nconst formatRegex: RegExp = /(.*?):(.*?)$/;\r\n\r\nconst ElectronicDebitAuthorizationModal = (data) => (\r\n \r\n ELECTRONIC DEBIT AUTHORIZATION\r\n \r\n }\r\n closeIcon={\r\n \r\n \r\n \r\n \r\n \r\n }\r\n onClose={removeUrlHash}\r\n >\r\n ELECTRONIC DEBIT AUTHORIZATION\r\n \r\n \r\n \r\n \r\n);\r\n\r\nconst AccountWalletTermsModal = (data) => (\r\n \r\n Account Wallet Terms\r\n \r\n }\r\n closeIcon={\r\n \r\n \r\n \r\n \r\n \r\n }\r\n onClose={removeUrlHash}\r\n >\r\n ACCOUNT WALLET TERMS\r\n \r\n \r\n \r\n \r\n);\r\n\r\nexport const formatterMap = {\r\n AutoPayEnrollmentTermsOfUse: () => ,\r\n AutoPayServiceFeeInfo: ({serviceFeeTierInformation}) => (\r\n \r\n ),\r\n ElectronicDebitAuthorization: (data = {}) => ,\r\n AccountWalletTerms: (data = {}) => ,\r\n};\r\n\r\nconst formatSection = (currentSection: string, data: AnyObject = {}) => {\r\n const keyFormatterRegex = /\\{\\{(.*?)\\}\\}/g;\r\n const variableValues = keyFormatterRegex.exec(currentSection)?.[1] || '';\r\n const [, keys, formatter] = variableValues.match(formatRegex) ?? [];\r\n const splitKeys = keys?.split(',') ?? [];\r\n const canFormat = keys && formatter && !!formatterMap[formatter];\r\n const mappedData = splitKeys.reduce(\r\n (result, key) => {\r\n return !!key && !!data[key] ? {...result, [`${key}`]: data[key]} : result;\r\n },\r\n {...data}\r\n );\r\n return canFormat ? formatterMap[formatter](mappedData) : data[variableValues] || variableValues;\r\n};\r\n\r\nexport const renderTerms = (rawTerms: string, data?: AnyObject) => {\r\n const variables = rawTerms?.match(substituteRegex) ?? [];\r\n let pointer = 0;\r\n let results: React.ReactNode[] = [];\r\n\r\n for (const variable of variables) {\r\n var index = rawTerms.indexOf(variable);\r\n const section = rawTerms.substring(pointer, index);\r\n pointer += section.length + variable.length;\r\n const formattedVariable = formatSection(variable, data);\r\n results = [...results, section, formattedVariable];\r\n }\r\n\r\n results = [...results, rawTerms.substring(pointer)];\r\n\r\n return results;\r\n};\r\n\r\nexport const TermsOfService: React.FC = (props) => {\r\n const {identifier = '', source = '', data, businessUnitId} = props;\r\n\r\n const fetchTerms = useAsync(async () => {\r\n if (!identifier) return source;\r\n\r\n const response = await TermsOfServiceService.getNewestPublishedTermsByIdentifier({\r\n identifier,\r\n });\r\n\r\n return response.data?.terms ?? '';\r\n }, [identifier, source]);\r\n\r\n const rawTerms = fetchTerms.value ?? '';\r\n const renderedTerms = useMemo(() => renderTerms(rawTerms, data), [data, rawTerms]);\r\n\r\n return (\r\n
\r\n {renderedTerms.map((x, i) => {\r\n return (\r\n \r\n {typeof x === 'string' ? (\r\n \r\n ) : (\r\n x\r\n )}\r\n \r\n );\r\n })}\r\n {businessUnitId && (\r\n \r\n )}\r\n
\r\n );\r\n};\r\n\r\ntype BusinessUnitTermsProps = {\r\n businessUnitId: number;\r\n identifier: string;\r\n};\r\n\r\nexport const BusinessUnitTerms: React.FC = (props) => {\r\n const {businessUnitId, identifier} = props;\r\n\r\n const fetchTerms = useAsync(async () => {\r\n const response = await TermsOfServiceService.getNewestPublishedTermsByIdentifier({\r\n identifier,\r\n businessUnitId,\r\n });\r\n\r\n return response.data?.terms ?? '';\r\n }, [businessUnitId, identifier]);\r\n\r\n const terms = fetchTerms.value ?? '';\r\n\r\n return (\r\n \r\n );\r\n};\r\n\r\nconst styles = css`\r\n .react-markdown-container,\r\n .react-markdown-container p:first-of-type {\r\n display: inline;\r\n }\r\n .react-markdown-container p:not(:first-of-type) {\r\n margin-top: 1em;\r\n }\r\n .modal-content p:first-of-type {\r\n display: block !important;\r\n }\r\n button[type='button'].ui.button.link.inline {\r\n display: inline !important;\r\n width: inherit;\r\n }\r\n .business-unit-terms.react-markdown-container p:first-of-type {\r\n display: block !important;\r\n margin-top: 1em;\r\n }\r\n`;\r\n","import React from 'react';\r\nimport {Table} from 'semantic-ui-react';\r\nimport {css} from '@emotion/react/macro';\r\n\r\ntype DataList = {\r\n align?: 'right' | 'left';\r\n data: {label: React.ReactNode; value: React.ReactNode}[];\r\n colonAfterLabel?: boolean;\r\n};\r\nexport const DataList: React.FC = ({data, align, colonAfterLabel = true}) => {\r\n const ShouldIgnoreTranslate = (label) => {\r\n return label === 'Address' || label === 'Name';\r\n };\r\n\r\n return (\r\n \r\n \r\n {data.map(({label, value}, i) => (\r\n \r\n \r\n {label ? `${label}${colonAfterLabel ? ':' : ''}` : ''}\r\n \r\n \r\n {value}\r\n \r\n \r\n ))}\r\n \r\n
\r\n );\r\n};\r\n\r\nconst datumStyles = css`\r\n .datum-label {\r\n font-weight: normal;\r\n /* color: rgba(0, 0, 0, 0.6); */\r\n font-size: 0.9rem !important;\r\n line-height: 1.4em;\r\n }\r\n\r\n .datum-value {\r\n font-weight: 500;\r\n font-size: 0.971429rem;\r\n line-height: 1.28571429em;\r\n text-transform: none;\r\n color: #0a2233;\r\n }\r\n`;\r\n","import {createContext, useContext} from 'react';\r\nimport {useAsync} from 'react-use';\r\nimport {Message} from 'semantic-ui-react';\r\nimport {useMatch} from '@reach/router';\r\nimport {BusinessUnitsService} from '../api/generated/BusinessUnitsService';\r\nimport {PaymentChannels} from '../api/generated/enums';\r\nimport {BusinessUnitContextDto} from '../api/generated/index.defs';\r\nimport {useIsAgentUser} from '../auth/authorization-helpers';\r\nimport {AsyncStateContainer} from '../components/async-state-container';\r\nimport {rootRoutes} from '../routes';\r\n\r\nconst INITIAL_STATE: BusinessUnitContextDto | undefined = undefined;\r\n\r\nconst BusinessUnitContext = createContext(INITIAL_STATE);\r\n\r\nconst BusinessUnitProvider = (props) => {\r\n const slug = useMatch(`${rootRoutes.customer}/:slug/*`)?.slug || '';\r\n const isAgent = useIsAgentUser();\r\n const channelType = isAgent ? PaymentChannels.POS : PaymentChannels.QuickPay;\r\n\r\n const fetchBusinessUnitContext = useAsync(async () => {\r\n const response = await BusinessUnitsService.getContextBySlug({\r\n slug,\r\n channelType,\r\n });\r\n return response.data;\r\n }, [channelType, slug]);\r\n\r\n const businessUnitContext = fetchBusinessUnitContext.value;\r\n\r\n return (\r\n \r\n \r\n {!businessUnitContext ? : props.children}\r\n \r\n \r\n );\r\n};\r\n\r\nconst useBusinessUnitContext = (): BusinessUnitContextDto => {\r\n const context = useContext(BusinessUnitContext);\r\n\r\n if (!context) {\r\n throw new Error('Invalid Business Unit Context');\r\n }\r\n\r\n return context;\r\n};\r\n\r\nexport {BusinessUnitProvider, useBusinessUnitContext};\r\n","import Axios from 'axios';\r\nimport React, {useEffect} from 'react';\r\nimport {useForm} from 'react-final-form';\r\nimport {Button} from 'semantic-ui-react';\r\nimport {css} from '@emotion/react/macro';\r\nimport {\r\n AchAccountHolderTypes,\r\n AchAccountTypes,\r\n BillingAddressCollectionTypes,\r\n} from '../api/generated/enums';\r\nimport {UpdatePaymentSessionPaymentSourceRequest} from '../api/generated/index.defs';\r\nimport {Form} from '../forms';\r\nimport {useProduce} from '../hooks/use-produce';\r\nimport {Media} from '../styles/breakpoints';\r\nimport {BillingAddressFormFields} from './billing-address-form-fields';\r\nimport {fieldKeys} from './index';\r\n\r\ninterface AchFields {\r\n billingAddressCollectionType: BillingAddressCollectionTypes;\r\n values: Partial;\r\n\r\n layout?: 'wide' | 'narrow';\r\n}\r\n\r\nconst [CheckingAccount, SavingsAccount] = [\r\n AchAccountTypes['Checking Account'],\r\n AchAccountTypes['Savings Account'],\r\n];\r\n\r\nconst [Business, Personal] = [AchAccountHolderTypes['Business'], AchAccountHolderTypes['Personal']];\r\n\r\nconst preventCopyPaste = {\r\n onDrag: (e) => {\r\n e.preventDefault();\r\n return false;\r\n },\r\n onDrop: (e) => {\r\n e.preventDefault();\r\n return false;\r\n },\r\n onCopy: (e) => {\r\n e.preventDefault();\r\n return false;\r\n },\r\n onCut: (e) => {\r\n e.preventDefault();\r\n return false;\r\n },\r\n onPaste: (e) => {\r\n e.preventDefault();\r\n return false;\r\n },\r\n autoComplete: 'off',\r\n};\r\n\r\ninterface AchFieldsState {\r\n routingNumber?: string;\r\n routingInfo?: {\r\n code: number;\r\n routing_number: string;\r\n customer_name: string;\r\n telephone?: string;\r\n };\r\n}\r\n\r\nexport const AchFields: React.FC = ({\r\n billingAddressCollectionType,\r\n values,\r\n layout = 'wide',\r\n}) => {\r\n const [state, setState] = useProduce({});\r\n const form = useForm();\r\n\r\n useEffect(() => {\r\n form.batch(() => {\r\n form.change(fieldKeys.accountType, CheckingAccount);\r\n form.change(fieldKeys.achAccountHolderType, Personal);\r\n });\r\n }, [form]);\r\n\r\n const routingNumber = state.routingNumber;\r\n useEffect(() => {\r\n let expired = false;\r\n if (routingNumber) {\r\n (async () => {\r\n const {data} = await Axios.get(\r\n `https://www.routingnumbers.info/api/data.json?rn=${routingNumber}`\r\n );\r\n if (expired) {\r\n return;\r\n }\r\n setState((draft) => {\r\n if (data?.code === 200 && data?.routing_number === routingNumber) {\r\n draft.routingInfo = data;\r\n } else {\r\n draft.routingInfo = undefined;\r\n }\r\n });\r\n })();\r\n }\r\n\r\n return () => {\r\n expired = true;\r\n };\r\n }, [routingNumber, setState]);\r\n\r\n return (\r\n <>\r\n {layout === 'wide' ? (\r\n
\r\n
\r\n
\r\n
\r\n \r\n \r\n {\r\n form.batch(() => {\r\n form.change(fieldKeys.accountType, CheckingAccount);\r\n form.change(fieldKeys.achAccountHolderType, Personal);\r\n });\r\n }}\r\n >\r\n Checking\r\n \r\n {\r\n form.batch(() => {\r\n form.change(fieldKeys.accountType, SavingsAccount);\r\n form.change(fieldKeys.achAccountHolderType, Personal);\r\n });\r\n }}\r\n >\r\n Savings\r\n \r\n \r\n
\r\n
\r\n \r\n \r\n {\r\n form.batch(() => {\r\n form.change(fieldKeys.accountType, CheckingAccount);\r\n form.change(fieldKeys.achAccountHolderType, Business);\r\n });\r\n }}\r\n >\r\n Checking\r\n \r\n {\r\n form.batch(() => {\r\n form.change(fieldKeys.accountType, SavingsAccount);\r\n form.change(fieldKeys.achAccountHolderType, Business);\r\n });\r\n }}\r\n >\r\n Savings\r\n \r\n \r\n
\r\n
\r\n
\r\n
\r\n ) : (\r\n
\r\n
\r\n \r\n
\r\n
\r\n \r\n
\r\n
\r\n )}\r\n\r\n \r\n\r\n {\r\n const routingNumber = values[fieldKeys.achRoutingNumber];\r\n setState((draft) => {\r\n if (routingNumber) {\r\n draft.routingNumber = routingNumber;\r\n } else {\r\n draft.routingNumber = undefined;\r\n draft.routingInfo = undefined;\r\n }\r\n });\r\n }}\r\n />\r\n\r\n \r\n\r\n \r\n\r\n \r\n \r\n );\r\n};\r\n\r\nconst styles = css`\r\n .account-types {\r\n display: flex;\r\n border: solid 2px #cbcfd1;\r\n border-radius: 0.26666667rem;\r\n\r\n & > div {\r\n flex: 1;\r\n margin: 0;\r\n\r\n &:first-of-type {\r\n label {\r\n border-right: solid 1px #cbcfd1;\r\n }\r\n .ui.button:first-of-type {\r\n border-left: none;\r\n }\r\n }\r\n\r\n &:last-of-type {\r\n label {\r\n border-left: solid 1px #cbcfd1;\r\n }\r\n .ui.button:last-of-type {\r\n border-right: none;\r\n }\r\n }\r\n }\r\n\r\n label {\r\n display: block;\r\n text-align: center;\r\n font-weight: 500;\r\n border-bottom: solid 2px #cbcfd1;\r\n padding-top: 0.1rem;\r\n padding-bottom: 0.25rem;\r\n margin: 0;\r\n background-color: #e5e7e8;\r\n }\r\n\r\n .ui.button {\r\n border-left: solid 1px #cbcfd1;\r\n border-right: solid 1px #cbcfd1;\r\n border-radius: 0;\r\n\r\n ${Media('MobileMax')} {\r\n padding: 0.73333333em 0em 0.73333333em;\r\n }\r\n\r\n &.active {\r\n color: rgba(0, 0, 0, 0.95) !important;\r\n background-color: #dff2ff;\r\n border-radius: 0px;\r\n font-weight: 500;\r\n }\r\n\r\n :hover {\r\n background-color: rgba(27, 28, 29, 0.1) !important;\r\n border-radius: 0px;\r\n }\r\n\r\n :focus {\r\n background-color: #dff2ff !important;\r\n border-radius: 0px;\r\n }\r\n }\r\n }\r\n`;\r\n","import React from 'react';\r\nimport {CardconnectFields} from './card-connect/credit-card-form';\r\nimport {NmiFields} from './nmi/credit-card-form';\r\nimport {useTokenizationConfig} from './tokenization-context';\r\nimport {CardTokenizerProps} from './types';\r\nimport {PaymentGatewayTypes} from '../api/generated/enums';\r\nimport {logger} from '../utils/logger';\r\n\r\nexport const CreditCardFormResolver: React.FC = (props) => {\r\n const tokenizerConfig = useTokenizationConfig();\r\n switch (tokenizerConfig?.strategy) {\r\n case PaymentGatewayTypes['Card Connect']:\r\n return ;\r\n\r\n case PaymentGatewayTypes.NMI:\r\n return ;\r\n default:\r\n break;\r\n }\r\n\r\n logger('tokenizer').warn('Unknown tokenizer strategy');\r\n\r\n return ;\r\n};\r\n","import {includes} from 'lodash';\r\nimport React, {useMemo} from 'react';\r\nimport {useForm} from 'react-final-form';\r\nimport {Button, Message} from 'semantic-ui-react';\r\nimport {css} from '@emotion/react/macro';\r\nimport {faCreditCard, faMoneyCheck} from '@fortawesome/pro-regular-svg-icons';\r\nimport {FontAwesomeIcon} from '@fortawesome/react-fontawesome';\r\nimport {BillingAddressCollectionTypes, PaymentSourceTypes} from '../api/generated/enums';\r\nimport {AccountDetailDto, CreateCustomerPaymentSourceRequest} from '../api/generated/index.defs';\r\nimport {Alert} from '../components/alert';\r\nimport {Form} from '../forms';\r\nimport {AchFields} from '../gateways/ach-form';\r\nimport {CreditCardFormResolver} from '../gateways/credit-card-form-resolver';\r\nimport {CardInfo} from '../gateways/types';\r\nimport {Media} from '../styles/breakpoints';\r\n\r\ntype Omitted =\r\n | 'address'\r\n | 'cardExpiration'\r\n | 'businessUnitId'\r\n | 'cardExpirationMonth'\r\n | 'cardExpirationYear'\r\n | 'cardEntryMethod';\r\n\r\nexport type PaymentSourceFormValues = Omit & {\r\n accountNumberMasked?: string;\r\n cardExpiration?: string;\r\n achConfirmAccountNumber: string;\r\n streetAddress: string;\r\n streetAddress2: string;\r\n city: string;\r\n state: string;\r\n zipCode: string;\r\n emailAddress: string;\r\n};\r\n\r\ntype PaymentSourceForm = {\r\n values: PaymentSourceFormValues;\r\n onCardInfo?: (cardInfo: CardInfo) => void;\r\n paymentSourceTypes: PaymentSourceTypes[];\r\n billingAddressCollectionType: BillingAddressCollectionTypes;\r\n cvv?: boolean;\r\n account?: AccountDetailDto | null | undefined;\r\n\r\n layout?: 'wide' | 'narrow';\r\n};\r\n\r\nexport const PaymentSourceForm: React.FC = (props) => {\r\n const {\r\n values,\r\n onCardInfo,\r\n paymentSourceTypes,\r\n billingAddressCollectionType,\r\n cvv,\r\n account,\r\n layout = 'wide',\r\n } = props;\r\n\r\n if (paymentSourceTypes.length === 0) {\r\n return (\r\n \r\n );\r\n }\r\n\r\n const isCreditCard = values.paymentSourceType === PaymentSourceTypes['Credit Card'];\r\n const achEnabled = includes(paymentSourceTypes, 'ACH');\r\n const creditCardEnabled = includes(paymentSourceTypes, 'Credit Card');\r\n\r\n return (\r\n <>\r\n {(!account?.blockCreditCardPayment && creditCardEnabled) ||\r\n (!account?.blockAchPayment && achEnabled) ? (\r\n \r\n ) : (\r\n \r\n Credit Card and ACH payments are currently blocked\r\n \r\n )}\r\n {isCreditCard && !account?.blockCreditCardPayment && creditCardEnabled ? (\r\n \r\n ) : (\r\n !account?.blockAchPayment &&\r\n achEnabled && (\r\n \r\n )\r\n )}\r\n \r\n );\r\n};\r\n\r\ntype PaymentSourceTypeSelector = {\r\n values: PaymentSourceFormValues;\r\n paymentSourceTypes: PaymentSourceTypes[];\r\n account?: AccountDetailDto | null | undefined;\r\n};\r\n\r\nexport const PaymentSourceTypeSelector: React.FC = (props) => {\r\n const {values, paymentSourceTypes, account} = props;\r\n\r\n const form = useForm();\r\n\r\n const creditCardBlocked = account?.blockCreditCardPayment;\r\n const achBlocked = account?.blockAchPayment;\r\n\r\n const achEnabled = includes(paymentSourceTypes, 'ACH');\r\n const creditCardEnabled = includes(paymentSourceTypes, 'Credit Card');\r\n\r\n const isCreditCard = values.paymentSourceType === PaymentSourceTypes['Credit Card'];\r\n const isAch = values.paymentSourceType === PaymentSourceTypes.ACH;\r\n\r\n const ShowPaymentMethod = (paymentSourceType: string) =>\r\n useMemo(() => {\r\n if (creditCardBlocked && paymentSourceType === PaymentSourceTypes['Credit Card']) {\r\n form.change('paymentSourceType', PaymentSourceTypes.ACH);\r\n return false;\r\n }\r\n\r\n if (achBlocked && paymentSourceType === PaymentSourceTypes.ACH) {\r\n form.change('paymentSourceType', PaymentSourceTypes['Credit Card']);\r\n return false;\r\n }\r\n\r\n return true;\r\n }, [paymentSourceType]);\r\n\r\n return (\r\n <>\r\n {creditCardEnabled && achEnabled && (\r\n
\r\n
\r\n
\r\n \r\n \r\n {ShowPaymentMethod(PaymentSourceTypes['Credit Card']) && (\r\n {\r\n form.change('paymentSourceType', PaymentSourceTypes['Credit Card']);\r\n }}\r\n >\r\n \r\n Credit / Debit\r\n \r\n )}\r\n\r\n {ShowPaymentMethod(PaymentSourceTypes.ACH) && (\r\n {\r\n form.change('paymentSourceType', PaymentSourceTypes.ACH);\r\n }}\r\n >\r\n \r\n eCheck\r\n \r\n )}\r\n \r\n
\r\n
\r\n
\r\n )}\r\n \r\n );\r\n};\r\n\r\nconst styles = css`\r\n .payment-source-types {\r\n border: solid 2px #cbcfd1;\r\n border-radius: 0.26666667rem;\r\n\r\n & > div {\r\n margin: 0;\r\n }\r\n\r\n label {\r\n display: block !important;\r\n text-align: center;\r\n font-weight: 500;\r\n border-bottom: solid 2px #cbcfd1;\r\n padding-top: 0.1rem;\r\n padding-bottom: 0.25rem;\r\n margin: 0 !important;\r\n background-color: #e5e7e8;\r\n font-size: 0.92857143em;\r\n }\r\n\r\n .ui.button {\r\n border-left: solid 1px #cbcfd1;\r\n border-right: solid 1px #cbcfd1;\r\n border-radius: 0;\r\n\r\n &:first-of-type {\r\n border-left: none;\r\n }\r\n &:last-of-type {\r\n border-right: none;\r\n }\r\n\r\n ${Media('MobileMax')} {\r\n padding: 0.73333333em 0em 0.73333333em;\r\n }\r\n\r\n &.active {\r\n color: rgba(0, 0, 0, 0.95) !important;\r\n background-color: #dff2ff !important;\r\n border-radius: 0px;\r\n font-weight: 500;\r\n }\r\n\r\n :hover {\r\n background-color: rgba(27, 28, 29, 0.1) !important;\r\n border-radius: 0px;\r\n }\r\n\r\n :focus {\r\n background-color: #dff2ff !important;\r\n border-radius: 0px;\r\n }\r\n }\r\n }\r\n`;\r\n","import {CssProperties} from '../types/index';\r\n\r\nexport type ClonedStyles = {\r\n object: Partial<{[K in CssProperties]: any}>;\r\n text: string;\r\n};\r\n\r\ntype CloneStylesConfig = {\r\n styleWhitelist?: CssProperties[];\r\n explicitValues?: Partial<{[K in CssProperties]: any}>;\r\n};\r\n\r\nexport const copyElementStyles = (\r\n target: HTMLElement,\r\n config: CloneStylesConfig = {}\r\n): ClonedStyles => {\r\n const {styleWhitelist, explicitValues = {}} = config;\r\n const targetStyles: CSSStyleDeclaration = window.getComputedStyle(target);\r\n\r\n const filterMap = styleWhitelist ? convertToLookup(styleWhitelist) : undefined;\r\n\r\n return (styleWhitelist || []).reduce(\r\n (styles, propertyName) => {\r\n const shouldCopyStyle = !filterMap || !!filterMap[propertyName];\r\n\r\n if (shouldCopyStyle) {\r\n const computedValue = targetStyles.getPropertyValue(propertyName);\r\n const value = explicitValues[propertyName] || computedValue;\r\n\r\n if (!value) {\r\n return styles;\r\n }\r\n\r\n styles.object[propertyName] = value;\r\n styles.text += `${propertyName}:${value};`;\r\n }\r\n\r\n return styles;\r\n },\r\n {\r\n object: {},\r\n text: '',\r\n }\r\n );\r\n};\r\n\r\nconst convertToLookup = (array: string[]) =>\r\n array.reduce((acc, key) => {\r\n acc[key] = true;\r\n return acc;\r\n }, {});\r\n","import {pick, takeRight} from 'lodash';\r\nimport qs from 'qs';\r\nimport React, {useCallback, useEffect} from 'react';\r\nimport * as Sentry from '@sentry/browser';\r\nimport {analytics} from '../../analytics';\r\nimport {fetchBinInfo} from '../../components/card-brand';\r\nimport {Env} from '../../config/env-vars';\r\nimport {useMobileDetect} from '../../hooks/use-mobile-detect';\r\nimport {usePostMessageHandler} from '../../hooks/use-post-message-handler';\r\nimport {useProduce} from '../../hooks/use-produce';\r\nimport {ClonedStyles, copyElementStyles} from '../../styles/copy-element-styles';\r\nimport {CssProperties} from '../../types/index';\r\nimport {parseJson, parseUrl} from '../../utils';\r\nimport {logger} from '../../utils/logger';\r\nimport {useTokenizationConfig, useTokenizationContext} from '../tokenization-context';\r\nimport {CardInfo} from '../types';\r\nimport {CardConnectTokenizerResponse} from './types';\r\n\r\ntype CardConnectTokenizer = {\r\n target: React.MutableRefObject;\r\n onCapture: (response: CardConnectTokenizerResponse) => void;\r\n onCardInfo?: (cardInfo: CardInfo) => void;\r\n onLoad?: () => void;\r\n onError?: (error) => void;\r\n};\r\n\r\nconst log = logger('card-connect-tokenizer');\r\n\r\nconst DEFAULT_IFRAME_TOKENIZER_PROPS = {\r\n invalidinputevent: true,\r\n tokenizewheninactive: true,\r\n enhancedresponse: true,\r\n placeholder: '0000 0000 0000 0000',\r\n formatinput: true,\r\n tokenpropname: 'token',\r\n inactivityto: 1000,\r\n // sendcardtypingevent: true,\r\n // cardinputmaxlength: 16,\r\n};\r\n\r\ntype TokenizerState = {\r\n inputHeight?: number;\r\n inputStyles?: ClonedStyles;\r\n};\r\n\r\nexport const CardConnectTokenizer: React.FC = (props) => {\r\n const {target, onCapture, onCardInfo, onLoad, onError} = props;\r\n\r\n const [state, setState] = useProduce({});\r\n const tokenizerContext = useTokenizationContext();\r\n const tokenizerConfig = useTokenizationConfig<{url: string}>();\r\n const isMobile = useMobileDetect();\r\n\r\n const parentWindowWidth = tokenizerContext.embeddedContext?.parentWindowWidth ?? 0;\r\n const isEmbedded = tokenizerContext.hostingMode === 'embedded' && parentWindowWidth > 0;\r\n const isEmbeddedMobile = isEmbedded && parentWindowWidth < 768;\r\n\r\n const tokenizeWhenInactive = isEmbedded ? isEmbeddedMobile : isMobile;\r\n\r\n const urlOrigin = tokenizerConfig?.properties?.url || Env.cardConnectBaseUrl || '';\r\n const subdomain = parseUrl(urlOrigin).host.split('.')[0];\r\n\r\n const messageFilter = useCallback(\r\n (event: MessageEvent) => event.origin === urlOrigin,\r\n [urlOrigin]\r\n );\r\n\r\n usePostMessageHandler({\r\n filter: messageFilter,\r\n onMessage: useCallback(\r\n (event: MessageEvent) => {\r\n const response = parseCardConnectMessage(event.data, subdomain);\r\n onCapture(response);\r\n\r\n log.info('card capture message', {\r\n entry: response.entry,\r\n errorCode: response.errorCode,\r\n original: event.data,\r\n });\r\n\r\n if (response.isValid && onCardInfo) {\r\n const cardInfo = fetchBinInfo(response.token);\r\n log.info(`card type fetched: ${cardInfo.type}`);\r\n onCardInfo(cardInfo);\r\n }\r\n },\r\n [onCapture, onCardInfo, subdomain]\r\n ),\r\n });\r\n\r\n useEffect(() => {\r\n if (target.current) {\r\n const clonedStyles = copyElementStyles(target.current, {\r\n styleWhitelist: acceptedCssProperties,\r\n explicitValues: {\r\n height: `${target.current.offsetHeight}px`,\r\n width: '100%',\r\n display: 'inline-block',\r\n 'border-top-style': 'none',\r\n 'border-right-style': 'none',\r\n 'border-bottom-style': 'none',\r\n 'border-left-style': 'none',\r\n 'border-bottom-width': '0',\r\n 'border-left-width': '0',\r\n 'border-right-width': '0',\r\n 'border-top-width': '0',\r\n 'border-bottom-color': 'transparent',\r\n 'border-left-color': 'transparent',\r\n 'border-right-color': 'transparent',\r\n 'border-top-color': 'transparent',\r\n 'padding-top': '5.5px',\r\n outline: 'none',\r\n 'outline-width': '0',\r\n },\r\n });\r\n\r\n setState((draft) => {\r\n draft.inputHeight = target.current.offsetHeight;\r\n draft.inputStyles = clonedStyles;\r\n });\r\n\r\n analytics.timeEvent('card-connect.tokenizer-loaded');\r\n }\r\n }, [setState, target]);\r\n\r\n const onFrameLoaded = () => {\r\n analytics.trackEvent('card-connect.tokenizer-loaded');\r\n\r\n if (onLoad) {\r\n onLoad();\r\n }\r\n };\r\n\r\n const onFrameError = (error) => {\r\n const exception = error || new Error('Failed to load card-connect-tokenizer iframe');\r\n\r\n log.error('Failed to load card-connect-tokenizer iframe', exception);\r\n Sentry.captureException(exception);\r\n\r\n if (onError) {\r\n onError(error);\r\n }\r\n };\r\n\r\n if (state.inputStyles?.text) {\r\n const bodyStyles = 'margin: 0;';\r\n const tokenizerProps = {\r\n ...DEFAULT_IFRAME_TOKENIZER_PROPS,\r\n tokenizewheninactive: tokenizeWhenInactive,\r\n css: `body{${bodyStyles}}input{${state.inputStyles.text}}`,\r\n };\r\n\r\n const url = `${urlOrigin}/itoke/ajax-tokenizer.html?${qs.stringify(tokenizerProps)}`;\r\n\r\n return (\r\n \r\n );\r\n }\r\n\r\n return null;\r\n};\r\n\r\nconst documentedCardConnectResponseKeys = ['entry', 'errorCode', 'errorMessage', 'token'];\r\n\r\nconst parseCardConnectMessage = (messageJsonString: string, subdomain: string) => {\r\n const data = parseJson(messageJsonString);\r\n let enhancedToken = '';\r\n\r\n const isValid = !!(data?.token && Number(data.errorCode) === 0);\r\n\r\n if (isValid) {\r\n // FIXME: move to shared utility method\r\n // prefix:token|last4|subdomain\r\n const last4 = takeRight(data.token, 4).join('');\r\n const tokenParts = [data.token, last4, subdomain].join('|');\r\n enhancedToken = `cardconnect_iframe:${tokenParts}`;\r\n }\r\n\r\n return {\r\n ...(pick(data, documentedCardConnectResponseKeys) as CardConnectTokenizerResponse),\r\n isValid,\r\n enhancedToken,\r\n };\r\n};\r\n\r\nconst acceptedCssProperties: CssProperties[] = [\r\n '-moz-appearance',\r\n '-moz-border-radius',\r\n '-moz-border-radius-bottomleft',\r\n '-moz-border-radius-bottomright',\r\n '-moz-border-radius-topleft',\r\n '-moz-border-radius-topright',\r\n '-moz-box-shadow',\r\n '-moz-outline',\r\n '-moz-outline-color',\r\n '-moz-outline-style',\r\n '-moz-outline-width',\r\n '-o-text-overflow',\r\n '-webkit-appearance',\r\n '-webkit-border-bottom-left-radius',\r\n '-webkit-border-bottom-right-radius',\r\n '-webkit-border-radius',\r\n '-webkit-border-top-left-radius',\r\n '-webkit-border-top-right-radius',\r\n '-webkit-box-shadow',\r\n 'appearance',\r\n 'azimuth',\r\n 'background',\r\n 'background-attachment',\r\n 'background-color',\r\n 'background-image',\r\n 'background-position',\r\n 'background-repeat',\r\n 'border',\r\n 'border-bottom',\r\n 'border-bottom-color',\r\n 'border-bottom-left-radius',\r\n 'border-bottom-right-radius',\r\n 'border-bottom-style',\r\n 'border-bottom-width',\r\n 'border-collapse',\r\n 'border-color',\r\n 'border-left',\r\n 'border-left-color',\r\n 'border-left-style',\r\n 'border-left-width',\r\n 'border-radius',\r\n 'border-right',\r\n 'border-right-color',\r\n 'border-right-style',\r\n 'border-right-width',\r\n 'border-spacing',\r\n 'border-style',\r\n 'border-top',\r\n 'border-top-color',\r\n 'border-top-left-radius',\r\n 'border-top-right-radius',\r\n 'border-top-style',\r\n 'border-top-width',\r\n 'border-width',\r\n 'box-shadow',\r\n 'box-sizing',\r\n 'caption-side',\r\n 'color',\r\n 'cue',\r\n 'cue-after',\r\n 'cue-before',\r\n 'direction',\r\n 'elevation',\r\n 'empty-cells',\r\n 'font',\r\n 'font-family',\r\n 'font-size',\r\n 'font-stretch',\r\n 'font-style',\r\n 'font-variant',\r\n 'font-weight',\r\n 'height',\r\n 'letter-spacing',\r\n 'line-height',\r\n 'list-style',\r\n 'list-style-image',\r\n 'list-style-position',\r\n 'list-style-type',\r\n 'margin',\r\n 'margin-bottom',\r\n 'margin-left',\r\n 'margin-right',\r\n 'margin-top',\r\n 'max-height',\r\n 'max-width',\r\n 'min-height',\r\n 'min-width',\r\n 'outline',\r\n 'outline-color',\r\n 'outline-style',\r\n 'outline-width',\r\n 'padding',\r\n 'padding-bottom',\r\n 'padding-left',\r\n 'padding-right',\r\n 'padding-top',\r\n 'pause',\r\n 'pause-after',\r\n 'pause-before',\r\n 'pitch',\r\n 'pitch-range',\r\n 'quotes',\r\n 'richness',\r\n 'speak',\r\n 'speak-header',\r\n 'speak-numeral',\r\n 'speak-punctuation',\r\n 'speech-rate',\r\n 'stress',\r\n 'table-layout',\r\n 'text-align',\r\n 'text-decoration',\r\n 'text-indent',\r\n 'text-overflow',\r\n 'text-shadow',\r\n 'text-transform',\r\n 'unicode-bidi',\r\n 'vertical-align',\r\n 'voice-family',\r\n 'volume',\r\n 'white-space',\r\n 'width',\r\n 'word-spacing',\r\n 'word-wrap',\r\n];\r\n","import {useBreakpoint} from '../styles/breakpoints';\r\n\r\nexport const useMobileDetect = () => {\r\n let isIOS =\r\n (/iPad|iPhone|iPod/.test(navigator.platform) ||\r\n (navigator.platform === 'MacIntel' && navigator.maxTouchPoints > 1)) &&\r\n !(window as any).MSStream;\r\n\r\n const isMobileSize = useBreakpoint() === 'MobileMax';\r\n\r\n return isIOS || isMobileSize;\r\n};\r\n","import React, {useRef, useState} from 'react';\r\nimport {Field} from 'react-final-form';\r\nimport {Image, Form as SemanticForm} from 'semantic-ui-react';\r\nimport {cx} from '@emotion/css';\r\nimport {css} from '@emotion/react/macro';\r\nimport {useMatch} from '@reach/router';\r\nimport {analytics} from '../../analytics';\r\nimport imageCvv from '../../assets/icon-cvv.svg';\r\nimport {CardBrandImage} from '../../components/card-brand';\r\nimport {Flex} from '../../components/flex';\r\nimport {Form} from '../../forms';\r\nimport {SubmitError} from '../../forms/submit-error';\r\nimport {routes} from '../../routes';\r\nimport {BillingAddressFormFields} from '../billing-address-form-fields';\r\nimport {fieldKeys} from '../index';\r\nimport {CardInfo, CardTokenizerProps} from '../types';\r\nimport {CardConnectTokenizer} from './tokenizer';\r\n\r\nexport const CardconnectFields: React.FC = ({\r\n onLoad,\r\n onCardInfo,\r\n billingAddressCollectionType,\r\n cvv = true,\r\n}) => {\r\n const [cardInfo, setCardInfo] = useState({\r\n type: 'Unknown',\r\n });\r\n\r\n const targetInputRef = useRef(null);\r\n const isCheckoutPage = useMatch(routes.checkout.base);\r\n\r\n return (\r\n <>\r\n {\r\n return (\r\n
\r\n \r\n \r\n
\r\n \r\n
\r\n
\r\n \r\n
\r\n );\r\n }}\r\n />\r\n\r\n {\r\n return (\r\n
\r\n \r\n \r\n \r\n }\r\n onLoad={() => {\r\n onLoad && onLoad();\r\n }}\r\n onCapture={(response) => {\r\n if (input.value && !response.isValid) {\r\n input.onChange('');\r\n analytics.trackEvent('card-connect.token-modified');\r\n } else if (response.isValid) {\r\n input.onChange(response.enhancedToken);\r\n }\r\n }}\r\n onCardInfo={(cardInfo) => {\r\n setCardInfo(cardInfo);\r\n if (onCardInfo) {\r\n onCardInfo(cardInfo);\r\n }\r\n }}\r\n />\r\n \r\n
\r\n \r\n \r\n \r\n );\r\n }}\r\n />\r\n\r\n \r\n\r\n \r\n \r\n );\r\n};\r\n\r\ntype CardExpirationAndCvv = {\r\n cvv: boolean;\r\n autoFocus?: boolean;\r\n};\r\n\r\nexport const CardExpirationAndCvv: React.FC = ({cvv, autoFocus}) => (\r\n \r\n \r\n \r\n \r\n {cvv ? (\r\n <>\r\n \r\n \r\n \r\n \r\n \r\n ) : (\r\n \r\n )}\r\n \r\n);\r\n\r\ntype CvvField = {\r\n autoFocus?: boolean;\r\n};\r\n\r\nexport const CvvField: React.FC = ({autoFocus}) => {\r\n return (\r\n {\r\n return (\r\n
\r\n \r\n \r\n
\r\n \r\n \r\n
\r\n
\r\n \r\n
\r\n );\r\n }}\r\n />\r\n );\r\n};\r\n\r\nconst inputWithImageStyles = css`\r\n &.input-with-image {\r\n position: relative;\r\n\r\n iframe {\r\n display: block;\r\n }\r\n\r\n .card-preview {\r\n position: absolute;\r\n right: 6px;\r\n top: 50%;\r\n height: 28px;\r\n margin-top: -14px;\r\n }\r\n }\r\n`;\r\n\r\nconst tokenizerStyles = css`\r\n ${inputWithImageStyles};\r\n\r\n #cardconnect-token-frame {\r\n border-radius: 0.28571429rem;\r\n border: 2px solid #cbcfd1;\r\n }\r\n\r\n &.error #cardconnect-token-frame {\r\n border-color: #e0b4b4;\r\n }\r\n`;\r\n","import {once} from 'lodash';\r\nimport {Plaid} from 'plaid-link';\r\nimport {analytics} from '../../analytics';\r\nimport {PaymentSourcesService} from '../../api/generated/PaymentSourcesService';\r\nimport {loadScript} from '../../utils';\r\nimport {logger} from '../../utils/logger';\r\n\r\nconst PLAID_LINK_SCRIPT_URL = 'https://cdn.plaid.com/link/v2/stable/link-initialize.js';\r\nconst log = logger('PlaidLink');\r\n\r\nexport const initialize = once(() => {\r\n return new Promise((r) => {\r\n const scriptConfig = {\r\n url: PLAID_LINK_SCRIPT_URL,\r\n onload: () => {\r\n analytics.trackEvent('plaid.link-event-occurred', {\r\n subject: 'loaded',\r\n });\r\n r();\r\n },\r\n };\r\n\r\n loadScript(scriptConfig);\r\n });\r\n});\r\n\r\ninterface PlaidLinkConfig {\r\n businessUnitId: number;\r\n sessionIdentifier: string;\r\n onSuccess: Plaid.OnSuccess;\r\n onExit: Plaid.OnExit;\r\n onEvent?: Plaid.OnEvent;\r\n}\r\n\r\nexport const initiateLink = async (config: PlaidLinkConfig) => {\r\n const {businessUnitId, sessionIdentifier, onSuccess, onExit, onEvent} = config;\r\n\r\n const response = await PaymentSourcesService.getPlaidLinkToken({\r\n businessUnitId,\r\n body: {\r\n sessionIdentifier,\r\n },\r\n });\r\n const token = response.data?.linkToken;\r\n\r\n if (token) {\r\n const linkHandler = window.Plaid.create({\r\n token,\r\n onSuccess: (token, metadata) => {\r\n log.info(token, metadata);\r\n onSuccess(token, metadata);\r\n linkHandler?.destroy();\r\n },\r\n onExit: (eventName, metadata) => {\r\n onExit(eventName, metadata);\r\n linkHandler?.destroy();\r\n },\r\n onEvent: (eventName, metadata) => {\r\n log.info(eventName, metadata);\r\n analytics.trackEvent('plaid.link-event-occurred', {\r\n subject: eventName,\r\n businessUnitId,\r\n sessionIdentifier,\r\n });\r\n onEvent?.(eventName, metadata);\r\n },\r\n } as any);\r\n\r\n linkHandler.open();\r\n\r\n return linkHandler;\r\n } else {\r\n throw new Error('Unable to initiate Plaid Link');\r\n }\r\n};\r\n","import {faBuilding} from '@fortawesome/pro-regular-svg-icons';\r\nimport {FontAwesomeIcon} from '@fortawesome/react-fontawesome';\r\nimport {Plaid} from 'plaid-link';\r\nimport React, {useEffect, useRef} from 'react';\r\nimport {StrictButtonProps} from 'semantic-ui-react';\r\nimport {Form} from '../../forms';\r\nimport {useProduce} from '../../hooks/use-produce';\r\nimport {notifications} from '../../utils/notification-service';\r\nimport {initialize, initiateLink} from './link';\r\n\r\ninterface PlaidLinkState {\r\n status: 'Uninitialized' | 'Initialized' | 'Authenticating' | 'Authenticated' | 'Failed';\r\n}\r\n\r\nexport interface PlaidLinkButtonProps extends StrictButtonProps {\r\n businessUnitId: number;\r\n sessionIdentifier: string;\r\n onAccountSelected: (token: string, metadata: Plaid.OnSuccessMetaData) => void;\r\n}\r\n\r\nexport const PlaidLinkButton: React.FC = (props) => {\r\n const [state, setState] = useProduce(() => {\r\n return {\r\n status: 'Uninitialized',\r\n };\r\n });\r\n\r\n const {businessUnitId, sessionIdentifier, onAccountSelected, ...buttonProps} = props;\r\n\r\n const {status} = state;\r\n const plaidBusy = status === 'Uninitialized' || status === 'Authenticating';\r\n\r\n useEffect(() => {\r\n (async () => {\r\n await initialize();\r\n setState((draft) => {\r\n draft.status = 'Initialized';\r\n });\r\n })();\r\n }, [setState]);\r\n\r\n const linkHandler = useRef();\r\n const activatePlaid = async () => {\r\n if (status === 'Authenticating') {\r\n return;\r\n }\r\n\r\n setState((draft) => {\r\n draft.status = 'Authenticating';\r\n });\r\n\r\n linkHandler.current = await initiateLink({\r\n businessUnitId,\r\n sessionIdentifier: sessionIdentifier,\r\n onSuccess: (token, metadata) => {\r\n onAccountSelected(token, metadata);\r\n setState((draft) => {\r\n draft.status = 'Authenticated';\r\n });\r\n\r\n notifications.success('Account Linked!');\r\n linkHandler.current?.destroy();\r\n },\r\n onExit: (eventName, metadata) => {\r\n setState((draft) => {\r\n draft.status = 'Failed';\r\n });\r\n linkHandler.current?.destroy();\r\n },\r\n });\r\n };\r\n\r\n return (\r\n {\r\n activatePlaid();\r\n }}\r\n {...buttonProps}\r\n >\r\n \r\n Verify Bank Account With Plaid\r\n \r\n );\r\n};\r\n","import {darken, lighten, textInputs, transparentize} from 'polished';\r\nimport React from 'react';\r\nimport {useAsync} from 'react-use';\r\nimport {Loader} from 'semantic-ui-react';\r\nimport {Global} from '@emotion/react';\r\nimport {ThemeProvider as EmotionThemeProvider} from '@emotion/react';\r\nimport {css} from '@emotion/react/macro';\r\nimport {DelayedLoadingContainer} from '../components/delayed-loading-container';\r\nimport styled, {defaultTheme, payStarColors} from './styled';\r\n\r\ntype Theme = typeof defaultTheme;\r\n\r\ntype ThemeProvider = {\r\n children: React.ReactNode;\r\n resolveTheme: () => Promise;\r\n};\r\n\r\nexport const ThemeContainer = styled.div`\r\n .ui {\r\n &.buttons .button,\r\n &.button {\r\n font-weight: normal;\r\n\r\n &.primary {\r\n background-color: ${(props) => props.theme.primaryButtonBg || payStarColors.primary.blue};\r\n\r\n &:hover,\r\n &:focus {\r\n &:not(.basic) {\r\n background-color: ${(props) =>\r\n lighten(0.1, props.theme.primaryButtonBg || payStarColors.primary.blue)} !important;\r\n }\r\n }\r\n }\r\n\r\n &.secondary {\r\n background-color: ${(props) => props.theme.secondaryButtonBg || '#e8e8e8'};\r\n box-shadow: 0px 0px 0px 1px ${(props) => props.theme.secondaryButtonShadow} !important;\r\n color: ${(props) => props.theme.secondaryButtonText || payStarColors.textLabel};\r\n\r\n &:hover,\r\n &:focus {\r\n background-color: ${(props) =>\r\n lighten(0.1, props.theme.secondaryButtonBg || '#e8e8e8')} !important;\r\n }\r\n }\r\n }\r\n }\r\n\r\n a {\r\n color: ${(props) => props.theme.primaryColor || payStarColors.primary.blue};\r\n\r\n &.hint {\r\n color: ${(props) => lighten(0.1, props.theme.primaryColor || payStarColors.primary.blue)};\r\n }\r\n }\r\n`;\r\n\r\nconst globalStyles = css`\r\n .root {\r\n position: absolute;\r\n top: 0;\r\n right: 0;\r\n bottom: 0;\r\n left: 0;\r\n }\r\n\r\n .ui {\r\n &.form {\r\n ${textInputs()} {\r\n border-width: 2px;\r\n border-color: ${payStarColors.grey2};\r\n\r\n &:focus {\r\n outline: -webkit-focus-ring-color auto 3px;\r\n }\r\n\r\n &[readonly] {\r\n background: #f1f1f1;\r\n color: #6b6b6b;\r\n &:focus {\r\n outline: none;\r\n background: #f1f1f1;\r\n color: #6b6b6b;\r\n }\r\n }\r\n }\r\n\r\n .field.error {\r\n ${textInputs()} {\r\n background: #fff;\r\n border-color: #e0b4b4;\r\n color: #9f3a38;\r\n box-shadow: none;\r\n }\r\n }\r\n\r\n .dropdown,\r\n .selection.dropdown {\r\n border-width: 2px;\r\n border-color: ${payStarColors.grey2};\r\n\r\n .menu {\r\n border-width: 2px;\r\n border-color: ${payStarColors.grey2};\r\n margin: 0px -2px;\r\n min-width: calc(100% + 4px);\r\n width: calc(100% + 4px);\r\n }\r\n\r\n &:not(.button) > .default.text,\r\n &.default:not(.button) > .text {\r\n color: ${payStarColors.grey1};\r\n }\r\n }\r\n\r\n .field > label,\r\n .field-label {\r\n color: ${payStarColors.textLabel};\r\n font-weight: normal;\r\n font-size: 0.92857143em;\r\n\r\n .hint {\r\n float: right;\r\n }\r\n }\r\n\r\n .success.message,\r\n .warning.message,\r\n .error.message {\r\n display: block;\r\n }\r\n\r\n .error.error input:-webkit-autofill {\r\n box-shadow: inherit !important;\r\n border-color: #cbcfd1 !important;\r\n }\r\n }\r\n\r\n &.input {\r\n &.labeled:not([class*='corner labeled']) .label {\r\n line-height: 1.3rem;\r\n border-width: 2px;\r\n border-color: ${payStarColors.grey2};\r\n padding-top: calc(0.78571429em - 2px);\r\n padding-bottom: calc(0.78571429em - 2px);\r\n background-color: #fff;\r\n\r\n &:first-of-type + input {\r\n border-left: 0;\r\n }\r\n }\r\n\r\n &.action {\r\n > .button {\r\n border: solid 2px ${payStarColors.grey2} !important;\r\n box-shadow: none;\r\n\r\n &:hover {\r\n box-shadow: none;\r\n }\r\n }\r\n\r\n &:not([class*='left action']) {\r\n > input {\r\n border-right-color: ${payStarColors.grey2} !important;\r\n }\r\n\r\n > .button:last-child {\r\n border-left: none !important;\r\n }\r\n }\r\n }\r\n\r\n &.input-file-upload {\r\n .file-upload {\r\n padding: 0 !important;\r\n background: #fff;\r\n\r\n .ui.button {\r\n margin: 0;\r\n border-radius: 0;\r\n }\r\n }\r\n }\r\n }\r\n\r\n &.breadcrumb a {\r\n color: ${payStarColors.primary.lightBlue};\r\n }\r\n\r\n &.table {\r\n font-size: 1rem;\r\n\r\n .error-text {\r\n color: ${payStarColors.errorText} !important;\r\n }\r\n\r\n .muted-text {\r\n color: ${payStarColors.mutedText} !important;\r\n }\r\n\r\n .warning-text {\r\n color: ${payStarColors.warningText} !important;\r\n }\r\n\r\n &.compact th {\r\n padding: 0.528571em 0.78571429em;\r\n }\r\n\r\n &.table tr th {\r\n border-left: none;\r\n }\r\n\r\n &.celled tr th {\r\n border-left: 1px solid rgba(222, 222, 222, 0.43);\r\n }\r\n\r\n thead th {\r\n border-radius: 0 !important;\r\n color: ${payStarColors.blue1};\r\n font-weight: 500;\r\n }\r\n\r\n &.selectable tbody tr {\r\n cursor: pointer;\r\n\r\n &.active,\r\n &.active:hover,\r\n &:hover {\r\n background: #d3eafb !important;\r\n\r\n .ui.label {\r\n /* border: solid 1px; */\r\n }\r\n }\r\n }\r\n\r\n tbody tr,\r\n thead tr {\r\n .hidden-row-action {\r\n opacity: 0;\r\n }\r\n\r\n &:hover .hidden-row-action {\r\n opacity: 1;\r\n }\r\n\r\n td:first-of-type,\r\n th:first-of-type {\r\n padding-left: 30px;\r\n }\r\n\r\n td:last-child,\r\n th:last-child {\r\n padding-right: 30px;\r\n }\r\n }\r\n\r\n &[class*='very basic']&:not(.not-padded) td:last-child {\r\n padding-right: 0.78571429rem !important;\r\n }\r\n }\r\n\r\n &.button {\r\n font-weight: normal;\r\n\r\n &.primary {\r\n background-color: ${payStarColors.primary.blue};\r\n\r\n &:hover,\r\n &:focus {\r\n background-color: ${lighten(0.075, payStarColors.primary.blue)} !important;\r\n }\r\n &:focus {\r\n box-shadow: 0px 0px 0px 1px ${darken(0.04, payStarColors.basicBoxShadow)};\r\n outline: -webkit-focus-ring-color auto 1px;\r\n }\r\n }\r\n\r\n &.secondary {\r\n background-color: #e8e8e8;\r\n color: ${payStarColors.textLabel};\r\n font-weight: normal;\r\n border-radius: 0.28571429rem;\r\n text-transform: none;\r\n text-shadow: none !important;\r\n &:hover,\r\n &:focus {\r\n color: ${payStarColors.textLabel};\r\n background-color: ${darken(0.075, '#e8e8e8')} !important;\r\n }\r\n &:focus {\r\n box-shadow: 0px 0px 0px 1px ${darken(0.04, payStarColors.basicBoxShadow)};\r\n outline: -webkit-focus-ring-color auto 1px;\r\n }\r\n }\r\n\r\n &.tertiary {\r\n background-color: #fff;\r\n color: ${payStarColors.textLabel};\r\n font-weight: normal;\r\n border-radius: 0.28571429rem;\r\n text-transform: none;\r\n text-shadow: none !important;\r\n\r\n &.negative {\r\n color: #db2828;\r\n\r\n &:hover,\r\n &:focus,\r\n &:active {\r\n background: #f9dbdc !important;\r\n color: #db2828;\r\n }\r\n }\r\n\r\n &.primary {\r\n background-color: #fff;\r\n color: ${payStarColors.primary.blue};\r\n\r\n &:hover,\r\n &:focus,\r\n &:active {\r\n background: ${transparentize(0.8, payStarColors.primary.blue)} !important;\r\n color: ${darken(0.1, payStarColors.primary.blue)};\r\n }\r\n }\r\n\r\n &:hover,\r\n &:focus {\r\n color: ${payStarColors.textLabel};\r\n background-color: ${darken(0.075, '#e8e8e8')} !important;\r\n }\r\n &:focus {\r\n box-shadow: 0px 0px 0px 1px ${darken(0.04, payStarColors.basicBoxShadow)};\r\n outline: -webkit-focus-ring-color auto 1px;\r\n }\r\n }\r\n\r\n &.basic {\r\n background-color: ${payStarColors.white1} !important;\r\n color: ${payStarColors.black};\r\n\r\n &:not(.action-button) {\r\n box-shadow: 0px 0px 0px 1px ${payStarColors.basicBoxShadow} !important;\r\n }\r\n &:hover {\r\n box-shadow: 0px 0px 0px 1px ${darken(0.04, payStarColors.basicBoxShadow)};\r\n color: ${darken(0.04, payStarColors.black)} !important;\r\n background-color: ${darken(0.08, payStarColors.white1)} !important;\r\n }\r\n &:focus {\r\n box-shadow: 0px 0px 0px 1px ${darken(0.04, payStarColors.basicBoxShadow)};\r\n color: ${darken(0.04, payStarColors.black)} !important;\r\n background-color: ${darken(0.02, payStarColors.white1)} !important;\r\n }\r\n &:active {\r\n box-shadow: 0px 0px 0px 1px ${darken(0.08, payStarColors.basicBoxShadow)};\r\n color: ${darken(0.08, payStarColors.black)} !important;\r\n background-color: ${darken(0.05, payStarColors.white1)} !important;\r\n }\r\n\r\n &.transparent {\r\n background-color: ${payStarColors.transparent} !important;\r\n &:hover {\r\n background-color: ${payStarColors.transparentHover} !important;\r\n }\r\n &:active {\r\n background-color: ${darken(0.05, payStarColors.transparentHover)} !important;\r\n }\r\n }\r\n\r\n &.warning {\r\n background-color: ${payStarColors.warningBackground} !important;\r\n box-shadow: 0px 0px 0px 1px ${payStarColors.warningBoxShadow} !important;\r\n color: ${payStarColors.warning};\r\n &:hover {\r\n box-shadow: 0px 0px 0px 1px ${darken(0.2, payStarColors.warningBoxShadow)};\r\n color: ${darken(0.2, payStarColors.warning)} !important;\r\n background-color: ${darken(0.03, payStarColors.warningBackground)} !important;\r\n }\r\n &:focus {\r\n box-shadow: 0px 0px 0px 1px ${darken(0.2, payStarColors.warningBoxShadow)};\r\n color: ${darken(0.2, payStarColors.warning)} !important;\r\n background-color: ${darken(0.03, payStarColors.warningBackground)} !important;\r\n }\r\n &:active {\r\n box-shadow: 0px 0px 0px 1px ${darken(0.3, payStarColors.warningBoxShadow)};\r\n color: ${darken(0.3, payStarColors.warning)} !important;\r\n background-color: ${darken(0.05, payStarColors.warningBackground)} !important;\r\n }\r\n }\r\n\r\n &.clear {\r\n background-color: transparent !important;\r\n box-shadow: none !important;\r\n\r\n &:hover,\r\n &:focus {\r\n background-color: rgba(27, 28, 29, 0.1) !important;\r\n }\r\n }\r\n }\r\n\r\n &.link {\r\n background: transparent none;\r\n color: rgba(0, 0, 0, 0.6);\r\n font-weight: normal;\r\n border-radius: 0.28571429rem;\r\n text-transform: none;\r\n text-shadow: none !important;\r\n display: inline-block;\r\n padding: 5px 0px;\r\n &:hover {\r\n color: rgba(0, 0, 0, 0.8);\r\n }\r\n &:focus {\r\n box-shadow: 0px 0px 0px 1px ${darken(0.04, payStarColors.basicBoxShadow)};\r\n color: ${darken(0.04, payStarColors.black)} !important;\r\n background-color: ${darken(0.02, payStarColors.white1)} !important;\r\n outline: -webkit-focus-ring-color auto 1px;\r\n }\r\n &:active {\r\n background: #f8f8f8;\r\n }\r\n }\r\n\r\n &.white {\r\n background: #fff !important;\r\n box-shadow: 0px 0px 0px 1px rgba(107, 112, 117, 0.35) inset,\r\n 0px 0px 0px 0px rgba(50, 53, 56, 0.15) inset;\r\n }\r\n\r\n &.clear {\r\n background: transparent none;\r\n color: rgba(0, 0, 0, 0.6);\r\n font-weight: normal;\r\n border-radius: 0.28571429rem;\r\n text-transform: none;\r\n text-shadow: none !important;\r\n &:hover {\r\n color: rgba(0, 0, 0, 0.8);\r\n }\r\n &:focus {\r\n box-shadow: 0px 0px 0px 1px ${darken(0.04, payStarColors.basicBoxShadow)};\r\n color: ${darken(0.04, payStarColors.black)} !important;\r\n background-color: ${transparentize(0.9, payStarColors.black)} !important;\r\n outline: -webkit-focus-ring-color auto 1px;\r\n }\r\n &:active {\r\n background: #f8f8f8;\r\n }\r\n }\r\n\r\n &.no-focus:not(:active) {\r\n box-shadow: none !important;\r\n outline: none !important;\r\n }\r\n }\r\n\r\n &.header {\r\n &.no-margin {\r\n margin: 0;\r\n }\r\n\r\n &.small {\r\n font-weight: 500;\r\n font-size: 0.971429rem;\r\n }\r\n\r\n &.inverted.attached {\r\n background-color: ${payStarColors.primary.blue};\r\n }\r\n\r\n &.icon svg {\r\n display: block;\r\n line-height: 1;\r\n padding: 0em;\r\n font-size: 3em;\r\n }\r\n\r\n &.icon > svg {\r\n margin: 0em auto 0.5rem;\r\n }\r\n }\r\n\r\n &.buttons > .ui.button:not(.basic):not(.inverted),\r\n &.buttons:not(.basic):not(.inverted) > .button,\r\n &.buttons .ui.button:not(.basic):not(.inverted),\r\n &.buttons:not(.basic):not(.inverted) .button {\r\n box-shadow: 0px 0px 0px 1px transparent inset, 0px 0em 0px 0px rgba(34, 36, 38, 0.15) inset;\r\n }\r\n\r\n &.menu {\r\n &.pagination {\r\n border: 1px solid ${payStarColors.basicBoxShadow};\r\n box-shadow: none;\r\n\r\n .item:before {\r\n background: ${payStarColors.basicBoxShadow};\r\n }\r\n }\r\n\r\n &.secondary.pointing .active.item {\r\n font-weight: normal;\r\n color: ${payStarColors.primary.blue};\r\n border-color: ${payStarColors.primary.blue};\r\n }\r\n }\r\n\r\n &.page.modals {\r\n z-index: 1000;\r\n }\r\n\r\n &.modal {\r\n &.basic {\r\n .ui.segment {\r\n color: #0a2233;\r\n }\r\n\r\n > .close {\r\n padding: 0.6rem 0rem 0rem 0.1rem;\r\n border: solid 2px #fff;\r\n box-shadow: 0px 0px 5px 0px rgba(0, 0, 0, 0.88);\r\n background: #000;\r\n color: #fff;\r\n border-radius: 4rem;\r\n font-size: 0.9rem;\r\n top: 0.5rem;\r\n right: 0.3rem;\r\n opacity: 1;\r\n }\r\n }\r\n\r\n .close-icon {\r\n position: absolute;\r\n right: -1rem;\r\n top: -1rem;\r\n\r\n .ui.button {\r\n width: 2rem;\r\n height: 2rem;\r\n padding: 0;\r\n border: solid 2px #fff;\r\n box-shadow: 0px 0px 5px 0px rgba(0, 0, 0, 0.88);\r\n }\r\n }\r\n\r\n .content .actions {\r\n margin: 15px -1.5rem -1.5rem;\r\n padding: 15px 10px;\r\n border-top: solid 1px rgba(0, 0, 0, 0.2);\r\n background: rgba(0, 0, 0, 0.02);\r\n }\r\n\r\n & > .actions {\r\n text-align: left;\r\n }\r\n\r\n .ui.form .form-actions {\r\n margin: 2em -1em -1em !important;\r\n padding: 1.5em 1em 1.5em 1em !important;\r\n }\r\n\r\n .ui.dimmer:not(.active) + .ui.loader {\r\n display: none;\r\n }\r\n }\r\n\r\n &.segment {\r\n display: block;\r\n border: 1px solid rgba(34, 36, 38, 0.3);\r\n\r\n padding: 2em;\r\n @media only screen and (max-width: 767px) {\r\n padding: 1em;\r\n }\r\n\r\n &.padding-sm {\r\n padding: 1em;\r\n }\r\n\r\n &.placeholder {\r\n min-height: 8rem;\r\n display: flex;\r\n }\r\n }\r\n\r\n &.tab {\r\n &.basic.segment {\r\n padding: 0;\r\n }\r\n }\r\n\r\n &.statistic {\r\n .label {\r\n text-align: left;\r\n font-weight: normal;\r\n }\r\n }\r\n\r\n &.dimmer {\r\n background-color: rgba(0, 0, 0, 0.75);\r\n }\r\n\r\n a.hint {\r\n float: right;\r\n font-weight: normal;\r\n font-size: 1rem;\r\n }\r\n }\r\n\r\n .secondary-navigation {\r\n background-color: #fff;\r\n padding: 6px 0;\r\n border-bottom: 2px solid #d9d9da;\r\n\r\n .ui.container {\r\n max-width: 1330px !important;\r\n\r\n @media only screen and (max-width: 767px) {\r\n margin-left: 0 !important;\r\n margin-right: 0 !important;\r\n }\r\n }\r\n\r\n .ui.secondary.pointing.menu {\r\n border-bottom: 2px solid #d9d9da;\r\n margin-bottom: -8px;\r\n }\r\n }\r\n\r\n .muted,\r\n .muted label {\r\n color: ${payStarColors.mutedText} !important;\r\n }\r\n\r\n .text-bold {\r\n font-weight: 600;\r\n }\r\n\r\n .relative {\r\n position: relative !important;\r\n }\r\n\r\n .clearfix:after {\r\n content: '';\r\n display: table;\r\n clear: both;\r\n }\r\n\r\n .react-toast-notifications__container {\r\n z-index: 10000 !important;\r\n }\r\n\r\n [data-reach-skip-link]:focus {\r\n z-index: 10;\r\n }\r\n\r\n [data-reach-tab-list] {\r\n margin: 0 0 1em 0;\r\n display: inline-block;\r\n background: #fff;\r\n border-radius: 5px;\r\n padding: 4px;\r\n border: 1px solid rgba(34, 36, 38, 0.15);\r\n box-shadow: 0px 1px 2px 0 rgba(34, 36, 38, 0.15);\r\n }\r\n\r\n [data-reach-tab-panel] {\r\n outline: none;\r\n }\r\n\r\n [data-reach-tab] {\r\n display: inline-block;\r\n padding: 0.25em 0.5em;\r\n margin: 0;\r\n background: none;\r\n color: inherit;\r\n font: inherit;\r\n cursor: pointer;\r\n -webkit-appearance: none;\r\n -moz-appearance: none;\r\n align-self: flex-end;\r\n border: none;\r\n margin: 0 2.5px 0;\r\n padding: 0.557143em 1.14285714em;\r\n border-bottom-width: 2px;\r\n transition: color 0.1s ease;\r\n background-color: transparent;\r\n color: #0a2233;\r\n border-radius: 5px;\r\n\r\n &:hover {\r\n background: rgba(0, 0, 0, 0.05);\r\n }\r\n\r\n &[data-selected] {\r\n background: #185885;\r\n color: #fff;\r\n }\r\n\r\n &:first-of-type {\r\n margin-left: 0px;\r\n }\r\n\r\n &:last-of-type {\r\n margin-right: 0px;\r\n }\r\n }\r\n\r\n [data-reach-tab]:disabled {\r\n opacity: 0.25;\r\n cursor: default;\r\n }\r\n\r\n [data-reach-menu-list],\r\n [data-reach-menu-items] {\r\n box-shadow: 0px 1px 3px 0px rgba(0, 0, 0, 0.08);\r\n border-radius: 0.26666667rem;\r\n margin-top: 0.33333333em;\r\n padding: 0;\r\n }\r\n\r\n [data-reach-menu-item][data-selected] {\r\n background: rgba(0, 0, 0, 0.05) !important;\r\n color: rgba(0, 0, 0, 0.95) !important;\r\n }\r\n\r\n [data-reach-menu-button][aria-expanded='true'] {\r\n background: rgba(20, 74, 111, 0.2) !important;\r\n color: #0c2d44;\r\n }\r\n`;\r\n\r\nexport const GlobalStyles = () => ;\r\n\r\nconst DEFAULT_RESOLVE_THEME = (): Promise => Promise.resolve(defaultTheme);\r\n\r\nexport const ThemeProvider = ({children, resolveTheme}: ThemeProvider) => {\r\n const fetchTheme = useAsync(resolveTheme);\r\n\r\n if (fetchTheme.loading) {\r\n return (\r\n \r\n \r\n Loading...\r\n \r\n \r\n );\r\n }\r\n\r\n if (fetchTheme.error || !fetchTheme.value) {\r\n return
Error
;\r\n }\r\n\r\n return (\r\n \r\n {children}\r\n \r\n );\r\n};\r\n\r\nThemeProvider.defaultProps = {\r\n resolveTheme: DEFAULT_RESOLVE_THEME,\r\n};\r\n","export default __webpack_public_path__ + \"static/media/icon-cvv.a5824339.svg\";","import type {ChildBridgeProps} from '../_packages/embedded/types';\r\n\r\nexport const ChildBridge: ChildBridgeProps = (window as any).xprops;\r\n","import {useState} from 'react';\r\nimport {useDebounce} from 'react-use';\r\n\r\nexport function useDebouncedState(defaultValue: T, delay) {\r\n const [val, setVal] = useState(defaultValue);\r\n const [debouncedValue, setDebouncedValue] = useState(defaultValue);\r\n\r\n useDebounce(\r\n () => {\r\n setDebouncedValue(val);\r\n },\r\n delay,\r\n [val]\r\n );\r\n\r\n return [debouncedValue, setVal] as [T, (newValue: T) => void];\r\n}\r\n","export const terms = `\r\nWhen signing up for Paystar’s Autopay or recurring billing payments by card or eCheck, you understand and agree that: \r\n\r\n* You are voluntarily opting into this service. You are not required to use this service, and it is being provided to you solely as an optional way for you to pay your billed amount or account balance.\r\n* You must become a registered user within the Paystar Payment Platform and add an email address to your account profile. If you opt out of receiving emails or other electronic communications from Paystar then you will be automatically canceled out of Autopay or recurring billing payments.\r\n* You will receive all notifications via email or other electronic communications and you agree that all agreements, notices, disclosures and other communications that we provide to you electronically satisfy any legal requirement that such communications be in writing. \r\n* The biller, the company or entity to which you are making a payment, is solely responsible for uploading billed amounts or account balances. The biller is solely responsible for the accuracy of the billed amount or account balance owed by you.\r\n* The credit or debit card or checking or savings account (“card or other payment account”) you input and save as your payment method will automatically be debited each time a payment is due. The amount owed will be debited on the due date or can be debited up to five (5) days before the due date if you select an earlier date.\r\n* Your card or other payment account will be debited for the amount owed or for the maximum amount you select regardless of whether the amount owed is constantly the same amount owed or if the amount owed changes or has a variable rate in subsequent billing cycles. \r\n* Importantly, if you select a maximum amount at which your card or other payment account can be debited, and if the billed amount or account balance owed by you is more than the previously set maximum amount, then your card or other payment account will not be debited. You will be notified that this payment amount will not be debited.\r\n* Importantly, if a service fee is owed by you in addition to your billed amount or account balance owed, then your card or other payment account will be debited for both the service fee and amount owed to your biller. \r\n* It is your sole responsibility to cancel a scheduled card or other payment account if you move or sell your home or business. Failure to do so may result in service fees and continued withdrawals from your card or other payment account. \r\n* It is your sole responsibility to cancel Paystar’s online Autopay or recurring billing payments and deactivate any unwanted notifications if you no longer desire to use Paystar’s online automatic payment functions.\r\n* You have the ability to cancel an automatic or future payment up to nine (9) hours before the scheduled payment date.\r\n* It is your sole responsibility and you agree to ensure that the payment method information you provide is and remains accurate. Failure to do so could result in a failed payment and additional service/return fees.\r\n* If your card or other payment account number changes or your credit or debit card expiration date changes, you agree to provide Paystar that updated information. Paystar will not be responsible for any payment processing errors or fees incurred if you fail to provide accurate information. \r\n* If you are currently set up for automatic payments through your bank and are changing over to Paystar’s Autopay or recurring billing payments, then please contact your bank and/or the billing department to cancel your bank’s automatic payments. Failure to do so may result in multiple withdrawals and additional service fees. \r\n* Finally, other applicable Terms and Conditions are incorporated here by reference, and may be found at [https://www.paystar.io/legal](https://www.paystar.io/legal). \r\n`.trim();\r\n","import {first} from 'lodash';\r\nimport {Plaid} from 'plaid-link';\r\nimport React from 'react';\r\nimport {useForm} from 'react-final-form';\r\nimport {Divider, FormField, Header, Image, Input, List, Segment} from 'semantic-ui-react';\r\nimport {AchAccountHolderTypes} from '../../api/generated/enums';\r\nimport {Flex} from '../../components/flex';\r\nimport {Form} from '../../forms';\r\nimport {useProduce} from '../../hooks/use-produce';\r\nimport {PlaidLinkButton} from './link-button';\r\n\r\ninterface PlaidLinkState {\r\n plaidLinkData?: {\r\n token: string;\r\n account: Plaid.Account;\r\n };\r\n}\r\n\r\nexport interface PlaidLinkFormData {\r\n token: string;\r\n plaidAccountId: string;\r\n}\r\n\r\ninterface Props {\r\n businessUnitId: number;\r\n sessionIdentifier: string;\r\n onAccountSelected: (token: string, metadata: Plaid.OnSuccessMetaData) => void;\r\n}\r\n\r\nexport const PlaidLinkForm: React.FC = (props) => {\r\n const [state, setState] = useProduce(() => {\r\n return {};\r\n });\r\n\r\n const form = useForm();\r\n\r\n return (\r\n <>\r\n \r\n \r\n \r\n
\r\n Verify Bank Account\r\n \r\n Paystar uses Plaid to securely verify bank\r\n accounts\r\n \r\n
\r\n
\r\n \r\n \r\n \r\n
\r\n \r\n \r\n Secure - Plaid uses bank level security throughout\r\n \r\n \r\n Private - Your account credentials never touch Paystar servers\r\n \r\n \r\n Trusted - Plaid integrates with over 11,000+ financial institutions in\r\n the US\r\n \r\n \r\n
\r\n {state.plaidLinkData ? (\r\n <>\r\n \r\n
Complete Account Verification
\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n ) : (\r\n {\r\n const account = first(metadata.accounts);\r\n if (account) {\r\n setState((draft) => {\r\n draft.plaidLinkData = {\r\n token,\r\n account,\r\n };\r\n });\r\n\r\n form.batch(() => {\r\n form.change('accountHolderName', account.name);\r\n form.change('achAccountHolderType', AchAccountHolderTypes.Personal);\r\n });\r\n }\r\n\r\n props.onAccountSelected(token, metadata);\r\n }}\r\n />\r\n )}\r\n
\r\n
\r\n \r\n );\r\n};\r\n","import {useEffect} from 'react';\r\nimport {SubscriptionEvents} from './use-subscription';\r\n\r\ntype MessageHandlerConfig = {\r\n onMessage: (event: MessageEvent) => void;\r\n filter?: (event: MessageEvent) => boolean;\r\n};\r\n\r\nconst DEFAULT_FILTER = () => true;\r\n\r\nexport const usePostMessageHandler = ({\r\n filter = DEFAULT_FILTER,\r\n onMessage,\r\n}: MessageHandlerConfig) => {\r\n useEffect(() => {\r\n const receiveMessage = (event: MessageEvent) => {\r\n if (filter(event)) {\r\n onMessage(event);\r\n }\r\n };\r\n\r\n window.addEventListener('message', receiveMessage, false);\r\n return () => {\r\n window.removeEventListener('message', receiveMessage);\r\n };\r\n }, [filter, onMessage]);\r\n};\r\n\r\nexport const useOnWindowCloseEvent = (event: SubscriptionEvents) => {\r\n useEffect(() => {\r\n window.onbeforeunload = () => {\r\n if (window.opener) {\r\n window.opener.postMessage(event, '*');\r\n }\r\n };\r\n\r\n return () => {\r\n window.onbeforeunload = null;\r\n };\r\n }, [event]);\r\n return null;\r\n};\r\n","import {takeRight, upperFirst} from 'lodash';\r\nimport moment from 'moment';\r\nimport React, {useEffect, useMemo, useRef} from 'react';\r\nimport {Field, useForm} from 'react-final-form';\r\nimport {Loader, Form as SemanticForm} from 'semantic-ui-react';\r\nimport {cx} from '@emotion/css';\r\nimport {css} from '@emotion/react/macro';\r\nimport {useMatch} from '@reach/router';\r\nimport {analytics} from '../../analytics';\r\nimport {CardBrands} from '../../api/generated/enums';\r\nimport {CardBrandImage} from '../../components/card-brand';\r\nimport {Form} from '../../forms';\r\nimport {SubmitError} from '../../forms/submit-error';\r\nimport {useProduce} from '../../hooks/use-produce';\r\nimport {routes} from '../../routes';\r\nimport {useScript} from '../../utils';\r\nimport {logger} from '../../utils/logger';\r\nimport {BillingAddressFormFields} from '../billing-address-form-fields';\r\nimport {creditCardKeys, fieldKeys} from '../index';\r\nimport {useTokenizationConfig} from '../tokenization-context';\r\nimport {CardTokenizerProps} from '../types';\r\nimport {CollectJsConfig, TokenizationReponse} from './types';\r\n\r\nconst log = logger('nmi tokenizer');\r\n\r\ninterface State {\r\n initialized: boolean;\r\n tokenizing: boolean;\r\n fieldState: {\r\n ccnumber: {\r\n valid: boolean;\r\n message: string;\r\n touched: boolean;\r\n };\r\n ccexp: {valid: boolean; message: string; touched: boolean};\r\n cvv: {valid: boolean; message: string; touched: boolean};\r\n };\r\n tokenizationReponse?: TokenizationReponse;\r\n}\r\n\r\nconst initializeCollectJs = (config: CollectJsConfig) => {\r\n (window as any).CollectJS.configure({\r\n customCss: {},\r\n // more css options available\r\n validationCallback: config.validationCallback,\r\n fieldsAvailableCallback: config.fieldsAvailableCallback,\r\n fields: {\r\n ccnumber: {\r\n selector: `#${creditCardKeys.accountNumberToken}`,\r\n title: 'Card Number',\r\n placeholder: '0000 0000 0000 0000',\r\n },\r\n ccexp: {\r\n selector: `#${creditCardKeys.cardExpiration}`,\r\n title: 'Expiration',\r\n placeholder: '00 / 00',\r\n },\r\n cvv: {\r\n display: 'show',\r\n selector: `#${creditCardKeys.cardCvv}`,\r\n title: 'CVV Code',\r\n placeholder: '***',\r\n },\r\n },\r\n variant: 'inline',\r\n callback: config.tokenizeCallback,\r\n });\r\n};\r\n\r\n// FIXME: Move to backend\r\nconst cardBrandMap = {\r\n amex: CardBrands.Amex,\r\n discover: CardBrands.Discover,\r\n mastercard: CardBrands.Mastercard,\r\n visa: CardBrands.Visa,\r\n};\r\n\r\nexport const buildCollectJsToken = (response: TokenizationReponse) => {\r\n if (response.token && response.card) {\r\n const {\r\n token,\r\n card: {number, exp, type, hash},\r\n } = response;\r\n\r\n // prefix:token|last4|expiration|type|hash\r\n const last4 = takeRight(number, 4).join('');\r\n const tokenParts = [token, last4, exp, type, hash].join('|');\r\n const nmiToken = `nmi_card:${tokenParts}`;\r\n const accountNumberMasked = `************${last4}`;\r\n\r\n return {\r\n token: nmiToken,\r\n type,\r\n exp,\r\n accountNumberMasked,\r\n };\r\n }\r\n\r\n return undefined;\r\n};\r\n\r\nexport const NmiFields: React.FC = ({\r\n onLoad,\r\n onCardInfo,\r\n billingAddressCollectionType,\r\n cvv = true,\r\n}) => {\r\n const targetInputRef = useRef(null);\r\n const config = useTokenizationConfig<{tokenizationKey: string}>();\r\n const [state, setState] = useProduce({\r\n initialized: false,\r\n tokenizing: false,\r\n fieldState: {\r\n ccnumber: {valid: false, message: '', touched: false},\r\n ccexp: {valid: false, message: '', touched: false},\r\n cvv: {valid: false, message: '', touched: false},\r\n },\r\n });\r\n const isCheckoutPage = useMatch(routes.checkout.base);\r\n\r\n const {initialized} = state;\r\n const tokenizationKey = config?.properties.tokenizationKey || '';\r\n\r\n const form = useForm();\r\n\r\n const collectJsConfig = useMemo(() => {\r\n const scriptConfig = {\r\n url: 'https://paystar.transactiongateway.com/token/Collect.js',\r\n attributes: {\r\n 'data-tokenization-key': tokenizationKey,\r\n },\r\n onload: () => {\r\n if (!initialized) {\r\n setState((draft) => {\r\n draft.initialized = true;\r\n });\r\n\r\n analytics.trackEvent('nmi.tokenizer-loaded', {\r\n subject: tokenizationKey,\r\n });\r\n\r\n initializeCollectJs({\r\n fieldsAvailableCallback: () => {\r\n onLoad?.();\r\n },\r\n validationCallback: (field, valid, message) => {\r\n setState((draft) => {\r\n const fieldState = draft.fieldState[field];\r\n fieldState.valid = valid;\r\n fieldState.message = message;\r\n fieldState.touched = true;\r\n });\r\n },\r\n tokenizeCallback: (response) => {\r\n setState((draft) => {\r\n draft.tokenizationReponse = response;\r\n draft.tokenizing = false;\r\n });\r\n\r\n const tokenInfo = buildCollectJsToken(response);\r\n\r\n if (tokenInfo) {\r\n form.batch(() => {\r\n form.change(fieldKeys.accountNumberToken, tokenInfo.token);\r\n form.change(fieldKeys.accountNumberMasked, tokenInfo.accountNumberMasked);\r\n const parsedExpiration = moment(tokenInfo.exp ?? '', 'MMYY');\r\n const expiration = parsedExpiration.format('MM/YY');\r\n\r\n form.change(fieldKeys.cardExpiration, expiration);\r\n });\r\n\r\n const brand = cardBrandMap[tokenInfo.type] || CardBrands.Unknown;\r\n\r\n onCardInfo?.({type: brand});\r\n }\r\n },\r\n });\r\n }\r\n },\r\n };\r\n\r\n log.info('initializing Collect.js', scriptConfig);\r\n\r\n return scriptConfig;\r\n // eslint-disable-next-line react-hooks/exhaustive-deps\r\n }, [initialized, tokenizationKey]);\r\n\r\n useScript(collectJsConfig);\r\n\r\n const canTokenize = useMemo(() => {\r\n const {ccnumber, ccexp, cvv} = state.fieldState;\r\n return ccnumber.valid && ccexp.valid && cvv.valid;\r\n }, [state.fieldState]);\r\n\r\n useEffect(() => {\r\n if (canTokenize) {\r\n setState((draft) => {\r\n draft.tokenizing = true;\r\n });\r\n (window as any).CollectJS.startPaymentRequest();\r\n }\r\n }, [canTokenize, setState]);\r\n\r\n var cardBrand = upperFirst(state.tokenizationReponse?.card?.type || CardBrands.Unknown);\r\n\r\n return (\r\n <>\r\n {\r\n return (\r\n
\r\n \r\n \r\n
\r\n \r\n
\r\n
\r\n \r\n
\r\n );\r\n }}\r\n />\r\n\r\n
\r\n {\r\n return (\r\n
\r\n \r\n \r\n
\r\n
\r\n {state.tokenizing ? (\r\n \r\n ) : (\r\n \r\n )}\r\n
\r\n \r\n \r\n
\r\n );\r\n }}\r\n />\r\n\r\n \r\n {\r\n return (\r\n
\r\n \r\n \r\n \r\n {/* */}\r\n
\r\n \r\n \r\n \r\n );\r\n }}\r\n />\r\n\r\n {\r\n return (\r\n
\r\n \r\n \r\n \r\n {/* */}\r\n
\r\n \r\n \r\n \r\n );\r\n }}\r\n />\r\n
\r\n \r\n\r\n \r\n \r\n );\r\n};\r\n\r\nconst nmiStyles = css`\r\n .nmi-tokenized-field {\r\n font-family: 'Roboto', 'Helvetica Neue', Arial, Helvetica, sans-serif;\r\n margin: 0em;\r\n outline: none;\r\n width: 100%;\r\n line-height: 1.21428571em;\r\n font-size: 1em;\r\n background: #ffffff;\r\n color: #0a2233;\r\n border-radius: 0.26666667rem;\r\n box-shadow: 0em 0em 0em 0em transparent inset;\r\n min-height: 40px;\r\n background: #f3f3f3;\r\n }\r\n\r\n .input-with-image {\r\n position: relative;\r\n\r\n .ui.image {\r\n position: absolute;\r\n max-height: 2rem;\r\n right: 0.4rem;\r\n top: 0.4rem;\r\n }\r\n\r\n .tokenization-loader {\r\n position: absolute !important;\r\n top: 0.6rem !important;\r\n right: 0.5rem !important;\r\n left: unset !important;\r\n }\r\n }\r\n`;\r\n","import {PaymentSourceTypes} from '../api/generated/enums';\r\nimport {\r\n CreditCardConfig as _CreditCardConfig,\r\n PaymentSourceSummaryDto,\r\n} from '../api/generated/index.defs';\r\nimport {Env} from '../config/env-vars';\r\n\r\nexport type CreditCardConfig =\r\n | _CreditCardConfig\r\n | {\r\n gatewayType: _CreditCardConfig['gatewayType'];\r\n tokenizerProperties: _CreditCardConfig['tokenizer']['properties'];\r\n };\r\n\r\nexport const paymentSourceIsAvailableForGateway = (\r\n paymentSource: PaymentSourceSummaryDto,\r\n creditCardConfig: CreditCardConfig\r\n) => {\r\n const {accountNumberTokenMasked, paymentSourceType} = paymentSource;\r\n\r\n if (paymentSourceType === PaymentSourceTypes.ACH) {\r\n return true;\r\n }\r\n\r\n if (creditCardConfig.gatewayType === 'NMI') {\r\n return accountNumberTokenMasked.startsWith('nmi');\r\n }\r\n\r\n // must be card connect from here on\r\n\r\n if (accountNumberTokenMasked.startsWith('*')) {\r\n return true;\r\n }\r\n\r\n const tokenizerProperties: {url?: string} | undefined =\r\n 'tokenizer' in creditCardConfig\r\n ? (creditCardConfig.tokenizer.properties as {url?: string})\r\n : (creditCardConfig.tokenizerProperties as {url?: string});\r\n const tokenizerUrl = tokenizerProperties?.url || Env.cardConnectBaseUrl;\r\n\r\n if (!tokenizerUrl) {\r\n return false;\r\n }\r\n\r\n const tokenizerSubdomain = new URL(tokenizerUrl).hostname.split('.')[0];\r\n const tokenSubdomain = accountNumberTokenMasked.split('|').pop();\r\n\r\n return tokenizerSubdomain === tokenSubdomain;\r\n};\r\n","/* eslint-disable */\r\n\r\nimport {\r\n AdvancedQueryColumnFilter,\r\n AdvancedQueryColumnSort,\r\n PaymentSummaryDto,\r\n Currency,\r\n PaymentSourceJsonDto,\r\n ServiceFeeCalculationDto,\r\n ServiceFeeTierGetDto,\r\n IList,\r\n List,\r\n Response,\r\n AdvancedQueryPage,\r\n IRequestOptions,\r\n IRequestConfig,\r\n getConfigs,\r\n axios,\r\n basePath\r\n} from './index.defs';\r\n\r\nexport class ServiceFeesService {\r\n /** Generate by swagger-axios-codegen */\r\n // @ts-nocheck\r\n /* eslint-disable */\r\n\r\n /**\r\n *\r\n */\r\n static getSummaries(\r\n params: {\r\n /** */\r\n page?: number;\r\n /** */\r\n pageSize?: number;\r\n /** */\r\n searchFieldNames?: string[];\r\n /** */\r\n searchSearchText?: string;\r\n /** */\r\n searchExactMatch?: boolean;\r\n /** */\r\n filtered?: AdvancedQueryColumnFilter[];\r\n /** */\r\n sorted?: AdvancedQueryColumnSort[];\r\n } = {} as any,\r\n options: IRequestOptions = {}\r\n ): Promise>> {\r\n return new Promise((resolve, reject) => {\r\n let url = basePath + '/api/service-fees';\r\n\r\n const configs: IRequestConfig = getConfigs('get', 'application/json', url, options);\r\n configs.params = {\r\n Page: params['page'],\r\n PageSize: params['pageSize'],\r\n 'Search.FieldNames': params['searchFieldNames'],\r\n 'Search.SearchText': params['searchSearchText'],\r\n 'Search.ExactMatch': params['searchExactMatch'],\r\n Filtered: params['filtered'],\r\n Sorted: params['sorted']\r\n };\r\n let data = null as any;\r\n\r\n configs.data = data;\r\n axios(configs, resolve, reject);\r\n });\r\n }\r\n /**\r\n *\r\n */\r\n static calculateServiceFees(\r\n params: {\r\n /** */\r\n businessUnitId?: number;\r\n /** */\r\n baseAmount?: number;\r\n /** */\r\n channel?: string;\r\n /** */\r\n scope?: string;\r\n /** */\r\n paymentSourceTypes?: string[];\r\n } = {} as any,\r\n options: IRequestOptions = {}\r\n ): Promise>> {\r\n return new Promise((resolve, reject) => {\r\n let url = basePath + '/api/service-fees/calculate';\r\n\r\n const configs: IRequestConfig = getConfigs('post', 'application/json', url, options);\r\n configs.params = {\r\n BusinessUnitId: params['businessUnitId'],\r\n BaseAmount: params['baseAmount'],\r\n Channel: params['channel'],\r\n Scope: params['scope'],\r\n PaymentSourceTypes: params['paymentSourceTypes']\r\n };\r\n let data = null as any;\r\n\r\n configs.data = data;\r\n axios(configs, resolve, reject);\r\n });\r\n }\r\n}\r\n","import {camelCase} from 'lodash';\r\nimport {AnyObject} from '../types';\r\nimport {\r\n AccountSummaryDto,\r\n PaymentFieldDetailDto,\r\n PaymentIntentConfig,\r\n PaymentIntentDetailDto,\r\n} from '../api/generated/index.defs';\r\n\r\ntype UsePaymentFieldsResult = {\r\n initialValues: Record;\r\n visibleFields: PaymentFieldDetailDto[];\r\n hiddenFields: PaymentFieldDetailDto[];\r\n};\r\n\r\nconst accountKeys = Object.keys(new AccountSummaryDto());\r\n\r\nexport const usePaymentFields = (\r\n paymentIntentConfig: PaymentIntentConfig,\r\n paymentIntentOrAccount: AnyObject,\r\n renderPaymentDescriptor: boolean = false,\r\n renderAllAccountMappedFields: boolean = false,\r\n renderAllUnmappedFields: boolean = false\r\n) => {\r\n const isPaymentIntent = isPaymentIntentDetailDto(paymentIntentOrAccount);\r\n const sourceData = isPaymentIntent\r\n ? paymentIntentOrAccount.paymentFields ?? {}\r\n : paymentIntentOrAccount ?? {};\r\n\r\n const result = paymentIntentConfig.paymentFields.reduce(\r\n (acc, configField) => {\r\n const key = isPaymentIntent ? configField.key : camelCase(configField.key);\r\n\r\n const initialValue = getInitialValueForField(key, sourceData, configField, isPaymentIntent);\r\n\r\n const hasValue = !!initialValue[camelCase(key)];\r\n const shouldShow = shouldShowField(\r\n configField,\r\n hasValue,\r\n renderPaymentDescriptor,\r\n renderAllAccountMappedFields,\r\n renderAllUnmappedFields\r\n );\r\n\r\n return {\r\n initialValues: {\r\n ...acc.initialValues,\r\n ...initialValue,\r\n },\r\n visibleFields: [...acc.visibleFields, ...(shouldShow ? [configField] : [])],\r\n hiddenFields: [...acc.hiddenFields, ...(shouldShow ? [] : [configField])],\r\n };\r\n },\r\n {\r\n initialValues: {},\r\n visibleFields: [],\r\n hiddenFields: [],\r\n } as UsePaymentFieldsResult\r\n );\r\n\r\n return result;\r\n};\r\n\r\nfunction isPaymentIntentDetailDto(arg: unknown): arg is PaymentIntentDetailDto {\r\n return arg !== null && typeof arg === 'object' && 'sessionIdentifier' in arg;\r\n}\r\n\r\nfunction getInitialValueForField(\r\n key: string,\r\n sourceData: AnyObject,\r\n paymentFieldConfig: PaymentFieldDetailDto,\r\n isPaymentIntent: boolean\r\n) {\r\n const camelCasedKey = camelCase(key);\r\n let value = '';\r\n if (paymentFieldConfig.accountFieldMappingKey) {\r\n if (paymentFieldConfig.accountFieldMappingKey === 'Address') {\r\n const address = sourceData[key] ?? '';\r\n value = typeof address === 'string' ? address : JSON.stringify(address);\r\n } else if (paymentFieldConfig.accountFieldMappingKey === 'Zip') {\r\n const zipKey = isPaymentIntent ? 'ZipCode' : 'zipCode';\r\n const addressKey = isPaymentIntent ? 'Address' : 'address';\r\n value =\r\n sourceData[zipKey] ?? (sourceData[addressKey] && sourceData[addressKey][zipKey]) ?? '';\r\n } else {\r\n const casedAccountFieldMappingKey = isPaymentIntent\r\n ? paymentFieldConfig.accountFieldMappingKey\r\n : camelCase(paymentFieldConfig.accountFieldMappingKey);\r\n value = sourceData[casedAccountFieldMappingKey] ?? sourceData[key] ?? '';\r\n }\r\n } else {\r\n if (isPaymentIntent || !accountKeys.some((x) => camelCasedKey === x)) {\r\n value = sourceData[key] ?? '';\r\n }\r\n }\r\n\r\n return {\r\n [camelCasedKey]: value,\r\n };\r\n}\r\n\r\nfunction shouldShowField(\r\n field: PaymentFieldDetailDto,\r\n hasValue: boolean,\r\n renderPaymentDescriptor: boolean,\r\n renderAccountMappedFields: boolean,\r\n renderUnmappedFields: boolean\r\n) {\r\n if (field.key.toLowerCase() === 'paymentdescriptor') return renderPaymentDescriptor;\r\n if (renderAccountMappedFields && field.accountFieldMappingKey) return true;\r\n if (renderUnmappedFields && !field.accountFieldMappingKey) return true;\r\n\r\n return !hasValue;\r\n}\r\n","import React from 'react';\r\nexport const ZeroWidthSpace = () => <>​;\r\n","import {isString} from 'lodash';\r\nimport React, {useState} from 'react';\r\nimport {useAsyncFn} from 'react-use';\r\nimport {Button, Header, Label, Modal, Popup} from 'semantic-ui-react';\r\nimport {css} from '@emotion/react/macro';\r\nimport {faTimes} from '@fortawesome/pro-regular-svg-icons';\r\nimport {faQuestion} from '@fortawesome/pro-solid-svg-icons';\r\nimport {FontAwesomeIcon} from '@fortawesome/react-fontawesome';\r\nimport {PaymentSourcesService} from '../api/generated/PaymentSourcesService';\r\nimport {PaymentSourceTypes} from '../api/generated/enums';\r\nimport {PaymentSourceJsonDto, PaymentSourceSummaryDto} from '../api/generated/index.defs';\r\nimport {Form} from '../forms';\r\nimport {parseJson} from '../utils';\r\nimport {notifications} from '../utils/notification-service';\r\nimport {CardBrandImage} from './card-brand';\r\nimport {Flex} from './flex';\r\nimport {isPaymentSourceExpired} from '../payments/payment-source-utils';\r\n\r\nconst maskLeft = (\r\n text: string,\r\n preserveLength: number,\r\n config?: {maskCharacter?: string; preserveSide?: 'left' | 'right'; totalLength?: number}\r\n) => {\r\n text ??= '';\r\n const preserveSide = config?.preserveSide || 'right';\r\n const maskCharacter = config?.maskCharacter || '*';\r\n const totalLength = config?.totalLength || text.length;\r\n\r\n const maskStart = preserveSide === 'left' ? 0 : Math.max(text.length - preserveLength, 0);\r\n const maskEnd = Math.min(maskStart + preserveLength, text.length);\r\n\r\n const masked = text\r\n .split('')\r\n .map((char, idx) => (idx < maskStart || idx >= maskEnd ? maskCharacter : char))\r\n .join('');\r\n\r\n if (masked.length <= totalLength) return masked;\r\n\r\n const preservedStartLeft = Math.max(masked.length - totalLength, 0);\r\n return preserveSide === 'left'\r\n ? masked.substring(0, Math.min(totalLength, masked.length))\r\n : masked.substring(preservedStartLeft);\r\n};\r\n\r\ntype PaymentSourcePreview = {\r\n paymentSource: PaymentSourceSummaryDto | undefined;\r\n onEdit?: () => void;\r\n onDelete?: () => void;\r\n hideExpiration?: boolean;\r\n showAutopay?: boolean;\r\n hideActions?: boolean;\r\n disabled?: boolean;\r\n disabledMessage?: string;\r\n};\r\n\r\nexport const PaymentSourceMiniPreview: React.FC = ({\r\n paymentSource,\r\n onEdit,\r\n}) => {\r\n if (!paymentSource) {\r\n return null;\r\n }\r\n return (\r\n \r\n \r\n {paymentSource.paymentSourceType === PaymentSourceTypes['Credit Card'] ? (\r\n \r\n ) : (\r\n `${paymentSource.accountType} `\r\n )}\r\n \r\n \r\n {maskLeft(paymentSource.accountNumberMasked, 4, {totalLength: 8})}\r\n \r\n {!!onEdit && (\r\n \r\n \r\n change\r\n \r\n \r\n )}\r\n \r\n );\r\n};\r\n\r\nexport const PaymentSourcePreview: React.FC = (props) => {\r\n const {\r\n paymentSource,\r\n onEdit,\r\n onDelete,\r\n hideExpiration,\r\n showAutopay,\r\n hideActions,\r\n disabled,\r\n disabledMessage,\r\n } = props;\r\n const [deleteConfirmModal, setDeleteConfirmModal] = useState(false);\r\n const [deletePaymentSourceState, deletePaymentSource] = useAsyncFn(async () => {\r\n if (!paymentSource) {\r\n return;\r\n }\r\n\r\n const response = await PaymentSourcesService.deleteById({\r\n id: paymentSource.id,\r\n });\r\n\r\n if (response.hasErrors) {\r\n notifications.error('Unable to delete payment source');\r\n } else {\r\n notifications.success('Payment source deleted');\r\n setDeleteConfirmModal(false);\r\n if (onDelete) {\r\n onDelete();\r\n }\r\n }\r\n });\r\n\r\n if (!paymentSource) {\r\n return null;\r\n }\r\n\r\n const isExpired = isPaymentSourceExpired(paymentSource);\r\n\r\n return (\r\n
\r\n
\r\n \r\n \r\n
\r\n {paymentSource.paymentSourceType === PaymentSourceTypes['Credit Card']\r\n ? 'Credit Card'\r\n : paymentSource.accountType}\r\n {showAutopay && paymentSource.isAutopay && (\r\n \r\n )}\r\n {isExpired && (\r\n \r\n )}\r\n
\r\n
\r\n \r\n {!!onEdit && (\r\n \r\n change\r\n \r\n )}\r\n \r\n
\r\n\r\n
{paymentSource.accountNumberMasked}
\r\n \r\n \r\n
\r\n {paymentSource.accountHolderName}\r\n
\r\n
\r\n \r\n {paymentSource.paymentSourceType === PaymentSourceTypes['Credit Card'] && (\r\n <>\r\n {!hideExpiration && (\r\n
\r\n
\r\n {paymentSource.cardExpirationMonth} / {paymentSource.cardExpirationYear}\r\n
\r\n
\r\n )}\r\n
\r\n \r\n
\r\n \r\n )}\r\n
\r\n
\r\n {!!disabled &&

{disabledMessage}

}\r\n\r\n {!hideActions && paymentSource.isAutopay && (\r\n \r\n \r\n \r\n \r\n }\r\n content=\"To remove this payment method from your wallet, modify your Autopay settings to use another method or unenroll from Autopay.\"\r\n />\r\n \r\n )}\r\n\r\n {!paymentSource.isAutopay && onDelete && (\r\n <>\r\n \r\n setDeleteConfirmModal(false)}\r\n >\r\n \r\n \r\n \r\n }\r\n >\r\n \r\n Are you sure you want to delete this payment source?\r\n \r\n \r\n \r\n Delete\r\n \r\n \r\n \r\n \r\n \r\n \r\n setDeleteConfirmModal(true)}\r\n >\r\n \r\n \r\n \r\n \r\n )}\r\n
\r\n
\r\n );\r\n};\r\n\r\ntype PaymentSourceJsonPreview = {\r\n paymentSource: PaymentSourceJsonDto | string;\r\n};\r\n\r\nexport const PaymentSourceJsonPreview: React.FC = (props) => {\r\n const {paymentSource} = props;\r\n\r\n let paymentSourceJson: PaymentSourceJsonDto | undefined = undefined;\r\n if (isString(paymentSource)) {\r\n paymentSourceJson = parseJson(paymentSource);\r\n } else {\r\n paymentSourceJson = paymentSource;\r\n }\r\n\r\n if (!paymentSourceJson) {\r\n return null;\r\n }\r\n\r\n return (\r\n
\r\n
\r\n
\r\n {paymentSourceJson.paymentSourceType === PaymentSourceTypes['Credit Card']\r\n ? 'Credit Card'\r\n : paymentSourceJson.accountType}\r\n
\r\n\r\n
{paymentSourceJson.accountNumberLast4}
\r\n \r\n \r\n
{paymentSourceJson.accountHolderName}
\r\n
\r\n \r\n {paymentSourceJson.paymentSourceType === PaymentSourceTypes['Credit Card'] && (\r\n <>\r\n
\r\n
\r\n {paymentSourceJson.cardExpirationMonth} / {paymentSourceJson.cardExpirationYear}\r\n
\r\n
\r\n
\r\n \r\n
\r\n \r\n )}\r\n
\r\n
\r\n
\r\n
\r\n );\r\n};\r\n\r\nexport const PaymentSourceMiniJsonPreview: React.FC = ({\r\n paymentSource,\r\n}) => {\r\n let paymentSourceJson: PaymentSourceJsonDto | undefined = undefined;\r\n if (isString(paymentSource)) {\r\n paymentSourceJson = parseJson(paymentSource);\r\n } else {\r\n paymentSourceJson = paymentSource;\r\n }\r\n\r\n if (!paymentSourceJson) {\r\n return null;\r\n }\r\n\r\n return (\r\n <>\r\n \r\n \r\n ************ {paymentSourceJson.accountNumberLast4}\r\n \r\n \r\n {paymentSourceJson.paymentSourceType === PaymentSourceTypes['Credit Card'] ? (\r\n \r\n ) : (\r\n paymentSourceJson.accountType\r\n )}\r\n \r\n \r\n
{paymentSourceJson.accountHolderName}
\r\n \r\n );\r\n};\r\n\r\nconst styles = css`\r\n &.payment-source {\r\n position: relative;\r\n flex: 1;\r\n\r\n .payment-source__content {\r\n position: relative;\r\n padding: 1rem 1.5rem 1rem;\r\n border-radius: 5px;\r\n background-color: #f1f1f1;\r\n box-shadow: 0 0 10px #f4f4f2;\r\n border: 2px solid #cbcfd1;\r\n max-width: 340px;\r\n font-family: monospace;\r\n\r\n .delete-button {\r\n position: absolute;\r\n right: -1rem;\r\n top: -0.8rem;\r\n\r\n .ui.button {\r\n width: 1.5rem;\r\n height: 1.5rem;\r\n padding: 0;\r\n border: solid 2px #fff;\r\n box-shadow: 0px 0px 5px 0px rgba(0, 0, 0, 0.88);\r\n }\r\n }\r\n }\r\n\r\n .payment-source__number {\r\n padding-top: 0.5rem;\r\n }\r\n\r\n .payment-source__expiration {\r\n font-size: 0.8rem;\r\n line-height: 1rem;\r\n padding: 0.8rem 0 0;\r\n }\r\n\r\n .payment-source__brand {\r\n position: absolute;\r\n top: 0.7em;\r\n right: 1rem;\r\n\r\n img {\r\n width: 40px;\r\n }\r\n }\r\n\r\n .disabled-message {\r\n margin-top: 14px;\r\n margin-bottom: 0;\r\n font-size: 0.9rem;\r\n line-height: 18px;\r\n }\r\n }\r\n`;\r\n\r\nconst miniStyles = css`\r\n .card-container {\r\n padding-left: 10px;\r\n\r\n .mini-card {\r\n max-width: 35px !important;\r\n }\r\n }\r\n`;\r\n","import {logger} from '../../utils/logger';\r\n\r\nexport type TokenizationType = 'msr.unencrypted' | 'msr.encrypted' | 'emv.encrypted';\r\n\r\ntype CardSecureParams =\r\n | {\r\n devicedata: string;\r\n source: 'iToke';\r\n encryptionhandler: 'RSA';\r\n unique: false;\r\n }\r\n | {\r\n devicedata: string;\r\n unique: false;\r\n }\r\n | {\r\n account: string;\r\n unique: false;\r\n };\r\n\r\ntype TokenizationDataResult = {\r\n type: TokenizationType;\r\n cardSecureParams: CardSecureParams;\r\n name: string;\r\n expiration: string;\r\n};\r\n\r\nconst log = logger('card-reader');\r\n\r\nexport const getTokenizationData = (trackData: string, useExplicitMsrEncryption?: boolean) => {\r\n let cardSecureParams: CardSecureParams;\r\n let [pan, , expiration] = trackData.split('^');\r\n let tokeinzationType: TokenizationType;\r\n\r\n const isEmv = isDataEmvOrNonAugustaMsr(trackData) && trackData.includes('5F20');\r\n\r\n if (isEmv) {\r\n tokeinzationType = 'emv.encrypted';\r\n\r\n cardSecureParams = {\r\n devicedata: parseValidCardData(trackData),\r\n unique: false,\r\n };\r\n\r\n expiration = '';\r\n } else if (trackData.indexOf('%B') === 0 && !useExplicitMsrEncryption) {\r\n tokeinzationType = 'msr.unencrypted';\r\n\r\n cardSecureParams = {\r\n account: pan.replace('%B', ''),\r\n unique: false,\r\n };\r\n } else {\r\n tokeinzationType = 'msr.encrypted';\r\n\r\n cardSecureParams = {\r\n devicedata: trackData,\r\n source: 'iToke',\r\n encryptionhandler: 'RSA',\r\n unique: false,\r\n };\r\n }\r\n\r\n if (!isEmv && expiration) {\r\n if (expiration.length > 4) {\r\n log.info('non-standard expiration format', expiration);\r\n }\r\n\r\n const year = expiration.substring(0, 2);\r\n const month = expiration.substring(2, 4);\r\n expiration = `${month}/${year}`;\r\n\r\n const expirationRegex = /\\d\\d\\/\\d\\d/gi;\r\n const matchesExpirationFormat = expirationRegex.test(expiration);\r\n if (!matchesExpirationFormat) expiration = '';\r\n }\r\n\r\n const result: TokenizationDataResult = {\r\n type: tokeinzationType,\r\n cardSecureParams,\r\n name: getNameOnCard(trackData),\r\n expiration,\r\n };\r\n\r\n return result;\r\n};\r\n\r\n/**\r\n * This find the cardholder name\r\n * from the various types of data this could be from the card such as EMV or track data.\r\n *\r\n * @param textData textData could be track data or emv data\r\n * @returns {string|null} the name or null if nothing-nobody\r\n */\r\nconst getNameOnCard = (textData) => {\r\n // -----------------------\r\n // from EMV tag data...\r\n // -----------------------\r\n if (isDataEmvOrNonAugustaMsr(textData) && textData.includes('5F20')) {\r\n /**\r\n * for this tag it's:\r\n * - 4 char tag\r\n * - then 2 hex chars for length (no length type here),\r\n * - then data\r\n */\r\n const startOfNameTLV = textData.indexOf('5F20');\r\n const startOfLength = startOfNameTLV + 4; // length is represented via 2 hex digits (2 nibbles / 1 byte)\r\n const startOfValue = startOfNameTLV + 6;\r\n\r\n const valueLengthHexDigits = textData.substr(startOfLength, 2);\r\n const valueLengthInNumChars = 2 * parseInt(valueLengthHexDigits, 16); // value is how many chars long? 1 byte==2 nibbles==2 chars\r\n\r\n const valueHexDigits = textData.substr(startOfValue, valueLengthInNumChars);\r\n\r\n const nameArray: string[] = [];\r\n for (let i = 0; i < valueHexDigits.length; i += 2) {\r\n // parse each 2 chars of hex to int, then translate into ascii char,\r\n const charValInHex = valueHexDigits.substr(i, 2);\r\n const asciiInValOfChar = parseInt(charValInHex, 16);\r\n nameArray.push(String.fromCharCode(asciiInValOfChar));\r\n }\r\n\r\n const nameString = nameArray.join('');\r\n return splitName(nameString);\r\n }\r\n\r\n // -----------------------\r\n // from MSR data...\r\n // -----------------------\r\n const splitChunk = textData.split('^', 2)[1];\r\n return splitName(splitChunk);\r\n\r\n function splitName(name: string) {\r\n if (name === undefined) {\r\n return '';\r\n }\r\n if (name.indexOf('/') === -1) {\r\n return name.trim();\r\n } else {\r\n const lastName = name.split('/')[0].trim();\r\n const firstName = name.split('/')[1].trim();\r\n return firstName + ' ' + lastName;\r\n }\r\n }\r\n};\r\n\r\n/**\r\n * This handles the data pumped out on the USB keyboard buffer card readers. Most cases it's a pass-though,\r\n * since original USB MSR readers had a consistent output, but things like the IdTech Augusta output different\r\n * MSR format when swiping because it's in a fallback mode, so we locate and extract what CardSecure\r\n * can work with.\r\n *\r\n * Reference: https://atlassian.idtechproducts.com/confluence/display/KB/Product+Integration+Topic+-+Augusta+QuickChip+KeyBoard+fallback+behavior\r\n *\r\n * return: EMV or MSR data that is acceptable to the gateway.\r\n * throws: exception if something goes wrong because of bad data.\r\n */\r\nconst parseValidCardData = (track: string) => {\r\n /**\r\n *\r\n * Let's say the start of the MSR has this chunk of characters\r\n * (there would be much much more, but this is more than we need to show how weeding thru the tags to find out data works):\r\n * \"DFEE250230029F390180DFEE238201D702CB01801F422300A39B%*4018********2263^BUMBERLING/HORACE ^\"\r\n *\r\n * To find our MSR data that CardSecure can use:\r\n * 1. find if+where DFEE23 is present (\"Chip Error fallback swipe\")\r\n * 2. look at next 2 chars (is a HEXADECIMAL VALUE):\r\n * a. 80 : that's your length, in bytes. so basically probably all after is data to use. but we'll play it safe.\r\n * b. 81 : the next 1 bytes (2 chars) is your length, in nibbles. so after that is data to use.\r\n * c. 82 : the next 2 bytes (4 chars) is your length, in nibbles. so after that is data to use.\r\n * d. 83 : the next 3 bytes (6 chars) is your length, in nibbles. so after that is data to use.\r\n * 3. grab all those characters after the length specifiers of that amount (in nibbles or bytes)\r\n *\r\n * In this example,\r\n * We find the 'DFEE23' followed by a '82', so the next two bytes are length in nibbles (single characters),\r\n * which are '01D7'. That's 471. And since we're dealing with nibbles because of the '82' preceding it,\r\n * we need to grab the 471 characters that follow the length info. The end.\r\n *\r\n * Two characters count as a byte here. A nibble is one character of data here. Each character represents a hexadecimal digit.\r\n */\r\n\r\n // Raw Augusta EMV data or Non-Augusta MSR data can just be returned right away. Ready to go.\r\n if (isDataEmvOrNonAugustaMsr(track)) {\r\n // it's either good non-augusta MSR or bad data.\r\n return track;\r\n }\r\n\r\n // Otherwise, we have fall-back MSR data from an IdTech Augusta. Let us parse it out from the noise.\r\n const startOfFallBackSwipe = track.indexOf('DFEE23');\r\n const startOfLengthType = startOfFallBackSwipe + 6;\r\n const lengthType = track.substr(startOfLengthType, 2);\r\n\r\n let msrLengthInChars = 160; // default: 80 bytes = 80 * 2 characters.\r\n let startOfMSRData = startOfLengthType + 2; // default\r\n if (lengthType[1] !== '0') {\r\n const lengthAmountHexCharSize = parseInt(lengthType[1], 16) * 2; // how many chars to read for the size of MSR data.\r\n const startOfLengthHexAmountSize = startOfLengthType + 2;\r\n const lengthHexChars = track.substr(startOfLengthHexAmountSize, lengthAmountHexCharSize);\r\n msrLengthInChars = parseInt(lengthHexChars, 16); // hex to decimal\r\n\r\n startOfMSRData = startOfLengthHexAmountSize + lengthAmountHexCharSize;\r\n }\r\n\r\n const msrData = track.substr(startOfMSRData, msrLengthInChars);\r\n\r\n return msrData;\r\n};\r\n\r\n/**\r\n * it's either good non-augusta MSR or bad data.\r\n * @param textData text from USB keyboard buffer\r\n * @returns {boolean} yes or no\r\n */\r\nconst isDataEmvOrNonAugustaMsr = (textData: string) => {\r\n return !textData.includes('DFEE23');\r\n};\r\n","import {useAsync} from 'react-use';\r\nimport {\r\n Segment,\r\n Table,\r\n TableBody,\r\n TableCell,\r\n TableHeader,\r\n TableHeaderCell,\r\n TableRow,\r\n} from 'semantic-ui-react';\r\nimport {css} from '@emotion/react';\r\nimport {EmbeddedService} from '../api/generated/EmbeddedService';\r\nimport {ServiceFeesService} from '../api/generated/ServiceFeesService';\r\nimport {PaymentIntentConfigScopes} from '../api/generated/enums';\r\nimport {\r\n Response as ApiResponse,\r\n List,\r\n PaymentIntentConfig,\r\n PaymentIntentDetailDto,\r\n ServiceFeeCalculationDto,\r\n} from '../api/generated/index.defs';\r\nimport Currency from '../components/currency';\r\n\r\nexport const useCalculatedServiceFees = (\r\n config: PaymentIntentConfig,\r\n intent: PaymentIntentDetailDto\r\n) => {\r\n return useAsync(async () => {\r\n const payload: IntersectingParams = {\r\n businessUnitId: intent.businessUnitId,\r\n channel: intent.channel,\r\n baseAmount: intent.subtotal,\r\n scope: intent.scope,\r\n paymentSourceTypes: config.paymentSourceConfig.paymentSourceTypes,\r\n };\r\n\r\n let res: ApiResponse>;\r\n\r\n if (intent.scope === PaymentIntentConfigScopes.Embedded) {\r\n res = await EmbeddedService.calculateServiceFees({\r\n ...payload,\r\n slug: config.businessUnitSlug,\r\n });\r\n } else {\r\n res = await ServiceFeesService.calculateServiceFees(payload);\r\n }\r\n\r\n return res.data;\r\n });\r\n};\r\n\r\n// ---\r\n\r\ntype CalculatedServiceFeesProps = {\r\n config: PaymentIntentConfig;\r\n intent: PaymentIntentDetailDto;\r\n};\r\n\r\ntype ServiceFeesParams = Parameters<(typeof ServiceFeesService)['calculateServiceFees']>[0];\r\ntype EmbeddedServiceParams = Parameters<(typeof EmbeddedService)['calculateServiceFees']>[0];\r\ntype IntersectingKeys = Extract;\r\ntype IntersectingParams = {[K in IntersectingKeys]: ServiceFeesParams[K]};\r\n\r\nexport const CalculatedServiceFeesSegment = ({config, intent}: CalculatedServiceFeesProps) => {\r\n const fetchServiceFees = useCalculatedServiceFees(config, intent);\r\n\r\n if (!fetchServiceFees.value?.length) return null;\r\n\r\n return (\r\n \r\n
\r\n
\r\n
\r\n Service Fees\r\n
\r\n
\r\n
\r\n \r\n \r\n \r\n Payment Type\r\n Service Fee\r\n \r\n \r\n \r\n {config.paymentSourceConfig.paymentSourceTypes.map((x) => (\r\n \r\n {x}\r\n \r\n y.tier.paymentSourceType === x)?.amount ?? 0\r\n }\r\n />\r\n \r\n \r\n ))}\r\n \r\n
\r\n
\r\n );\r\n};\r\n\r\nconst styles = css`\r\n &.ui.message {\r\n background-color: #ffffff;\r\n border: 1px solid #d8d9e0;\r\n box-shadow: none;\r\n\r\n .header {\r\n font-weight: normal;\r\n margin-bottom: 1rem;\r\n color: #0a2233;\r\n font-size: 1.28571429em;\r\n }\r\n }\r\n\r\n .ui.table.compact {\r\n margin: 0;\r\n\r\n th {\r\n border-radius: 0.26666667rem 0.26666667rem 0em 0em !important;\r\n }\r\n }\r\n`;\r\n","import {map, pickBy} from 'lodash';\r\nimport imageAmex from 'payment-icons/svg/flat/amex.svg';\r\nimport imageDiscover from 'payment-icons/svg/flat/discover.svg';\r\nimport imageMastercard from 'payment-icons/svg/flat/mastercard.svg';\r\nimport imageVisa from 'payment-icons/svg/flat/visa.svg';\r\nimport React from 'react';\r\nimport {useAsync} from 'react-use';\r\nimport {Image} from 'semantic-ui-react';\r\nimport {css} from '@emotion/react/macro';\r\nimport {PaymentChannelsService} from '../api/generated/PaymentChannelsService';\r\n\r\ntype AcceptedCardTypes = {\r\n channelType: string;\r\n businessUnitId: number;\r\n};\r\n\r\nexport const AcceptedCardTypes: React.FC = (props) => {\r\n const fetchChannels = useAsync(async () => {\r\n const response = await PaymentChannelsService.getBusinessUnitPaymentChannel({\r\n businessUnitId: props.businessUnitId,\r\n channelType: props.channelType,\r\n });\r\n return response.data;\r\n });\r\n\r\n const brands = fetchChannels.value?.creditCard.paymentMerchantAccount?.acceptedCardBrands;\r\n\r\n const cardImages = {\r\n visa: imageVisa,\r\n mastercard: imageMastercard,\r\n amex: imageAmex,\r\n discover: imageDiscover,\r\n };\r\n\r\n if (!brands) {\r\n return null;\r\n }\r\n\r\n return (\r\n \r\n {map(\r\n pickBy(cardImages, (_, key) => brands[key]),\r\n (value, key) => (\r\n \r\n )\r\n )}\r\n \r\n );\r\n};\r\n","import React from 'react';\r\nimport {Header, Radio, Table} from 'semantic-ui-react';\r\nimport {BillingAddressCollectionTypes, PaymentSourceTypes} from '../api/generated/enums';\r\nimport {PaymentSourceSummaryDto} from '../api/generated/index.defs';\r\nimport {AuthorizedComponent} from '../auth/authorization-helpers';\r\nimport {Form} from '../forms';\r\nimport {Button} from '../forms/button';\r\nimport {CardInfo} from '../gateways/types';\r\nimport {useProduce} from '../hooks/use-produce';\r\nimport {buttonAccessibilityProps} from '../utils/accessibility-helpers';\r\nimport {PaymentSourceForm, PaymentSourceFormValues} from './payment-source-form';\r\nimport {CreditCardConfig, paymentSourceIsAvailableForGateway} from './payment-utils';\r\nimport {useForm} from 'react-final-form';\r\n\r\ntype SavedPaymentSourceSelector = {\r\n selectedId?: number; // FIXME: Look into handling this better\r\n onChange: (paymentSourceId: number | undefined) => void;\r\n paymentSources: PaymentSourceSummaryDto[];\r\n creditCardConfig: CreditCardConfig;\r\n};\r\n\r\nexport const SavedPaymentSourceSelector: React.FC = (props) => {\r\n const {paymentSources, creditCardConfig, onChange, selectedId} = props;\r\n\r\n return (\r\n \r\n \r\n {paymentSources.map((x) => {\r\n const isUsable = paymentSourceIsAvailableForGateway(x, creditCardConfig);\r\n return (\r\n {\r\n if (isUsable) onChange(x.id);\r\n },\r\n })}\r\n active={selectedId === x.id}\r\n disabled={!isUsable}\r\n >\r\n \r\n \r\n \r\n \r\n {x.accountType} - {x.accountNumberLast4}\r\n \r\n \r\n {x.paymentSourceType === PaymentSourceTypes['Credit Card']\r\n ? `Exp: ${x.cardExpirationMonth}/${x.cardExpirationYear}`\r\n : ''}\r\n \r\n \r\n );\r\n })}\r\n \r\n
\r\n );\r\n};\r\n\r\ntype PaymentSourceSelectionState = {\r\n addNewPaymentSource: boolean;\r\n};\r\n\r\ntype Props = SavedPaymentSourceSelector & {\r\n payerProvidedPaymentSources: PaymentSourceSummaryDto[];\r\n values: PaymentSourceFormValues;\r\n paymentSourceTypes: PaymentSourceTypes[];\r\n billingAddressCollectionType: BillingAddressCollectionTypes;\r\n onCardInfo: (cardInfo: CardInfo) => void;\r\n accountWalletsEnabled?: boolean;\r\n creditCardConfig: CreditCardConfig;\r\n organizationName: string;\r\n payerProvidedWallets: boolean;\r\n showPayerProvided?: boolean;\r\n};\r\n\r\nexport const PaymentSourceSelection: React.FC = (props) => {\r\n const {\r\n values,\r\n onChange,\r\n selectedId,\r\n paymentSources,\r\n payerProvidedPaymentSources,\r\n onCardInfo,\r\n paymentSourceTypes,\r\n billingAddressCollectionType,\r\n accountWalletsEnabled,\r\n creditCardConfig,\r\n organizationName,\r\n payerProvidedWallets,\r\n showPayerProvided,\r\n } = props;\r\n\r\n const payerProvidedExists = payerProvidedPaymentSources.length > 0;\r\n\r\n const [state, setState] = useProduce({\r\n addNewPaymentSource: false,\r\n });\r\n\r\n const form = useForm();\r\n\r\n const addNewPaymentSourceClicked =\r\n (paymentSources.length === 0 && payerProvidedPaymentSources.length === 0) ||\r\n state.addNewPaymentSource;\r\n\r\n return (\r\n <>\r\n {addNewPaymentSourceClicked ? (\r\n <>\r\n \r\n {paymentSourceTypes.length > 0 && (\r\n <>\r\n \r\n {\r\n if (\r\n form.getFieldState('savePaymentSource')?.value &&\r\n form.getFieldState('isPayerProvidedMethod')?.value\r\n ) {\r\n form.change('isPayerProvidedMethod', false);\r\n }\r\n }}\r\n />\r\n\r\n {payerProvidedWallets && (\r\n \r\n )}\r\n \r\n {accountWalletsEnabled && (\r\n \r\n \r\n \r\n )}\r\n \r\n )}\r\n \r\n ) : (\r\n <>\r\n {paymentSources.length > 0 && (\r\n \r\n )}\r\n\r\n {payerProvidedWallets && showPayerProvided && payerProvidedExists && (\r\n <>\r\n
Payer Provided
\r\n \r\n \r\n )}\r\n\r\n {\r\n onChange(undefined);\r\n setState((draft) => {\r\n draft.addNewPaymentSource = true;\r\n });\r\n }}\r\n >\r\n Select Alternate Payment Method\r\n \r\n \r\n )}\r\n \r\n );\r\n};\r\n","export const buttonAccessibilityProps = ({label, onSelect}) => {\r\n return {\r\n 'aria-label': label,\r\n tabIndex: 0,\r\n role: 'button',\r\n onClick: (e) => {\r\n onSelect(e);\r\n },\r\n onKeyDown: (e) => {\r\n if (e.keyCode === 13) {\r\n onSelect(e);\r\n }\r\n },\r\n };\r\n};\r\n","import {useParams} from '@reach/router';\r\nimport {AnyObject} from '../types';\r\n\r\nexport function usePathParams() {\r\n const params = useParams();\r\n return params as T;\r\n}\r\n","import axios from 'axios';\r\nimport React, {useMemo, useRef} from 'react';\r\nimport {FormField, Header, Input, Modal} from 'semantic-ui-react';\r\nimport {useDebouncedCallback} from 'use-debounce';\r\nimport {css} from '@emotion/react/macro';\r\nimport {faCreditCard} from '@fortawesome/pro-regular-svg-icons';\r\nimport {FontAwesomeIcon} from '@fortawesome/react-fontawesome';\r\nimport {analytics} from '../analytics';\r\nimport {BillingAddressCollectionTypes, TokenizationTypes} from '../api/generated/enums';\r\nimport {ZeroWidthSpace} from '../components/zero-width';\r\nimport {Env} from '../config/env-vars';\r\nimport {Form} from '../forms';\r\nimport {BillingAddressFormFields} from '../gateways/billing-address-form-fields';\r\nimport {TokenizationType, getTokenizationData} from '../gateways/card-connect/card-readers';\r\nimport {CardExpirationAndCvv, CvvField} from '../gateways/card-connect/credit-card-form';\r\nimport {useTokenizationConfig} from '../gateways/tokenization-context';\r\nimport {useProduce} from '../hooks/use-produce';\r\nimport {logger} from '../utils/logger';\r\nimport {notifications} from '../utils/notification-service';\r\n\r\nconst log = logger('card-swipe-modal');\r\n\r\nexport interface TokenResponse {\r\n errorcode: number;\r\n message: string;\r\n token: string;\r\n name: string;\r\n expiration: string;\r\n type?: TokenizationType;\r\n}\r\n\r\ninterface CardSwipeInput {\r\n onActivate: () => void;\r\n onCapture: (cardData: TokenResponse) => void;\r\n useExplicitMsrEncryption?: boolean;\r\n}\r\n\r\ninterface CardSwipeInputState {\r\n mode: 'closed' | 'waiting' | 'processing' | 'captured' | 'error';\r\n attempt: number;\r\n}\r\n\r\nexport const CardSwipeInput: React.FC = (props) => {\r\n const {onActivate, onCapture, useExplicitMsrEncryption} = props;\r\n const [state, setState] = useProduce({\r\n mode: 'closed',\r\n attempt: 0,\r\n });\r\n\r\n const inputRef = useRef(null);\r\n\r\n const opened = state.mode !== 'closed' && state.mode !== 'captured';\r\n\r\n const tokenizerConfig = useTokenizationConfig<{url: string}>();\r\n const urlOrigin = tokenizerConfig?.properties?.url || Env.cardConnectBaseUrl || '';\r\n\r\n const activate = () => {\r\n setState((draft) => {\r\n draft.mode = 'waiting';\r\n });\r\n\r\n onActivate();\r\n };\r\n\r\n const onCardRead = useDebouncedCallback((trackData: string | undefined) => {\r\n if (!trackData || trackData.length < 15) {\r\n setState((draft) => {\r\n draft.mode = 'error';\r\n draft.attempt++;\r\n });\r\n\r\n return;\r\n }\r\n\r\n (async () => {\r\n const data = await tokenizeCardSwipe(trackData, urlOrigin, Boolean(useExplicitMsrEncryption));\r\n\r\n if (data.errorcode === 0) {\r\n onCapture(data);\r\n\r\n setState((draft) => {\r\n draft.mode = 'captured';\r\n draft.attempt++;\r\n });\r\n\r\n onCardRead.cancel();\r\n notifications.success('Card Data Captured');\r\n } else {\r\n setState((draft) => {\r\n draft.mode = 'error';\r\n draft.attempt++;\r\n });\r\n }\r\n })();\r\n }, 250);\r\n\r\n return (\r\n \r\n \r\n Swipe Card\r\n \r\n }\r\n open={opened}\r\n css={styles}\r\n >\r\n Swipe Card\r\n \r\n
\r\n \r\n {state.mode === 'processing' && (\r\n <>\r\n Retrieving track data\r\n \r\n )}\r\n {state.mode === 'waiting' && (\r\n <>\r\n \r\n Please swipe the credit card\r\n
\r\n using your card reader device now\r\n
\r\n \r\n Please refrain from using your mouse or keyboard\r\n \r\n \r\n )}\r\n {state.mode === 'error' && (\r\n <>\r\n \r\n \r\n \r\n \r\n

\r\n We are having trouble understanding the card track data.\r\n
\r\n \r\n Please refrain from using your mouse or keyboard during the\r\n
\r\n \"Receiving track data\" period.\r\n
\r\n
\r\n
\r\n If you continue to have issues, please contact us\r\n

\r\n
\r\n \r\n )}\r\n
\r\n\r\n
\r\n {\r\n const target = e.target;\r\n setTimeout(() => {\r\n target.focus();\r\n }, 0);\r\n }}\r\n onKeyUp={() => {\r\n setState((draft) => {\r\n draft.mode = 'processing';\r\n });\r\n onCardRead(inputRef.current?.value);\r\n }}\r\n />\r\n
\r\n
\r\n \r\n {\r\n onCardRead.cancel();\r\n setState((draft) => {\r\n draft.mode = 'closed';\r\n });\r\n }}\r\n >\r\n Cancel\r\n \r\n \r\n \r\n );\r\n};\r\n\r\ninterface CardSwipeFormFields {\r\n cardData: TokenResponse;\r\n paymentSourceType?: string;\r\n billingAddressCollectionType: BillingAddressCollectionTypes;\r\n}\r\n\r\nexport const CardSwipeFormFields: React.FC = (props) => {\r\n const {cardData, paymentSourceType, billingAddressCollectionType} = props;\r\n const token = useMemo(() => cardData.token.replace(/\\d(?=\\d{4})/g, '*'), [cardData.token]);\r\n return (\r\n <>\r\n
\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n {cardData.type === 'emv.encrypted' ? null : !!cardData.expiration ? (\r\n \r\n ) : (\r\n \r\n )}\r\n \r\n \r\n );\r\n};\r\n\r\nconst tokenizeCardSwipe = async (\r\n trackData: string,\r\n urlOrigin: string,\r\n useExplicitMsrEncryption: boolean\r\n) => {\r\n try {\r\n const cardSecureUrl = `${urlOrigin}/cardsecure/api/v1/ccn/tokenize`;\r\n\r\n const tokenizationData = getTokenizationData(trackData, useExplicitMsrEncryption);\r\n analytics.trackEvent('card-connect.hardware-tokenized', {\r\n subject: tokenizationData.type,\r\n });\r\n\r\n const {data} = await axios.post(\r\n cardSecureUrl,\r\n tokenizationData.cardSecureParams\r\n );\r\n\r\n // FIXME: add enhanced token\r\n\r\n return {\r\n ...data,\r\n name: tokenizationData.name,\r\n expiration: tokenizationData.expiration,\r\n type: tokenizationData.type,\r\n };\r\n } catch (error) {\r\n log.error('unable to tokenize card swipe data');\r\n\r\n return {\r\n errorcode: -1,\r\n message: 'Failed to tokenize input',\r\n token: '',\r\n name: '',\r\n expiration: '',\r\n type: undefined,\r\n };\r\n }\r\n};\r\n\r\nconst styles = css`\r\n .swipe-input-container {\r\n overflow: hidden;\r\n\r\n input {\r\n position: absolute;\r\n left: -999999px;\r\n }\r\n }\r\n`;\r\n\r\nconst buttonStyles = css`\r\n & {\r\n margin-right: 0.5rem;\r\n }\r\n`;\r\n","import {first} from 'lodash';\r\nimport React, {useMemo, useState} from 'react';\r\nimport {OnChange} from 'react-final-form-listeners';\r\nimport {useAsync, useAsyncFn, useAsyncRetry} from 'react-use';\r\nimport {Dimmer, Header, Loader, Message} from 'semantic-ui-react';\r\nimport {css} from '@emotion/react/macro';\r\nimport {faTimes} from '@fortawesome/pro-regular-svg-icons';\r\nimport {FontAwesomeIcon} from '@fortawesome/react-fontawesome';\r\nimport {analytics} from '../analytics';\r\nimport {PaymentIntentsService} from '../api/generated/PaymentIntentsService';\r\nimport {PaymentSourcesService} from '../api/generated/PaymentSourcesService';\r\nimport {\r\n AchAccountHolderTypes,\r\n AchAccountTypes,\r\n BillingAddressCollectionTypes,\r\n CardEntryMethods,\r\n PaymentChannels,\r\n PaymentSourceTypes,\r\n} from '../api/generated/enums';\r\nimport {\r\n GetAccountPaymentSourcesResponse,\r\n NewPaymentSource,\r\n PaymentIntentConfig,\r\n PaymentIntentDetailDto,\r\n UpdatePaymentIntentPaymentSourceRequest,\r\n UpdatePaymentSessionPaymentSourceRequest,\r\n} from '../api/generated/index.defs';\r\nimport {useHasAuthorization, useIsAgentUser} from '../auth/authorization-helpers';\r\nimport {AcceptedCardTypes} from '../components/accepted-card-types';\r\nimport {mapPaymentSourceAddress} from '../components/address';\r\nimport {AsyncStateContainer} from '../components/async-state-container';\r\nimport {fetchBinInfo} from '../components/card-brand';\r\nimport {ConfirmButton} from '../components/confirm-button';\r\nimport {Flex} from '../components/flex';\r\nimport {Form} from '../forms';\r\nimport {PlaidLinkButton} from '../gateways/plaid/link-button';\r\nimport {PlaidLinkForm} from '../gateways/plaid/link-form';\r\nimport {PlaidLinkStatus, TokenizationContextProvider} from '../gateways/tokenization-context';\r\nimport {CardInfo} from '../gateways/types';\r\nimport {useProduce} from '../hooks/use-produce';\r\nimport {CardSwipeFormFields, CardSwipeInput, TokenResponse} from '../payments/card-swipe-modal';\r\nimport {PaymentSourceFormValues, PaymentSourceTypeSelector} from '../payments/payment-source-form';\r\nimport {PaymentSourceSelection} from '../payments/payment-source-selection';\r\nimport {\r\n getAvailablePaymentSourceTypes,\r\n parseExpirationData,\r\n} from '../payments/payment-source-utils';\r\nimport {Media} from '../styles/breakpoints';\r\nimport {CalculatedServiceFeesSegment} from '../service-fees/calculated-service-fees';\r\n\r\nexport type PaymentValidationResponse = {\r\n cardInfo?: CardInfo;\r\n cardCvv?: string;\r\n};\r\n\r\nexport type PaymentIntentPaymentSourceFormProps = {\r\n paymentIntent: PaymentIntentDetailDto;\r\n paymentIntentConfig: PaymentIntentConfig;\r\n onPaymentValidated: (validationResult: PaymentValidationResponse) => void;\r\n onCancel: () => void;\r\n};\r\n\r\ntype State = {\r\n paymentSourceType: PaymentSourceTypes;\r\n paymentSourceId?: number;\r\n cardData?: TokenResponse;\r\n plaidAccountId?: string;\r\n plaidExchangeToken?: string;\r\n};\r\n\r\ninterface FormValues extends Partial {\r\n cardCvv: string;\r\n cardExpiration?: string;\r\n}\r\n\r\ninterface paymentSourceConfig {\r\n paymentSourceId?: number;\r\n cardData?: TokenResponse;\r\n cardInfo?: CardInfo;\r\n sessionIdentifier: string;\r\n channel: string;\r\n}\r\n\r\nexport const buildPaymentSourceRequest = (values: FormValues, config: paymentSourceConfig) => {\r\n const payload = {\r\n paymentSource: {},\r\n } as unknown as UpdatePaymentIntentPaymentSourceRequest;\r\n\r\n let newPaymentSource: NewPaymentSource;\r\n if (config.paymentSourceId) {\r\n payload.paymentSource.savedPaymentSourceId = config.paymentSourceId;\r\n } else if (values.paymentSourceType === PaymentSourceTypes['Credit Card']) {\r\n newPaymentSource = {...values} as any;\r\n newPaymentSource.accountType = config.cardInfo?.type ?? '';\r\n\r\n if (config.cardData) {\r\n const entryMethod =\r\n config.cardData.type === 'emv.encrypted'\r\n ? CardEntryMethods['EMV Contact']\r\n : CardEntryMethods.Swiped;\r\n\r\n newPaymentSource.cardEntryMethod = entryMethod;\r\n newPaymentSource.accountNumberToken = config.cardData.token;\r\n newPaymentSource.accountHolderName = config.cardData.name;\r\n\r\n if (config.cardData.expiration) {\r\n const error = setExpiration(newPaymentSource, config.cardData.expiration);\r\n\r\n if (error) {\r\n return error;\r\n }\r\n }\r\n } else {\r\n newPaymentSource.cardEntryMethod = CardEntryMethods.Keyed;\r\n const error = setExpiration(newPaymentSource, values.cardExpiration || '');\r\n\r\n if (error) {\r\n return error;\r\n }\r\n }\r\n\r\n payload.paymentSource.newPaymentSource = newPaymentSource;\r\n } else {\r\n payload.paymentSource.newPaymentSource = {...DEFAULT_ACH_PAYMENT_SOURCE, ...values} as any;\r\n }\r\n\r\n if (payload.paymentSource.newPaymentSource) {\r\n payload.paymentSource.newPaymentSource = mapPaymentSourceAddress(\r\n payload.paymentSource.newPaymentSource\r\n );\r\n payload.paymentSource.newPaymentSource.channel = config.channel;\r\n\r\n if ((payload.paymentSource.newPaymentSource as any)?.cardCvv) {\r\n delete (payload.paymentSource.newPaymentSource as any).cardCvv;\r\n }\r\n }\r\n\r\n return {\r\n identifier: config.sessionIdentifier,\r\n body: payload,\r\n errors: undefined,\r\n };\r\n};\r\n\r\nconst setExpiration = (newPaymentSource: NewPaymentSource, cardExpiration: string) => {\r\n const {error, expiration} = parseExpirationData(cardExpiration || '');\r\n if (error) {\r\n return {\r\n identifier: undefined,\r\n body: undefined,\r\n errors: error,\r\n };\r\n }\r\n\r\n if (expiration) {\r\n newPaymentSource.cardExpirationMonth = expiration.cardExpirationMonth;\r\n newPaymentSource.cardExpirationYear = expiration.cardExpirationYear;\r\n (newPaymentSource.cardExpiration as any) = undefined;\r\n }\r\n};\r\n\r\nconst waitingForToken = (values: FormValues, state: State) => {\r\n const {\r\n accountHolderName,\r\n achRoutingNumber,\r\n achAccountNumber,\r\n achConfirmAccountNumber,\r\n paymentSourceType,\r\n achAccountHolderType,\r\n } = values;\r\n const isAch = paymentSourceType === PaymentSourceTypes['ACH'];\r\n const isPlaidRequest = !!state.plaidAccountId && !!state.plaidExchangeToken;\r\n\r\n if (state.cardData || state.paymentSourceId) {\r\n return false;\r\n }\r\n\r\n if (isAch) {\r\n if (isPlaidRequest) {\r\n return !(accountHolderName && achAccountHolderType);\r\n }\r\n\r\n return !(accountHolderName && achRoutingNumber && achAccountNumber && achConfirmAccountNumber);\r\n }\r\n\r\n return !values.accountNumberToken;\r\n};\r\n\r\nexport const PaymentIntentPaymentSourceForm: React.FC = (\r\n props\r\n) => {\r\n const {paymentIntent, paymentIntentConfig, onPaymentValidated, onCancel} = props;\r\n const isAgentRole = useIsAgentUser();\r\n\r\n const isCustomer = useHasAuthorization({role: 'Customer'});\r\n\r\n const {paymentSourceId, paymentSource, accounts, businessUnitId} = paymentIntent;\r\n const {paymentSourceConfig, channel, organizationName, businessUnitPayerProvidedWallets} =\r\n paymentIntentConfig;\r\n const {creditCard, ach} = paymentSourceConfig;\r\n const accountId = accounts.length !== 0 ? accounts[0].id : undefined;\r\n\r\n const fetchPayerProvidedPaymentSources = useAsyncRetry(async () => {\r\n if (!isAgentRole || !businessUnitPayerProvidedWallets) return;\r\n\r\n const {data} = await PaymentSourcesService.getPayerProvidedForAccount({\r\n accountId: accountId ?? 0,\r\n includeCustomerAutopayPaymentSources: true,\r\n });\r\n return data;\r\n });\r\n\r\n const payerProvidedPaymentSources =\r\n fetchPayerProvidedPaymentSources.value?.accountPaymentSources ?? [];\r\n\r\n const accountWalletsEnabled =\r\n isAgentRole &&\r\n Boolean(accountId) &&\r\n channel === PaymentChannels.POS &&\r\n paymentIntentConfig.paymentSourceConfig.accountWalletsEnabled;\r\n\r\n const fetchAccountPaymentSources = useAsync(async () => {\r\n if (!accountWalletsEnabled) return [];\r\n\r\n const {data} = await PaymentSourcesService.getAllForAccount({accountId: accountId || 0});\r\n return data;\r\n });\r\n\r\n const accountPaymentSources =\r\n (fetchAccountPaymentSources.value as GetAccountPaymentSourcesResponse)?.accountPaymentSources ??\r\n [];\r\n\r\n const customerPaymentSource = (\r\n fetchAccountPaymentSources.value as GetAccountPaymentSourcesResponse\r\n )?.customerAutopayPaymentSource;\r\n\r\n let derivedPaymentSourceConfig = paymentSourceConfig;\r\n if (accountWalletsEnabled) {\r\n derivedPaymentSourceConfig = {\r\n ...paymentSourceConfig,\r\n paymentSources: [...accountPaymentSources, customerPaymentSource].filter((x) => !!x),\r\n };\r\n }\r\n\r\n const {availablePaymentSources, paymentSourceTypes} = useMemo(\r\n () => getAvailablePaymentSourceTypes(derivedPaymentSourceConfig, accounts, paymentSource),\r\n [derivedPaymentSourceConfig, accounts, paymentSource]\r\n );\r\n\r\n const [state, setState] = useProduce(() => {\r\n const sources = availablePaymentSources || [];\r\n const onlySource = sources.length === 1 ? sources[0] : undefined;\r\n\r\n return {\r\n paymentSourceId: paymentSourceId || onlySource?.id,\r\n paymentSourceType: paymentSourceTypes.find((x) => x === 'Credit Card')\r\n ? 'Credit Card'\r\n : 'ACH',\r\n plaidLinkState: {\r\n status: 'Uninitialized',\r\n },\r\n };\r\n });\r\n\r\n const [cardInfo, setCardInfo] = useState();\r\n\r\n const initialValues: FormValues = (\r\n state.paymentSourceType === PaymentSourceTypes.ACH\r\n ? DEFAULT_ACH_PAYMENT_SOURCE\r\n : DEFAULT_CARD_PAYMENT_SOURCE\r\n ) as any;\r\n\r\n const billingAddressCollectionType = creditCard.avsValidation as BillingAddressCollectionTypes;\r\n const {acceptedCardBrands, tokenizer} = paymentSourceConfig.creditCard;\r\n\r\n const cardSwipeEnabled =\r\n creditCard.cardSwipeEnabled && state.paymentSourceType === 'Credit Card' && isAgentRole;\r\n\r\n const plaidAccountLinkEnabled =\r\n ach.plaidAccountLinkEnabled && state.paymentSourceType === 'ACH' && isCustomer;\r\n\r\n const plaidLinkStatus: PlaidLinkStatus =\r\n plaidAccountLinkEnabled && ach.plaidPayerAccountLinkRequiredAch\r\n ? 'Required'\r\n : plaidAccountLinkEnabled\r\n ? 'Optional'\r\n : 'Disabled';\r\n\r\n const [updateFromPlaidState, updateFromPlaid] = useAsyncFn(\r\n async (plaidAccountId: string, plaidExchangeToken: string, values: FormValues) => {\r\n const updateSessionResponse = await PaymentIntentsService.updatePaymentSourceFromPlaid({\r\n identifier: paymentIntent.sessionIdentifier,\r\n body: {\r\n channel: channel,\r\n plaidAccountId,\r\n plaidExchangeToken,\r\n accountHolderName: values.accountHolderName || '',\r\n achAccountHolderType: values.achAccountHolderType || '',\r\n savePaymentSource: values.savePaymentSource || false,\r\n },\r\n });\r\n\r\n if (updateSessionResponse.hasErrors) {\r\n return updateSessionResponse;\r\n }\r\n }\r\n );\r\n\r\n const onSubmit = async (values: FormValues) => {\r\n const isCard = values.paymentSourceType === PaymentSourceTypes['Credit Card'];\r\n if (isCard && waitingForToken(values, state)) {\r\n analytics.trackEvent('checkout.client-validation', {subject: 'missing-payment-source-token'});\r\n\r\n return {\r\n data: null,\r\n hasErrors: true,\r\n errors: [\r\n {\r\n propertyName: 'accountNumberToken',\r\n errorMessage: 'Unable to validate card. Please re-type card number or try a new card.',\r\n },\r\n ],\r\n };\r\n }\r\n\r\n if (state.plaidExchangeToken && state.plaidAccountId) {\r\n const plaidResponse = await updateFromPlaid(\r\n state.plaidAccountId,\r\n state.plaidExchangeToken,\r\n values\r\n );\r\n if (plaidResponse?.errors) {\r\n return plaidResponse;\r\n }\r\n\r\n onPaymentValidated({\r\n cardInfo: cardInfo as CardInfo,\r\n cardCvv: values.cardCvv,\r\n });\r\n return;\r\n }\r\n\r\n const request = buildPaymentSourceRequest(values, {\r\n paymentSourceId: state.paymentSourceId,\r\n cardData: state.cardData,\r\n sessionIdentifier: paymentIntent.sessionIdentifier,\r\n channel: paymentIntent.channel,\r\n cardInfo,\r\n });\r\n\r\n if (request.identifier) {\r\n const updateSessionResponse = await PaymentIntentsService.updatePaymentSource(request);\r\n\r\n if (updateSessionResponse.hasErrors) {\r\n return updateSessionResponse;\r\n }\r\n\r\n onPaymentValidated({\r\n cardInfo: cardInfo as CardInfo,\r\n cardCvv: values.cardCvv,\r\n });\r\n } else {\r\n return request.errors;\r\n }\r\n };\r\n\r\n const {useExplicitMsrEncryption} = paymentIntentConfig.paymentSourceConfig?.creditCard || false;\r\n\r\n return (\r\n
\r\n \r\n \r\n \r\n \r\n {paymentIntentConfig.businessUnitDisplayServiceFees && (\r\n \r\n )}\r\n \r\n className=\"strong-labels\"\r\n initialValues={initialValues}\r\n onSubmit={onSubmit}\r\n autoComplete=\"off\"\r\n render={({values, form}) => {\r\n return (\r\n <>\r\n \r\n \r\n \r\n \r\n
Payment Method
\r\n
\r\n \r\n {cardSwipeEnabled && (\r\n <>\r\n {state.cardData ? (\r\n {\r\n setState((draft) => {\r\n draft.cardData = undefined;\r\n });\r\n }}\r\n >\r\n \r\n Clear Card Data\r\n \r\n ) : (\r\n {\r\n setState((draft) => {\r\n draft.cardData = undefined;\r\n });\r\n }}\r\n onCapture={(cardData) => {\r\n setState((draft) => {\r\n draft.cardData = cardData;\r\n });\r\n\r\n if (cardData.expiration) {\r\n form.change('cardExpiration', cardData.expiration);\r\n }\r\n\r\n const binInfo = fetchBinInfo(cardData.token);\r\n setCardInfo(binInfo);\r\n }}\r\n useExplicitMsrEncryption={useExplicitMsrEncryption}\r\n />\r\n )}\r\n \r\n )}\r\n {plaidLinkStatus === 'Optional' && (\r\n {\r\n var accountId = first(metadata.accounts)?.id || '';\r\n setState((draft) => {\r\n draft.plaidAccountId = accountId;\r\n draft.plaidExchangeToken = token;\r\n });\r\n }}\r\n />\r\n )}\r\n \r\n
\r\n\r\n \r\n {(value, previous) => {\r\n if (value !== previous) {\r\n setState((draft) => {\r\n draft.paymentSourceType = value;\r\n draft.cardData = undefined;\r\n });\r\n }\r\n }}\r\n \r\n\r\n {state.cardData ? (\r\n \r\n ) : plaidLinkStatus === 'Required' ? (\r\n <>\r\n \r\n {\r\n var accountId = first(metadata.accounts)?.id || '';\r\n setState((draft) => {\r\n draft.plaidAccountId = accountId;\r\n draft.plaidExchangeToken = token;\r\n });\r\n }}\r\n />\r\n \r\n ) : (\r\n setCardInfo(cardInfo)}\r\n onChange={(paymentSourceId) => {\r\n setState((draft) => {\r\n draft.paymentSourceId = paymentSourceId;\r\n });\r\n }}\r\n selectedId={state.paymentSourceId}\r\n paymentSources={availablePaymentSources}\r\n payerProvidedPaymentSources={payerProvidedPaymentSources}\r\n paymentSourceTypes={paymentSourceTypes}\r\n billingAddressCollectionType={billingAddressCollectionType}\r\n accountWalletsEnabled={accountWalletsEnabled}\r\n creditCardConfig={paymentSourceConfig.creditCard}\r\n organizationName={organizationName}\r\n payerProvidedWallets={businessUnitPayerProvidedWallets}\r\n showPayerProvided={channel === PaymentChannels.POS}\r\n />\r\n )}\r\n\r\n
\r\n {cardInfo &&\r\n acceptedCardBrands &&\r\n !acceptedCardBrands[cardInfo.type.toLowerCase()] && (\r\n \r\n )}\r\n\r\n \r\n Review\r\n \r\n \r\n {values.paymentSourceType === PaymentSourceTypes['Credit Card'] && (\r\n \r\n )}\r\n
\r\n
\r\n
\r\n \r\n );\r\n }}\r\n />\r\n
\r\n
\r\n );\r\n};\r\n\r\nconst DEFAULT_PAYMENT_SOURCE = {\r\n accountHolderName: '',\r\n accountNumberToken: '',\r\n\r\n zipCode: '',\r\n emailAddress: '',\r\n};\r\nconst DEFAULT_CARD_PAYMENT_SOURCE = {\r\n ...DEFAULT_PAYMENT_SOURCE,\r\n\r\n paymentSourceType: PaymentSourceTypes['Credit Card'],\r\n\r\n cardExpirationMonth: '',\r\n cardExpirationYear: '',\r\n cardCvv: '',\r\n};\r\nconst DEFAULT_ACH_PAYMENT_SOURCE = {\r\n ...DEFAULT_PAYMENT_SOURCE,\r\n\r\n paymentSourceType: PaymentSourceTypes.ACH,\r\n\r\n accountType: AchAccountTypes['Checking Account'],\r\n achAccountHolderType: AchAccountHolderTypes.Unknown,\r\n\r\n achRoutingNumber: '',\r\n achAccountNumber: '',\r\n achConfirmAccountNumber: '',\r\n};\r\n\r\nconst styles = css`\r\n .accepted-cards {\r\n flex: 1;\r\n align-items: center;\r\n\r\n @media (max-width: 767px) {\r\n margin-top: 20px;\r\n }\r\n\r\n @media (min-width: 768px) and (max-width: 1199px) {\r\n position: absolute;\r\n bottom: -3rem;\r\n left: 0;\r\n }\r\n }\r\n\r\n .service-fee {\r\n font-size: 1.2rem;\r\n }\r\n\r\n .fee-amount {\r\n margin-top: 5px;\r\n }\r\n\r\n .ui.button svg {\r\n margin-right: 0.5rem;\r\n }\r\n\r\n .ui.form {\r\n margin-bottom: 1rem;\r\n\r\n span.label {\r\n font-weight: normal;\r\n color: #0a2233;\r\n font-size: 1.28571429em;\r\n }\r\n }\r\n\r\n ${Media('MobileMax')} {\r\n .add-payment-source {\r\n margin-bottom: 1rem;\r\n }\r\n }\r\n`;\r\n\r\nexport {getAvailablePaymentSourceTypes};\r\n","import {filter, keyBy} from 'lodash';\r\nimport React from 'react';\r\nimport {useFieldArray} from 'react-final-form-arrays';\r\nimport {Header, Modal, Table} from 'semantic-ui-react';\r\nimport {faPlus, faTimes} from '@fortawesome/pro-regular-svg-icons';\r\nimport {FontAwesomeIcon} from '@fortawesome/react-fontawesome';\r\nimport {ProductSummaryDto} from '../api/generated/index.defs';\r\nimport {Alert} from '../components/alert';\r\nimport Currency from '../components/currency';\r\nimport {FlexRowWithActions} from '../components/flex';\r\nimport {Form} from '../forms';\r\nimport {notifications} from '../utils/notification-service';\r\n\r\ntype ProductionSelectionForm = {\r\n fieldName: string;\r\n products: ProductSummaryDto[];\r\n};\r\n\r\nexport type ProductLineItem = {\r\n productId: number;\r\n price: number;\r\n variablePrice: boolean;\r\n required: boolean;\r\n description: string;\r\n};\r\n\r\nexport const mapProductToLineItem = (product: ProductSummaryDto) => {\r\n return {\r\n productId: product.id,\r\n price: product.price,\r\n variablePrice: product.allowPriceModification,\r\n required: product.required,\r\n description: product.name,\r\n } as ProductLineItem;\r\n};\r\n\r\nexport const ProductionSelectionForm: React.FC = ({\r\n fieldName,\r\n products,\r\n}) => {\r\n const optionalProducts = filter(products, {required: false});\r\n const fieldArray = useFieldArray(fieldName);\r\n const fields = fieldArray.fields;\r\n const productMap = keyBy(products, (x) => x.id);\r\n\r\n return (\r\n
\r\n \r\n {optionalProducts.length !== 0 && (\r\n \r\n \r\n {' Add Products'}\r\n \r\n }\r\n closeIcon={\r\n \r\n \r\n \r\n \r\n \r\n }\r\n >\r\n Available Products\r\n \r\n \r\n \r\n {optionalProducts.map((x) => (\r\n \r\n {x.name}\r\n \r\n \r\n \r\n \r\n {\r\n fieldArray.fields.push(mapProductToLineItem(x));\r\n notifications.info(`${x.name} added to cart.`);\r\n }}\r\n >\r\n \r\n {' Add'}\r\n \r\n \r\n \r\n ))}\r\n \r\n
\r\n
\r\n \r\n )}\r\n \r\n }\r\n actionsPosition=\"right\"\r\n >\r\n
\r\n Product Options\r\n Select items to be added to your payment\r\n
\r\n \r\n \r\n {fields.length === 0 ? (\r\n No Products Selected\r\n ) : (\r\n \r\n \r\n {fields.map((name, index) => {\r\n const element = fields.value[index];\r\n const product = productMap[element.productId];\r\n return (\r\n \r\n \r\n {element.description}\r\n {!product.required && (\r\n
\r\n {\r\n fields.remove(index);\r\n }}\r\n >\r\n Remove\r\n \r\n
\r\n )}\r\n
\r\n \r\n \r\n \r\n
\r\n );\r\n })}\r\n
\r\n
\r\n )}\r\n
\r\n );\r\n};\r\n","import React, {useMemo} from 'react';\r\nimport {useForm} from 'react-final-form';\r\nimport {Header, Table} from 'semantic-ui-react';\r\nimport {AccountSummaryDto, PaymentIntentConfig, ProductCharge} from '../api/generated/index.defs';\r\nimport {Form} from '../forms';\r\n\r\nexport const AccountChargeForm: React.FC<{\r\n config: PaymentIntentConfig;\r\n resolvedState: AccountChargeOptions;\r\n account?: AccountSummaryDto;\r\n}> = ({config, resolvedState, account}) => {\r\n const {freeFormPaymentEnabled: allowsFreeFormPayment} = config.accountConfig;\r\n const form = useForm();\r\n return (\r\n <>\r\n
\r\n Account Payment\r\n {resolvedState.showAmountOptions && (\r\n Select the amount you'd like to pay\r\n )}\r\n
\r\n\r\n \r\n \r\n {resolvedState.outstandingBalance > 0 && (\r\n \r\n \r\n {resolvedState.showAmountOptions ? (\r\n \r\n ) : (\r\n 'Amount Due:'\r\n )}\r\n \r\n \r\n \r\n \r\n \r\n )}\r\n {allowsFreeFormPayment && (\r\n \r\n \r\n {resolvedState.showAmountOptions ? (\r\n \r\n ) : (\r\n 'Payment Amount:'\r\n )}\r\n \r\n \r\n {\r\n form.change('paymentType', 'other');\r\n }}\r\n />\r\n \r\n \r\n )}\r\n \r\n
\r\n \r\n );\r\n};\r\n\r\ntype AccountChargeOptions = {\r\n canMakeAccountCharge: boolean;\r\n accountBalanceOnly: boolean;\r\n noOutstandingBalance: boolean;\r\n showAmountOptions: boolean;\r\n outstandingBalance: number;\r\n};\r\n\r\nexport const useAccountChargeOptions = (\r\n config: PaymentIntentConfig,\r\n account?: AccountSummaryDto\r\n) => {\r\n const resolvedState: AccountChargeOptions = useMemo(() => {\r\n const allowsFreeFormPayment = config.accountConfig.freeFormPaymentEnabled;\r\n\r\n if (!config || !account) {\r\n return {\r\n canMakeAccountCharge: false,\r\n accountBalanceOnly: false,\r\n noOutstandingBalance: false,\r\n showAmountOptions: false,\r\n outstandingBalance: 0,\r\n };\r\n }\r\n\r\n const canMakeAccountCharge = account.totalOutstandingBalance > 0 || allowsFreeFormPayment;\r\n const accountBalanceOnly = account.totalOutstandingBalance > 0 && !allowsFreeFormPayment;\r\n const noOutstandingBalance = account.totalOutstandingBalance === 0 && !allowsFreeFormPayment;\r\n const showAmountOptions = account.totalOutstandingBalance > 0 && allowsFreeFormPayment;\r\n\r\n return {\r\n canMakeAccountCharge,\r\n accountBalanceOnly,\r\n noOutstandingBalance,\r\n showAmountOptions,\r\n outstandingBalance: account.totalOutstandingBalance ?? 0,\r\n };\r\n }, [account, config]);\r\n\r\n return resolvedState;\r\n};\r\n\r\nexport type AccountChargeInitialValues = {\r\n paymentType: string; //'balance',\r\n amount: number;\r\n balance: number;\r\n products: ProductCharge[];\r\n pastDueAmountMinor: number;\r\n};\r\n\r\nexport const useAccountChargeInitialValues = (\r\n outstandingBalance: number,\r\n requiresMinimumOfBalance: boolean,\r\n pastDueAmountMinor: number\r\n) => {\r\n return useMemo(() => {\r\n const amount = requiresMinimumOfBalance ? Math.max(outstandingBalance, 0) : 0;\r\n\r\n return {\r\n amount,\r\n balance: Math.max(outstandingBalance, 0),\r\n paymentType: 'balance',\r\n products: [],\r\n description: '',\r\n pastDueAmountMinor: pastDueAmountMinor,\r\n };\r\n }, [\r\n requiresMinimumOfBalance,\r\n outstandingBalance,\r\n pastDueAmountMinor,\r\n ]) as AccountChargeInitialValues;\r\n};\r\n\r\nexport const shouldUsePastDueAmount = (\r\n config: PaymentIntentConfig,\r\n account: AccountSummaryDto | undefined\r\n) =>\r\n config.businessUnitPastDueAccounts &&\r\n config.accountConfig.freeFormPaymentEnabled &&\r\n !config.accountConfig.minimumBalanceRequired &&\r\n (account?.pastDueAmountMinor ?? 0) > 0;\r\n","import React from 'react';\r\nimport {\r\n AccountDetailDto,\r\n AccountFieldGetDto,\r\n PaymentIntentConfig,\r\n} from '../api/generated/index.defs';\r\nimport {Media, useBreakpoint} from '../styles/breakpoints';\r\nimport {Flex, FlexRowWithActions} from '../components/flex';\r\nimport Currency from '../components/currency';\r\nimport {DateFormat} from '../components/date';\r\nimport {Divider, Header, Label, Table} from 'semantic-ui-react';\r\nimport {Form} from '../forms';\r\nimport {css} from '@emotion/react/macro';\r\nimport {first} from 'lodash';\r\nimport moment from 'moment';\r\nimport {payStarColors} from '../styles/styled';\r\nimport {cx} from '@emotion/css';\r\nimport {AccountFieldTypes} from '../api/generated/enums';\r\nimport {useFormState} from 'react-final-form';\r\nimport {useAccountFieldConfigMap} from './account-field-label';\r\n\r\nexport type MultiAccountPaymentDto = {\r\n account: AccountDetailDto;\r\n accountDisplay: string;\r\n autopayEnrolled: boolean;\r\n canMakePayment: boolean;\r\n preventPayments: boolean;\r\n showRecentPayment: boolean;\r\n includeInMulti: boolean;\r\n};\r\n\r\nexport type MultiAccountPaymentFormProps = {\r\n mappedAccounts: MultiAccountPaymentDto[];\r\n allowsFreeFormPayment: boolean;\r\n values: any;\r\n accountFields: AccountFieldGetDto[];\r\n showSubtotal?: boolean;\r\n};\r\n\r\nexport const GetMappedAccountsForMultiAccountPaymentForm = (\r\n accounts: AccountDetailDto[],\r\n config: PaymentIntentConfig\r\n) => {\r\n if (!accounts) return [];\r\n\r\n return accounts.map((account) => {\r\n const subaccount = account.subAccountNumber ? ` / ${account.subAccountNumber}` : '';\r\n const accountDisplay = `${account.accountNumber}${subaccount}`;\r\n const autopayEnrolled = account.enrolledInAutopay;\r\n\r\n const hasBalance = account.balance > 0;\r\n\r\n const channelDisabled = !config.enabled;\r\n\r\n const preventPayments =\r\n account.accountLocked || account.isArchived || account.blockedByAllPaymentTypes;\r\n\r\n const canMakePayment =\r\n !preventPayments &&\r\n !channelDisabled &&\r\n (hasBalance || config.accountConfig.freeFormPaymentEnabled); // hasAvailableProducts\r\n\r\n const upcomingPayment = first(account.upcomingPayments);\r\n\r\n const showRecentPayment =\r\n !upcomingPayment?.dateToProcess &&\r\n account.lastPaymentDate &&\r\n moment().diff(moment(account.lastPaymentDate), 'days') <= 7;\r\n\r\n return {\r\n account,\r\n accountDisplay,\r\n autopayEnrolled,\r\n canMakePayment,\r\n preventPayments,\r\n showRecentPayment,\r\n includeInMulti: canMakePayment && !account.isArchived && !autopayEnrolled,\r\n } as MultiAccountPaymentDto;\r\n });\r\n};\r\n\r\nexport const MultiAccountPaymentForm = (props: MultiAccountPaymentFormProps) => {\r\n const {mappedAccounts, allowsFreeFormPayment, values, accountFields, showSubtotal} = props;\r\n\r\n const fields = useAccountFieldConfigMap(accountFields);\r\n\r\n const isMobile = useBreakpoint() === 'MobileMax';\r\n\r\n const dueDateConfigured = accountFields.find(\r\n (x) => x.type === AccountFieldTypes.DueDate\r\n )?.isDisplayField;\r\n\r\n const {values: formValues} = useFormState();\r\n const chargeAmounts = Object.entries(formValues)\r\n .filter(([key, value]) => key.startsWith('acc_') && value.selected)\r\n .map(([_, value]) => value.totalOutstandingBalance as number);\r\n const total = chargeAmounts.reduce((acc, cur) => acc + cur, 0);\r\n\r\n return (\r\n <>\r\n {isMobile ? (\r\n <>\r\n {mappedAccounts.map(({account, autopayEnrolled, preventPayments, includeInMulti}) => {\r\n const subAccount = account.subAccountNumber ? ` / ${account.subAccountNumber}` : '';\r\n const accountNumberDisplay = `${account.accountNumber} ${subAccount}`;\r\n const accountState = values[`acc_${account.id}`];\r\n\r\n return (\r\n \r\n
\r\n \r\n
\r\n
{fields(AccountFieldTypes.Balance).label}
\r\n
\r\n \r\n
\r\n
\r\n {account.dueDate && dueDateConfigured && (\r\n
\r\n {fields(AccountFieldTypes.DueDate).label}:{' '}\r\n \r\n
\r\n )}\r\n \r\n }\r\n actionsPosition=\"right\"\r\n align=\"top\"\r\n className=\"title-section unstackable\"\r\n >\r\n
\r\n {account.name || accountNumberDisplay}\r\n {account.name && {accountNumberDisplay}}\r\n
\r\n \r\n
\r\n\r\n
\r\n {includeInMulti ? (\r\n <>\r\n
Payment Amount
\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n ) : (\r\n <>{account.isArchived ? : null}\r\n )}\r\n
\r\n \r\n );\r\n })}\r\n {!!showSubtotal && (\r\n <>\r\n \r\n \r\n \r\n \r\n Subtotal\r\n \r\n \r\n \r\n \r\n \r\n
\r\n \r\n )}\r\n \r\n ) : (\r\n <>\r\n \r\n \r\n \r\n \r\n Account\r\n \r\n {fields(AccountFieldTypes.Balance).label}\r\n \r\n {dueDateConfigured && (\r\n \r\n {fields(AccountFieldTypes.DueDate).label}\r\n \r\n )}\r\n \r\n Payment Amount\r\n \r\n \r\n \r\n \r\n {mappedAccounts.map(\r\n ({account, accountDisplay, autopayEnrolled, preventPayments, includeInMulti}) => {\r\n const accountState = values[`acc_${account.id}`];\r\n\r\n return (\r\n \r\n \r\n {includeInMulti ? (\r\n \r\n ) : null}\r\n \r\n \r\n {account.name}\r\n
{accountDisplay}
\r\n
\r\n \r\n \r\n \r\n {dueDateConfigured && (\r\n \r\n \r\n \r\n )}\r\n \r\n {account.isArchived ? (\r\n \r\n ) : preventPayments ? (\r\n \r\n ) : autopayEnrolled ? (\r\n \r\n ) : includeInMulti ? (\r\n \r\n ) : null}\r\n \r\n \r\n );\r\n }\r\n )}\r\n
\r\n
\r\n {!!showSubtotal && (\r\n <>\r\n \r\n \r\n \r\n \r\n Subtotal\r\n \r\n \r\n \r\n \r\n \r\n
\r\n \r\n )}\r\n \r\n )}\r\n \r\n );\r\n};\r\n\r\nexport const multiAccountFormStyles = css`\r\n .account-overview-card {\r\n max-width: 900px;\r\n }\r\n\r\n .title-section {\r\n margin-bottom: 1rem;\r\n .ui.header {\r\n margin-top: 0;\r\n }\r\n }\r\n\r\n tr.selected {\r\n background-color: #f0f3ff;\r\n }\r\n\r\n .message-container > *:last-child {\r\n margin-bottom: 1rem !important;\r\n }\r\n\r\n .nowrap {\r\n text-wrap: nowrap;\r\n }\r\n\r\n .action-buttons {\r\n gap: 2rem;\r\n\r\n .action-account-detail .ui.button {\r\n margin-bottom: 1rem !important;\r\n }\r\n\r\n ${Media('DesktopMin')} {\r\n display: flex;\r\n justify-content: flex-end;\r\n margin-bottom: -2rem;\r\n padding-top: 1rem;\r\n border-top: solid 1px rgba(0, 0, 0, 0.2);\r\n margin-top: -1rem;\r\n }\r\n }\r\n\r\n .enrollment-actions {\r\n display: flex;\r\n justify-content: space-between;\r\n flex-direction: row;\r\n align-items: center;\r\n align-content: center;\r\n margin-top: 1rem;\r\n }\r\n\r\n .account-balance {\r\n margin-left: 1.5rem;\r\n font-size: 14px;\r\n line-height: 16px;\r\n text-align: right;\r\n\r\n .title {\r\n text-transform: uppercase;\r\n font-weight: bold;\r\n color: #545454;\r\n }\r\n .value {\r\n font-size: 34px;\r\n line-height: 40px;\r\n }\r\n }\r\n\r\n .ui.form .ui.table .form-field {\r\n margin-bottom: 0em;\r\n }\r\n\r\n .info-box {\r\n color: ${payStarColors.blue6};\r\n }\r\n\r\n .currency input {\r\n font-weight: 600;\r\n text-align: right !important;\r\n }\r\n\r\n .multi-account-form {\r\n td:first-of-type,\r\n th:first-of-type {\r\n padding-left: 8px !important;\r\n }\r\n\r\n td:last-child,\r\n th:last-child {\r\n padding-right: 8px !important;\r\n }\r\n }\r\n\r\n ${Media('DesktopMin')} {\r\n .multi-account-form {\r\n td:first-of-type,\r\n th:first-of-type {\r\n padding-left: 16px !important;\r\n }\r\n\r\n td:last-child,\r\n th:last-child {\r\n padding-right: 16px !important;\r\n }\r\n }\r\n }\r\n\r\n ${Media('MobileMax')} {\r\n .multi-account-payment-form {\r\n margin: -1rem;\r\n max-width: unset;\r\n\r\n .account-payment-field {\r\n padding: 1rem;\r\n border-bottom: solid 1px rgba(0, 0, 0, 0.2);\r\n position: relative;\r\n\r\n &.disabled * {\r\n color: #776;\r\n }\r\n\r\n &.selected {\r\n background-color: #f0f3ff;\r\n }\r\n\r\n .row-selection {\r\n padding-right: 1rem;\r\n }\r\n }\r\n\r\n .account-payment-field:last-child {\r\n border-bottom: none;\r\n }\r\n\r\n .account-balance {\r\n .value {\r\n font-size: 24px;\r\n line-height: 30px;\r\n }\r\n }\r\n }\r\n\r\n .form-actions {\r\n padding: 1rem;\r\n }\r\n }\r\n`;\r\n\r\nconst multiAccountFormFooterTableStyles = css`\r\n &.ui.table {\r\n margin-left: auto;\r\n }\r\n`;\r\n\r\nconst mobileTableStyles = css`\r\n &.account-payment-field {\r\n margin-bottom: 16px;\r\n }\r\n\r\n .title-section {\r\n gap: 24px;\r\n }\r\n\r\n .account-balance {\r\n display: flex;\r\n justify-content: flex-end;\r\n flex-wrap: wrap;\r\n gap: 0 0.15rem;\r\n text-align: right;\r\n\r\n .title {\r\n &:after {\r\n content: ':';\r\n }\r\n }\r\n }\r\n\r\n .due-date {\r\n display: flex;\r\n justify-content: flex-end;\r\n flex-wrap: wrap;\r\n gap: 0 0.15rem;\r\n text-align: right;\r\n margin-bottom: 14px;\r\n }\r\n\r\n & .field .ui.input-currency input[type='text'] {\r\n min-width: auto !important;\r\n width: 100%;\r\n }\r\n`;\r\n","import React from 'react';\r\nimport ReactMarkdown from 'react-markdown';\r\nimport {Message} from 'semantic-ui-react';\r\nimport {MessageDetailDto} from '../api/generated/index.defs';\r\n\r\ntype MessageDisplay = {\r\n location: 'payment' | 'confirmation';\r\n messages: MessageDetailDto[];\r\n};\r\n\r\nexport const MessageDisplay: React.FC = (props) => {\r\n return (\r\n <>\r\n {props.messages\r\n .filter(\r\n (x) =>\r\n (x.showOnPayment && props.location === 'payment') ||\r\n (x.showOnConfirmation && props.location === 'confirmation')\r\n )\r\n .map((member) => (\r\n \r\n \r\n \r\n ))}\r\n \r\n );\r\n};\r\n","import '@reach/combobox/styles.css';\r\n\r\nimport React, {useEffect, useState} from 'react';\r\nimport {useHotkeys} from 'react-hotkeys-hook';\r\nimport {useAsyncFn} from 'react-use';\r\nimport {Icon, Input, Form as SemanticForm} from 'semantic-ui-react';\r\nimport {Global} from '@emotion/react';\r\nimport {css} from '@emotion/react/macro';\r\nimport {\r\n Combobox,\r\n ComboboxInput,\r\n ComboboxList,\r\n ComboboxOption,\r\n ComboboxPopover,\r\n} from '@reach/combobox';\r\nimport {AccountsService} from '../api/generated/AccountsService';\r\nimport {\r\n AccountFieldGetDto,\r\n AccountSummaryDto,\r\n BusinessUnitContextDto,\r\n} from '../api/generated/index.defs';\r\nimport Currency from '../components/currency';\r\nimport {useDebouncedState} from '../hooks/use-debounced-state';\r\nimport {payStarColors} from '../styles/styled';\r\nimport {AdvancedPagedSearch} from '../types';\r\nimport {notifications} from '../utils/notification-service';\r\nimport {useAccountFieldConfigMap} from './account-field-label';\r\n\r\ntype AccountSearchInput = {\r\n onAccountResults?: (accounts: AccountSummaryDto[]) => void;\r\n onAccountSelected: (account: AccountSummaryDto) => void;\r\n businessUnit: BusinessUnitContextDto;\r\n};\r\n\r\ntype SearchResult = {\r\n account: AccountSummaryDto;\r\n accountFields: AccountFieldGetDto[];\r\n};\r\n\r\nconst SearchResult = ({account, accountFields}: SearchResult) => {\r\n const fields = useAccountFieldConfigMap(accountFields);\r\n const subAccount = fields('SubAccountNumber');\r\n const accountConfig = fields('AccountNumber');\r\n return (\r\n
\r\n
\r\n \r\n
\r\n
{account.name}
\r\n
\r\n {accountConfig.label}: {account.accountNumber}\r\n
\r\n {subAccount.isQuickPayLookupField && (\r\n <>\r\n
\r\n {subAccount.label}: {account.subAccountNumber}\r\n
\r\n \r\n )}\r\n {account.description &&
{account.description}
}\r\n
\r\n );\r\n};\r\n\r\nconst minSearchLength = 1;\r\n\r\nexport const AccountSearchInput: React.FC = ({\r\n businessUnit,\r\n onAccountSelected,\r\n onAccountResults,\r\n}) => {\r\n const [selectedResult, setSelectedResult] = useState();\r\n const [search, setSearch] = useDebouncedState('', 300);\r\n\r\n const [searchAccountState, searchAccount] = useAsyncFn(async (...args) => {\r\n const [term] = args;\r\n\r\n const searchMethod = businessUnit.customAccountSyncStrategy\r\n ? searchAccountsCustom\r\n : searchAccounts;\r\n\r\n const result = await searchMethod(term, businessUnit.id);\r\n\r\n if (onAccountResults) {\r\n onAccountResults(result);\r\n }\r\n return result;\r\n });\r\n\r\n useEffect(() => {\r\n if (search && search.length >= minSearchLength) {\r\n searchAccount(search);\r\n }\r\n }, [search, searchAccount]);\r\n\r\n const getSelectedAccount = (accountId: string) => {\r\n if (!searchAccountState.value) {\r\n return undefined;\r\n }\r\n\r\n return searchAccountState.value.find((x) => `${x.id}` === accountId);\r\n };\r\n\r\n const {value, loading} = searchAccountState;\r\n const results = search.length >= minSearchLength && value ? value : undefined;\r\n\r\n const ref = useHotkeys(\r\n 'enter',\r\n (e) => {\r\n e.preventDefault();\r\n\r\n const accounts = searchAccountState.value ?? [];\r\n if (accounts.length === 1) {\r\n const account = accounts[0];\r\n setSelectedResult(account);\r\n onAccountSelected(account);\r\n }\r\n },\r\n {\r\n filterPreventDefault: true,\r\n filter: () => true,\r\n enableOnTags: ['INPUT'],\r\n }\r\n );\r\n\r\n return (\r\n <>\r\n
\r\n \r\n \r\n {selectedResult ? (\r\n \r\n ) : (\r\n {\r\n const account = getSelectedAccount(accountId);\r\n if (account) {\r\n setSelectedResult(account);\r\n onAccountSelected(account);\r\n }\r\n }}\r\n >\r\n \r\n \r\n {\r\n const {value} = event.target as HTMLInputElement;\r\n setSearch(value);\r\n }}\r\n />\r\n \r\n {results && !loading && (\r\n \r\n {results.length > 0 ? (\r\n \r\n {results.map((result, index) => (\r\n \r\n \r\n \r\n ))}\r\n \r\n ) : (\r\n

No results

\r\n )}\r\n
\r\n )}\r\n \r\n )}\r\n
\r\n {!selectedResult && !businessUnit.customAccountSyncStrategy && (\r\n
Search by Name, Account Number, or Address
\r\n )}\r\n
\r\n \r\n );\r\n};\r\n\r\nconst searchAccounts = async (term, businessUnitId) => {\r\n const searchParams: AdvancedPagedSearch = {\r\n searchFieldNames: ['name', 'accountNumber', 'subAccountNumber', 'addressStreetAddress'],\r\n searchSearchText: term,\r\n };\r\n\r\n const response = await AccountsService.getAll({\r\n businessUnitId: businessUnitId,\r\n page: 1,\r\n pageSize: 25,\r\n isPos: true,\r\n ...searchParams,\r\n });\r\n\r\n if (response.hasErrors) {\r\n notifications.errors(response.errors);\r\n return [];\r\n } else {\r\n return response.data.items;\r\n }\r\n};\r\n\r\nconst searchAccountsCustom = async (term, businessUnitId) => {\r\n const response = await AccountsService.search({\r\n businessUnitId: businessUnitId,\r\n query: term,\r\n });\r\n\r\n if (response.hasErrors) {\r\n notifications.errors(response.errors);\r\n return [];\r\n } else {\r\n return response.data;\r\n }\r\n};\r\n\r\nconst styles = css`\r\n [data-reach-combobox-popover] {\r\n border: none;\r\n background: transparent;\r\n z-index: 30;\r\n\r\n .ui.basic.button.all-results-button {\r\n margin-top: 0px;\r\n box-shadow: 0 2px 4px 0 rgba(34, 36, 38, 0.12), 0 2px 10px 0 rgba(34, 36, 38, 0.15) !important;\r\n background-color: ${payStarColors.white1} !important;\r\n border: 1px solid #d4d4d5 !important;\r\n }\r\n\r\n [data-reach-combobox-list] {\r\n white-space: normal;\r\n text-align: left;\r\n text-transform: none;\r\n background: #fff;\r\n margin-top: 0.5em;\r\n border-radius: 0.28571429rem;\r\n -webkit-box-shadow: 0 2px 4px 0 rgba(34, 36, 38, 0.12), 0 2px 10px 0 rgba(34, 36, 38, 0.15);\r\n box-shadow: 0 2px 4px 0 rgba(34, 36, 38, 0.12), 0 2px 10px 0 rgba(34, 36, 38, 0.15);\r\n border: 1px solid #d4d4d5;\r\n z-index: 998;\r\n padding-inline-start: 0;\r\n\r\n > :first-of-type {\r\n border-radius: 0.28571429rem 0.28571429rem 0 0;\r\n }\r\n\r\n > :last-child {\r\n border-radius: 0 0 0.28571429rem 0.28571429rem;\r\n }\r\n\r\n [data-reach-combobox-option] {\r\n cursor: pointer;\r\n display: block;\r\n overflow: hidden;\r\n font-size: 1em;\r\n padding: 0.85714286em 1.14285714em;\r\n color: rgba(0, 0, 0, 0.87);\r\n line-height: 1.33;\r\n border-bottom: 1px solid rgba(34, 36, 38, 0.1);\r\n\r\n &[data-highlighted],\r\n &:hover {\r\n background-color: #e6e6e6;\r\n }\r\n }\r\n\r\n [data-reach-combobox-option]:last-child {\r\n border-bottom: none !important;\r\n }\r\n\r\n [data-reach-combobox-option] .title {\r\n margin: -0.14285714em 0 0;\r\n font-family: Lato, 'Helvetica Neue', Arial, Helvetica, sans-serif;\r\n font-weight: 700;\r\n font-size: 1em;\r\n color: rgba(0, 0, 0, 0.85);\r\n }\r\n\r\n [data-reach-combobox-option] .description {\r\n margin-top: 0;\r\n font-size: 0.92857143em;\r\n color: rgba(0, 0, 0, 0.7);\r\n }\r\n\r\n [data-reach-combobox-option] .price {\r\n float: right;\r\n color: #21ba45;\r\n }\r\n }\r\n\r\n .no-results {\r\n background: #fff;\r\n box-shadow: #000 0px 0px 2px 0px;\r\n padding: 1rem;\r\n margin: 4px 1px;\r\n border-radius: 4px;\r\n }\r\n }\r\n\r\n .map-popover {\r\n z-index: 9999;\r\n max-height: 76dvh;\r\n overflow-y: scroll;\r\n }\r\n`;\r\n","import {camelCase} from 'lodash';\r\nimport React from 'react';\r\nimport {Header} from 'semantic-ui-react';\r\nimport {cx} from '@emotion/css';\r\nimport {PaymentIntentsService} from '../api/generated/PaymentIntentsService';\r\nimport {\r\n PaymentFieldDetailDto,\r\n PaymentIntentConfig,\r\n PaymentIntentDetailDto,\r\n} from '../api/generated/index.defs';\r\nimport {ConfirmButton} from '../components/confirm-button';\r\nimport {Form} from '../forms';\r\nimport {PaymentIntentConfigScopes} from '../api/generated/enums';\r\nimport {usePaymentFields} from '../payments/payment-field-utils';\r\n\r\nexport type PaymentIntentFieldsProps = {\r\n paymentIntent: PaymentIntentDetailDto;\r\n paymentIntentConfig: PaymentIntentConfig;\r\n onUpdate: () => void;\r\n onCancel: () => void;\r\n};\r\n\r\ntype PaymentIntentFieldsForm = {\r\n paymentFields: PaymentFieldDetailDto[];\r\n accountId?: number;\r\n};\r\n\r\nexport const PaymentIntentFieldsForm: React.FC = ({\r\n paymentFields,\r\n accountId,\r\n}) => {\r\n return (\r\n <>\r\n
Payment Information
\r\n {paymentFields.map((x) => {\r\n const hidden = isHiddenPaymentField(x, accountId);\r\n return (\r\n \r\n );\r\n })}\r\n \r\n );\r\n};\r\n\r\nconst isHiddenPaymentField = (field: PaymentFieldDetailDto, accountId?: number) => {\r\n return (\r\n Boolean(accountId) && (!!field.accountFieldMappingKey || field.key === 'PaymentDescriptor')\r\n );\r\n};\r\n\r\nexport const PaymentIntentFields: React.FC = ({\r\n paymentIntent,\r\n paymentIntentConfig,\r\n onUpdate,\r\n onCancel,\r\n}) => {\r\n const {hiddenFields, visibleFields, initialValues} = usePaymentFields(\r\n paymentIntentConfig,\r\n paymentIntent\r\n );\r\n\r\n const onSubmit = async (values) => {\r\n const response = await PaymentIntentsService.updatePaymentFields({\r\n identifier: paymentIntent.sessionIdentifier,\r\n body: {\r\n paymentFields: values.paymentFields,\r\n useMergeStrategy: false,\r\n scope: PaymentIntentConfigScopes.Default,\r\n },\r\n });\r\n\r\n if (response.hasErrors) {\r\n return response;\r\n }\r\n\r\n onUpdate();\r\n };\r\n\r\n return (\r\n (\r\n <>\r\n \r\n \r\n\r\n
\r\n \r\n Continue\r\n \r\n \r\n
\r\n
\r\n \r\n )}\r\n />\r\n );\r\n};\r\n\r\n// ---\r\n\r\n/**\r\n * PaymentIntentFormFields renders similar to PaymentIntentFieldsForm but it takes\r\n * the hidden & visible fields as props instead of taking all fields and determining\r\n * itself if the field should be hidden. This was created to handle requirement changes\r\n * to match the behavior of embedded payment fields.\r\n */\r\n\r\ntype PaymentIntentFormFieldsProps = {\r\n hiddenFields: PaymentFieldDetailDto[];\r\n visibleFields: PaymentFieldDetailDto[];\r\n};\r\n\r\nexport const PaymentIntentPaymentFields: React.FC = ({\r\n hiddenFields,\r\n visibleFields,\r\n}) => {\r\n return (\r\n <>\r\n
Payment Information
\r\n {hiddenFields.map((x) => {\r\n return (\r\n \r\n );\r\n })}\r\n {visibleFields.map((x) => {\r\n return (\r\n \r\n );\r\n })}\r\n \r\n );\r\n};\r\n","import React from 'react';\r\nimport {Header, Table} from 'semantic-ui-react';\r\nimport {PaymentIntentConfig} from '../api/generated/index.defs';\r\nimport {Form} from '../forms';\r\n\r\nexport const OpenChargeForm: React.FC<{\r\n config: PaymentIntentConfig;\r\n title?: string;\r\n embedded?: boolean;\r\n}> = ({config, title, embedded}) => {\r\n return embedded ? (\r\n <>\r\n {!config.productConfig.enabled && (\r\n <>\r\n
{title || 'How much would you like to pay'}
\r\n \r\n \r\n )}\r\n \r\n ) : (\r\n <>\r\n
{title || 'How much would you like to pay'}
\r\n \r\n \r\n \r\n Payment Amount:\r\n \r\n \r\n \r\n \r\n \r\n
\r\n \r\n );\r\n};\r\n","import React, {useEffect, useMemo} from 'react';\r\nimport {useForm, useFormState} from 'react-final-form';\r\nimport {Divider} from 'semantic-ui-react';\r\nimport {AccountSearchInput} from '../accounts/account-search-input';\r\nimport {\r\n GetMappedAccountsForMultiAccountPaymentForm,\r\n MultiAccountPaymentForm,\r\n} from '../accounts/multi-account-payment-form';\r\nimport {AccountSummaryDto, PaymentIntentConfig} from '../api/generated/index.defs';\r\nimport {useBusinessUnitContext} from '../customer-portal/business-unit-provider';\r\nimport {useProduce} from '../hooks/use-produce';\r\n\r\nexport const PosMultiAccountChargeForm: React.FC<{\r\n config: PaymentIntentConfig;\r\n account?: AccountSummaryDto;\r\n}> = ({config, account}) => {\r\n const businessUnit = useBusinessUnitContext();\r\n const form = useForm();\r\n const {values} = useFormState();\r\n\r\n const [state, setState] = useProduce<{\r\n accounts: AccountSummaryDto[];\r\n counter: number;\r\n }>({\r\n accounts: account ? [account] : [],\r\n counter: 0,\r\n });\r\n\r\n const accountKey = account ? `acc_${account.id}` : null;\r\n const formAmount =\r\n accountKey && !!values[accountKey] ? values[accountKey].totalOutstandingBalance : null;\r\n useEffect(() => {\r\n if (accountKey) {\r\n form.change(accountKey, {\r\n selected: true,\r\n totalOutstandingBalance: formAmount ?? account?.totalOutstandingBalance,\r\n });\r\n }\r\n }, [accountKey, formAmount, form, account?.totalOutstandingBalance]);\r\n\r\n const mappedAccounts = useMemo(() => {\r\n return GetMappedAccountsForMultiAccountPaymentForm(state.accounts as any, config);\r\n }, [config, state.accounts]);\r\n\r\n return (\r\n <>\r\n {\r\n setState((draft) => {\r\n draft.accounts = [...draft.accounts, selectedAccount];\r\n draft.counter++;\r\n });\r\n\r\n const accountKey = `acc_${selectedAccount.id}`;\r\n\r\n setTimeout(() => {\r\n form.change(accountKey, {\r\n selected: true,\r\n totalOutstandingBalance: selectedAccount.totalOutstandingBalance,\r\n });\r\n }, 0);\r\n }}\r\n />\r\n \r\n \r\n \r\n );\r\n};\r\n","import React from 'react';\r\nimport {Header} from 'semantic-ui-react';\r\nimport {PaymentIntentConfig} from '../api/generated/index.defs';\r\nimport Currency from '../components/currency';\r\nimport {Flex} from '../components/flex';\r\nimport {ProductionSelectionForm} from '../payments/product-selection-form';\r\n\r\nexport const ProductChargeForm: React.FC<{\r\n config: PaymentIntentConfig;\r\n embedded: boolean;\r\n total: number;\r\n}> = ({config, embedded, total}) => {\r\n return (\r\n <>\r\n \r\n
\r\n
\r\n \r\n \r\n
{embedded ? 'Total Amount' : 'Payment Amount'}
\r\n
\r\n \r\n
\r\n \r\n
\r\n
\r\n
\r\n {embedded &&
}\r\n \r\n );\r\n};\r\n","import React, {useEffect} from 'react';\r\nimport {useForm, useFormState} from 'react-final-form';\r\nimport {css} from '@emotion/react/macro';\r\nimport {PaymentChannels} from '../api/generated/enums';\r\nimport {AccountSummaryDto, Charges, PaymentIntentConfig} from '../api/generated/index.defs';\r\nimport {\r\n AccountChargeForm,\r\n AccountChargeInitialValues,\r\n shouldUsePastDueAmount,\r\n useAccountChargeOptions,\r\n} from './account-charges-form';\r\nimport {OpenChargeForm} from './open-charge-form';\r\nimport {PosMultiAccountChargeForm} from './pos-map-charges-form';\r\nimport {ProductChargeForm} from './product-charge-form';\r\n\r\ntype PaymentIntentChargesFormProps = {\r\n config: PaymentIntentConfig;\r\n account?: AccountSummaryDto;\r\n title?: string;\r\n embedded?: boolean;\r\n};\r\n\r\nexport const PaymentIntentChargesForm: React.FC = ({\r\n config,\r\n account,\r\n title,\r\n embedded,\r\n}) => {\r\n const isPos = config.channel === PaymentChannels.POS;\r\n const posMultiAccountEnabled =\r\n !embedded && isPos && config.accountConfig.multipleAccountPosEnabled;\r\n\r\n if (posMultiAccountEnabled) {\r\n return ;\r\n }\r\n\r\n return (\r\n \r\n );\r\n};\r\n\r\nconst StandardPaymentIntentChargesForm: React.FC = ({\r\n config,\r\n account,\r\n title,\r\n embedded,\r\n}) => {\r\n const form = useForm();\r\n const state = useFormState();\r\n\r\n const resolvedState = useAccountChargeOptions(config, account);\r\n const {canMakeAccountCharge} = resolvedState;\r\n\r\n const {paymentType, balance, amount, products, pastDueAmountMinor} = state.values || {};\r\n const calculatedAmount = shouldUsePastDueAmount(config, account) ? pastDueAmountMinor : amount;\r\n const total = calculateTotal(paymentType, balance, calculatedAmount, products);\r\n\r\n const canMakeOpenCharge = !canMakeAccountCharge && config.openChargeEnabled;\r\n\r\n const chargeType =\r\n canMakeOpenCharge && !account\r\n ? 'open-charge'\r\n : canMakeAccountCharge\r\n ? 'account-charge'\r\n : 'none';\r\n\r\n useEffect(() => {\r\n if (chargeType === 'open-charge') {\r\n form.change('paymentType', 'other');\r\n }\r\n }, [chargeType, form]);\r\n\r\n return (\r\n
\r\n {chargeType === 'open-charge' && (\r\n \r\n )}\r\n\r\n {chargeType === 'account-charge' && (\r\n \r\n )}\r\n\r\n {config.productConfig.enabled && (\r\n \r\n )}\r\n
\r\n );\r\n};\r\n\r\nconst calculateTotal = (\r\n paymentType: string,\r\n balance: number,\r\n amount: number,\r\n products: {price: number}[]\r\n) => {\r\n const accountPayment = (paymentType === 'other' ? amount : balance) ?? 0;\r\n const productTotal = (products || []).reduce((sum, lineItem) => sum + lineItem.price, 0);\r\n const total = accountPayment + (isNaN(productTotal) ? 0 : productTotal);\r\n return isNaN(total) ? 0 : total;\r\n};\r\n\r\nexport const mapFormToCharges = (\r\n values: AccountChargeInitialValues,\r\n usePastDueAmount: boolean,\r\n accountId?: number\r\n): Charges => {\r\n const accountCharges = Object.keys(values)\r\n .filter((x) => values[x].selected)\r\n .map((x) => {\r\n const accountId = Number(x.replace('acc_', ''));\r\n return {\r\n accountId,\r\n paymentAmount: values[x].totalOutstandingBalance ?? 0,\r\n description: '',\r\n };\r\n });\r\n\r\n if (accountCharges.length > 0) {\r\n return {\r\n accounts: accountCharges,\r\n openCharges: [],\r\n products: [],\r\n };\r\n }\r\n\r\n const paymentAmount =\r\n usePastDueAmount && values.paymentType === 'other'\r\n ? values.pastDueAmountMinor\r\n : values.paymentType === 'other'\r\n ? values.amount\r\n : values.balance;\r\n\r\n return {\r\n openCharges: accountId\r\n ? []\r\n : [\r\n {\r\n amount: values.amount,\r\n description: '',\r\n },\r\n ],\r\n accounts:\r\n accountId && paymentAmount\r\n ? [\r\n {\r\n accountId: accountId,\r\n paymentAmount,\r\n description: '',\r\n },\r\n ]\r\n : [],\r\n products: values.products,\r\n };\r\n};\r\n\r\nconst styles = css`\r\n .ui.table.line-items .form-field {\r\n margin: 0em;\r\n }\r\n\r\n .account-charge,\r\n .open-charge {\r\n margin-bottom: 3rem;\r\n }\r\n\r\n .embedded-currency-input {\r\n max-width: 150px;\r\n input {\r\n text-align: right !important;\r\n }\r\n }\r\n`;\r\n","import React from 'react';\r\nimport {StandardTermsOfServiceIdentifiers} from '../api/generated/enums';\r\nimport Currency from '../components/currency';\r\nimport {BusinessUnitTerms, TermsOfService} from '../components/terms-of-service';\r\nimport {Tooltip} from '../components/tooltip';\r\n\r\ntype PaymentTerms = {\r\n paymentSourceType: string;\r\n serviceFee: number;\r\n authorizer?: string;\r\n businessUnitId: number;\r\n isAccountless?: boolean;\r\n};\r\n\r\ntype VariableData = {\r\n authorizer: string;\r\n serviceFee: JSX.Element;\r\n businessUnitId: number;\r\n identifier: string;\r\n};\r\n\r\n// FIXME: Move up in tree\r\nexport const TermsOfUse = () => (\r\n \r\n \r\n TERMS OF USE\r\n \r\n \r\n);\r\n\r\nexport const PaymentTerms: React.FC = ({\r\n paymentSourceType,\r\n serviceFee,\r\n businessUnitId,\r\n isAccountless,\r\n authorizer = 'Paystar',\r\n}) => {\r\n const termsIdentifier =\r\n paymentSourceType === 'Credit Card'\r\n ? serviceFee > 0\r\n ? StandardTermsOfServiceIdentifiers['credit-card-terms-with-service-fee']\r\n : StandardTermsOfServiceIdentifiers['credit-card-terms']\r\n : serviceFee > 0\r\n ? StandardTermsOfServiceIdentifiers['ach-terms-with-service-fee']\r\n : StandardTermsOfServiceIdentifiers['ach-terms'];\r\n\r\n const variableData: VariableData = {\r\n authorizer: authorizer,\r\n serviceFee: ,\r\n businessUnitId: businessUnitId,\r\n identifier: termsIdentifier,\r\n };\r\n\r\n return (\r\n <>\r\n \r\n {isAccountless && (\r\n \r\n )}\r\n \r\n );\r\n};\r\n","import React from 'react';\r\nimport {Header, Icon, Popup, Table} from 'semantic-ui-react';\r\nimport nameof from 'ts-nameof.macro';\r\nimport {css} from '@emotion/react/macro';\r\nimport {analytics} from '../analytics';\r\nimport {PaymentIntentsService} from '../api/generated/PaymentIntentsService';\r\nimport {PaymentIntentDetailDto} from '../api/generated/index.defs';\r\nimport {ConfirmButton} from '../components/confirm-button';\r\nimport Currency from '../components/currency';\r\nimport {PaymentSourceMiniPreview} from '../components/payment-source-preview';\r\nimport {ChildBridge} from '../embedded/bridge';\r\nimport {Form} from '../forms';\r\nimport {decimalValueConverter} from '../forms/value-converters';\r\nimport {notify} from '../hooks/use-subscription';\r\nimport {PaymentTerms} from '../payments/payment-terms';\r\nimport {ApiError, ApiResponse} from '../types';\r\nimport {useGoogleReCaptcha} from 'react-google-recaptcha-v3';\r\n\r\nexport type PaymentIntentReview = {\r\n paymentIntent: PaymentIntentDetailDto;\r\n cardCvv: string;\r\n recaptchaAction: string;\r\n onComplete: (response: ApiResponse) => void;\r\n onCancel?: () => void;\r\n processFunction?: (recaptchaToken: string) => Promise>;\r\n};\r\n\r\nexport const PaymentIntentReview: React.FC = (props) => {\r\n const {executeRecaptcha} = useGoogleReCaptcha();\r\n const {paymentIntent, onComplete, onCancel, cardCvv, processFunction} = props;\r\n\r\n const onSubmit = async () => {\r\n const action =\r\n processFunction ||\r\n ((recaptchaToken) =>\r\n PaymentIntentsService.process(\r\n {\r\n identifier: paymentIntent.sessionIdentifier,\r\n body: {cardCvv, recaptchaToken},\r\n },\r\n {headers: {['Timestamp']: analytics.getDistinctId()}}\r\n ));\r\n\r\n if (!executeRecaptcha) {\r\n const errors: ApiError[] = [\r\n {\r\n propertyName: '',\r\n errorMessage:\r\n 'We cannot validate your request for payment at this time. Please try again later.',\r\n },\r\n ];\r\n return {\r\n errors,\r\n hasErrors: true,\r\n data: undefined,\r\n };\r\n }\r\n\r\n const recaptchaToken = await executeRecaptcha(props.recaptchaAction);\r\n\r\n const response = await action(recaptchaToken);\r\n\r\n if (response.hasErrors) {\r\n return response;\r\n } else {\r\n analytics.trackEvent('quickpay.payment-session-updated', {\r\n subject: nameof(PaymentIntentsService.process),\r\n status: response.data?.status,\r\n subtotal: response.data?.subtotal,\r\n sessionIdentifier: response.data?.sessionIdentifier,\r\n });\r\n\r\n if (response.data) {\r\n notify('payment-session-processed', {paymentIntent: response.data});\r\n ChildBridge?.notify('PAYMENT-SESSION.PROCESSED', response.data); // TODO: don't think this is used anymore??\r\n }\r\n\r\n onComplete(response);\r\n }\r\n };\r\n\r\n let total = paymentIntent.subtotal;\r\n let serviceFee = 0;\r\n const fees = paymentIntent.serviceFeeCalculation;\r\n const hasFees = fees?.amount > 0;\r\n\r\n if (hasFees) {\r\n serviceFee = fees.amount;\r\n total = total + serviceFee;\r\n }\r\n\r\n return (\r\n \r\n (\r\n <>\r\n
Confirm Payment
\r\n\r\n
\r\n \r\n \r\n \r\n Payment Method:\r\n \r\n \r\n \r\n \r\n {hasFees && (\r\n <>\r\n \r\n Payment:\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n {'Service Fee: '}\r\n \r\n }\r\n position=\"top center\"\r\n >\r\n {'A '}\r\n \r\n {!!fees.tier.percentageFee &&\r\n `${decimalValueConverter.format(fees.tier.percentageFee)}%`}\r\n {!!fees.tier.flatFee && !!fees.tier.percentageFee && ' + '}\r\n {!!fees.tier.flatFee && }\r\n {!!fees.tier.flatFee ? ' flat fee' : ' fee'}\r\n \r\n {' will be paid to Paystar for providing this service.'}\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n )}\r\n \r\n Total:\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n
\r\n
\r\n\r\n
\r\n
\r\n \r\n
\r\n \r\n Submit Payment\r\n \r\n {onCancel && (\r\n \r\n )}\r\n
\r\n \r\n )}\r\n />\r\n
\r\n );\r\n};\r\n\r\nconst styles = css`\r\n .no-border {\r\n border-bottom: none !important;\r\n }\r\n\r\n .no-wrap {\r\n white-space: nowrap;\r\n }\r\n\r\n .mini-card {\r\n max-width: 35px !important;\r\n display: inline-block !important;\r\n }\r\n\r\n .payment-total {\r\n margin-top: 0.25rem !important;\r\n font-size: 1.5rem !important;\r\n /* color: green; */\r\n }\r\n\r\n .form-actions {\r\n margin-top: 2rem;\r\n }\r\n\r\n .form-actions-text {\r\n font-size: 0.8rem;\r\n margin-bottom: 1rem;\r\n\r\n a {\r\n font-weight: 500;\r\n }\r\n }\r\n`;\r\n","/* eslint-disable */\r\n\r\nimport {\r\n PaymentIntentConfig,\r\n Address,\r\n PaymentFieldDetailDto,\r\n MessageDetailDto,\r\n AccountConfig,\r\n AccountFieldGetDto,\r\n PaymentSourceConfig,\r\n CreditCardConfig,\r\n TokenizerConfig,\r\n AcceptedCardBrands,\r\n AchConfig,\r\n PaymentSourceSummaryDto,\r\n OptionalAddress,\r\n ProductConfig,\r\n ProductSummaryDto,\r\n AccountDetailDto,\r\n CustomerAccountGetDto,\r\n AutopayEnrollmentSettings,\r\n ScheduledPaymentCustomerSummaryDto,\r\n CreateCheckoutPaymentIntentRequest,\r\n NewPaymentSource,\r\n AccountCharge,\r\n ProductCharge,\r\n PaymentIntentDetailDto,\r\n PaymentSessionLineItemGetDto,\r\n Currency,\r\n AccountSummaryDto,\r\n ServiceFeeCalculationDto,\r\n ServiceFeeTierGetDto,\r\n ProcessPaymentIntentRequest,\r\n PaymentIntentResultDto,\r\n SendPaymentReceiptRequest,\r\n EmptyResponse,\r\n Error,\r\n IList,\r\n List,\r\n Response,\r\n AdvancedQueryPage,\r\n IRequestOptions,\r\n IRequestConfig,\r\n getConfigs,\r\n axios,\r\n basePath\r\n} from './index.defs';\r\n\r\nexport class CheckoutService {\r\n /** Generate by swagger-axios-codegen */\r\n // @ts-nocheck\r\n /* eslint-disable */\r\n\r\n /**\r\n *\r\n */\r\n static getConfig(\r\n params: {\r\n /** */\r\n slug: string;\r\n } = {} as any,\r\n options: IRequestOptions = {}\r\n ): Promise> {\r\n return new Promise((resolve, reject) => {\r\n let url = basePath + '/api/checkout-config/{slug}';\r\n url = url.replace('{slug}', params['slug'] + '');\r\n\r\n const configs: IRequestConfig = getConfigs('get', 'application/json', url, options);\r\n\r\n let data = null as any;\r\n\r\n configs.data = data;\r\n axios(configs, resolve, reject);\r\n });\r\n }\r\n /**\r\n *\r\n */\r\n static getAccounts(\r\n params: {\r\n /** */\r\n slug: string;\r\n /** */\r\n signature: string;\r\n /** */\r\n expiration: number;\r\n /** */\r\n base64Info?: string;\r\n } = {} as any,\r\n options: IRequestOptions = {}\r\n ): Promise>> {\r\n return new Promise((resolve, reject) => {\r\n let url = basePath + '/api/checkout/{slug}/{signature}/{expiration}/get-accounts';\r\n url = url.replace('{slug}', params['slug'] + '');\r\n url = url.replace('{signature}', params['signature'] + '');\r\n url = url.replace('{expiration}', params['expiration'] + '');\r\n\r\n const configs: IRequestConfig = getConfigs('get', 'application/json', url, options);\r\n configs.params = { base64Info: params['base64Info'] };\r\n let data = null as any;\r\n\r\n configs.data = data;\r\n axios(configs, resolve, reject);\r\n });\r\n }\r\n /**\r\n *\r\n */\r\n static create(\r\n params: {\r\n /** */\r\n slug: string;\r\n /** */\r\n signature: string;\r\n /** */\r\n expiration: number;\r\n /** */\r\n body?: CreateCheckoutPaymentIntentRequest;\r\n } = {} as any,\r\n options: IRequestOptions = {}\r\n ): Promise> {\r\n return new Promise((resolve, reject) => {\r\n let url = basePath + '/api/checkout/{slug}/{signature}/{expiration}/create';\r\n url = url.replace('{slug}', params['slug'] + '');\r\n url = url.replace('{signature}', params['signature'] + '');\r\n url = url.replace('{expiration}', params['expiration'] + '');\r\n\r\n const configs: IRequestConfig = getConfigs('post', 'application/json', url, options);\r\n\r\n let data = params['body'];\r\n\r\n configs.data = data;\r\n axios(configs, resolve, reject);\r\n });\r\n }\r\n /**\r\n *\r\n */\r\n static get(\r\n params: {\r\n /** */\r\n slug: string;\r\n /** */\r\n signature: string;\r\n /** */\r\n expiration: number;\r\n /** */\r\n identifier: string;\r\n } = {} as any,\r\n options: IRequestOptions = {}\r\n ): Promise> {\r\n return new Promise((resolve, reject) => {\r\n let url = basePath + '/api/checkout/{slug}/{signature}/{expiration}/{identifier}';\r\n url = url.replace('{slug}', params['slug'] + '');\r\n url = url.replace('{signature}', params['signature'] + '');\r\n url = url.replace('{expiration}', params['expiration'] + '');\r\n url = url.replace('{identifier}', params['identifier'] + '');\r\n\r\n const configs: IRequestConfig = getConfigs('get', 'application/json', url, options);\r\n\r\n let data = null as any;\r\n\r\n configs.data = data;\r\n axios(configs, resolve, reject);\r\n });\r\n }\r\n /**\r\n *\r\n */\r\n static process(\r\n params: {\r\n /** */\r\n slug: string;\r\n /** */\r\n signature: string;\r\n /** */\r\n expiration: number;\r\n /** */\r\n identifier: string;\r\n /** */\r\n body?: ProcessPaymentIntentRequest;\r\n } = {} as any,\r\n options: IRequestOptions = {}\r\n ): Promise> {\r\n return new Promise((resolve, reject) => {\r\n let url = basePath + '/api/checkout/{slug}/{signature}/{expiration}/{identifier}/process';\r\n url = url.replace('{slug}', params['slug'] + '');\r\n url = url.replace('{signature}', params['signature'] + '');\r\n url = url.replace('{expiration}', params['expiration'] + '');\r\n url = url.replace('{identifier}', params['identifier'] + '');\r\n\r\n const configs: IRequestConfig = getConfigs('post', 'application/json', url, options);\r\n\r\n let data = params['body'];\r\n\r\n configs.data = data;\r\n axios(configs, resolve, reject);\r\n });\r\n }\r\n /**\r\n *\r\n */\r\n static getResult(\r\n params: {\r\n /** */\r\n slug: string;\r\n /** */\r\n signature: string;\r\n /** */\r\n expiration: number;\r\n /** */\r\n identifier: string;\r\n } = {} as any,\r\n options: IRequestOptions = {}\r\n ): Promise> {\r\n return new Promise((resolve, reject) => {\r\n let url = basePath + '/api/checkout/{slug}/{signature}/{expiration}/{identifier}/result';\r\n url = url.replace('{slug}', params['slug'] + '');\r\n url = url.replace('{signature}', params['signature'] + '');\r\n url = url.replace('{expiration}', params['expiration'] + '');\r\n url = url.replace('{identifier}', params['identifier'] + '');\r\n\r\n const configs: IRequestConfig = getConfigs('get', 'application/json', url, options);\r\n\r\n let data = null as any;\r\n\r\n configs.data = data;\r\n axios(configs, resolve, reject);\r\n });\r\n }\r\n /**\r\n *\r\n */\r\n static sendReceipt(\r\n params: {\r\n /** */\r\n slug: string;\r\n /** */\r\n signature: string;\r\n /** */\r\n expiration: number;\r\n /** */\r\n identifier: string;\r\n /** */\r\n body?: SendPaymentReceiptRequest;\r\n } = {} as any,\r\n options: IRequestOptions = {}\r\n ): Promise {\r\n return new Promise((resolve, reject) => {\r\n let url = basePath + '/api/checkout/{slug}/{signature}/{expiration}/{identifier}/email';\r\n url = url.replace('{slug}', params['slug'] + '');\r\n url = url.replace('{signature}', params['signature'] + '');\r\n url = url.replace('{expiration}', params['expiration'] + '');\r\n url = url.replace('{identifier}', params['identifier'] + '');\r\n\r\n const configs: IRequestConfig = getConfigs('post', 'application/json', url, options);\r\n\r\n let data = params['body'];\r\n\r\n configs.data = data;\r\n axios(configs, resolve, reject);\r\n });\r\n }\r\n}\r\n","import React, {useEffect, useMemo} from 'react';\r\nimport {useForm, useFormState} from 'react-final-form';\r\nimport {Header, Message} from 'semantic-ui-react';\r\nimport {css} from '@emotion/react/macro';\r\nimport {BillingAddressCollectionTypes, PaymentSourceTypes} from '../api/generated/enums';\r\nimport {\r\n PaymentIntentConfig,\r\n UpdatePaymentSessionPaymentSourceRequest,\r\n} from '../api/generated/index.defs';\r\nimport {Flex} from '../components/flex';\r\nimport {Form} from '../forms';\r\nimport {TokenizationContextProvider} from '../gateways/tokenization-context';\r\nimport {CardInfo} from '../gateways/types';\r\nimport {useProduce} from '../hooks/use-produce';\r\nimport {getAvailablePaymentSourceTypes} from '../payment-intents/payment-intent-payment-source-form';\r\nimport {PaymentSourceForm, PaymentSourceFormValues} from '../payments/payment-source-form';\r\nimport {Media} from '../styles/breakpoints';\r\n\r\ntype Props = {\r\n paymentIntentConfig: PaymentIntentConfig;\r\n};\r\n\r\ninterface State {\r\n cardInfo?: CardInfo;\r\n submitRequested: boolean;\r\n}\r\n\r\ninterface FormValues extends Partial {\r\n cardCvv: string;\r\n cardExpiration?: string;\r\n}\r\n\r\nexport const CheckoutPaymentSource: React.FC = (props) => {\r\n const {paymentIntentConfig} = props;\r\n const {paymentSourceConfig} = paymentIntentConfig;\r\n const {creditCard} = paymentSourceConfig;\r\n\r\n const form = useForm();\r\n const {values} = useFormState();\r\n\r\n const [state, setState] = useProduce({\r\n submitRequested: false,\r\n });\r\n\r\n const {paymentSourceTypes} = useMemo(\r\n () => getAvailablePaymentSourceTypes(paymentSourceConfig),\r\n [paymentSourceConfig]\r\n );\r\n\r\n const canSubmit = hasRequiredInfo(values as any);\r\n\r\n useEffect(() => {\r\n (async () => {\r\n if (canSubmit && state.submitRequested) {\r\n await form.submit();\r\n }\r\n\r\n setState((draft) => {\r\n draft.submitRequested = false;\r\n });\r\n })();\r\n }, [canSubmit, form, setState, state.submitRequested]);\r\n\r\n const billingAddressCollectionType = creditCard.avsValidation as BillingAddressCollectionTypes;\r\n const {acceptedCardBrands, tokenizer} = paymentIntentConfig.paymentSourceConfig.creditCard;\r\n\r\n return (\r\n
\r\n \r\n \r\n \r\n
Payment Method
\r\n
\r\n \r\n
\r\n\r\n {\r\n form.change('accountType', cardInfo.type);\r\n setState((draft) => {\r\n draft.cardInfo = cardInfo;\r\n });\r\n }}\r\n paymentSourceTypes={paymentSourceTypes}\r\n billingAddressCollectionType={billingAddressCollectionType}\r\n />\r\n\r\n
\r\n {state.cardInfo &&\r\n acceptedCardBrands &&\r\n !acceptedCardBrands[state.cardInfo.type.toLowerCase()] && (\r\n \r\n )}\r\n\r\n {\r\n setState((draft) => {\r\n draft.submitRequested = true;\r\n });\r\n }}\r\n >\r\n Review\r\n \r\n
\r\n
\r\n
\r\n );\r\n};\r\n\r\nconst hasRequiredInfo = (values: FormValues) => {\r\n const isAch = values.paymentSourceType === PaymentSourceTypes['ACH'];\r\n\r\n if (isAch) {\r\n const fieldsEntered =\r\n values.accountHolderName &&\r\n values.achRoutingNumber &&\r\n values.achAccountNumber &&\r\n values.achConfirmAccountNumber;\r\n\r\n return !!fieldsEntered;\r\n }\r\n\r\n return !!values.accountNumberToken;\r\n};\r\n\r\nconst styles = css`\r\n .accepted-cards {\r\n flex: 1;\r\n align-items: center;\r\n\r\n @media (max-width: 767px) {\r\n margin-top: 20px;\r\n }\r\n\r\n @media (min-width: 768px) and (max-width: 1199px) {\r\n position: absolute;\r\n bottom: -3rem;\r\n left: 0;\r\n }\r\n }\r\n\r\n .service-fee {\r\n font-size: 1.2rem;\r\n }\r\n\r\n .fee-amount {\r\n margin-top: 5px;\r\n }\r\n\r\n .ui.button svg {\r\n margin-right: 0.5rem;\r\n }\r\n\r\n ${Media('MobileMax')} {\r\n .add-payment-source {\r\n margin-bottom: 1rem;\r\n }\r\n }\r\n`;\r\n","import moment from 'moment';\r\nimport React, {useState} from 'react';\r\nimport {useInterval} from 'react-use';\r\nimport {usePathParams} from '../hooks/user-path-params';\r\n\r\nexport const Countdown = () => {\r\n const pathParams = usePathParams<{signature: string; expiration: string}>();\r\n const [state, setState] = useState();\r\n useInterval(() => {\r\n var duration = moment.duration(\r\n moment(new Date(Number(pathParams.expiration) * 1000)).diff(moment())\r\n );\r\n\r\n setState(duration);\r\n }, 200);\r\n\r\n var minutesRemaining = state?.asMinutes() || 0;\r\n if (minutesRemaining > 30) {\r\n return <>;\r\n }\r\n\r\n return (\r\n <>\r\n {'Checkout session expires in '}\r\n {state ? moment.utc(state.asMilliseconds()).format('mm:ss') : 0} minutes\r\n \r\n );\r\n};\r\n","import {camelCase, omit} from 'lodash';\r\nimport React, {useMemo} from 'react';\r\nimport {useAsync} from 'react-use';\r\nimport {Label} from 'semantic-ui-react';\r\nimport {RouteComponentProps, useNavigate} from '@reach/router';\r\nimport {\r\n GetMappedAccountsForMultiAccountPaymentForm,\r\n MultiAccountPaymentDto,\r\n MultiAccountPaymentForm,\r\n multiAccountFormStyles,\r\n} from '../accounts/multi-account-payment-form';\r\nimport {CheckoutService} from '../api/generated/CheckoutService';\r\nimport {\r\n AchAccountHolderTypes,\r\n AchAccountTypes,\r\n CardEntryMethods,\r\n PaymentSourceTypes,\r\n} from '../api/generated/enums';\r\nimport {\r\n CreateCheckoutPaymentIntentRequest,\r\n NewPaymentSource,\r\n PaymentIntentConfig,\r\n ProductCharge,\r\n} from '../api/generated/index.defs';\r\nimport {mapPaymentSourceAddress} from '../components/address';\r\nimport {Form} from '../forms';\r\nimport {useQueryParams} from '../hooks/use-query-params';\r\nimport {usePathParams} from '../hooks/user-path-params';\r\nimport {PaymentIntentChargesForm} from '../payment-intents/payment-intent-charges-form';\r\nimport {PaymentIntentPaymentFields} from '../payment-intents/payment-intent-fields';\r\nimport {getAvailablePaymentSourceTypes} from '../payment-intents/payment-intent-payment-source-form';\r\nimport {usePaymentFields} from '../payments/payment-field-utils';\r\nimport {parseExpirationData} from '../payments/payment-source-utils';\r\nimport {buildPath, routes} from '../routes';\r\nimport {ApiError} from '../types/index';\r\nimport {CheckoutPaymentSource} from './checkout-payment-source';\r\nimport {Countdown} from './countdown';\r\n\r\ntype Props = RouteComponentProps & {\r\n config: PaymentIntentConfig;\r\n onCreated: (createdEvent: {cardCvv: string}) => void;\r\n};\r\n\r\ntype QueryParams = {\r\n amount: string;\r\n multiAccountInfo: string;\r\n};\r\n\r\ntype PathParams = {\r\n signature: string;\r\n expiration: string;\r\n};\r\n\r\nconst arrayMutators = Form.ArrayMutators();\r\nconst defaultValue = {};\r\n\r\nconst getInitialValues = (\r\n paymentSourceTypes: PaymentSourceTypes[],\r\n mappedAccounts: MultiAccountPaymentDto[],\r\n queryParams: QueryParams\r\n) => {\r\n const paymentFields = omit(queryParams, ['amount', 'multiAccountInfo']);\r\n const paymentSourceType = paymentSourceTypes.find((x) => x === 'Credit Card')\r\n ? 'Credit Card'\r\n : 'ACH';\r\n\r\n const eligibleAccounts = mappedAccounts.filter((x) => x.includeInMulti);\r\n let selectionCount = 0;\r\n\r\n const accounts = eligibleAccounts.reduce((acc, item, idx) => {\r\n acc[`acc_${item.account.id}`] = {\r\n totalOutstandingBalance: item.account.totalOutstandingBalance,\r\n selected: item.account.totalOutstandingBalance > 0 && ++selectionCount <= 25,\r\n };\r\n return acc;\r\n }, {});\r\n\r\n const amount = Number(queryParams.amount);\r\n return {\r\n paymentFields,\r\n amount: isNaN(amount) ? 0 : amount,\r\n paymentSourceType,\r\n accountType: paymentSourceType === 'ACH' ? AchAccountTypes['Checking Account'] : '',\r\n achAccountHolderType: paymentSourceType === 'ACH' ? AchAccountHolderTypes.Unknown : '',\r\n accountHolderName: '',\r\n accountNumberToken: '',\r\n\r\n cardExpirationMonth: '',\r\n cardExpirationYear: '',\r\n cardCvv: '',\r\n\r\n achRoutingNumber: '',\r\n achAccountNumber: '',\r\n achConfirmAccountNumber: '',\r\n\r\n zipCode: '',\r\n emailAddress: '',\r\n ...accounts,\r\n };\r\n};\r\n\r\nconst CheckoutInitiate: React.FC = ({config, onCreated}) => {\r\n const navigate = useNavigate();\r\n const queryParams = useQueryParams() || defaultValue;\r\n const {signature, expiration} = usePathParams();\r\n\r\n const {paymentSourceTypes} = useMemo(\r\n () => getAvailablePaymentSourceTypes(config.paymentSourceConfig),\r\n [config]\r\n );\r\n\r\n const fetchAccounts = useAsync(async () => {\r\n if (queryParams.multiAccountInfo) {\r\n const response = await CheckoutService.getAccounts({\r\n signature,\r\n expiration: Number(expiration),\r\n slug: config.businessUnitSlug,\r\n base64Info: queryParams.multiAccountInfo ?? '',\r\n });\r\n\r\n return response.data;\r\n }\r\n\r\n return null;\r\n });\r\n\r\n const accounts = fetchAccounts.value;\r\n const renderPaymentDescriptor = (accounts?.length ?? 0) < 2;\r\n const {hiddenFields, visibleFields} = usePaymentFields(\r\n config,\r\n queryParams,\r\n renderPaymentDescriptor,\r\n true,\r\n true\r\n );\r\n\r\n const mappedAccounts = useMemo(() => {\r\n if (!accounts) return [];\r\n return GetMappedAccountsForMultiAccountPaymentForm(accounts, config);\r\n }, [accounts, config]);\r\n\r\n const initialValues = useMemo(\r\n () => getInitialValues(paymentSourceTypes, mappedAccounts, queryParams),\r\n [paymentSourceTypes, mappedAccounts, queryParams]\r\n );\r\n\r\n const onSubmit = async (values) => {\r\n const paymentSource = buildPaymentSourceRequest(\r\n omit(values, ['paymentFields', 'amount']) as any\r\n );\r\n\r\n if (paymentSource.errors) {\r\n return {\r\n errors: paymentSource.errors,\r\n hasErrors: true,\r\n data: undefined,\r\n };\r\n }\r\n\r\n const accountCharges = Object.keys(values)\r\n .filter((x) => values[x].selected)\r\n .map((x) => {\r\n const accountId = Number(x.replace('acc_', ''));\r\n return {\r\n accountId,\r\n paymentAmount: values[x].totalOutstandingBalance ?? 0,\r\n description: '',\r\n };\r\n });\r\n\r\n if (queryParams.multiAccountInfo && accountCharges.length === 0) {\r\n const errors: ApiError[] = [\r\n {propertyName: '', errorMessage: 'Please select at least one account to pay.'},\r\n ];\r\n return {\r\n errors,\r\n hasErrors: true,\r\n data: undefined,\r\n };\r\n }\r\n\r\n const paymentFields = values.paymentFields as Record;\r\n [...hiddenFields, ...visibleFields]\r\n .filter((x) => typeof paymentFields[camelCase(x.key)] === 'undefined')\r\n .forEach((x) => {\r\n paymentFields[camelCase(x.key)] = '';\r\n });\r\n\r\n const payload: CreateCheckoutPaymentIntentRequest = {\r\n businessUnitId: config.businessUnitId,\r\n paymentFields: paymentFields,\r\n amount: values.amount || 0,\r\n paymentSource: paymentSource.newPaymentSource,\r\n products: (values.products || []).map((x: ProductCharge) => ({\r\n productId: x.productId,\r\n price: x.price,\r\n })),\r\n accounts: accountCharges,\r\n };\r\n\r\n const response = await CheckoutService.create({\r\n signature,\r\n expiration: Number(expiration),\r\n slug: config.businessUnitSlug,\r\n body: payload,\r\n });\r\n\r\n if (response.hasErrors) {\r\n return response;\r\n }\r\n\r\n const path = routes.checkout.base.replace(/\\/\\*/gi, `/${routes.checkout.review}`);\r\n\r\n const params = {\r\n signature,\r\n expiration,\r\n sessionId: response.data.sessionIdentifier,\r\n slug: config.businessUnitSlug,\r\n };\r\n\r\n onCreated({cardCvv: values.cardCvv});\r\n navigate(buildPath(path, params), {state: {multiAccountInfo: queryParams.multiAccountInfo}});\r\n };\r\n\r\n return (\r\n <>\r\n \r\n (\r\n <>\r\n \r\n \r\n
\r\n {queryParams.multiAccountInfo && mappedAccounts ? (\r\n <>\r\n \r\n
\r\n \r\n ) : (\r\n <>\r\n \r\n
\r\n \r\n )}\r\n \r\n
\r\n \r\n )}\r\n />\r\n \r\n );\r\n};\r\n\r\ninterface PaymentSourceFields {\r\n paymentSourceType: string;\r\n accountType: string;\r\n accountHolderName: string;\r\n accountNumberToken: string;\r\n\r\n streetAddress: string;\r\n streetAddress2: string;\r\n city: string;\r\n state: string;\r\n zipCode: string;\r\n\r\n cardExpirationMonth: string;\r\n cardExpirationYear: string;\r\n cardExpiration?: string;\r\n cardCvv: string;\r\n\r\n achAccountHolderType: string;\r\n achAccountNumber: string;\r\n achRoutingNumber: string;\r\n achConfirmAccountNumber: string;\r\n}\r\n\r\nconst buildPaymentSourceRequest = (values: PaymentSourceFields) => {\r\n let newPaymentSource: NewPaymentSource;\r\n\r\n if (values.paymentSourceType === PaymentSourceTypes['Credit Card']) {\r\n newPaymentSource = {...values} as any;\r\n\r\n newPaymentSource.cardEntryMethod = CardEntryMethods.Keyed;\r\n let errors = setExpiration(newPaymentSource, values.cardExpiration || '');\r\n\r\n if (errors) {\r\n return {\r\n newPaymentSource: undefined,\r\n errors,\r\n };\r\n }\r\n } else {\r\n newPaymentSource = {...values} as any;\r\n }\r\n\r\n newPaymentSource = mapPaymentSourceAddress(newPaymentSource);\r\n\r\n if ((newPaymentSource as any)?.cardCvv) {\r\n delete (newPaymentSource as any).cardCvv;\r\n }\r\n\r\n return {\r\n newPaymentSource,\r\n errors: undefined,\r\n };\r\n};\r\n\r\nconst setExpiration = (newPaymentSource: NewPaymentSource, cardExpiration: string) => {\r\n const {error, expiration} = parseExpirationData(cardExpiration || '');\r\n\r\n if (error) {\r\n return error.errors;\r\n }\r\n\r\n if (expiration) {\r\n newPaymentSource.cardExpirationMonth = expiration.cardExpirationMonth;\r\n newPaymentSource.cardExpirationYear = expiration.cardExpirationYear;\r\n (newPaymentSource.cardExpiration as any) = undefined;\r\n }\r\n};\r\n\r\nexport {CheckoutInitiate};\r\n","import React from 'react';\r\nimport {Header} from 'semantic-ui-react';\r\nimport {css} from '@emotion/react/macro';\r\nimport {PaymentIntentConfig, PaymentIntentDetailDto} from '../api/generated/index.defs';\r\nimport Currency from '../components/currency';\r\nimport {DataList} from '../components/data-list';\r\nimport {Form} from '../forms';\r\nimport {Media} from '../styles/breakpoints';\r\n\r\ntype CheckoutDetails = {\r\n paymentIntent: PaymentIntentDetailDto;\r\n config: PaymentIntentConfig;\r\n};\r\n\r\nexport const CheckoutDetails: React.FC = ({config, paymentIntent}) => {\r\n const {accounts} = paymentIntent;\r\n\r\n const paymentFieldsDisplay = config.paymentFields\r\n .filter(\r\n (x) => accounts.length === 0 || (!x.accountFieldMappingKey && x.key !== 'PaymentDescriptor') // FIXME: Think about this\r\n )\r\n .map((x) => {\r\n return {\r\n label: x.label,\r\n value: paymentIntent.paymentFields[x.key] || (x.accountFieldMappingKey ? '' : '(skipped)'),\r\n };\r\n });\r\n\r\n return (\r\n <>\r\n \r\n {paymentFieldsDisplay.length > 0 && (\r\n <>\r\n
Payment Information
\r\n \r\n \r\n )}\r\n\r\n {paymentIntent.lineItems.length > 0 && (\r\n <>\r\n
Line Items
\r\n ({\r\n label: lineItem.description,\r\n value: (\r\n \r\n \r\n \r\n ),\r\n }))}\r\n align=\"right\"\r\n />\r\n \r\n )}\r\n
\r\n \r\n );\r\n};\r\n\r\nconst styles = css`\r\n ${Media('MobileMax')} {\r\n td.datum-value {\r\n text-align: right;\r\n }\r\n }\r\n`;\r\n","import React, {useMemo, useState} from 'react';\r\nimport {FormSpy} from 'react-final-form';\r\nimport {useAsync} from 'react-use';\r\nimport {Header} from 'semantic-ui-react';\r\nimport {cx} from '@emotion/css';\r\nimport {css} from '@emotion/react/macro';\r\nimport {\r\n faCheck,\r\n faEnvelopeOpenText,\r\n faExclamationTriangle,\r\n} from '@fortawesome/pro-regular-svg-icons';\r\nimport {FontAwesomeIcon} from '@fortawesome/react-fontawesome';\r\nimport {CheckoutService} from '../api/generated/CheckoutService';\r\nimport {PaymentSourceTypes, PaymentStatuses} from '../api/generated/enums';\r\nimport {PaymentIntentDetailDto} from '../api/generated/index.defs';\r\nimport {Alert} from '../components/alert';\r\nimport {AsyncStateContainer} from '../components/async-state-container';\r\nimport {CopyButton} from '../components/copy-button';\r\nimport Currency from '../components/currency';\r\nimport {DataList} from '../components/data-list';\r\nimport {DateFormat} from '../components/date';\r\nimport {FlexRowWithActions} from '../components/flex';\r\nimport {Form} from '../forms';\r\nimport {usePathParams} from '../hooks/user-path-params';\r\nimport {buildPath, routes} from '../routes';\r\nimport {payStarColors} from '../styles/styled';\r\nimport {notifications} from '../utils/notification-service';\r\nimport {Button} from '../forms/button';\r\nimport {navigate, useLocation} from '@reach/router';\r\n\r\ntype Props = {\r\n paymentIntent: PaymentIntentDetailDto;\r\n};\r\n\r\nexport const CheckoutStatus: React.FC = ({paymentIntent, children}) => {\r\n const location = useLocation();\r\n const state = location.state as any;\r\n const pathParams = usePathParams<{\r\n slug: string;\r\n signature: string;\r\n expiration: string;\r\n sessionId: string;\r\n }>();\r\n\r\n const [emailSent, setEmailSent] = useState(false);\r\n\r\n const initialValues = useMemo(\r\n () => ({\r\n emailAddress: '',\r\n }),\r\n []\r\n );\r\n\r\n const fetchPaymentSessionResult = useAsync(async () => {\r\n const response = await CheckoutService.getResult({\r\n slug: pathParams.slug,\r\n signature: pathParams.signature,\r\n expiration: Number(pathParams.expiration),\r\n identifier: pathParams.sessionId,\r\n });\r\n\r\n if (response.hasErrors) {\r\n notifications.errors(response.errors);\r\n return undefined;\r\n }\r\n\r\n return response.data;\r\n });\r\n\r\n const paymentSessionResult = fetchPaymentSessionResult.value;\r\n\r\n const sendEmail = (paymentId: number, emailAddress: string) =>\r\n CheckoutService.sendReceipt({\r\n slug: pathParams.slug,\r\n signature: pathParams.signature,\r\n expiration: Number(pathParams.expiration),\r\n identifier: pathParams.sessionId,\r\n body: {\r\n emailAddress: emailAddress,\r\n },\r\n });\r\n\r\n if (\r\n fetchPaymentSessionResult.loading ||\r\n fetchPaymentSessionResult.error ||\r\n !paymentSessionResult\r\n ) {\r\n return (\r\n \r\n <>\r\n \r\n );\r\n }\r\n\r\n const success = paymentSessionResult.basePaymentStatus === PaymentStatuses.Succeeded;\r\n\r\n const icon = success ? faCheck : faExclamationTriangle;\r\n\r\n const message = success\r\n ? 'Your payment has been processed successfully'\r\n : 'Unable to process payment';\r\n\r\n const isCard =\r\n paymentIntent.paymentSource.paymentSourceType === PaymentSourceTypes['Credit Card'];\r\n const accountType = paymentIntent.paymentSource.accountType;\r\n\r\n return (\r\n
\r\n \r\n \r\n \r\n \r\n }\r\n actionsPosition=\"right\"\r\n className=\"unstackable\"\r\n >\r\n
{message}
\r\n\r\n \r\n {paymentSessionResult.basePaymentReference}\r\n \r\n \r\n ),\r\n },\r\n {\r\n label: 'Payment Amount',\r\n value: ,\r\n },\r\n ...(paymentSessionResult.serviceFeeAmountMinor\r\n ? [\r\n {\r\n label: 'Service Fee',\r\n value: ,\r\n },\r\n ]\r\n : []),\r\n {\r\n label: 'Payment Date',\r\n value: (\r\n \r\n ),\r\n },\r\n ...(isCard ? [{label: 'Card Type', value: accountType}] : []),\r\n ]}\r\n />\r\n \r\n\r\n {!success && (\r\n <>\r\n {paymentSessionResult.errorMessage}\r\n {state &&\r\n state.multiAccountInfo &&\r\n paymentSessionResult.basePaymentStatus === PaymentStatuses.Declined && (\r\n {\r\n const path = routes.checkout.base.replace(/\\/\\*/gi, ``);\r\n\r\n const params = {\r\n signature: pathParams.signature,\r\n expiration: pathParams.expiration,\r\n slug: pathParams.slug,\r\n };\r\n\r\n navigate(buildPath(path, params, {multiAccountInfo: state.multiAccountInfo}));\r\n }}\r\n >\r\n Try Again\r\n \r\n )}\r\n \r\n )}\r\n
\r\n {children}\r\n {success && (\r\n <>\r\n \r\n {\r\n const response = await sendEmail(\r\n paymentSessionResult.basePaymentId,\r\n values.emailAddress\r\n );\r\n\r\n if (response.hasErrors) {\r\n return response;\r\n }\r\n\r\n notifications.info('Email sent');\r\n setEmailSent(true);\r\n }}\r\n render={() =>\r\n emailSent ? (\r\n <>\r\n
\r\n \r\n On its way!\r\n
\r\n

We've emailed your receipt.

\r\n
\r\n \r\n Print Receipt\r\n \r\n
\r\n \r\n ) : (\r\n <>\r\n
Would you like a receipt?
\r\n \r\n
\r\n \r\n {({values}) => (\r\n \r\n Send Receipt\r\n \r\n )}\r\n \r\n\r\n \r\n Print Receipt\r\n \r\n
\r\n \r\n )\r\n }\r\n />\r\n
\r\n\r\n {\r\n navigate(buildPath(routes.customer.dashboard, {slug: pathParams.slug}));\r\n }}\r\n type=\"button\"\r\n fluid\r\n basic\r\n >\r\n I'm Done\r\n \r\n \r\n )}\r\n
\r\n );\r\n};\r\n\r\nexport const styles = css`\r\n .payment-status {\r\n &.error .status-icon svg {\r\n color: ${payStarColors.errorText};\r\n }\r\n\r\n .status-icon svg {\r\n font-size: 4rem;\r\n margin-left: 1.2rem;\r\n }\r\n\r\n .copy-button {\r\n padding: 0;\r\n margin-left: 1rem !important;\r\n }\r\n\r\n .ui.button.fluid {\r\n margin-top: 1.5rem;\r\n }\r\n\r\n .ui.icon.header .copy-reference {\r\n display: inline-block;\r\n font-size: 0.4rem;\r\n padding: 6px;\r\n margin-left: 5px;\r\n margin-top: 2px;\r\n }\r\n\r\n .cta-register-account {\r\n margin-top: 2rem;\r\n }\r\n\r\n @media (max-width: 767px) {\r\n .icon.status-icon svg {\r\n font-size: 2rem;\r\n }\r\n\r\n .copy-reference {\r\n display: none !important;\r\n }\r\n\r\n > .row.unstackable {\r\n align-items: flex-start;\r\n }\r\n\r\n .form-actions {\r\n padding-top: 1rem;\r\n }\r\n }\r\n }\r\n`;\r\n","import React from 'react';\r\nimport {useAsyncRetry} from 'react-use';\r\nimport {Label} from 'semantic-ui-react';\r\nimport {RouteComponentProps} from '@reach/router';\r\nimport {CheckoutService} from '../api/generated/CheckoutService';\r\nimport {PaymentSessionStatuses} from '../api/generated/enums';\r\nimport {PaymentIntentConfig} from '../api/generated/index.defs';\r\nimport {AsyncStateContainer} from '../components/async-state-container';\r\nimport {Json} from '../components/json';\r\nimport {usePathParams} from '../hooks/user-path-params';\r\nimport {PaymentIntentReview} from '../payment-intents/payment-intent-review';\r\nimport {Countdown} from './countdown';\r\nimport {CheckoutDetails} from './details';\r\nimport {CheckoutStatus} from './status';\r\nimport {analytics} from '../analytics';\r\n\r\ntype Props = RouteComponentProps & {\r\n config: PaymentIntentConfig;\r\n cvv: string;\r\n onComplete: () => void;\r\n};\r\n\r\nexport const CheckoutReview: React.FC = ({config, cvv, onComplete}) => {\r\n const pathParams = usePathParams<{\r\n signature: string;\r\n expiration: string;\r\n sessionId: string;\r\n }>();\r\n\r\n const fetchSession = useAsyncRetry(async () => {\r\n const response = await CheckoutService.get({\r\n slug: config.businessUnitSlug,\r\n signature: pathParams.signature,\r\n expiration: Number(pathParams.expiration),\r\n identifier: pathParams.sessionId,\r\n });\r\n\r\n return response;\r\n });\r\n\r\n const paymentIntent = fetchSession.value?.data;\r\n\r\n const isComplete = paymentIntent?.status === PaymentSessionStatuses.Complete;\r\n\r\n if (isComplete) {\r\n onComplete();\r\n }\r\n\r\n const process = (recaptchaToken) =>\r\n CheckoutService.process(\r\n {\r\n slug: config.businessUnitSlug,\r\n signature: pathParams.signature,\r\n expiration: Number(pathParams.expiration),\r\n identifier: pathParams.sessionId,\r\n body: {cardCvv: cvv, recaptchaToken},\r\n },\r\n {headers: {['Timestamp']: analytics.getDistinctId()}}\r\n );\r\n\r\n return (\r\n \r\n {paymentIntent ? (\r\n <>\r\n {paymentIntent.status !== PaymentSessionStatuses.Complete && (\r\n \r\n )}\r\n\r\n {paymentIntent.status === PaymentSessionStatuses.RequiresConfirmation && (\r\n <>\r\n \r\n \r\n \r\n )}\r\n {paymentIntent.status === PaymentSessionStatuses.Complete && (\r\n \r\n \r\n \r\n )}\r\n \r\n ) : (\r\n \r\n )}\r\n \r\n );\r\n};\r\n","import '../assets/semantic-compiled.css';\r\n\r\nimport {lighten} from 'polished';\r\nimport React from 'react';\r\nimport {useState} from 'react';\r\nimport {GoogleReCaptchaProvider} from 'react-google-recaptcha-v3';\r\nimport {ToastProvider} from 'react-toast-notifications';\r\nimport {useAsync} from 'react-use';\r\nimport {Container, Header, Image, Segment} from 'semantic-ui-react';\r\nimport {cx} from '@emotion/css';\r\nimport {css} from '@emotion/react/macro';\r\nimport {Router, useMatch} from '@reach/router';\r\nimport {CheckoutService} from '../api/generated/CheckoutService';\r\nimport {PaymentIntentConfig} from '../api/generated/index.defs';\r\nimport {Address} from '../components/address';\r\nimport {FlexRowWithActions} from '../components/flex';\r\nimport {MessageDisplay} from '../messages/message-display';\r\nimport {routes} from '../routes';\r\nimport {Media, useBreakpoint} from '../styles/breakpoints';\r\nimport {payStarColors} from '../styles/styled';\r\nimport {NotificationService} from '../utils/notification-service';\r\nimport {CheckoutInitiate} from './initiate';\r\nimport {CheckoutReview} from './review';\r\nimport {GlobalStyles} from '../styles/theme-provider';\r\nimport {Env} from '../config/env-vars';\r\n\r\ntype HostedCheckoutAppProps = {};\r\n\r\nconst defaultValue = {};\r\nconst HostedCheckoutApp: React.FC = () => {\r\n const {recaptchaSiteKey} = Env;\r\n const [cvv, setCvv] = useState('');\r\n const [paymentCompleted, setPaymentCompleted] = useState(false);\r\n const match: any = useMatch(routes.checkout.base) || defaultValue;\r\n const breakpoint = useBreakpoint();\r\n const showMobileLogo = ['MobileMax', 'TabletMin', 'TabletMax'].some((x) => x === breakpoint);\r\n const fetchConfig = useAsync(async () => {\r\n const result = await CheckoutService.getConfig({\r\n slug: match.slug,\r\n });\r\n return result.data;\r\n });\r\n const config = fetchConfig.value;\r\n\r\n if (!config) {\r\n return null;\r\n }\r\n\r\n return (\r\n <>\r\n \r\n \r\n \r\n
\r\n \r\n \r\n \r\n
\r\n \r\n
\r\n \r\n \r\n {!showMobileLogo && config.businessUnitLogoUrl && (\r\n \r\n )}\r\n\r\n {showMobileLogo && config.businessUnitMobileLogo && (\r\n \r\n )}\r\n \r\n }\r\n actionsPosition={breakpoint === 'MobileMax' ? 'left' : 'right'}\r\n >\r\n \r\n {config.businessUnitHeader}\r\n {config.businessUnitSubHeader}\r\n \r\n \r\n \r\n \r\n {\r\n setCvv(cardCvv);\r\n }}\r\n />\r\n\r\n setPaymentCompleted(true)}\r\n />\r\n \r\n \r\n
\r\n
\r\n
\r\n
\r\n
\r\n \r\n );\r\n};\r\n\r\ntype CheckoutThemeProps = {\r\n config: PaymentIntentConfig;\r\n};\r\n\r\nconst CheckoutThemeProvider: React.FC = ({config, children}) => {\r\n const theme = css`\r\n border-top: solid 5px ${config.businessUnitPrimaryColor} !important;\r\n\r\n .ui.attached.label {\r\n margin-top: 5px;\r\n }\r\n\r\n .ui {\r\n &.buttons .button,\r\n &.button {\r\n font-weight: normal;\r\n\r\n &.primary {\r\n background-color: ${config.businessUnitPrimaryColor || payStarColors.primary.blue};\r\n\r\n &:hover,\r\n &:focus {\r\n &:not(.basic) {\r\n background-color: ${lighten(\r\n 0.1,\r\n config.businessUnitPrimaryColor || payStarColors.primary.blue\r\n )} !important;\r\n }\r\n }\r\n }\r\n\r\n &.secondary {\r\n background-color: ${config.businessUnitPrimaryColor || '#e8e8e8'};\r\n box-shadow: 0px 0px 0px 1px ${config.businessUnitPrimaryColor} !important;\r\n color: ${config.businessUnitPrimaryColor || payStarColors.textLabel};\r\n\r\n &:hover,\r\n &:focus {\r\n background-color: ${lighten(\r\n 0.1,\r\n config.businessUnitPrimaryColor || '#e8e8e8'\r\n )} !important;\r\n }\r\n }\r\n }\r\n }\r\n\r\n a {\r\n color: ${config.businessUnitPrimaryColor || payStarColors.primary.blue};\r\n\r\n &.hint {\r\n color: ${lighten(0.1, config.businessUnitPrimaryColor || payStarColors.primary.blue)};\r\n }\r\n }\r\n `;\r\n\r\n return
{children}
;\r\n};\r\n\r\ntype CheckoutFooterProps = {\r\n config: PaymentIntentConfig;\r\n};\r\n\r\nconst CheckoutFooter: React.FC = ({config}) => {\r\n return (\r\n <>\r\n
\r\n \r\n
\r\n
{config.organizationName}
\r\n
\r\n
\r\n
\r\n \r\n \r\n
\r\n
\r\n
Need Help?
\r\n
\r\n Email:{' '}\r\n \r\n help@paystar.io\r\n \r\n
\r\n\r\n
Powered by Paystar
\r\n
\r\n \r\n Terms of Use\r\n {' '}\r\n |{' '}\r\n \r\n Privacy Policy\r\n \r\n
\r\n
\r\n
\r\n
\r\n \r\n );\r\n};\r\n\r\nconst styles = css`\r\n background: whitesmoke;\r\n\r\n .cp-footer {\r\n padding-top: 2rem;\r\n margin-top: 3rem;\r\n margin-bottom: 60px;\r\n border-top: 1px solid rgba(34, 36, 38, 0.15);\r\n color: #656565;\r\n font-size: 14px;\r\n line-height: 1.4285em;\r\n\r\n .ui.header {\r\n font-weight: 400;\r\n margin-bottom: 0.25rem;\r\n font-size: 1.228571rem;\r\n color: rgba(0, 0, 0, 0.87);\r\n }\r\n }\r\n\r\n .contact-info {\r\n display: flex !important;\r\n flex-direction: row;\r\n justify-content: space-between;\r\n }\r\n\r\n .messages {\r\n margin-top: 20px;\r\n }\r\n\r\n .ui.input {\r\n min-width: 150px;\r\n }\r\n\r\n .branding-container {\r\n margin-top: 1.75rem !important;\r\n background: #fff;\r\n }\r\n\r\n .logo {\r\n max-height: 3rem !important;\r\n width: auto !important;\r\n padding: 0 0.5rem;\r\n\r\n ${Media('TabletMin')} {\r\n padding: 0 0.5rem;\r\n }\r\n }\r\n`;\r\n\r\nexport default HostedCheckoutApp;\r\n"],"sourceRoot":""}