From f5eee30aa5b7e7865cc6ca50791b2b6b08db4bcd Mon Sep 17 00:00:00 2001 From: Nicolay Arefyeu Date: Wed, 13 Aug 2025 10:04:25 +0300 Subject: [PATCH 01/12] Uber connected page --- src/languages/de.ts | 4 + src/languages/en.ts | 4 + src/languages/es.ts | 4 + src/languages/fr.ts | 4 + src/languages/it.ts | 4 + src/languages/ja.ts | 4 + src/languages/nl.ts | 4 + src/languages/pl.ts | 4 + src/languages/pt-BR.ts | 4 + src/languages/zh-hans.ts | 4 + .../TogglePolicyUberAutoInvitePageParams.ts | 6 + .../TogglePolicyUberAutoRemovePageParams.ts | 6 + src/libs/API/parameters/index.ts | 2 + src/libs/API/types.ts | 4 + src/libs/actions/Policy/Policy.ts | 77 ++++++++++ .../WorkspaceReceiptPartnersPage.tsx | 131 +++++++++++++++++- src/types/onyx/Policy.ts | 69 +++++---- 17 files changed, 302 insertions(+), 33 deletions(-) create mode 100644 src/libs/API/parameters/TogglePolicyUberAutoInvitePageParams.ts create mode 100644 src/libs/API/parameters/TogglePolicyUberAutoRemovePageParams.ts diff --git a/src/languages/de.ts b/src/languages/de.ts index 29b856da60bf..73b31575acd4 100644 --- a/src/languages/de.ts +++ b/src/languages/de.ts @@ -3515,6 +3515,9 @@ const translations = { receiptPartners: { uber: { subtitle: 'Automatisieren Sie die Reisekosten und Essenslieferungskosten in Ihrem gesamten Unternehmen.', + autoRemove: 'Neue Workspace-Mitglieder zu Uber for Business einladen', + autoInvite: 'Entfernte Workspace-Mitglieder von Uber for Business deaktivieren', + manageInvites: 'Einladungen verwalten', }, }, perDiem: { @@ -4651,6 +4654,7 @@ const translations = { receiptPartnersWarningModal: { featureEnabledTitle: 'Uber trennen', disconnectText: 'Um diese Funktion zu deaktivieren, trennen Sie bitte zuerst die Uber for Business Integration.', + description: 'Möchten Sie diese Integration wirklich trennen?', confirmText: 'Verstanden', }, workflowWarningModal: { diff --git a/src/languages/en.ts b/src/languages/en.ts index 0fa6bada365c..0f1e181b023e 100755 --- a/src/languages/en.ts +++ b/src/languages/en.ts @@ -3512,6 +3512,9 @@ const translations = { receiptPartners: { uber: { subtitle: 'Automate travel and meal delivery expenses across your organization.', + autoRemove: 'Invite new workspace members to Uber for Business', + autoInvite: 'Deactivate removed workspace members from Uber for Business', + manageInvites: 'Manage invites', }, }, perDiem: { @@ -4634,6 +4637,7 @@ const translations = { receiptPartnersWarningModal: { featureEnabledTitle: 'Disconnect Uber', disconnectText: 'To disable this feature, please disconnect the Uber for Business integration first.', + description: 'Are you sure you want to disconnect this integration?', confirmText: 'Got it', }, workflowWarningModal: { diff --git a/src/languages/es.ts b/src/languages/es.ts index 6f0795ff65c4..62520bfbed9e 100644 --- a/src/languages/es.ts +++ b/src/languages/es.ts @@ -3500,6 +3500,9 @@ const translations = { receiptPartners: { uber: { subtitle: 'Automatice los gastos de viajes y entrega de comidas en toda su organización.', + autoRemove: 'Invitar a nuevos miembros del espacio de trabajo a Uber para Empresas', + autoInvite: 'Desactivar miembros del espacio de trabajo eliminados de Uber para Empresas', + manageInvites: 'Administrar invitaciones', }, }, perDiem: { @@ -4644,6 +4647,7 @@ const translations = { receiptPartnersWarningModal: { featureEnabledTitle: 'Desconectar Uber', disconnectText: 'Para desactivar esta función, desconecta primero la integración de Uber for Business.', + description: '¿Está seguro de que desea desconectar esta integración?', confirmText: 'Entendido', }, workflowWarningModal: { diff --git a/src/languages/fr.ts b/src/languages/fr.ts index e2c2cbcb728c..b4535346399b 100644 --- a/src/languages/fr.ts +++ b/src/languages/fr.ts @@ -3523,6 +3523,9 @@ const translations = { receiptPartners: { uber: { subtitle: 'Automatisez les dépenses de déplacement et de livraison de repas dans toute votre organisation.', + autoRemove: "Inviter de nouveaux membres de l'espace de travail sur Uber", + autoInvite: "Désactiver les membres supprimés de l'espace de travail sur Uber", + manageInvites: 'Gérer les invitations', }, }, perDiem: { @@ -4667,6 +4670,7 @@ const translations = { receiptPartnersWarningModal: { featureEnabledTitle: 'Déconnecter Uber', disconnectText: "Pour désactiver cette fonctionnalité, veuillez d'abord déconnecter l'intégration Uber for Business.", + description: 'Êtes-vous sûr de vouloir déconnecter cette intégration?', confirmText: 'Compris', }, workflowWarningModal: { diff --git a/src/languages/it.ts b/src/languages/it.ts index fb1ea04bf065..2ad2438dd3f6 100644 --- a/src/languages/it.ts +++ b/src/languages/it.ts @@ -3528,6 +3528,9 @@ const translations = { receiptPartners: { uber: { subtitle: 'Automatizza le spese di viaggio e di consegna dei pasti in tutta la tua organizzazione.', + autoRemove: "Invita nuovi membri dell'area di lavoro su Uber for Business", + autoInvite: "Disattiva i membri dell'area di lavoro rimossi da Uber for Business", + manageInvites: 'Gestisci inviti', }, }, perDiem: { @@ -4666,6 +4669,7 @@ const translations = { receiptPartnersWarningModal: { featureEnabledTitle: 'Disconnetti Uber', disconnectText: "Per disabilitare questa funzionalità, disconnetti prima l'integrazione Uber for Business.", + description: 'Sei sicuro di voler disconnettere questa integrazione?', confirmText: 'Capito', }, workflowWarningModal: { diff --git a/src/languages/ja.ts b/src/languages/ja.ts index de0099367881..4e73a7dac748 100644 --- a/src/languages/ja.ts +++ b/src/languages/ja.ts @@ -3528,6 +3528,9 @@ const translations = { receiptPartners: { uber: { subtitle: '組織全体で出張費や食事の配達費を自動化します。', + autoRemove: 'Uber for Business に新しいワークスペースメンバーを招待する', + autoInvite: 'Uber for Business から削除されたワークスペースメンバーを非アクティブ化する', + manageInvites: '招待を管理する', }, }, perDiem: { @@ -4645,6 +4648,7 @@ const translations = { receiptPartnersWarningModal: { featureEnabledTitle: 'Uberを切断', disconnectText: 'この機能を無効にするには、まずUber for Business統合を切断してください。', + description: 'この統合を切断してもよろしいですか?', confirmText: '了解', }, workflowWarningModal: { diff --git a/src/languages/nl.ts b/src/languages/nl.ts index d09032abc2a2..75a4d00a238c 100644 --- a/src/languages/nl.ts +++ b/src/languages/nl.ts @@ -3535,6 +3535,9 @@ const translations = { receiptPartners: { uber: { subtitle: 'Automatiseer reis- en maaltijdbezorgkosten binnen uw organisatie.', + autoRemove: 'Nodig nieuwe werkruimteleden uit voor Uber for Business', + autoInvite: 'Deactiveer verwijderde werkruimteleden van Uber for Business', + manageInvites: 'Beheer uitnodigingen', }, }, perDiem: { @@ -4668,6 +4671,7 @@ const translations = { receiptPartnersWarningModal: { featureEnabledTitle: 'Uber verbreken', disconnectText: 'Om deze functie uit te schakelen, verbreek eerst de Uber for Business integratie.', + description: 'Weet u zeker dat u deze integratie wilt verbreken?', confirmText: 'Begrepen', }, workflowWarningModal: { diff --git a/src/languages/pl.ts b/src/languages/pl.ts index 8c4752dd8917..c0606bd844b1 100644 --- a/src/languages/pl.ts +++ b/src/languages/pl.ts @@ -3528,6 +3528,9 @@ const translations = { receiptPartners: { uber: { subtitle: 'Zautomatyzuj wydatki na podróże i dostawę posiłków w swojej organizacji.', + autoRemove: 'Zaproś nowych członków przestrzeni roboczej do Ubera dla Firm', + autoInvite: 'Dezaktywuj usuniętych członków przestrzeni roboczej w Uberze dla Firm', + manageInvites: 'Zarządzaj zaproszeniami', }, }, perDiem: { @@ -4657,6 +4660,7 @@ const translations = { receiptPartnersWarningModal: { featureEnabledTitle: 'Rozłącz Uber', disconnectText: 'Aby wyłączyć tę funkcję, najpierw rozłącz integrację Uber for Business.', + description: 'Czy na pewno chcesz rozłączyć tę integrację?', confirmText: 'Rozumiem', }, workflowWarningModal: { diff --git a/src/languages/pt-BR.ts b/src/languages/pt-BR.ts index 6ac8cff08b07..bffae67aa7e5 100644 --- a/src/languages/pt-BR.ts +++ b/src/languages/pt-BR.ts @@ -3533,6 +3533,9 @@ const translations = { receiptPartners: { uber: { subtitle: 'Automatize despesas de viagens e entrega de refeições em toda a sua organização.', + autoRemove: 'Convidar novos membros do espaço de trabalho para o Uber for Business', + autoInvite: 'Desativar membros removidos do espaço de trabalho do Uber for Business', + manageInvites: 'Gerenciar convites', }, }, perDiem: { @@ -4663,6 +4666,7 @@ const translations = { receiptPartnersWarningModal: { featureEnabledTitle: 'Desconectar Uber', disconnectText: 'Para desativar este recurso, desconecte primeiro a integração do Uber for Business.', + description: 'Tem certeza de que deseja desconectar esta integração?', confirmText: 'Entendi', }, workflowWarningModal: { diff --git a/src/languages/zh-hans.ts b/src/languages/zh-hans.ts index 842325a416a6..4be688f3fae6 100644 --- a/src/languages/zh-hans.ts +++ b/src/languages/zh-hans.ts @@ -3486,6 +3486,9 @@ const translations = { receiptPartners: { uber: { subtitle: '自动化整个组织的差旅和送餐费用。', + autoRemove: '邀请新工作区成员加入 Uber for Business', + autoInvite: '停用已从 Uber for Business 移除的工作区成员', + manageInvites: '管理邀请', }, }, perDiem: { @@ -4582,6 +4585,7 @@ const translations = { receiptPartnersWarningModal: { featureEnabledTitle: '断开Uber连接', disconnectText: '要禁用此功能,请先断开Uber for Business集成。', + description: '您确定要断开此集成吗?', confirmText: '明白了', }, workflowWarningModal: { diff --git a/src/libs/API/parameters/TogglePolicyUberAutoInvitePageParams.ts b/src/libs/API/parameters/TogglePolicyUberAutoInvitePageParams.ts new file mode 100644 index 000000000000..67997b8df9ab --- /dev/null +++ b/src/libs/API/parameters/TogglePolicyUberAutoInvitePageParams.ts @@ -0,0 +1,6 @@ +type TogglePolicyUberAutoInvitePageParams = { + policyID: string; + enabled?: boolean; +}; + +export default TogglePolicyUberAutoInvitePageParams; diff --git a/src/libs/API/parameters/TogglePolicyUberAutoRemovePageParams.ts b/src/libs/API/parameters/TogglePolicyUberAutoRemovePageParams.ts new file mode 100644 index 000000000000..3a97a5935804 --- /dev/null +++ b/src/libs/API/parameters/TogglePolicyUberAutoRemovePageParams.ts @@ -0,0 +1,6 @@ +type TogglePolicyUberAutoRemovePageParams = { + policyID: string; + enabled?: boolean; +}; + +export default TogglePolicyUberAutoRemovePageParams; diff --git a/src/libs/API/parameters/index.ts b/src/libs/API/parameters/index.ts index de8154e2dacb..a13d8baeb8b2 100644 --- a/src/libs/API/parameters/index.ts +++ b/src/libs/API/parameters/index.ts @@ -30,6 +30,7 @@ export type {default as SyncPolicyToQuickbooksDesktopParams} from './SyncPolicyT export type {default as DeleteContactMethodParams} from './DeleteContactMethodParams'; export type {default as DeletePaymentBankAccountParams} from './DeletePaymentBankAccountParams'; export type {default as DeletePaymentCardParams} from './DeletePaymentCardParams'; +export type {default as TogglePolicyUberAutoInvitePageParams} from './TogglePolicyUberAutoInvitePageParams'; export type {default as DismissReferralBannerParams} from './DismissReferralBannerParams'; export type {default as ExpandURLPreviewParams} from './ExpandURLPreviewParams'; export type {default as GetMissingOnyxMessagesParams} from './GetMissingOnyxMessagesParams'; @@ -122,6 +123,7 @@ export type {default as AddEmojiReactionParams} from './AddEmojiReactionParams'; export type {default as RemoveEmojiReactionParams} from './RemoveEmojiReactionParams'; export type {default as LeaveRoomParams} from './LeaveRoomParams'; export type {default as LeaveGroupChatParams} from './LeaveGroupChatParams'; +export type {default as TogglePolicyUberAutoRemovePageParams} from './TogglePolicyUberAutoRemovePageParams'; export type {default as InviteToRoomParams} from './InviteToRoomParams'; export type {default as InviteToGroupChatParams} from './InviteToGroupChatParams'; export type {default as RemoveFromRoomParams} from './RemoveFromRoomParams'; diff --git a/src/libs/API/types.ts b/src/libs/API/types.ts index 14a0be6c160b..efd3de921bed 100644 --- a/src/libs/API/types.ts +++ b/src/libs/API/types.ts @@ -50,6 +50,8 @@ const WRITE_COMMANDS = { CARD_DEACTIVATE: 'Card_Deactivate', CHRONOS_REMOVE_OOO_EVENT: 'Chronos_RemoveOOOEvent', MAKE_DEFAULT_PAYMENT_METHOD: 'MakeDefaultPaymentMethod', + POLICY_UBER_AUTO_INVITE: 'PolicyUberAutoInvite', + POLICY_UBER_AUTO_REMOVE: 'PolicyUberAutoRemove', ADD_PAYMENT_CARD: 'AddPaymentCard', ADD_PAYMENT_CARD_SCA: 'AddPaymentCardSCA', VERIFY_SETUP_INTENT: 'User_VerifySetupIntent', @@ -523,6 +525,8 @@ type WriteCommandParameters = { [WRITE_COMMANDS.UPDATE_EXPENSIFY_CARD_LIMIT_TYPE]: Parameters.UpdateExpensifyCardLimitTypeParams; [WRITE_COMMANDS.CARD_DEACTIVATE]: Parameters.CardDeactivateParams; [WRITE_COMMANDS.MAKE_DEFAULT_PAYMENT_METHOD]: Parameters.MakeDefaultPaymentMethodParams; + [WRITE_COMMANDS.POLICY_UBER_AUTO_INVITE]: Parameters.TogglePolicyUberAutoInvitePageParams; + [WRITE_COMMANDS.POLICY_UBER_AUTO_REMOVE]: Parameters.TogglePolicyUberAutoRemovePageParams; [WRITE_COMMANDS.ADD_PAYMENT_CARD]: Parameters.AddPaymentCardParams; [WRITE_COMMANDS.ADD_PAYMENT_CARD_SCA]: Parameters.AddPaymentCardParams; [WRITE_COMMANDS.VERIFY_SETUP_INTENT]: Parameters.VerifySetupIntentParams; diff --git a/src/libs/actions/Policy/Policy.ts b/src/libs/actions/Policy/Policy.ts index 96e2e5de7f3b..988c23b7dbf7 100644 --- a/src/libs/actions/Policy/Policy.ts +++ b/src/libs/actions/Policy/Policy.ts @@ -52,6 +52,8 @@ import type { SetWorkspaceAutoReportingMonthlyOffsetParams, SetWorkspacePayerParams, SetWorkspaceReimbursementParams, + TogglePolicyUberAutoInvitePageParams, + TogglePolicyUberAutoRemovePageParams, ToggleReceiptPartnersParams, UpdateInvoiceCompanyNameParams, UpdateInvoiceCompanyWebsiteParams, @@ -2510,6 +2512,79 @@ function openPolicyReceiptPartnersPage(policyID?: string) { API.read(READ_COMMANDS.OPEN_POLICY_RECEIPT_PARTNERS_PAGE, params); } +function togglePolicyUberAutoInvite(policyID?: string, enabled?: boolean) { + if (!policyID) { + Log.warn('togglePolicyUberAutoInvite invalid params', {policyID}); + return; + } + + const optimisticData: OnyxUpdate[] = [ + { + key: `${ONYXKEYS.COLLECTION.POLICY}${policyID}`, + onyxMethod: Onyx.METHOD.MERGE, + value: { + receiptPartners: {uber: {autoInvite: enabled}}, + pendingFields: { + type: CONST.RED_BRICK_ROAD_PENDING_ACTION.UPDATE, + }, + }, + }, + ]; + const successData: OnyxUpdate[] = [ + { + key: `${ONYXKEYS.COLLECTION.POLICY}${policyID}`, + onyxMethod: Onyx.METHOD.MERGE, + value: {receiptPartners: {uber: {autoInvite: enabled}}, pendingFields: null}, + }, + ]; + const failureData: OnyxUpdate[] = [ + { + key: `${ONYXKEYS.COLLECTION.POLICY}${policyID}`, + onyxMethod: Onyx.METHOD.MERGE, + value: {receiptPartners: {uber: {autoInvite: !enabled}}, pendingFields: null}, + }, + ]; + + const params: TogglePolicyUberAutoInvitePageParams = {policyID, enabled}; + + API.write(WRITE_COMMANDS.POLICY_UBER_AUTO_INVITE, params, {optimisticData, successData, failureData}); +} + +function togglePolicyUberAutoRemove(policyID?: string, enabled?: boolean) { + if (!policyID) { + Log.warn('togglePolicyUberAutoRemove invalid params', {policyID}); + return; + } + + const optimisticData: OnyxUpdate[] = [ + { + key: `${ONYXKEYS.COLLECTION.POLICY}${policyID}`, + onyxMethod: Onyx.METHOD.MERGE, + value: { + receiptPartners: {uber: {autoRemove: enabled}}, + }, + }, + ]; + const successData: OnyxUpdate[] = [ + { + key: `${ONYXKEYS.COLLECTION.POLICY}${policyID}`, + onyxMethod: Onyx.METHOD.MERGE, + value: {receiptPartners: {uber: {autoRemove: enabled}}}, + }, + ]; + const failureData: OnyxUpdate[] = [ + { + key: `${ONYXKEYS.COLLECTION.POLICY}${policyID}`, + onyxMethod: Onyx.METHOD.MERGE, + value: {receiptPartners: {uber: {autoRemove: !enabled}}}, + }, + ]; + + const params: TogglePolicyUberAutoRemovePageParams = {policyID, enabled}; + + API.write(WRITE_COMMANDS.POLICY_UBER_AUTO_REMOVE, params, {optimisticData, successData, failureData}); +} + /** * Returns the accountIDs of the members of the policy whose data is passed in the parameters */ @@ -5745,6 +5820,8 @@ export { clearGetAccessiblePoliciesErrors, calculateBillNewDot, payAndDowngrade, + togglePolicyUberAutoInvite, + togglePolicyUberAutoRemove, clearBillingReceiptDetailsErrors, clearQuickbooksOnlineAutoSyncErrorField, setIsForcedToChangeCurrency, diff --git a/src/pages/workspace/receiptPartners/WorkspaceReceiptPartnersPage.tsx b/src/pages/workspace/receiptPartners/WorkspaceReceiptPartnersPage.tsx index aceb5354448f..0e6c1ec637ab 100644 --- a/src/pages/workspace/receiptPartners/WorkspaceReceiptPartnersPage.tsx +++ b/src/pages/workspace/receiptPartners/WorkspaceReceiptPartnersPage.tsx @@ -1,13 +1,18 @@ -import React, {useCallback, useEffect, useMemo} from 'react'; +import React, {useCallback, useEffect, useMemo, useRef, useState} from 'react'; import {ActivityIndicator, View} from 'react-native'; import Button from '@components/Button'; +import ConfirmModal from '@components/ConfirmModal'; import HeaderWithBackButton from '@components/HeaderWithBackButton'; +import * as Expensicons from '@components/Icon/Expensicons'; import * as Illustrations from '@components/Icon/Illustrations'; import MenuItem from '@components/MenuItem'; +import MenuItemWithTopDescription from '@components/MenuItemWithTopDescription'; import OfflineWithFeedback from '@components/OfflineWithFeedback'; import ScreenWrapper from '@components/ScreenWrapper'; import ScrollView from '@components/ScrollView'; import Section from '@components/Section'; +import ThreeDotsMenu from '@components/ThreeDotsMenu'; +import type ThreeDotsMenuProps from '@components/ThreeDotsMenu/types'; import useLocalize from '@hooks/useLocalize'; import useNetwork from '@hooks/useNetwork'; import usePolicy from '@hooks/usePolicy'; @@ -20,10 +25,12 @@ import type {PlatformStackScreenProps} from '@navigation/PlatformStackNavigation import type {WorkspaceSplitNavigatorParamList} from '@navigation/types'; import AccessOrNotFoundWrapper from '@pages/workspace/AccessOrNotFoundWrapper'; import type {MenuItemData} from '@pages/workspace/accounting/types'; +import ToggleSettingOptionRow from '@pages/workspace/workflows/ToggleSettingsOptionRow'; import {openExternalLink} from '@userActions/Link'; -import {openPolicyReceiptPartnersPage} from '@userActions/Policy/Policy'; +import {openPolicyReceiptPartnersPage, togglePolicyUberAutoInvite, togglePolicyUberAutoRemove} from '@userActions/Policy/Policy'; import CONST from '@src/CONST'; import type SCREENS from '@src/SCREENS'; +import type {AnchorPosition} from '@src/styles'; import {getReceiptPartnersIntegrationData} from './utils'; type WorkspaceReceiptPartnersPageProps = PlatformStackScreenProps; @@ -37,13 +44,19 @@ function WorkspaceReceiptPartnersPage({route}: WorkspaceReceiptPartnersPageProps const receiptPartnerNames = CONST.POLICY.RECEIPT_PARTNERS.NAME; const receiptPartnerIntegrations = Object.values(receiptPartnerNames); const {isOffline} = useNetwork(); + const threeDotsMenuContainerRef = useRef(null); const policy = usePolicy(policyID); const theme = useTheme(); const isLoading = policy?.isLoading; + const [isDisconnectModalOpen, setIsDisconnectModalOpen] = useState(false); const integrations = policy?.receiptPartners; + const isAutoRemove = integrations?.uber?.autoRemove; + const isAutoInvite = integrations?.uber?.autoInvite; + const [isConnected, setIsConnected] = useState(false); const startIntegrationFlow = useCallback( ({name}: {name: string}) => { + setIsConnected(true); switch (name) { case CONST.POLICY.RECEIPT_PARTNERS.NAME.UBER: { const {connectFormData} = integrations?.uber ?? {}; @@ -72,6 +85,48 @@ function WorkspaceReceiptPartnersPage({route}: WorkspaceReceiptPartnersPageProps // eslint-disable-next-line react-hooks/exhaustive-deps }, []); + const calculateAndSetThreeDotsMenuPosition = useCallback(() => { + if (shouldUseNarrowLayout) { + return Promise.resolve({horizontal: 0, vertical: 0}); + } + return new Promise((resolve) => { + threeDotsMenuContainerRef.current?.measureInWindow((x, y, width, height) => { + resolve({ + horizontal: x + width, + vertical: y + height, + }); + }); + }); + }, [shouldUseNarrowLayout]); + + const toggleWorkspaceUberAutoInvite = useCallback(() => { + togglePolicyUberAutoInvite(policyID, !isAutoInvite); + }, [isAutoInvite, policyID]); + + const toggleWorkspaceUberAutoRemove = useCallback(() => { + togglePolicyUberAutoRemove(policyID, !isAutoRemove); + }, [isAutoRemove, policyID]); + + const overflowMenu: ThreeDotsMenuProps['menuItems'] = useMemo( + () => [ + { + icon: Expensicons.Key, + text: translate('workspace.accounting.enterCredentials'), + onSelected: () => startIntegrationFlow({name: CONST.POLICY.RECEIPT_PARTNERS.NAME.UBER}), + shouldCallAfterModalHide: true, + disabled: isOffline, + iconRight: Expensicons.NewWindow, + }, + { + icon: Expensicons.Trashcan, + text: translate('workspace.accounting.disconnect'), + onSelected: () => setIsDisconnectModalOpen(true), + shouldCallAfterModalHide: true, + }, + ], + [translate, isOffline, startIntegrationFlow], + ); + const connectionsMenuItems: MenuItemData[] = useMemo(() => { if (policyID) { return receiptPartnerIntegrations @@ -97,7 +152,18 @@ function WorkspaceReceiptPartnersPage({route}: WorkspaceReceiptPartnersPageProps numberOfLinesDescription: 5, titleContainerStyle: [styles.pr2], description: integrationData?.description, - rightComponent: ( + rightComponent: isConnected ? ( + + + + ) : (