From 3130ad1b6d9473118e851c7e378e146827d569ba Mon Sep 17 00:00:00 2001 From: Nicolay Arefyeu Date: Mon, 1 Sep 2025 15:34:40 +0300 Subject: [PATCH 1/5] Uber disconnect follow up --- src/pages/workspace/WorkspaceMoreFeaturesPage.tsx | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/src/pages/workspace/WorkspaceMoreFeaturesPage.tsx b/src/pages/workspace/WorkspaceMoreFeaturesPage.tsx index a578f306e1e7..5c42e9365259 100644 --- a/src/pages/workspace/WorkspaceMoreFeaturesPage.tsx +++ b/src/pages/workspace/WorkspaceMoreFeaturesPage.tsx @@ -91,6 +91,8 @@ function WorkspaceMoreFeaturesPage({policy, route}: WorkspaceMoreFeaturesPagePro selector: filterInactiveCards, canBeMissing: true, }); + const integrations = policy?.receiptPartners; + const isUberConnected = !!integrations?.uber?.organizationID; const [cardFeeds] = useCardFeeds(policyID); const [isOrganizeWarningModalOpen, setIsOrganizeWarningModalOpen] = useState(false); const [isIntegrateWarningModalOpen, setIsIntegrateWarningModalOpen] = useState(false); @@ -333,7 +335,9 @@ function WorkspaceMoreFeaturesPage({policy, route}: WorkspaceMoreFeaturesPagePro isActive: policy?.areReceiptPartnersEnabled ?? false, pendingAction: policy?.pendingFields?.areReceiptPartnersEnabled, disabledAction: () => { - // TODO: When Uber integration is added, check if any integration exists if(!hasReceiptPartnersIntegration) return; + if (!isUberConnected) { + return; + } setIsReceiptPartnersWarningModalOpen(true); }, action: (isEnabled: boolean) => { @@ -342,7 +346,7 @@ function WorkspaceMoreFeaturesPage({policy, route}: WorkspaceMoreFeaturesPagePro } enablePolicyReceiptPartners(policyID, isEnabled); }, - disabled: false, // TODO: When Uber integration is added, set to hasReceiptPartnersIntegration + disabled: isUberConnected, errors: getLatestErrorField(policy ?? {}, CONST.POLICY.MORE_FEATURES.ARE_RECEIPT_PARTNERS_ENABLED), onCloseError: () => { if (!policyID) { From 64dffffde95074eb7ffb652f82def27cab544003 Mon Sep 17 00:00:00 2001 From: Nicolay Arefyeu Date: Mon, 1 Sep 2025 19:06:39 +0300 Subject: [PATCH 2/5] clean up --- src/hooks/useIsUberConnected.ts | 8 ++++++++ src/pages/workspace/WorkspaceMoreFeaturesPage.tsx | 4 ++-- .../receiptPartners/WorkspaceReceiptPartnersPage.tsx | 7 ++----- 3 files changed, 12 insertions(+), 7 deletions(-) create mode 100644 src/hooks/useIsUberConnected.ts diff --git a/src/hooks/useIsUberConnected.ts b/src/hooks/useIsUberConnected.ts new file mode 100644 index 000000000000..0d1a4c00ca31 --- /dev/null +++ b/src/hooks/useIsUberConnected.ts @@ -0,0 +1,8 @@ +import usePolicy from './usePolicy'; + +export default function useIsUberConnected({policyID}: {policyID?: string}) { + const policy = usePolicy(policyID); + + const integrations = policy?.receiptPartners; + return !!integrations?.uber?.organizationID; +} diff --git a/src/pages/workspace/WorkspaceMoreFeaturesPage.tsx b/src/pages/workspace/WorkspaceMoreFeaturesPage.tsx index 5c42e9365259..099d7bd6ebfd 100644 --- a/src/pages/workspace/WorkspaceMoreFeaturesPage.tsx +++ b/src/pages/workspace/WorkspaceMoreFeaturesPage.tsx @@ -9,6 +9,7 @@ import Section from '@components/Section'; import Text from '@components/Text'; import useCardFeeds from '@hooks/useCardFeeds'; import useDefaultFundID from '@hooks/useDefaultFundID'; +import useIsUberConnected from '@hooks/useIsUberConnected'; import useLocalize from '@hooks/useLocalize'; import useNetwork from '@hooks/useNetwork'; import useOnyx from '@hooks/useOnyx'; @@ -91,8 +92,7 @@ function WorkspaceMoreFeaturesPage({policy, route}: WorkspaceMoreFeaturesPagePro selector: filterInactiveCards, canBeMissing: true, }); - const integrations = policy?.receiptPartners; - const isUberConnected = !!integrations?.uber?.organizationID; + const isUberConnected = useIsUberConnected({policyID}); const [cardFeeds] = useCardFeeds(policyID); const [isOrganizeWarningModalOpen, setIsOrganizeWarningModalOpen] = useState(false); const [isIntegrateWarningModalOpen, setIsIntegrateWarningModalOpen] = useState(false); diff --git a/src/pages/workspace/receiptPartners/WorkspaceReceiptPartnersPage.tsx b/src/pages/workspace/receiptPartners/WorkspaceReceiptPartnersPage.tsx index 8f51176c8f5d..899fbd515553 100644 --- a/src/pages/workspace/receiptPartners/WorkspaceReceiptPartnersPage.tsx +++ b/src/pages/workspace/receiptPartners/WorkspaceReceiptPartnersPage.tsx @@ -11,6 +11,7 @@ import ScreenWrapper from '@components/ScreenWrapper'; import ScrollView from '@components/ScrollView'; import Section from '@components/Section'; import ThreeDotsMenu from '@components/ThreeDotsMenu'; +import useIsUberConnected from '@hooks/useIsUberConnected'; import useLocalize from '@hooks/useLocalize'; import useNetwork from '@hooks/useNetwork'; import usePolicy from '@hooks/usePolicy'; @@ -52,13 +53,10 @@ function WorkspaceReceiptPartnersPage({route}: WorkspaceReceiptPartnersPageProps const integrations = policy?.receiptPartners; const isAutoRemove = !!integrations?.uber?.autoRemove; const isAutoInvite = !!integrations?.uber?.autoInvite; - const [isConnected, setIsConnected] = useState(false); - const isUberConnected = !!integrations?.uber?.organizationID || isConnected; + const isUberConnected = useIsUberConnected({policyID}); const startIntegrationFlow = useCallback( ({name}: {name: string}) => { - // TODO remove this when integration flow will be ready - setIsConnected(true); switch (name) { case CONST.POLICY.RECEIPT_PARTNERS.NAME.UBER: { const {connectFormData} = integrations?.uber ?? {}; @@ -149,7 +147,6 @@ function WorkspaceReceiptPartnersPage({route}: WorkspaceReceiptPartnersPageProps return; } removePolicyReceiptPartnersConnection(policyID, selectedPartner, integrations?.[selectedPartner]); - setIsConnected(false); onCloseModal(); }, [policyID, selectedPartner, integrations, onCloseModal]); From f9e0806cb7fb76cc0dde66dc98384bb58a14c5a4 Mon Sep 17 00:00:00 2001 From: Nicolay Arefyeu Date: Mon, 1 Sep 2025 19:26:46 +0300 Subject: [PATCH 3/5] comments --- src/hooks/useIsUberConnected.ts | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/src/hooks/useIsUberConnected.ts b/src/hooks/useIsUberConnected.ts index 0d1a4c00ca31..900d6a3da7f4 100644 --- a/src/hooks/useIsUberConnected.ts +++ b/src/hooks/useIsUberConnected.ts @@ -3,6 +3,5 @@ import usePolicy from './usePolicy'; export default function useIsUberConnected({policyID}: {policyID?: string}) { const policy = usePolicy(policyID); - const integrations = policy?.receiptPartners; - return !!integrations?.uber?.organizationID; + return !!policy?.receiptPartners?.uber?.organizationID; } From 46c8b785a85dbcf28f76411bb442b96d6f61d48e Mon Sep 17 00:00:00 2001 From: Nicolay Arefyeu Date: Tue, 2 Sep 2025 08:37:57 +0300 Subject: [PATCH 4/5] fix offline mode --- src/hooks/useIsUberConnected.ts | 7 ------- src/libs/actions/Policy/Policy.ts | 5 +++-- src/pages/workspace/WorkspaceMoreFeaturesPage.tsx | 3 +-- .../receiptPartners/WorkspaceReceiptPartnersPage.tsx | 3 +-- 4 files changed, 5 insertions(+), 13 deletions(-) delete mode 100644 src/hooks/useIsUberConnected.ts diff --git a/src/hooks/useIsUberConnected.ts b/src/hooks/useIsUberConnected.ts deleted file mode 100644 index 900d6a3da7f4..000000000000 --- a/src/hooks/useIsUberConnected.ts +++ /dev/null @@ -1,7 +0,0 @@ -import usePolicy from './usePolicy'; - -export default function useIsUberConnected({policyID}: {policyID?: string}) { - const policy = usePolicy(policyID); - - return !!policy?.receiptPartners?.uber?.organizationID; -} diff --git a/src/libs/actions/Policy/Policy.ts b/src/libs/actions/Policy/Policy.ts index b76297676dc5..39f5a5768027 100644 --- a/src/libs/actions/Policy/Policy.ts +++ b/src/libs/actions/Policy/Policy.ts @@ -2801,7 +2801,7 @@ function removePolicyReceiptPartnersConnection(policyID: string, partnerName: st key: `${ONYXKEYS.COLLECTION.POLICY}${policyID}`, value: { receiptPartners: { - [partnerName]: {pendingAction: CONST.RED_BRICK_ROAD_PENDING_ACTION.DELETE}, + [partnerName]: {pendingAction: CONST.RED_BRICK_ROAD_PENDING_ACTION.DELETE, organizationID: null}, }, }, }, @@ -2813,7 +2813,8 @@ function removePolicyReceiptPartnersConnection(policyID: string, partnerName: st key: `${ONYXKEYS.COLLECTION.POLICY}${policyID}`, value: { receiptPartners: { - [partnerName]: {pendingAction: null}, + organizationID: null, + [partnerName]: {pendingAction: null, organizationID: null}, }, }, }, diff --git a/src/pages/workspace/WorkspaceMoreFeaturesPage.tsx b/src/pages/workspace/WorkspaceMoreFeaturesPage.tsx index 099d7bd6ebfd..9b2f1c342649 100644 --- a/src/pages/workspace/WorkspaceMoreFeaturesPage.tsx +++ b/src/pages/workspace/WorkspaceMoreFeaturesPage.tsx @@ -9,7 +9,6 @@ import Section from '@components/Section'; import Text from '@components/Text'; import useCardFeeds from '@hooks/useCardFeeds'; import useDefaultFundID from '@hooks/useDefaultFundID'; -import useIsUberConnected from '@hooks/useIsUberConnected'; import useLocalize from '@hooks/useLocalize'; import useNetwork from '@hooks/useNetwork'; import useOnyx from '@hooks/useOnyx'; @@ -92,7 +91,7 @@ function WorkspaceMoreFeaturesPage({policy, route}: WorkspaceMoreFeaturesPagePro selector: filterInactiveCards, canBeMissing: true, }); - const isUberConnected = useIsUberConnected({policyID}); + const isUberConnected = !!policy?.receiptPartners?.uber?.organizationID; const [cardFeeds] = useCardFeeds(policyID); const [isOrganizeWarningModalOpen, setIsOrganizeWarningModalOpen] = useState(false); const [isIntegrateWarningModalOpen, setIsIntegrateWarningModalOpen] = useState(false); diff --git a/src/pages/workspace/receiptPartners/WorkspaceReceiptPartnersPage.tsx b/src/pages/workspace/receiptPartners/WorkspaceReceiptPartnersPage.tsx index 899fbd515553..4721c7610a6c 100644 --- a/src/pages/workspace/receiptPartners/WorkspaceReceiptPartnersPage.tsx +++ b/src/pages/workspace/receiptPartners/WorkspaceReceiptPartnersPage.tsx @@ -11,7 +11,6 @@ import ScreenWrapper from '@components/ScreenWrapper'; import ScrollView from '@components/ScrollView'; import Section from '@components/Section'; import ThreeDotsMenu from '@components/ThreeDotsMenu'; -import useIsUberConnected from '@hooks/useIsUberConnected'; import useLocalize from '@hooks/useLocalize'; import useNetwork from '@hooks/useNetwork'; import usePolicy from '@hooks/usePolicy'; @@ -53,7 +52,7 @@ function WorkspaceReceiptPartnersPage({route}: WorkspaceReceiptPartnersPageProps const integrations = policy?.receiptPartners; const isAutoRemove = !!integrations?.uber?.autoRemove; const isAutoInvite = !!integrations?.uber?.autoInvite; - const isUberConnected = useIsUberConnected({policyID}); + const isUberConnected = !!policy?.receiptPartners?.uber?.organizationID; const startIntegrationFlow = useCallback( ({name}: {name: string}) => { From 2e316f3c25117fd0cd504d9d68e49615fe75db36 Mon Sep 17 00:00:00 2001 From: Nicolay Arefyeu Date: Thu, 4 Sep 2025 15:52:41 +0300 Subject: [PATCH 5/5] comments --- src/hooks/useIsPolicyConnectedToUberReceiptPartner.ts | 7 +++++++ src/libs/actions/Policy/Policy.ts | 5 ++--- src/pages/workspace/WorkspaceMoreFeaturesPage.tsx | 3 ++- .../receiptPartners/WorkspaceReceiptPartnersPage.tsx | 3 ++- src/types/onyx/Policy.ts | 4 ++++ 5 files changed, 17 insertions(+), 5 deletions(-) create mode 100644 src/hooks/useIsPolicyConnectedToUberReceiptPartner.ts diff --git a/src/hooks/useIsPolicyConnectedToUberReceiptPartner.ts b/src/hooks/useIsPolicyConnectedToUberReceiptPartner.ts new file mode 100644 index 000000000000..7721ed263dc7 --- /dev/null +++ b/src/hooks/useIsPolicyConnectedToUberReceiptPartner.ts @@ -0,0 +1,7 @@ +import usePolicy from './usePolicy'; + +export default function useIsPolicyConnectedToUberReceiptPartner({policyID}: {policyID?: string}) { + const policy = usePolicy(policyID); + + return !!policy?.receiptPartners?.uber?.enabled; +} diff --git a/src/libs/actions/Policy/Policy.ts b/src/libs/actions/Policy/Policy.ts index fafb2ab5f281..bf810eb1d23c 100644 --- a/src/libs/actions/Policy/Policy.ts +++ b/src/libs/actions/Policy/Policy.ts @@ -2804,7 +2804,7 @@ function removePolicyReceiptPartnersConnection(policyID: string, partnerName: st key: `${ONYXKEYS.COLLECTION.POLICY}${policyID}`, value: { receiptPartners: { - [partnerName]: {pendingAction: CONST.RED_BRICK_ROAD_PENDING_ACTION.DELETE, organizationID: null}, + [partnerName]: {pendingAction: CONST.RED_BRICK_ROAD_PENDING_ACTION.DELETE, enabled: false}, }, }, }, @@ -2816,8 +2816,7 @@ function removePolicyReceiptPartnersConnection(policyID: string, partnerName: st key: `${ONYXKEYS.COLLECTION.POLICY}${policyID}`, value: { receiptPartners: { - organizationID: null, - [partnerName]: {pendingAction: null, organizationID: null}, + [partnerName]: null, }, }, }, diff --git a/src/pages/workspace/WorkspaceMoreFeaturesPage.tsx b/src/pages/workspace/WorkspaceMoreFeaturesPage.tsx index 9b2f1c342649..835e3727aab8 100644 --- a/src/pages/workspace/WorkspaceMoreFeaturesPage.tsx +++ b/src/pages/workspace/WorkspaceMoreFeaturesPage.tsx @@ -9,6 +9,7 @@ import Section from '@components/Section'; import Text from '@components/Text'; import useCardFeeds from '@hooks/useCardFeeds'; import useDefaultFundID from '@hooks/useDefaultFundID'; +import useIsPolicyConnectedToUberReceiptPartner from '@hooks/useIsPolicyConnectedToUberReceiptPartner'; import useLocalize from '@hooks/useLocalize'; import useNetwork from '@hooks/useNetwork'; import useOnyx from '@hooks/useOnyx'; @@ -91,7 +92,7 @@ function WorkspaceMoreFeaturesPage({policy, route}: WorkspaceMoreFeaturesPagePro selector: filterInactiveCards, canBeMissing: true, }); - const isUberConnected = !!policy?.receiptPartners?.uber?.organizationID; + const isUberConnected = useIsPolicyConnectedToUberReceiptPartner({policyID}); const [cardFeeds] = useCardFeeds(policyID); const [isOrganizeWarningModalOpen, setIsOrganizeWarningModalOpen] = useState(false); const [isIntegrateWarningModalOpen, setIsIntegrateWarningModalOpen] = useState(false); diff --git a/src/pages/workspace/receiptPartners/WorkspaceReceiptPartnersPage.tsx b/src/pages/workspace/receiptPartners/WorkspaceReceiptPartnersPage.tsx index cd88187d70fe..3eaa9e5387ab 100644 --- a/src/pages/workspace/receiptPartners/WorkspaceReceiptPartnersPage.tsx +++ b/src/pages/workspace/receiptPartners/WorkspaceReceiptPartnersPage.tsx @@ -11,6 +11,7 @@ import ScreenWrapper from '@components/ScreenWrapper'; import ScrollView from '@components/ScrollView'; import Section from '@components/Section'; import ThreeDotsMenu from '@components/ThreeDotsMenu'; +import useIsPolicyConnectedToUberReceiptPartner from '@hooks/useIsPolicyConnectedToUberReceiptPartner'; import useLocalize from '@hooks/useLocalize'; import useNetwork from '@hooks/useNetwork'; import usePolicy from '@hooks/usePolicy'; @@ -50,7 +51,7 @@ function WorkspaceReceiptPartnersPage({route}: WorkspaceReceiptPartnersPageProps const integrations = policy?.receiptPartners; const isAutoRemove = !!integrations?.uber?.autoRemove; const isAutoInvite = !!integrations?.uber?.autoInvite; - const isUberConnected = !!policy?.receiptPartners?.uber?.organizationID; + const isUberConnected = useIsPolicyConnectedToUberReceiptPartner({policyID}); const startIntegrationFlow = useCallback( ({name}: {name: string}) => { diff --git a/src/types/onyx/Policy.ts b/src/types/onyx/Policy.ts index d820d1c17fc6..17b6528e73a4 100644 --- a/src/types/onyx/Policy.ts +++ b/src/types/onyx/Policy.ts @@ -165,6 +165,10 @@ type UberReceiptPartner = { * auto remove for uber connection */ autoRemove?: boolean; + /** + * Whether uber is enabled for user + */ + enabled?: boolean; /** * organization id for connected uber */