{"version":3,"sources":["webpack:///./react-components/blank-page-placeholder/index.js","webpack:///./transfer/utils/homepage-filter-tabs.js","webpack:///./transfer/components/homepage/common/layout.js","webpack:///./transfer/components/homepage/top-contacts-container/contact-bubble.js","webpack:///./transfer/components/homepage/top-contacts-container/top-contacts-container-small.js","webpack:///./transfer/utils/search-placeholder.js","webpack:///./experiments/contact-search-placeholder.js","webpack:///./transfer/components/homepage/helpers/decorateContact.js"],"names":["BlankPagePlaceholder","_ref","message","React","createElement","Div","padding","ErrorCommon","hideServiceMessage","status","i18n","content","SEND_TAB_FEATURES","FEATURES","REQUEST_TAB_FEATURES","MORE_TAB_FEATURES","serverPropsfeatureEligibility","serverProps","featureEligibility","filterTabs","panes","map","pane","paneAttr","eligible","privileged","extra","type","feature","checkSendRequestTabEligibility","checkContactsTabEligibility","tabFeatures","some","f","checkMoreTabEligibility","_objectSpread","checkTabEligibility","filter","getDefaultTab","index","_findIndex","comp","BlankPage","sendTabFeatures","arguments","length","undefined","requestTabFeatures","_isEmpty","InputContainer","glamorous","div","marginTop","smallAndSmaller","display","InputWrapper","form","maxWidth","margin","position","top","backgroundColor","InputAndContactsWrapper","_ref3","isLarge","isLeftAlign","width","SEARCH_INPUT_WIDTH","searchInputWithSmallAndSmaller","HelperContainer","span","color","float","lineHeight","fontSize","fontWeight","marginRight","Wrapper","button","paddingTop","border","background","boxSizing","cursor","textAlign","zIndex","transition","shouldDim","opacity","TitleTextComponent","_CaptionText","Title","props","_extends","size","className","css","clear","textOverflow","overflow","whiteSpace","toString","ThumbnailContainer","justifyContent","transform","transitionDelay","marginBottom","ContactBubble","_ref2","diameter","contact","selectContact","canUseInitials","itemNumber","thumbnailUrl","firstName","lastName","alternateFullName","isFavorite","displayName","getDisplayName","firstInitial","charAt","lastInitial","data-testid","data-nemo","tabIndex","onClick","TEXT_PADDING","ContactAvatar","imageUrl","isBusiness","Boolean","getAvatarColor","Array","isArray","name","key","title","Fragment","style","WebkitBoxOrient","WebkitLineClamp","hyphens","isContactsTabEligible","ListContactsContainer","paddingBottom","ContactBubbleContainer","li","verticalAlign","isWebIncreaseTopContacts","ManageContactsContainer","enterAnimation","from","to","leaveAnimation","ContactsWrapper","_ref4","marginLeft","overflowX","ContactsContainer","_ref5","contacts","handleSelectContact","pageGroup","pageName","dispatch","FlipMove","typeName","id","_Link","as","RouterLink","data-pagename","data-pagename2","getSearchPlaceholder","defaultValue","flowType","isEligibleForContactSearchPlaceholderContentT1","isEligibleForContactSearchPlaceholderContentT2","isEligibleForContactSearchPlaceholderContentT3","isEligibleForContactSearchPlaceholderContentT4","FLOW_TYPES","REQUEST","pxp","isEligibleForEitherTreatmentForPlaceholderContent","decorateContact","options","decoratedContact","Object","keys","forEach"],"mappings":"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","file":"default~request-page~send-page.esm.js","sourcesContent":["// @flow\n/**\n * Show a blank page with message in the center\n * Usage scenario: secondary user may have no privilege to view a page\n */\nimport React from 'react'\nimport { Div } from 'glamorous'\nimport ErrorCommon from '../../transfer/components/errorCommon'\n\ntype Props = {\n message: string,\n}\nexport default function BlankPagePlaceholder({ message = '' }: Props) {\n return (\n
\n \n
\n )\n}\n","import * as FEATURES from '../../../../lib/utils/featureEligibilityConstants'\nimport serverProps from './serverProps'\nimport BlankPage from '../../react-components/blank-page-placeholder'\nimport content from 'pp-react-l10n'\nimport _ from 'lodash'\nconst i18n = content('transfer/page/recipient')\n\nconst SEND_TAB_FEATURES = [FEATURES.SEND, FEATURES.BUY]\nconst REQUEST_TAB_FEATURES = [FEATURES.REQUEST]\nexport const MORE_TAB_FEATURES = [\n FEATURES.GIFT,\n FEATURES.INVOICE,\n FEATURES.MASS_PAYMENT,\n FEATURES.POOLS,\n FEATURES.MGM,\n FEATURES.PPME,\n FEATURES.XB,\n FEATURES.MESSAGES,\n]\n\nconst serverPropsfeatureEligibility =\n (serverProps && serverProps.featureEligibility) || {}\n\nfunction filterTabs(panes, featureEligibility) {\n const filteredTabs = panes\n .map(pane => checkTabEligibility(pane, featureEligibility))\n .filter(pane => pane.eligible)\n\n return filteredTabs\n}\n\n/**\n * Decide the tab to render for `/myaccount/transfer/homepage`\n * Mostly, it should default to the first tab (send)\n * In case of secondary user when he does not have privilege of send,\n * render the next privileged tab\n * So it should return the first tab that user has both eligibility and privilege\n */\nfunction getDefaultTab(panes) {\n const index = _.findIndex(panes, pane => pane.eligible && pane.privileged)\n return index < 0 ? 0 : index\n}\n\nfunction checkTabEligibility(pane, featureEligibility) {\n let paneAttr = { eligible: true, privileged: true, extra: {} }\n switch (pane.type.feature) {\n case 'send':\n paneAttr = checkSendRequestTabEligibility(\n SEND_TAB_FEATURES,\n featureEligibility\n )\n break\n case 'request':\n paneAttr = checkSendRequestTabEligibility(\n REQUEST_TAB_FEATURES,\n featureEligibility\n )\n break\n case 'contacts':\n paneAttr = checkContactsTabEligibility(\n SEND_TAB_FEATURES,\n REQUEST_TAB_FEATURES,\n featureEligibility\n )\n break\n case 'more':\n paneAttr = checkMoreTabEligibility(MORE_TAB_FEATURES, featureEligibility)\n break\n default:\n break\n }\n const { eligible, privileged, extra } = paneAttr\n return { ...pane, eligible, privileged, ...extra }\n}\n\nfunction checkSendRequestTabEligibility(tabFeatures, featureEligibility) {\n let privileged = true,\n extra = {}\n const eligible = tabFeatures.some(f => featureEligibility[f].eligible)\n if (eligible) {\n privileged = tabFeatures.some(f => featureEligibility[f].privileged)\n if (!privileged) {\n extra = {\n comp: BlankPage,\n message: i18n('homepage.blank'),\n }\n }\n }\n return { eligible, privileged, extra }\n}\n\n// show contacts tab only when user has eligibility and privilege of both send and request\nfunction checkContactsTabEligibility(\n sendTabFeatures = SEND_TAB_FEATURES,\n requestTabFeatures = REQUEST_TAB_FEATURES,\n featureEligibility = serverPropsfeatureEligibility\n) {\n const privileged = true,\n extra = {}\n const eligible =\n !_.isEmpty(featureEligibility) &&\n sendTabFeatures.some(\n f => featureEligibility[f].eligible && featureEligibility[f].privileged\n ) &&\n requestTabFeatures.some(\n f => featureEligibility[f].eligible && featureEligibility[f].privileged\n )\n return { eligible, privileged, extra }\n}\n\nfunction checkMoreTabEligibility(tabFeatures, featureEligibility) {\n const privileged = true,\n extra = {}\n const eligible = tabFeatures.some(\n f => featureEligibility[f].eligible && featureEligibility[f].privileged\n )\n return { eligible, privileged, extra }\n}\n\nexport { filterTabs, getDefaultTab, checkContactsTabEligibility }\n","import React from 'react'\nimport glamorous from 'glamorous'\nimport {\n smallAndSmaller,\n searchInputWithSmallAndSmaller,\n} from 'lib/styles/media-queries'\nimport { HeadingText } from '@paypalcorp/pp-react'\nimport { SEARCH_INPUT_WIDTH } from '../../../../../../lib/constants'\n\nexport const InputContainer = glamorous.div({\n marginTop: '31px',\n [smallAndSmaller]: {\n display: 'block',\n },\n})\n\nexport const RecipientForm = glamorous.form('transferPage', {\n maxWidth: '1024px',\n margin: '30px auto 40px auto',\n position: 'relative',\n top: '28px',\n [smallAndSmaller]: {\n top: 'unset',\n margin: '18px auto 40px auto !important',\n },\n})\n\ntype Props = { children: any }\n\nexport const TitleHeader = ({ children, ...props }: Props) => (\n \n {children}\n \n)\n\nexport const TitleDescription = ({ children, ...props }: Props) => (\n \n {children}\n \n)\n\nexport const InputWrapper = glamorous.div({\n display: 'block',\n backgroundColor: 'white',\n padding: '30px 0 calc(5%) 0',\n [smallAndSmaller]: {\n padding: '8px 0 calc(10%) 0',\n },\n})\n\nexport const InputAndContactsWrapper = glamorous.div(\n {},\n ({ isLarge, isLeftAlign = false }) => {\n return {\n width: isLarge ? SEARCH_INPUT_WIDTH : 500,\n margin: isLeftAlign ? '0 24px' : '0 auto',\n [isLarge ? searchInputWithSmallAndSmaller : smallAndSmaller]: {\n width: 'unset',\n margin: 'auto 24px',\n },\n }\n }\n)\n\nexport const HelperWrapper = glamorous.span('vx_text_5', {\n color: '#2c2e2f',\n float: 'right',\n lineHeight: 2.4,\n top: '14px',\n marginTop: '22px',\n fontSize: '0.8125rem',\n fontWeight: 400,\n marginRight: '-7px',\n [smallAndSmaller]: {\n marginTop: 0,\n marginRight: '-5px',\n },\n})\n\nexport const HelperContainer = glamorous.div({\n float: 'right',\n marginTop: '1rem',\n [smallAndSmaller]: {\n marginTop: 0,\n },\n})\n\nexport const TurnOnSearchWrapper = glamorous.span('vx_text_5', {\n float: 'right',\n top: '0.875rem',\n marginTop: '0.9375rem',\n fontSize: '0.9375rem',\n fontWeight: 400,\n [smallAndSmaller]: {\n marginTop: 0,\n },\n})\n","// @flow\nimport React from 'react'\nimport glamorous from 'glamorous'\nimport { getDisplayName } from 'lib/contact-utils'\nimport { CaptionText } from '@paypalcorp/pp-react'\nimport { css } from 'glamor'\n\nimport ContactAvatar from 'transfer/components/contactAvatar'\n\nimport { getAvatarColor } from 'lib/avatar'\n\n// have padding around user photo so we have more space for display name\nconst TEXT_PADDING = 12\n\nconst Wrapper = glamorous.button(\n {\n // need a bit padding for scale on hover\n padding: 0,\n paddingTop: 5,\n display: 'inline-block',\n // do not show button styles\n border: 'none',\n background: 'none',\n boxSizing: 'content-box', // make padding from children affect wrapper width\n cursor: 'pointer',\n textAlign: 'center',\n zIndex: 1,\n transition: 'opacity 300ms ease',\n },\n ({ shouldDim }) =>\n shouldDim && {\n opacity: 0.4,\n }\n)\n\nconst TitleTextComponent = CaptionText\nconst Title = props => (\n \n)\n\nconst ThumbnailContainer = glamorous.div({\n display: 'flex',\n justifyContent: 'center',\n transform: 'scale(1)',\n transition: 'all 300ms ease',\n // This delay is because as the cursor moves in the space between contacts there is a (correct) flicker\n // as the opacity and size are reset quickly. This delay still feels snappy, but avoids that most of the time.\n transitionDelay: '50ms',\n ':hover': {\n transform: 'scale(1.1)',\n },\n marginBottom: '0.5em',\n})\n\ntype ContactBubbleProps = {\n diameter: number | string,\n contact: FormattedContact,\n selectContact: (FormattedContact, number) => void,\n canUseInitials?: boolean,\n isFavorite?: boolean,\n itemNumber: number,\n}\nexport default function ContactBubble({\n diameter,\n contact,\n selectContact,\n canUseInitials,\n itemNumber,\n}: ContactBubbleProps) {\n const {\n thumbnailUrl = '',\n firstName = '',\n lastName = '',\n alternateFullName,\n isFavorite = false,\n } = contact\n const displayName = getDisplayName(contact)\n const firstInitial = canUseInitials ? firstName.charAt(0) : undefined\n const lastInitial = canUseInitials ? lastName.charAt(0) : undefined\n\n return (\n selectContact(contact, itemNumber)}\n css={{ width: diameter + TEXT_PADDING * 2 }}\n >\n \n \n \n {Array.isArray(displayName) ? (\n displayName.map((name, index) => {\n return (\n \n {name}\n \n )\n })\n ) : (\n <>\n {/* This case is where there is no first/last name combo\n the inline styling applies a 2 line clamp and ellipsis\n for overflowing content. Hyphening rules are applied\n via the browser from the language set within the html\n head tag.\n */}\n \n {displayName}\n \n \n </>\n )}\n </Wrapper>\n )\n}\n","// @flow\nimport React from 'react'\nimport { Link as RouterLink } from 'react-router-dom'\nimport glamorous from 'glamorous'\nimport { checkContactsTabEligibility } from '../../../utils/homepage-filter-tabs'\nimport FlipMove from 'react-flip-move'\nimport content from 'pp-react-l10n'\nimport { Link } from '@paypalcorp/pp-react'\nimport { smallAndSmaller } from '../../../../lib/styles/media-queries'\nimport ContactBubble from './contact-bubble'\nimport { isWebIncreaseTopContacts } from 'experiments/web-increase-top-contacts'\nconst i18n = content('transfer/page/recipient')\n\nconst CONTACT_BUBBLE_SIZE = 60\n\nconst { eligible, privileged } = checkContactsTabEligibility()\nconst isContactsTabEligible = eligible && privileged\n\nconst ListContactsContainer = glamorous.div({}, ({ isLeftAlign }) => ({\n // $FlowFixMe\n ...(!isLeftAlign && { padding: '0px calc(50% - 25rem)' }),\n textAlign: isLeftAlign ? 'left' : 'center',\n backgroundColor: 'white',\n display: 'block',\n [smallAndSmaller]: {\n paddingBottom: '5px',\n },\n}))\n\nconst ContactBubbleContainer = glamorous.li(\n {\n display: 'inline-block',\n verticalAlign: 'top',\n },\n ({ isLeftAlign }) => {\n return isLeftAlign\n ? {\n marginRight: isWebIncreaseTopContacts() ? 6 : 10,\n [smallAndSmaller]: {\n marginRight: isWebIncreaseTopContacts() ? 6 : 10,\n },\n }\n : {\n margin: isWebIncreaseTopContacts() ? '0 3px' : '0 15px',\n [smallAndSmaller]: {\n margin: isWebIncreaseTopContacts() ? '0 3px' : '0 13px',\n },\n }\n }\n)\n\nconst ManageContactsContainer = glamorous.div({}, ({ isLeftAlign }) => ({\n display: 'block',\n textAlign: isLeftAlign ? 'left' : 'center',\n margin: isLeftAlign ? '30px 24px' : '30px 0',\n [smallAndSmaller]: {\n margin: isLeftAlign ? '20px 24px' : '20px 0',\n },\n}))\n\nconst enterAnimation = {\n from: {\n transform: 'translateY(-8px)',\n opacity: 0,\n },\n to: {\n transform: 'translateY(0)',\n opacity: 1,\n },\n}\n\nconst leaveAnimation = {\n from: {\n transform: 'scale(1)',\n opacity: 1,\n },\n to: {\n transform: 'scale(.8)',\n opacity: 0,\n },\n}\n\n// $FlowFixMe\nconst ContactsWrapper = glamorous.div({}, ({ isLeftAlign }) => ({\n ...(isLeftAlign && { marginLeft: '24px' }),\n whiteSpace: 'nowrap',\n [smallAndSmaller]: {\n overflowX: 'scroll',\n },\n}))\n\ntype ContactsContainerProps = {\n contacts: [],\n handleSelectContact: ({}) => void,\n canUseInitials?: boolean,\n pageGroup?: string,\n pageName?: string,\n dispatch: Function,\n isLeftAlign?: boolean,\n}\n\nexport default function ContactsContainer({\n contacts,\n handleSelectContact,\n canUseInitials,\n pageGroup,\n pageName,\n dispatch,\n isLeftAlign = false,\n}: ContactsContainerProps) {\n return (\n <ListContactsContainer isLeftAlign={isLeftAlign}>\n <ContactsWrapper isLeftAlign={isLeftAlign}>\n <FlipMove\n enterAnimation={enterAnimation}\n leaveAnimation={leaveAnimation}\n typeName=\"ul\"\n style={{ margin: 0 }}\n >\n {contacts.map((contact, itemNumber) => (\n <ContactBubbleContainer key={contact.id} isLeftAlign={isLeftAlign}>\n <ContactBubble\n itemNumber={itemNumber}\n diameter={CONTACT_BUBBLE_SIZE}\n contact={contact}\n selectContact={handleSelectContact}\n canUseInitials={canUseInitials}\n />\n </ContactBubbleContainer>\n ))}\n </FlipMove>\n </ContactsWrapper>\n\n {isContactsTabEligible && (\n <ManageContactsContainer isLeftAlign={isLeftAlign}>\n <Link\n as={RouterLink}\n to=\"/myaccount/transfer/homepage/contact-list\"\n data-pagename={pageGroup}\n data-pagename2={pageName}\n >\n {i18n('homepage.manage.contacts')}\n </Link>\n </ManageContactsContainer>\n )}\n </ListContactsContainer>\n )\n}\n","import content from 'pp-react-l10n'\nimport { FLOW_TYPES } from '../constants'\nimport {\n isEligibleForContactSearchPlaceholderContentT1,\n isEligibleForContactSearchPlaceholderContentT2,\n isEligibleForContactSearchPlaceholderContentT3,\n isEligibleForContactSearchPlaceholderContentT4,\n} from '../../experiments/contact-search-placeholder'\n\nconst i18n = content('transfer/contacts')\n\nexport function getSearchPlaceholder(defaultValue, flowType) {\n if (isEligibleForContactSearchPlaceholderContentT1()) {\n return i18n('contacts.searchPlaceholderContent1')\n } else if (isEligibleForContactSearchPlaceholderContentT2()) {\n return i18n('contacts.searchPlaceholderContent2')\n } else if (isEligibleForContactSearchPlaceholderContentT3()) {\n return i18n('contacts.searchPlaceholderContent3')\n } else if (isEligibleForContactSearchPlaceholderContentT4()) {\n return flowType === FLOW_TYPES.REQUEST\n ? i18n('contacts.searchPlaceholderContent4ForRequestMoneyFlow')\n : i18n('contacts.searchPlaceholderContent4')\n }\n return defaultValue\n}\n","// https://internal.msmaster.qa.paypal.com/elmo/experiment/124172\n// Contact Search placeholder\n\nimport * as pxp from '../lib/pxp'\n\nexport function isEligibleForContactSearchPlaceholderContentT1() {\n return pxp.isTreatment('Trmt_p2p_contact_search_text_start_searching')\n}\n\nexport function isEligibleForContactSearchPlaceholderContentT2() {\n return pxp.isTreatment('Trmt_p2p_contact_search_text_enter_contact')\n}\n\nexport function isEligibleForContactSearchPlaceholderContentT3() {\n return pxp.isTreatment('Trmt_p2p_contact_search_text_find_contact')\n}\n\nexport function isEligibleForContactSearchPlaceholderContentT4() {\n return pxp.isTreatment('Trmt_p2p_contact_search_text_search_to_send_request')\n}\n\nexport function isEligibleForEitherTreatmentForPlaceholderContent() {\n return (\n isEligibleForContactSearchPlaceholderContentT1() ||\n isEligibleForContactSearchPlaceholderContentT2() ||\n isEligibleForContactSearchPlaceholderContentT3() ||\n isEligibleForContactSearchPlaceholderContentT4()\n )\n}\n","export default function decorateContact(options, contact = {}) {\n const decoratedContact = {\n ...contact,\n }\n\n Object.keys(options).forEach(function(key) {\n decoratedContact[key] = options[key]\n })\n\n return decoratedContact\n}\n"],"sourceRoot":""}