{"version":3,"sources":["webpack:///./transfer/actions/card.js","webpack:///./transfer/utils/addCardUtils.js"],"names":["changeCardNumber","cardNumber","cardSpec","type","types","TRANSACTION","CHANGE_CARD_NUMBER","data","changeExpiry","expiry","CHANGE_EXPIRY","changeCardSecurityCode","securityCode","CHANGE_SECURITY_CODE","changeCardType","cardType","CHANGE_CARD_TYPE","handleSaveCard","dispatch","getState","card","fields","user","birthYear","birthMonth","birthDay","dob","travelRuleUtils","addCardUtils","_objectSpread","length","ADD_CARD","ccNum","address","selectedBillingAddress","id","billingAddressId","dobYear","dobMonth","dobDay","server","requestId","isFBMessenger","idpConnect","expirationMonth","slice","expirationYear","payload","creditOrDebit","concat","post","then","response","arguments","undefined","addedCard","successFbAddCard","intent","window","location","successRedirect","overpanelActions","show","payRequestActions","sendActions","catch","actions","CREDIT","lastDigits","ADDED_CARD","SUCCESS_FB_ADD_CARD","cardAdded","handleNoBillingAddress","shakeBillingLabel","ADDRESS","NO_BILLING_ADDRESS","ADD_CARD_FIELD_NAMES","REQ_CARD_FIELD_NAMES","addCardFieldMap","cardExpiry","cardCode","csc","ccNumber","expirationDate","expiryDate","issueNumber","cardIssueNumber","startDate","cardStartDate","cardExpiryIsValid","_ref","includes","cardNumberIsValid","_ref2","autodetect","issuerPattern","RegExp","pattern","autodetectPattern","test","cardCodeIsValid","_ref3","cardStartDateIsValid","_ref4","cardIssueNumberIsValid","_ref5","getAddCardIncompleteRequiredFields","props","requiredFieldsFromSpec","Object","keys","filter","field","required","incompleteFields","push","makeCDNUrlGeoCompliant","imageUrl","msGeoCDNUrl","defaultCDNUrl","replace"],"mappings":"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","file":"28.esm.js","sourcesContent":["import * as actions from './Actions'\nimport * as overpanelActions from './overpanels'\nimport * as payRequestActions from './pay-request'\nimport * as sendActions from './send'\nimport { post } from '../../calculator/lib/xhr'\nimport { ActionTypes as types } from '../constants'\nimport * as travelRuleUtils from '../utils/travelRuleUtils'\nimport * as addCardUtils from '../utils/addCardUtils'\n\nexport function changeCardNumber(cardNumber, cardSpec) {\n return {\n type: types.TRANSACTION.CHANGE_CARD_NUMBER,\n data: { cardNumber, cardSpec },\n }\n}\n\nexport function changeExpiry(expiry) {\n return {\n type: types.TRANSACTION.CHANGE_EXPIRY,\n data: { expiry },\n }\n}\n\nexport function changeCardSecurityCode(securityCode) {\n return {\n type: types.TRANSACTION.CHANGE_SECURITY_CODE,\n data: { securityCode },\n }\n}\n\nexport function changeCardType(cardType) {\n return {\n type: types.TRANSACTION.CHANGE_CARD_TYPE,\n data: { cardType },\n }\n}\n\nexport function handleSaveCard() {\n return (dispatch, getState) => {\n // grab data from the store to check whether we have all info to proceed\n const {\n card,\n card: {\n cardSpec: { fields },\n },\n user: { birthYear, birthMonth, birthDay },\n } = getState()\n\n // if we needed DOB but do not have valid DOB, return out\n if (\n fields.dob &&\n !travelRuleUtils.isDOBValid(birthYear, birthMonth, birthDay)\n ) {\n return\n }\n\n // if we do not have all other necessary fields, return out\n if (addCardUtils.getAddCardIncompleteRequiredFields({ ...card }).length) {\n return\n }\n\n // if not valid card number, return out\n // This extra check is added due to user selected card type cases\n // not validating properly (HTML DOM validation only checks pattern prop)\n if (!addCardUtils.cardNumberIsValid(card)) {\n return\n }\n\n // else continue with saving card\n dispatch(saveCard())\n }\n}\n\nexport function saveCard() {\n return (dispatch, getState) => {\n dispatch({ type: types.TRANSACTION.ADD_CARD })\n\n // grab necessary data from the store\n const {\n card: {\n cardSpec: { type: cardType },\n cardNumber: ccNum,\n expiry,\n securityCode,\n },\n address: {\n selectedBillingAddress: { id: billingAddressId },\n },\n user: { birthYear: dobYear, birthMonth: dobMonth, birthDay: dobDay },\n server: { requestId, isFBMessenger, idpConnect },\n } = getState()\n\n // massage expiration date data into correct format\n const expirationMonth = expiry.slice(0, 2)\n let expirationYear = expiry.slice(3)\n expirationYear =\n expirationYear.length === 4 ? expirationYear : `20${expirationYear}`\n\n const payload = {\n creditOrDebit: 'credit',\n cardType,\n ccNum,\n expirationMonth,\n expirationYear,\n securityCode,\n billingAddressId,\n dobYear,\n dobMonth,\n dobDay,\n }\n\n post('/myaccount/transfer/cards', payload)\n .then((response = {}) => {\n dispatch(addedCard(response))\n if (isFBMessenger) {\n return dispatch(successFbAddCard())\n }\n\n if (idpConnect.intent === 'idpConnect') {\n dispatch(successFbAddCard())\n window.location = idpConnect.successRedirect\n return\n }\n\n // maybe close when everything is done?\n dispatch(overpanelActions.toggleAddCardOverpanel({ show: false }))\n\n if (requestId) {\n dispatch(payRequestActions.fetchFundingOptions())\n } else {\n dispatch(sendActions.fetchFundingOptions())\n }\n })\n .catch(actions.handleError(dispatch))\n }\n}\n\nexport function addedCard(response) {\n const { CREDIT: { cardType, lastDigits } = {} } = response\n return {\n type: types.TRANSACTION.ADDED_CARD,\n data: {\n addedCard: { cardType, lastDigits },\n },\n }\n}\n\nexport function successFbAddCard() {\n return {\n type: types.TRANSACTION.SUCCESS_FB_ADD_CARD,\n data: {\n cardAdded: true,\n },\n }\n}\n\nexport function handleNoBillingAddress(shakeBillingLabel) {\n return {\n type: types.ADDRESS.NO_BILLING_ADDRESS,\n shakeBillingLabel: !shakeBillingLabel,\n }\n}\n","const ADD_CARD_FIELD_NAMES = {\n CARD_NUMBER: 'cardNumber',\n CARD_EXPIRY: 'cardExpiry',\n CARD_CODE: 'cardCode',\n CARD_ISSUE_NUMBER: 'cardIssueNumber',\n CARD_START_DATE: 'cardStartDate',\n}\n\nconst REQ_CARD_FIELD_NAMES = {\n CARD_NUMBER: 'ccNumber',\n CARD_EXPIRY: 'expirationDate',\n CARD_CODE: 'csc',\n\n // Unverified\n CARD_ISSUE_NUMBER: 'cardIssueNumber',\n CARD_START_DATE: 'cardStartDate',\n}\n\n// Fields for credit card inputs can be named differently depending on the service\n// and error handlers. This maps all possible field names to standardized names\nexport const addCardFieldMap = {\n cardNumber: ADD_CARD_FIELD_NAMES.CARD_NUMBER,\n cardExpiry: ADD_CARD_FIELD_NAMES.CARD_EXPIRY,\n cardCode: ADD_CARD_FIELD_NAMES.CARD_CODE,\n csc: ADD_CARD_FIELD_NAMES.CARD_CODE,\n 'card.number': ADD_CARD_FIELD_NAMES.CARD_NUMBER,\n 'bank.bank_account_number': ADD_CARD_FIELD_NAMES.CARD_NUMBER,\n ccNum: ADD_CARD_FIELD_NAMES.CARD_NUMBER,\n ccNumber: ADD_CARD_FIELD_NAMES.CARD_NUMBER,\n expirationDate: ADD_CARD_FIELD_NAMES.CARD_EXPIRY,\n expiryDate: ADD_CARD_FIELD_NAMES.CARD_EXPIRY,\n issueNumber: ADD_CARD_FIELD_NAMES.CARD_ISSUE_NUMBER,\n cardIssueNumber: ADD_CARD_FIELD_NAMES.CARD_ISSUE_NUMBER,\n startDate: ADD_CARD_FIELD_NAMES.CARD_START_DATE,\n cardStartDate: ADD_CARD_FIELD_NAMES.CARD_START_DATE,\n}\n\nexport function cardExpiryIsValid({ expiry }) {\n const validExpiryLengths = [5, 7]\n return validExpiryLengths.includes(expiry.length)\n}\n\nexport function cardNumberIsValid({ cardNumber, cardSpec }) {\n const autodetect = cardSpec.fields.ccNumber.autodetect\n const issuerPattern = RegExp(cardSpec.fields.ccNumber.pattern)\n\n // Also validate autodetect pattern to ensure user selected card type cases\n // are validated properly if a autodetect pattern exists.\n if (autodetect) {\n const autodetectPattern = RegExp(cardSpec.fields.ccNumber.autodetect)\n return issuerPattern.test(cardNumber) && autodetectPattern.test(cardNumber)\n }\n\n return issuerPattern.test(cardNumber)\n}\n\nexport function cardCodeIsValid({ securityCode, cardSpec }) {\n if (!securityCode) {\n return false\n }\n const issuerPattern = new RegExp(cardSpec.fields.csc.pattern)\n return issuerPattern.test(securityCode)\n}\n\nexport function cardStartDateIsValid({ startDate, cardSpec }) {\n const issuerPattern = RegExp(cardSpec.fields.startDate.pattern)\n return issuerPattern.test(startDate)\n}\n\nexport function cardIssueNumberIsValid({ issueNumber, cardSpec }) {\n const issuerPattern = RegExp(cardSpec.fields.issueNumber.pattern)\n return issuerPattern.test(issueNumber)\n}\n\n/**\n * A helper method that sifts through props from and returns\n * a list of field names that are incomplete\n * @return {Array} - a list of incomplete field names\n */\nexport function getAddCardIncompleteRequiredFields(props) {\n const {\n cardSpec: { fields },\n cardNumber,\n expiry,\n securityCode,\n cardIssueNumber,\n cardStartDate,\n } = props\n\n // grab the required fields off the properties of the object and into an array\n const allFields = Object.keys(fields)\n const requiredFieldsFromSpec = allFields.filter(\n field => fields[field].required\n )\n\n // will be built up with the names of all incomplete (missing) fields\n const incompleteFields = []\n\n if (!cardNumber) {\n incompleteFields.push(REQ_CARD_FIELD_NAMES.CARD_NUMBER)\n }\n if (!expiry) {\n incompleteFields.push(REQ_CARD_FIELD_NAMES.CARD_EXPIRY)\n }\n if (!securityCode) {\n incompleteFields.push(REQ_CARD_FIELD_NAMES.CARD_CODE)\n }\n if (!cardIssueNumber) {\n incompleteFields.push(REQ_CARD_FIELD_NAMES.CARD_ISSUE_NUMBER)\n }\n if (!cardStartDate) {\n incompleteFields.push(REQ_CARD_FIELD_NAMES.CARD_START_DATE)\n }\n\n // return only the incomplete fields that are required by the card spec\n return incompleteFields.filter(field =>\n requiredFieldsFromSpec.includes(field)\n )\n}\n\nexport function makeCDNUrlGeoCompliant(imageUrl, msGeoCDNUrl) {\n const defaultCDNUrl = 'https://www.paypalobjects.com'\n\n if (\n imageUrl &&\n imageUrl.includes(defaultCDNUrl) &&\n msGeoCDNUrl &&\n msGeoCDNUrl !== defaultCDNUrl\n ) {\n imageUrl.replace(defaultCDNUrl, msGeoCDNUrl)\n }\n\n return imageUrl\n}\n"],"sourceRoot":""}