Skip to content

Commit

Permalink
Merge pull request #44218 from mananjadhav/mj-netsuite-connect-button
Browse files Browse the repository at this point in the history
[#Wave-Control: Add NetSuite]: Added `NetSuite` connect button and fixed copies
  • Loading branch information
yuwenmemon authored Jun 27, 2024
2 parents 359dbe6 + 6a3037c commit 0aad889
Show file tree
Hide file tree
Showing 11 changed files with 145 additions and 91 deletions.
5 changes: 5 additions & 0 deletions src/CONST.ts
Original file line number Diff line number Diff line change
Expand Up @@ -1794,6 +1794,11 @@ const CONST = {
XERO: 'xero',
NETSUITE: 'netsuite',
},
NAME_USER_FRIENDLY: {
netsuite: 'NetSuite',
quickbooksOnline: 'Quickbooks Online',
xero: 'Xero',
},
SYNC_STAGE_NAME: {
STARTING_IMPORT_QBO: 'startingImportQBO',
STARTING_IMPORT_XERO: 'startingImportXero',
Expand Down
30 changes: 30 additions & 0 deletions src/components/AccountingConnectionConfirmationModal.tsx
Original file line number Diff line number Diff line change
@@ -0,0 +1,30 @@
import React from 'react';
import useLocalize from '@hooks/useLocalize';
import type {ConnectionName} from '@src/types/onyx/Policy';
import ConfirmModal from './ConfirmModal';

type AccountingConnectionConfirmationModalProps = {
integrationToConnect: ConnectionName;
onConfirm: () => void;
onCancel: () => void;
};

function AccountingConnectionConfirmationModal({integrationToConnect, onCancel, onConfirm}: AccountingConnectionConfirmationModalProps) {
const {translate} = useLocalize();

return (
<ConfirmModal
title={translate('workspace.accounting.connectTitle', integrationToConnect)}
isVisible
onConfirm={onConfirm}
onCancel={onCancel}
prompt={translate('workspace.accounting.connectPrompt', integrationToConnect)}
confirmText={translate('workspace.accounting.setup')}
cancelText={translate('common.cancel')}
success
/>
);
}

AccountingConnectionConfirmationModal.displayName = 'AccountingConnectionConfirmationModal';
export default AccountingConnectionConfirmationModal;
54 changes: 54 additions & 0 deletions src/components/ConnectToNetSuiteButton/index.tsx
Original file line number Diff line number Diff line change
@@ -0,0 +1,54 @@
import React, {useState} from 'react';
import AccountingConnectionConfirmationModal from '@components/AccountingConnectionConfirmationModal';
import Button from '@components/Button';
import useLocalize from '@hooks/useLocalize';
import useNetwork from '@hooks/useNetwork';
import useThemeStyles from '@hooks/useThemeStyles';
import {removePolicyConnection} from '@libs/actions/connections';
import Navigation from '@libs/Navigation/Navigation';
import CONST from '@src/CONST';
import ROUTES from '@src/ROUTES';
import type {ConnectToNetSuiteButtonProps} from './types';

function ConnectToNetSuiteButton({policyID, shouldDisconnectIntegrationBeforeConnecting, integrationToDisconnect}: ConnectToNetSuiteButtonProps) {
const styles = useThemeStyles();
const {translate} = useLocalize();
const {isOffline} = useNetwork();

const [isDisconnectModalOpen, setIsDisconnectModalOpen] = useState(false);

return (
<>
<Button
onPress={() => {
if (shouldDisconnectIntegrationBeforeConnecting && integrationToDisconnect) {
setIsDisconnectModalOpen(true);
return;
}

// TODO: Will be updated to new token input page
Navigation.navigate(ROUTES.POLICY_ACCOUNTING_NETSUITE_SUBSIDIARY_SELECTOR.getRoute(policyID));
}}
text={translate('workspace.accounting.setup')}
style={styles.justifyContentCenter}
small
isDisabled={isOffline}
/>
{shouldDisconnectIntegrationBeforeConnecting && isDisconnectModalOpen && integrationToDisconnect && (
<AccountingConnectionConfirmationModal
onConfirm={() => {
removePolicyConnection(policyID, integrationToDisconnect);

// TODO: Will be updated to new token input page
Navigation.navigate(ROUTES.POLICY_ACCOUNTING_NETSUITE_SUBSIDIARY_SELECTOR.getRoute(policyID));
setIsDisconnectModalOpen(false);
}}
integrationToConnect={CONST.POLICY.CONNECTIONS.NAME.NETSUITE}
onCancel={() => setIsDisconnectModalOpen(false)}
/>
)}
</>
);
}

export default ConnectToNetSuiteButton;
10 changes: 10 additions & 0 deletions src/components/ConnectToNetSuiteButton/types.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
import type {PolicyConnectionName} from '@src/types/onyx/Policy';

type ConnectToNetSuiteButtonProps = {
policyID: string;
shouldDisconnectIntegrationBeforeConnecting?: boolean;
integrationToDisconnect?: PolicyConnectionName;
};

// eslint-disable-next-line import/prefer-default-export
export type {ConnectToNetSuiteButtonProps};
11 changes: 3 additions & 8 deletions src/components/ConnectToQuickbooksOnlineButton/index.native.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -2,9 +2,9 @@ import React, {useRef, useState} from 'react';
import type {OnyxEntry} from 'react-native-onyx';
import {withOnyx} from 'react-native-onyx';
import {WebView} from 'react-native-webview';
import AccountingConnectionConfirmationModal from '@components/AccountingConnectionConfirmationModal';
import FullPageOfflineBlockingView from '@components/BlockingViews/FullPageOfflineBlockingView';
import Button from '@components/Button';
import ConfirmModal from '@components/ConfirmModal';
import FullScreenLoadingIndicator from '@components/FullscreenLoadingIndicator';
import HeaderWithBackButton from '@components/HeaderWithBackButton';
import Modal from '@components/Modal';
Expand Down Expand Up @@ -57,19 +57,14 @@ function ConnectToQuickbooksOnlineButton({
isDisabled={isOffline}
/>
{shouldDisconnectIntegrationBeforeConnecting && integrationToDisconnect && isDisconnectModalOpen && (
<ConfirmModal
title={translate('workspace.accounting.disconnectTitle', CONST.POLICY.CONNECTIONS.NAME.XERO)}
<AccountingConnectionConfirmationModal
onConfirm={() => {
removePolicyConnection(policyID, integrationToDisconnect);
setIsDisconnectModalOpen(false);
setWebViewOpen(true);
}}
isVisible
integrationToConnect={CONST.POLICY.CONNECTIONS.NAME.QBO}
onCancel={() => setIsDisconnectModalOpen(false)}
prompt={translate('workspace.accounting.disconnectPrompt', CONST.POLICY.CONNECTIONS.NAME.QBO)}
confirmText={translate('workspace.accounting.disconnect')}
cancelText={translate('common.cancel')}
danger
/>
)}
{isWebViewOpen && (
Expand Down
11 changes: 3 additions & 8 deletions src/components/ConnectToQuickbooksOnlineButton/index.tsx
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
import React, {useState} from 'react';
import AccountingConnectionConfirmationModal from '@components/AccountingConnectionConfirmationModal';
import Button from '@components/Button';
import ConfirmModal from '@components/ConfirmModal';
import useEnvironment from '@hooks/useEnvironment';
import useLocalize from '@hooks/useLocalize';
import useNetwork from '@hooks/useNetwork';
Expand Down Expand Up @@ -38,19 +38,14 @@ function ConnectToQuickbooksOnlineButton({policyID, shouldDisconnectIntegrationB
small
/>
{shouldDisconnectIntegrationBeforeConnecting && integrationToDisconnect && isDisconnectModalOpen && (
<ConfirmModal
title={translate('workspace.accounting.disconnectTitle', CONST.POLICY.CONNECTIONS.NAME.XERO)}
isVisible={isDisconnectModalOpen}
<AccountingConnectionConfirmationModal
onConfirm={() => {
removePolicyConnection(policyID, integrationToDisconnect);
Link.openLink(getQuickBooksOnlineSetupLink(policyID), environmentURL);
setIsDisconnectModalOpen(false);
}}
integrationToConnect={CONST.POLICY.CONNECTIONS.NAME.QBO}
onCancel={() => setIsDisconnectModalOpen(false)}
prompt={translate('workspace.accounting.disconnectPrompt', CONST.POLICY.CONNECTIONS.NAME.QBO)}
confirmText={translate('workspace.accounting.disconnect')}
cancelText={translate('common.cancel')}
danger
/>
)}
</>
Expand Down
11 changes: 3 additions & 8 deletions src/components/ConnectToXeroButton/index.native.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -2,9 +2,9 @@ import React, {useRef, useState} from 'react';
import type {OnyxEntry} from 'react-native-onyx';
import {withOnyx} from 'react-native-onyx';
import {WebView} from 'react-native-webview';
import AccountingConnectionConfirmationModal from '@components/AccountingConnectionConfirmationModal';
import FullPageOfflineBlockingView from '@components/BlockingViews/FullPageOfflineBlockingView';
import Button from '@components/Button';
import ConfirmModal from '@components/ConfirmModal';
import FullScreenLoadingIndicator from '@components/FullscreenLoadingIndicator';
import HeaderWithBackButton from '@components/HeaderWithBackButton';
import Modal from '@components/Modal';
Expand Down Expand Up @@ -52,19 +52,14 @@ function ConnectToXeroButton({policyID, session, shouldDisconnectIntegrationBefo
isDisabled={isOffline}
/>
{shouldDisconnectIntegrationBeforeConnecting && isDisconnectModalOpen && integrationToDisconnect && (
<ConfirmModal
title={translate('workspace.accounting.disconnectTitle', CONST.POLICY.CONNECTIONS.NAME.QBO)}
<AccountingConnectionConfirmationModal
onConfirm={() => {
removePolicyConnection(policyID, integrationToDisconnect);
setIsDisconnectModalOpen(false);
setWebViewOpen(true);
}}
isVisible
integrationToConnect={CONST.POLICY.CONNECTIONS.NAME.XERO}
onCancel={() => setIsDisconnectModalOpen(false)}
prompt={translate('workspace.accounting.disconnectPrompt', CONST.POLICY.CONNECTIONS.NAME.XERO)}
confirmText={translate('workspace.accounting.disconnect')}
cancelText={translate('common.cancel')}
danger
/>
)}
<Modal
Expand Down
11 changes: 3 additions & 8 deletions src/components/ConnectToXeroButton/index.tsx
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
import React, {useState} from 'react';
import AccountingConnectionConfirmationModal from '@components/AccountingConnectionConfirmationModal';
import Button from '@components/Button';
import ConfirmModal from '@components/ConfirmModal';
import useEnvironment from '@hooks/useEnvironment';
import useLocalize from '@hooks/useLocalize';
import useNetwork from '@hooks/useNetwork';
Expand Down Expand Up @@ -35,19 +35,14 @@ function ConnectToXeroButton({policyID, shouldDisconnectIntegrationBeforeConnect
isDisabled={isOffline}
/>
{shouldDisconnectIntegrationBeforeConnecting && isDisconnectModalOpen && integrationToDisconnect && (
<ConfirmModal
title={translate('workspace.accounting.disconnectTitle', CONST.POLICY.CONNECTIONS.NAME.QBO)}
isVisible
<AccountingConnectionConfirmationModal
onConfirm={() => {
removePolicyConnection(policyID, integrationToDisconnect);
Link.openLink(getXeroSetupLink(policyID), environmentURL);
setIsDisconnectModalOpen(false);
}}
integrationToConnect={CONST.POLICY.CONNECTIONS.NAME.XERO}
onCancel={() => setIsDisconnectModalOpen(false)}
prompt={translate('workspace.accounting.disconnectPrompt', CONST.POLICY.CONNECTIONS.NAME.XERO)}
confirmText={translate('workspace.accounting.disconnect')}
cancelText={translate('common.cancel')}
danger
/>
)}
</>
Expand Down
43 changes: 16 additions & 27 deletions src/languages/en.ts
Original file line number Diff line number Diff line change
Expand Up @@ -2444,22 +2444,19 @@ export default {
syncNow: 'Sync now',
disconnect: 'Disconnect',
disconnectTitle: (integration?: ConnectionName): string => {
switch (integration) {
case CONST.POLICY.CONNECTIONS.NAME.QBO:
return 'Disconnect QuickBooks Online';
case CONST.POLICY.CONNECTIONS.NAME.XERO:
return 'Disconnect Xero';
default: {
return 'Disconnect integration';
}
}
const integrationName = integration && CONST.POLICY.CONNECTIONS.NAME_USER_FRIENDLY[integration] ? CONST.POLICY.CONNECTIONS.NAME_USER_FRIENDLY[integration] : 'integration';
return `Disconnect ${integrationName}`;
},
connectTitle: (integrationToConnect: ConnectionName): string => `Connect ${CONST.POLICY.CONNECTIONS.NAME_USER_FRIENDLY[integrationToConnect] ?? 'accounting integration'}`,

syncError: (integration?: ConnectionName): string => {
switch (integration) {
case CONST.POLICY.CONNECTIONS.NAME.QBO:
return "Can't connect to QuickBooks Online.";
case CONST.POLICY.CONNECTIONS.NAME.XERO:
return "Can't connect to Xero.";
case CONST.POLICY.CONNECTIONS.NAME.NETSUITE:
return "Can't connect to NetSuite.";
default: {
return "Can't connect to integration.";
}
Expand All @@ -2478,25 +2475,17 @@ export default {
[CONST.INTEGRATION_ENTITY_MAP_TYPES.NONE]: 'Not imported',
[CONST.INTEGRATION_ENTITY_MAP_TYPES.REPORT_FIELD]: 'Imported as report fields',
},
disconnectPrompt: (integrationToConnect?: ConnectionName, currentIntegration?: ConnectionName): string => {
switch (integrationToConnect) {
case CONST.POLICY.CONNECTIONS.NAME.QBO:
return 'Are you sure you want to disconnect Xero to set up QuickBooks Online?';
case CONST.POLICY.CONNECTIONS.NAME.XERO:
return 'Are you sure you want to disconnect QuickBooks Online to set up Xero?';
default: {
switch (currentIntegration) {
case CONST.POLICY.CONNECTIONS.NAME.QBO:
return 'Are you sure you want to disconnect QuickBooks Online?';
case CONST.POLICY.CONNECTIONS.NAME.XERO:
return 'Are you sure you want to disconnect Xero?';
default: {
return 'Are you sure you want to disconnect this integration?';
}
}
}
}
disconnectPrompt: (currentIntegration?: ConnectionName): string => {
const integrationName =
currentIntegration && CONST.POLICY.CONNECTIONS.NAME_USER_FRIENDLY[currentIntegration]
? CONST.POLICY.CONNECTIONS.NAME_USER_FRIENDLY[currentIntegration]
: 'this integration';
return `Are you sure you want to disconnect ${integrationName}?`;
},
connectPrompt: (integrationToConnect: ConnectionName): string =>
`Are you sure you want to connect ${
CONST.POLICY.CONNECTIONS.NAME_USER_FRIENDLY[integrationToConnect] ?? 'this accounting integration'
}? This will remove any existing acounting connections.`,
enterCredentials: 'Enter your credentials',
connections: {
syncStageName: (stage: PolicyConnectionSyncStage) => {
Expand Down
44 changes: 15 additions & 29 deletions src/languages/es.ts
Original file line number Diff line number Diff line change
Expand Up @@ -2446,23 +2446,19 @@ export default {
other: 'Otras integraciones',
syncNow: 'Sincronizar ahora',
disconnect: 'Desconectar',
disconnectTitle: (currentIntegration?: ConnectionName): string => {
switch (currentIntegration) {
case CONST.POLICY.CONNECTIONS.NAME.QBO:
return 'Desconectar QuickBooks Online';
case CONST.POLICY.CONNECTIONS.NAME.XERO:
return 'Desconectar Xero';
default: {
return 'Desconectar integración';
}
}
disconnectTitle: (integration?: ConnectionName): string => {
const integrationName = integration && CONST.POLICY.CONNECTIONS.NAME_USER_FRIENDLY[integration] ? CONST.POLICY.CONNECTIONS.NAME_USER_FRIENDLY[integration] : 'integración';
return `Desconectar ${integrationName}`;
},
connectTitle: (integrationToConnect: ConnectionName): string => `Conectar ${CONST.POLICY.CONNECTIONS.NAME_USER_FRIENDLY[integrationToConnect] ?? 'accounting integration'}`,
syncError: (integration?: ConnectionName): string => {
switch (integration) {
case CONST.POLICY.CONNECTIONS.NAME.QBO:
return 'No se puede conectar a QuickBooks Online.';
case CONST.POLICY.CONNECTIONS.NAME.XERO:
return 'No se puede conectar a Xero';
return 'No se puede conectar a Xero.';
case CONST.POLICY.CONNECTIONS.NAME.NETSUITE:
return 'No se puede conectar a NetSuite.';
default: {
return 'No se ha podido conectar a la integración.';
}
Expand All @@ -2481,25 +2477,15 @@ export default {
[CONST.INTEGRATION_ENTITY_MAP_TYPES.NONE]: 'No importado',
[CONST.INTEGRATION_ENTITY_MAP_TYPES.REPORT_FIELD]: 'Importado como campos de informe',
},
disconnectPrompt: (integrationToConnect?: ConnectionName, currentIntegration?: ConnectionName): string => {
switch (integrationToConnect) {
case CONST.POLICY.CONNECTIONS.NAME.QBO:
return '¿Estás seguro de que quieres desconectar Xero para configurar QuickBooks Online?';
case CONST.POLICY.CONNECTIONS.NAME.XERO:
return '¿Estás seguro de que quieres desconectar QuickBooks Online para configurar Xero?';
default: {
switch (currentIntegration) {
case CONST.POLICY.CONNECTIONS.NAME.QBO:
return '¿Estás seguro de que quieres desconectar QuickBooks Online?';
case CONST.POLICY.CONNECTIONS.NAME.XERO:
return '¿Estás seguro de que quieres desconectar Xero?';
default: {
return '¿Estás seguro de que quieres desconectar integración?';
}
}
}
}
disconnectPrompt: (currentIntegration?: ConnectionName): string => {
const integrationName =
currentIntegration && CONST.POLICY.CONNECTIONS.NAME_USER_FRIENDLY[currentIntegration] ? CONST.POLICY.CONNECTIONS.NAME_USER_FRIENDLY[currentIntegration] : 'integración';
return `¿Estás seguro de que quieres desconectar ${integrationName}?`;
},
connectPrompt: (integrationToConnect: ConnectionName): string =>
`¿Estás seguro de que quieres conectar a ${
CONST.POLICY.CONNECTIONS.NAME_USER_FRIENDLY[integrationToConnect] ?? 'esta integración contable'
}? Esto eliminará cualquier conexión contable existente.`,
enterCredentials: 'Ingresa tus credenciales',
connections: {
syncStageName: (stage: PolicyConnectionSyncStage) => {
Expand Down
Loading

0 comments on commit 0aad889

Please sign in to comment.