Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Deep link to add secondary login in OldDot #6319

Merged
merged 4 commits into from
Nov 19, 2021
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
8 changes: 4 additions & 4 deletions src/languages/en.js
Original file line number Diff line number Diff line change
Expand Up @@ -675,13 +675,13 @@ export default {
headerWithEcard: 'Cards are ready!',
noVBACopy: 'Connect a bank account to issue unlimited Expensify Cards for your workspace members and access all of these incredible benefits:',
VBANoECardCopy: 'Add a work email address to issue unlimited Expensify Cards for your workspace members, as well as all of these incredible benefits:',
conciergeCanHelp: 'Concierge can help you add a work email address to enable the Expensify Card.',
VBAWithECardCopy: 'Enjoy all these incredible benefits:',
benefit1: 'Up to 2% cash back',
benefit2: 'Digital and physical cards',
benefit3: 'No personal liability',
benefit4: 'Customizable limits',
chatWithConcierge: 'Chat with Concierge',
addWorkEmail: 'Add work email address',
checkingDomain: 'Hang tight! We are still working on enabling your Expensify Cards. Check back here in a few minutes.',
},
reimburse: {
captureReceipts: 'Capture receipts',
Expand Down Expand Up @@ -745,9 +745,9 @@ export default {
streamlinePayments: 'Streamline payments',
oneMoreThing: 'One more thing!',
allSet: 'You\'re all set!',
accountDescriptionNoCards: 'This bank account will be used to reimburse expenses, collect invoices, and pay bills all from the same account.\n\nConcierge can help you add a work email address to enable the Expensify Card.',
accountDescriptionNoCards: 'This bank account will be used to reimburse expenses, collect invoices, and pay bills all from the same account.\n\nPlease add a work email address as a secondary login to enable the Expensify Card.',
accountDescriptionWithCards: 'This bank account will be used to issue corporate cards, reimburse expenses, collect invoices, and pay bills all from the same account.',
chatWithConcierge: 'Chat with Concierge',
addWorkEmail: 'Add work email address',
letsFinishInChat: 'Let\'s finish in chat!',
almostDone: 'Almost done!',
disconnectBankAccount: 'Disconnect bank account',
Expand Down
8 changes: 4 additions & 4 deletions src/languages/es.js
Original file line number Diff line number Diff line change
Expand Up @@ -677,13 +677,13 @@ export default {
headerWithEcard: '¡Tus tarjetas están listas!',
noVBACopy: 'Conecta una cuenta bancaria para emitir Tarjetas Expensify ilimitadas para los miembros de tu espacio de trabajo y acceder a todas estas increíbles ventajas:',
VBANoECardCopy: 'Agrega tu correo electrónico de trabajo para emitir Tarjetas Expensify ilimitadas para los miembros de tu espacio de trabajo y acceder a todas estas increíbles ventajas:',
conciergeCanHelp: 'Concierge te puede ayudar a añadir un correo electrónico de trabajo para activar la Tarjeta Expensify.',
VBAWithECardCopy: 'Disfruta de todas estas increíbles ventajas:',
benefit1: 'Hasta un 2% de devolución en tus gastos',
benefit2: 'Tarjetas digitales y físicas',
benefit3: 'Sin responsabilidad personal',
benefit4: 'Límites personalizables',
chatWithConcierge: 'Chatea con Concierge',
addWorkEmail: 'Añadir correo electrónico de trabajo',
checkingDomain: '¡Un momento! Estamos todavía trabajando para habilitar tu Tarjeta Expensify. Vuelve aquí en unos minutos.',
},
reimburse: {
captureReceipts: 'Captura recibos',
Expand Down Expand Up @@ -747,9 +747,9 @@ export default {
streamlinePayments: 'Optimiza pagos',
oneMoreThing: '¡Una cosa más!',
allSet: '¡Todo listo!',
accountDescriptionNoCards: 'Esta cuenta bancaria se utilizará para reembolsar gastos y cobrar y pagar facturas, todo desde la misma cuenta. Concierge puede ayudarte a añadir tu correo de trabajo para activar la Tarjeta Expensify.',
accountDescriptionNoCards: 'Esta cuenta bancaria se utilizará para reembolsar gastos y cobrar y pagar facturas, todo desde la misma cuenta.\n\nPor favor añade un correo electrónico de trabajo como tu nombre de usuario secundario para activar la Tarjeta Expensify.',
accountDescriptionWithCards: 'Esta cuenta bancaria se utilizará para emitir tarjetas corporativas, reembolsar gastos y cobrar y pagar facturas, todo desde la misma cuenta.',
chatWithConcierge: 'Chat con Concierge',
addWorkEmail: 'Añadir correo electrónico de trabajo',
letsFinishInChat: '¡Continuemos en el chat!',
almostDone: '¡Casi listo!',
disconnectBankAccount: 'Desconectar cuenta bancaria',
Expand Down
1 change: 1 addition & 0 deletions src/libs/Pusher/EventType.js
Original file line number Diff line number Diff line change
Expand Up @@ -7,4 +7,5 @@ export default {
REPORT_COMMENT_EDIT: 'reportCommentEdit',
REPORT_TOGGLE_PINNED: 'reportTogglePinned',
PREFERRED_LOCALE: 'preferredLocale',
EXPENSIFY_CARD_UPDATE: 'expensifyCardUpdate',
};
32 changes: 32 additions & 0 deletions src/libs/actions/User.js
Original file line number Diff line number Diff line change
Expand Up @@ -284,6 +284,37 @@ function subscribeToUserEvents() {
});
}

/**
* Subscribes to Expensify Card updates when checking loginList for private domains
*/
function subscribeToExpensifyCardUpdates() {
if (!currentUserAccountID) {
return;
}

const pusherChannelName = `private-user-accountID-${currentUserAccountID}`;
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

It looks like we use the same in subscribeToUserEvents, can we consolidate those somehow? Also, is there a reason we don't need to check if currentUserAccountID exists in this function?

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This is a one-time only subscription that happens when the user clicks the Add work email address link. Adding it to subscribeToUserEvents would subscribe users prematurely and unnecessarily.

I didn't add the check because when the user subscribes to this event we should have a currentUserAccountID. That is different from subscribeToUserEvents because subscribeToUserEvents is called upon login and race conditions could cause currentUserAccountID to be undefined. With that being said, I'll add the check just to be safe.

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Sounds good, thanks for the explanation!


// Handle Expensify Card approval flow updates
Pusher.subscribe(pusherChannelName, Pusher.TYPE.EXPENSIFY_CARD_UPDATE, (pushJSON) => {
if (pushJSON.isUsingExpensifyCard) {
Onyx.merge(ONYXKEYS.USER, {isUsingExpensifyCard: pushJSON.isUsingExpensifyCard, isCheckingDomain: null});
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Why do we set isCheckingDomain to null instead of false?

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Setting it to null should delete the key from Onyx. Since this is a one-time only event, I felt like it was better to remove the key than leave it set as false.

Pusher.unsubscribe(pusherChannelName, Pusher.TYPE.EXPENSIFY_CARD_UPDATE);
} else {
Onyx.merge(ONYXKEYS.USER, {isCheckingDomain: pushJSON.isCheckingDomain});
}
}, false,
() => {
NetworkConnection.triggerReconnectionCallbacks('pusher re-subscribed to private user channel');
})
.catch((error) => {
Log.info(
'[User] Failed to subscribe to Pusher channel',
false,
{error, pusherChannelName, eventName: Pusher.TYPE.EXPENSIFY_CARD_UPDATE},
);
});
}

/**
* Sync preferredSkinTone with Onyx and Server
* @param {String} skinTone
Expand Down Expand Up @@ -318,4 +349,5 @@ export {
setPreferredSkinTone,
setShouldUseSecureStaging,
clearUserErrorMessage,
subscribeToExpensifyCardUpdates,
};
17 changes: 12 additions & 5 deletions src/pages/ReimbursementAccount/EnableStep.js
Original file line number Diff line number Diff line change
Expand Up @@ -10,18 +10,19 @@ import Navigation from '../../libs/Navigation/Navigation';
import Text from '../../components/Text';
import compose from '../../libs/compose';
import ONYXKEYS from '../../ONYXKEYS';
import {ChatBubble, Close} from '../../components/Icon/Expensicons';
import {Mail, Close} from '../../components/Icon/Expensicons';
import MenuItem from '../../components/MenuItem';
import getBankIcon from '../../components/Icon/BankIcons';
import {getPaymentMethods} from '../../libs/actions/PaymentMethods';
import FullScreenLoadingIndicator from '../../components/FullscreenLoadingIndicator';
import bankAccountPropTypes from '../../components/bankAccountPropTypes';
import {navigateToConciergeChat} from '../../libs/actions/Report';
import confettiPop from '../../../assets/images/confetti-pop.gif';
import Icon from '../../components/Icon';
import WorkspaceSection from '../workspace/WorkspaceSection';
import {ConciergeBlue} from '../../components/Icon/Illustrations';
import {requestResetFreePlanBankAccount} from '../../libs/actions/BankAccounts';
import {openOldDotLink} from '../../libs/actions/Link';
import {subscribeToExpensifyCardUpdates} from '../../libs/actions/User';

const propTypes = {
/** Are we loading payment methods? */
Expand Down Expand Up @@ -72,10 +73,11 @@ class EnableStep extends React.Component {
}];
if (!isUsingExpensifyCard) {
menuItems.unshift({
title: this.props.translate('workspace.bankAccount.chatWithConcierge'),
icon: ChatBubble,
title: this.props.translate('workspace.bankAccount.addWorkEmail'),
icon: Mail,
onPress: () => {
navigateToConciergeChat();
openOldDotLink('settings?param={"section":"account","openModal":"secondaryLogin"}');
subscribeToExpensifyCardUpdates();
},
shouldShowRightIcon: true,
});
Expand Down Expand Up @@ -111,6 +113,11 @@ class EnableStep extends React.Component {
: this.props.translate('workspace.bankAccount.accountDescriptionWithCards')}
</Text>
</WorkspaceSection>
{this.props.user.isCheckingDomain && (
<Text style={[styles.formError, styles.m5]}>
{this.props.translate('workspace.card.checkingDomain')}
</Text>
)}
</View>
</View>
);
Expand Down
79 changes: 47 additions & 32 deletions src/pages/workspace/card/WorkspaceCardVBANoECardView.js
Original file line number Diff line number Diff line change
@@ -1,55 +1,70 @@
import React from 'react';
import {View} from 'react-native';
import {withOnyx} from 'react-native-onyx';
import Text from '../../../components/Text';
import styles from '../../../styles/styles';
import withLocalize, {withLocalizePropTypes} from '../../../components/withLocalize';
import {Concierge} from '../../../components/Icon/Expensicons';
import {Mail} from '../../../components/Icon/Expensicons';
import {JewelBoxBlue} from '../../../components/Icon/Illustrations';
import UnorderedList from '../../../components/UnorderedList';
import WorkspaceSection from '../WorkspaceSection';
import {navigateToConciergeChat} from '../../../libs/actions/Report';
import Navigation from '../../../libs/Navigation/Navigation';
import {openOldDotLink} from '../../../libs/actions/Link';
import {subscribeToExpensifyCardUpdates} from '../../../libs/actions/User';
import ONYXKEYS from '../../../ONYXKEYS';
import compose from '../../../libs/compose';

const propTypes = {
...withLocalizePropTypes,
};

const WorkspaceCardVBANoECardView = props => (
<WorkspaceSection
title={props.translate('workspace.card.header')}
icon={JewelBoxBlue}
menuItems={[
{
title: props.translate('workspace.card.chatWithConcierge'),
onPress: () => {
Navigation.dismissModal();
navigateToConciergeChat();
<>
<WorkspaceSection
title={props.translate('workspace.card.header')}
icon={JewelBoxBlue}
menuItems={[
{
title: props.translate('workspace.card.addWorkEmail'),
onPress: () => {
Navigation.dismissModal();
openOldDotLink('settings?param={"section":"account","openModal":"secondaryLogin"}');
subscribeToExpensifyCardUpdates();
},
icon: Mail,
shouldShowRightIcon: true,
},
icon: Concierge,
shouldShowRightIcon: true,
},
]}
>
<View style={[styles.mv4]}>
<Text>{props.translate('workspace.card.VBANoECardCopy')}</Text>
</View>

<UnorderedList
items={[
props.translate('workspace.card.benefit1'),
props.translate('workspace.card.benefit2'),
props.translate('workspace.card.benefit3'),
props.translate('workspace.card.benefit4'),
]}
/>
>
<View style={[styles.mv4]}>
<Text>{props.translate('workspace.card.VBANoECardCopy')}</Text>
</View>

<View style={[styles.mv4]}>
<Text>{props.translate('workspace.card.conciergeCanHelp')}</Text>
</View>
</WorkspaceSection>
<UnorderedList
items={[
props.translate('workspace.card.benefit1'),
props.translate('workspace.card.benefit2'),
props.translate('workspace.card.benefit3'),
props.translate('workspace.card.benefit4'),
]}
/>
</WorkspaceSection>
{props.user.isCheckingDomain && (
<Text style={[styles.m5, styles.formError]}>
{props.translate('workspace.card.checkingDomain')}
</Text>
)}
</>
);

WorkspaceCardVBANoECardView.propTypes = propTypes;
WorkspaceCardVBANoECardView.displayName = 'WorkspaceCardVBANoECardView';

export default withLocalize(WorkspaceCardVBANoECardView);
export default compose(
withLocalize,
withOnyx({
user: {
key: ONYXKEYS.USER,
},
}),
)(WorkspaceCardVBANoECardView);