From 814012d7fb55cd3abfd71c8db16cb6d7f8d667e4 Mon Sep 17 00:00:00 2001
From: Rutika Pawar <183392827+twilight2294@users.noreply.github.com>
Date: Thu, 27 Feb 2025 16:05:35 +0530
Subject: [PATCH 01/15] Fix error message when accepting Travel terms
---
src/pages/Travel/TravelTerms.tsx | 22 ++++++++++++++++++++++
1 file changed, 22 insertions(+)
diff --git a/src/pages/Travel/TravelTerms.tsx b/src/pages/Travel/TravelTerms.tsx
index be25e2316491..0c023957a911 100644
--- a/src/pages/Travel/TravelTerms.tsx
+++ b/src/pages/Travel/TravelTerms.tsx
@@ -10,6 +10,7 @@ import HeaderWithBackButton from '@components/HeaderWithBackButton';
import ScreenWrapper from '@components/ScreenWrapper';
import Text from '@components/Text';
import TextLink from '@components/TextLink';
+import useCurrentUserPersonalDetails from '@hooks/useCurrentUserPersonalDetails';
import useLocalize from '@hooks/useLocalize';
import usePermissions from '@hooks/usePermissions';
import useThemeStyles from '@hooks/useThemeStyles';
@@ -18,6 +19,7 @@ import {acceptSpotnanaTerms, cleanupTravelProvisioningSession} from '@libs/actio
import {getLatestErrorMessage} from '@libs/ErrorUtils';
import Navigation from '@libs/Navigation/Navigation';
import type {TravelNavigatorParamList} from '@libs/Navigation/types';
+import {getActivePolicies, getActivePolicy} from '@libs/PolicyUtils';
import CONST from '@src/CONST';
import ONYXKEYS from '@src/ONYXKEYS';
import ROUTES from '@src/ROUTES';
@@ -34,6 +36,13 @@ function TravelTerms({route}: TravelTermsPageProps) {
const [travelProvisioning] = useOnyx(ONYXKEYS.TRAVEL_PROVISIONING);
const isLoading = travelProvisioning?.isLoading;
const domain = route.params.domain === CONST.TRAVEL.DEFAULT_DOMAIN ? undefined : route.params.domain;
+ const [policies] = useOnyx(ONYXKEYS.COLLECTION.POLICY);
+ const {login: currentUserLogin} = useCurrentUserPersonalDetails();
+ const activePolicies = getActivePolicies(policies, currentUserLogin);
+ const groupPolicies = activePolicies.filter((policy) => policy.type !== CONST.POLICY.TYPE.PERSONAL);
+ const isUserMemberOfSingleGroupPolicy = groupPolicies.length === 1;
+ const activePolicy = getActivePolicy();
+ const isActivePolicyGroup = activePolicy?.type;
useEffect(() => {
if (travelProvisioning?.error === CONST.TRAVEL.PROVISIONING.ERROR_PERMISSION_DENIED && domain) {
@@ -112,6 +121,19 @@ function TravelTerms({route}: TravelTermsPageProps) {
setErrorMessage('');
}
+ if (!isActivePolicyGroup && !isUserMemberOfSingleGroupPolicy) {
+ // This will be kept in en.ts and es.ts file seperately
+ setErrorMessage(
+ 'You need to set a default workspace to enable Expensify Travel. Go to Settings > Workspaces > click the three vertical dots next to a workspace > Set as default workspace, then try again!',
+ );
+ return;
+ }
+
+ if (isUserMemberOfSingleGroupPolicy) {
+ acceptSpotnanaTerms(domain, groupPolicies[0].id);
+ return;
+ }
+
acceptSpotnanaTerms(domain);
}}
message={errorMessage}
From c10340638f851643ea93f7b3f63397e1e02c9991 Mon Sep 17 00:00:00 2001
From: Rutika Pawar <183392827+twilight2294@users.noreply.github.com>
Date: Thu, 27 Feb 2025 16:07:02 +0530
Subject: [PATCH 02/15] accept policyID
---
src/libs/actions/Travel.ts | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
diff --git a/src/libs/actions/Travel.ts b/src/libs/actions/Travel.ts
index b3a892c99ab6..c81fea019e00 100644
--- a/src/libs/actions/Travel.ts
+++ b/src/libs/actions/Travel.ts
@@ -9,7 +9,7 @@ import ONYXKEYS from '@src/ONYXKEYS';
/**
* Accept Spotnana terms and conditions to receive a proper token used for authenticating further actions
*/
-function acceptSpotnanaTerms(domain?: string) {
+function acceptSpotnanaTerms(domain?: string, policyID?: string) {
const optimisticData: OnyxUpdate[] = [
{
onyxMethod: 'merge',
@@ -49,7 +49,7 @@ function acceptSpotnanaTerms(domain?: string) {
},
];
- const params: AcceptSpotnanaTermsParams = {domain};
+ const params: AcceptSpotnanaTermsParams = {domain, policyID};
API.write(WRITE_COMMANDS.ACCEPT_SPOTNANA_TERMS, params, {optimisticData, successData, failureData});
}
From 2c394d975becf81c8b94ee945195685e566c5e09 Mon Sep 17 00:00:00 2001
From: Rutika Pawar <183392827+twilight2294@users.noreply.github.com>
Date: Thu, 27 Feb 2025 16:07:26 +0530
Subject: [PATCH 03/15] update param
---
src/libs/API/parameters/AcceptSpotnanaTermsParams.ts | 1 +
1 file changed, 1 insertion(+)
diff --git a/src/libs/API/parameters/AcceptSpotnanaTermsParams.ts b/src/libs/API/parameters/AcceptSpotnanaTermsParams.ts
index a5a67e76eac3..f854601beffb 100644
--- a/src/libs/API/parameters/AcceptSpotnanaTermsParams.ts
+++ b/src/libs/API/parameters/AcceptSpotnanaTermsParams.ts
@@ -1,5 +1,6 @@
type AcceptSpotnanaTermsParams = {
domain?: string;
+ policyID?: string;
};
export default AcceptSpotnanaTermsParams;
From 5cfcc4d57f47b5196ee75172621dd882a4d280df Mon Sep 17 00:00:00 2001
From: Rutika Pawar <183392827+twilight2294@users.noreply.github.com>
Date: Thu, 6 Mar 2025 13:43:03 +0000
Subject: [PATCH 04/15] translate to spanish
---
src/languages/en.ts | 1 +
src/languages/es.ts | 1 +
src/pages/Travel/TravelTerms.tsx | 7 ++-----
3 files changed, 4 insertions(+), 5 deletions(-)
diff --git a/src/languages/en.ts b/src/languages/en.ts
index 127de853ce29..51abd11e5b1d 100755
--- a/src/languages/en.ts
+++ b/src/languages/en.ts
@@ -2564,6 +2564,7 @@ const translations = {
travelTermsAndConditions: 'terms & conditions',
agree: 'I agree to the ',
error: 'You must agree to the Expensify Travel terms & conditions to continue',
+ defaultWorkspaceError: 'You need to set a default workspace to enable Expensify Travel. Go to Settings > Workspaces > click the three vertical dots next to a workspace > Set as default workspace, then try again!',
},
flight: 'Flight',
flightDetails: {
diff --git a/src/languages/es.ts b/src/languages/es.ts
index ba838537a2a7..d9d4217d27af 100644
--- a/src/languages/es.ts
+++ b/src/languages/es.ts
@@ -2588,6 +2588,7 @@ const translations = {
travelTermsAndConditions: 'términos y condiciones',
agree: 'Acepto los ',
error: 'Debes aceptar los términos y condiciones de Expensify Travel para continuar',
+ defaultWorkspaceError: 'Debes establecer un espacio de trabajo predeterminado para habilitar Expensify Travel. Ve a Configuración > Espacios de trabajo > haz clic en los tres puntos verticales junto a un espacio de trabajo > Establecer como espacio de trabajo predeterminado y luego inténtalo de nuevo.',
},
flight: 'Vuelo',
flightDetails: {
diff --git a/src/pages/Travel/TravelTerms.tsx b/src/pages/Travel/TravelTerms.tsx
index 0c023957a911..a852e8d9dbee 100644
--- a/src/pages/Travel/TravelTerms.tsx
+++ b/src/pages/Travel/TravelTerms.tsx
@@ -122,15 +122,12 @@ function TravelTerms({route}: TravelTermsPageProps) {
}
if (!isActivePolicyGroup && !isUserMemberOfSingleGroupPolicy) {
- // This will be kept in en.ts and es.ts file seperately
- setErrorMessage(
- 'You need to set a default workspace to enable Expensify Travel. Go to Settings > Workspaces > click the three vertical dots next to a workspace > Set as default workspace, then try again!',
- );
+ setErrorMessage(translate('travel.termsAndConditions.defaultWorkspaceError'));
return;
}
if (isUserMemberOfSingleGroupPolicy) {
- acceptSpotnanaTerms(domain, groupPolicies[0].id);
+ acceptSpotnanaTerms(domain, groupPolicies.at(0)?.id);
return;
}
From 34deec3c8f98449f521188c9fe991d78b089d28a Mon Sep 17 00:00:00 2001
From: Rutika Pawar <183392827+twilight2294@users.noreply.github.com>
Date: Thu, 6 Mar 2025 14:20:59 +0000
Subject: [PATCH 05/15] fix conditions
---
src/languages/en.ts | 3 ++-
src/languages/es.ts | 3 ++-
src/pages/Travel/TravelTerms.tsx | 13 ++++++++-----
3 files changed, 12 insertions(+), 7 deletions(-)
diff --git a/src/languages/en.ts b/src/languages/en.ts
index 51abd11e5b1d..5b014ca2d492 100755
--- a/src/languages/en.ts
+++ b/src/languages/en.ts
@@ -2564,7 +2564,8 @@ const translations = {
travelTermsAndConditions: 'terms & conditions',
agree: 'I agree to the ',
error: 'You must agree to the Expensify Travel terms & conditions to continue',
- defaultWorkspaceError: 'You need to set a default workspace to enable Expensify Travel. Go to Settings > Workspaces > click the three vertical dots next to a workspace > Set as default workspace, then try again!',
+ defaultWorkspaceError:
+ 'You need to set a default workspace to enable Expensify Travel. Go to Settings > Workspaces > click the three vertical dots next to a workspace > Set as default workspace, then try again!',
},
flight: 'Flight',
flightDetails: {
diff --git a/src/languages/es.ts b/src/languages/es.ts
index d9d4217d27af..8457f27df5dd 100644
--- a/src/languages/es.ts
+++ b/src/languages/es.ts
@@ -2588,7 +2588,8 @@ const translations = {
travelTermsAndConditions: 'términos y condiciones',
agree: 'Acepto los ',
error: 'Debes aceptar los términos y condiciones de Expensify Travel para continuar',
- defaultWorkspaceError: 'Debes establecer un espacio de trabajo predeterminado para habilitar Expensify Travel. Ve a Configuración > Espacios de trabajo > haz clic en los tres puntos verticales junto a un espacio de trabajo > Establecer como espacio de trabajo predeterminado y luego inténtalo de nuevo.',
+ defaultWorkspaceError:
+ 'Debes establecer un espacio de trabajo predeterminado para habilitar Expensify Travel. Ve a Configuración > Espacios de trabajo > haz clic en los tres puntos verticales junto a un espacio de trabajo > Establecer como espacio de trabajo predeterminado y luego inténtalo de nuevo.',
},
flight: 'Vuelo',
flightDetails: {
diff --git a/src/pages/Travel/TravelTerms.tsx b/src/pages/Travel/TravelTerms.tsx
index a852e8d9dbee..5e86544c6ebe 100644
--- a/src/pages/Travel/TravelTerms.tsx
+++ b/src/pages/Travel/TravelTerms.tsx
@@ -42,7 +42,7 @@ function TravelTerms({route}: TravelTermsPageProps) {
const groupPolicies = activePolicies.filter((policy) => policy.type !== CONST.POLICY.TYPE.PERSONAL);
const isUserMemberOfSingleGroupPolicy = groupPolicies.length === 1;
const activePolicy = getActivePolicy();
- const isActivePolicyGroup = activePolicy?.type;
+ const isActivePolicyGroup = activePolicy?.type !== CONST.POLICY.TYPE.PERSONAL;
useEffect(() => {
if (travelProvisioning?.error === CONST.TRAVEL.PROVISIONING.ERROR_PERMISSION_DENIED && domain) {
@@ -121,17 +121,20 @@ function TravelTerms({route}: TravelTermsPageProps) {
setErrorMessage('');
}
- if (!isActivePolicyGroup && !isUserMemberOfSingleGroupPolicy) {
- setErrorMessage(translate('travel.termsAndConditions.defaultWorkspaceError'));
+ if (isActivePolicyGroup) {
+ acceptSpotnanaTerms(domain);
return;
}
- if (isUserMemberOfSingleGroupPolicy) {
+ if (!isActivePolicyGroup && isUserMemberOfSingleGroupPolicy) {
acceptSpotnanaTerms(domain, groupPolicies.at(0)?.id);
return;
}
- acceptSpotnanaTerms(domain);
+ if (!isActivePolicyGroup && !isUserMemberOfSingleGroupPolicy) {
+ setErrorMessage(translate('travel.termsAndConditions.defaultWorkspaceError'));
+ return;
+ }
}}
message={errorMessage}
isAlertVisible={!!errorMessage}
From 38f56d1d74a2442aee313d220e5ce49b1e423472 Mon Sep 17 00:00:00 2001
From: Rutika Pawar <183392827+twilight2294@users.noreply.github.com>
Date: Thu, 6 Mar 2025 19:56:58 +0530
Subject: [PATCH 06/15] Update src/pages/Travel/TravelTerms.tsx
---
src/pages/Travel/TravelTerms.tsx | 1 -
1 file changed, 1 deletion(-)
diff --git a/src/pages/Travel/TravelTerms.tsx b/src/pages/Travel/TravelTerms.tsx
index 5e86544c6ebe..2f19253a5699 100644
--- a/src/pages/Travel/TravelTerms.tsx
+++ b/src/pages/Travel/TravelTerms.tsx
@@ -133,7 +133,6 @@ function TravelTerms({route}: TravelTermsPageProps) {
if (!isActivePolicyGroup && !isUserMemberOfSingleGroupPolicy) {
setErrorMessage(translate('travel.termsAndConditions.defaultWorkspaceError'));
- return;
}
}}
message={errorMessage}
From 5137cb1a7159b33ae5668c24f17f25c935703719 Mon Sep 17 00:00:00 2001
From: Rutika Pawar <183392827+twilight2294@users.noreply.github.com>
Date: Wed, 12 Mar 2025 23:15:49 +0530
Subject: [PATCH 07/15] update condition to show upgrade workspace page
---
src/components/BookTravelButton.tsx | 11 ++++++++---
1 file changed, 8 insertions(+), 3 deletions(-)
diff --git a/src/components/BookTravelButton.tsx b/src/components/BookTravelButton.tsx
index 01d512e9b2be..561f9b672e7c 100644
--- a/src/components/BookTravelButton.tsx
+++ b/src/components/BookTravelButton.tsx
@@ -2,6 +2,7 @@ import {Str} from 'expensify-common';
import React, {useCallback, useContext, useState} from 'react';
import {NativeModules} from 'react-native';
import {useOnyx} from 'react-native-onyx';
+import useCurrentUserPersonalDetails from '@hooks/useCurrentUserPersonalDetails';
import useLocalize from '@hooks/useLocalize';
import usePermissions from '@hooks/usePermissions';
import usePolicy from '@hooks/usePolicy';
@@ -11,7 +12,7 @@ import {openTravelDotLink} from '@libs/actions/Link';
import {cleanupTravelProvisioningSession} from '@libs/actions/Travel';
import Log from '@libs/Log';
import Navigation from '@libs/Navigation/Navigation';
-import {getAdminsPrivateEmailDomains, isPaidGroupPolicy} from '@libs/PolicyUtils';
+import {getActivePolicies, getAdminsPrivateEmailDomains} from '@libs/PolicyUtils';
import colors from '@styles/theme/colors';
import CONST from '@src/CONST';
import ONYXKEYS from '@src/ONYXKEYS';
@@ -47,7 +48,11 @@ function BookTravelButton({text}: BookTravelButtonProps) {
const {setRootStatusBarEnabled} = useContext(CustomStatusBarAndBackgroundContext);
const {isBlockedFromSpotnanaTravel} = usePermissions();
const [isPreventionModalVisible, setPreventionModalVisibility] = useState(false);
-
+ const [policies] = useOnyx(ONYXKEYS.COLLECTION.POLICY);
+ const {login: currentUserLogin} = useCurrentUserPersonalDetails();
+ const activePolicies = getActivePolicies(policies, currentUserLogin);
+ const groupPolicies = activePolicies.filter((policy) => policy.type !== CONST.POLICY.TYPE.PERSONAL);
+ const isUserMemberOfSingleGroupPolicy = groupPolicies.length === 1;
// Flag indicating whether NewDot was launched exclusively for Travel,
// e.g., when the user selects "Trips" from the Expensify Classic menu in HybridApp.
const [wasNewDotLaunchedJustForTravel] = useOnyx(ONYXKEYS.IS_SINGLE_NEW_DOT_ENTRY);
@@ -68,7 +73,7 @@ function BookTravelButton({text}: BookTravelButtonProps) {
return;
}
- if (!isPaidGroupPolicy(policy)) {
+ if (isUserMemberOfSingleGroupPolicy) {
Navigation.navigate(ROUTES.TRAVEL_UPGRADE);
return;
}
From fd161311bf736bf9d8c21ab1337f5b551d94be98 Mon Sep 17 00:00:00 2001
From: Rutika Pawar <183392827+twilight2294@users.noreply.github.com>
Date: Sun, 23 Mar 2025 12:09:44 +0000
Subject: [PATCH 08/15] push new updates according to requirement
https://github.com/Expensify/App/pull/57537#issuecomment-2719015231
---
src/components/BookTravelButton.tsx | 15 +++++++++++++--
.../API/parameters/AcceptSpotnanaTermsParams.ts | 1 -
src/libs/actions/Travel.ts | 4 ++--
src/pages/Travel/TravelTerms.tsx | 15 ++-------------
4 files changed, 17 insertions(+), 18 deletions(-)
diff --git a/src/components/BookTravelButton.tsx b/src/components/BookTravelButton.tsx
index da8d18b86c2f..08c979267fe0 100644
--- a/src/components/BookTravelButton.tsx
+++ b/src/components/BookTravelButton.tsx
@@ -55,7 +55,7 @@ function BookTravelButton({text}: BookTravelButtonProps) {
const [policies] = useOnyx(ONYXKEYS.COLLECTION.POLICY);
const {login: currentUserLogin} = useCurrentUserPersonalDetails();
const activePolicies = getActivePolicies(policies, currentUserLogin);
- const groupPolicies = activePolicies.filter((policy) => policy.type !== CONST.POLICY.TYPE.PERSONAL);
+ const groupPolicies = activePolicies.filter((activePolicy) => activePolicy.type !== CONST.POLICY.TYPE.PERSONAL);
const isUserMemberOfSingleGroupPolicy = groupPolicies.length === 1;
// Flag indicating whether NewDot was launched exclusively for Travel,
// e.g., when the user selects "Trips" from the Expensify Classic menu in HybridApp.
@@ -133,7 +133,18 @@ function BookTravelButton({text}: BookTravelButtonProps) {
Navigation.navigate(ROUTES.TRAVEL_DOMAIN_SELECTOR);
}
}
- }, [policy, wasNewDotLaunchedJustForTravel, travelSettings, translate, primaryContactMethod, setRootStatusBarEnabled, isBlockedFromSpotnanaTravel, StyleUtils, styles]);
+ }, [
+ policy,
+ wasNewDotLaunchedJustForTravel,
+ travelSettings,
+ translate,
+ primaryContactMethod,
+ setRootStatusBarEnabled,
+ isBlockedFromSpotnanaTravel,
+ StyleUtils,
+ styles,
+ isUserMemberOfSingleGroupPolicy,
+ ]);
return (
<>
diff --git a/src/libs/API/parameters/AcceptSpotnanaTermsParams.ts b/src/libs/API/parameters/AcceptSpotnanaTermsParams.ts
index f854601beffb..a5a67e76eac3 100644
--- a/src/libs/API/parameters/AcceptSpotnanaTermsParams.ts
+++ b/src/libs/API/parameters/AcceptSpotnanaTermsParams.ts
@@ -1,6 +1,5 @@
type AcceptSpotnanaTermsParams = {
domain?: string;
- policyID?: string;
};
export default AcceptSpotnanaTermsParams;
diff --git a/src/libs/actions/Travel.ts b/src/libs/actions/Travel.ts
index c81fea019e00..b3a892c99ab6 100644
--- a/src/libs/actions/Travel.ts
+++ b/src/libs/actions/Travel.ts
@@ -9,7 +9,7 @@ import ONYXKEYS from '@src/ONYXKEYS';
/**
* Accept Spotnana terms and conditions to receive a proper token used for authenticating further actions
*/
-function acceptSpotnanaTerms(domain?: string, policyID?: string) {
+function acceptSpotnanaTerms(domain?: string) {
const optimisticData: OnyxUpdate[] = [
{
onyxMethod: 'merge',
@@ -49,7 +49,7 @@ function acceptSpotnanaTerms(domain?: string, policyID?: string) {
},
];
- const params: AcceptSpotnanaTermsParams = {domain, policyID};
+ const params: AcceptSpotnanaTermsParams = {domain};
API.write(WRITE_COMMANDS.ACCEPT_SPOTNANA_TERMS, params, {optimisticData, successData, failureData});
}
diff --git a/src/pages/Travel/TravelTerms.tsx b/src/pages/Travel/TravelTerms.tsx
index 338a11055ef0..8eb5043aae7d 100644
--- a/src/pages/Travel/TravelTerms.tsx
+++ b/src/pages/Travel/TravelTerms.tsx
@@ -19,7 +19,7 @@ import {acceptSpotnanaTerms, cleanupTravelProvisioningSession} from '@libs/actio
import {getLatestErrorMessage} from '@libs/ErrorUtils';
import Navigation from '@libs/Navigation/Navigation';
import type {TravelNavigatorParamList} from '@libs/Navigation/types';
-import {getActivePolicies, getActivePolicy} from '@libs/PolicyUtils';
+import {getActivePolicy} from '@libs/PolicyUtils';
import CONFIG from '@src/CONFIG';
import CONST from '@src/CONST';
import ONYXKEYS from '@src/ONYXKEYS';
@@ -39,9 +39,6 @@ function TravelTerms({route}: TravelTermsPageProps) {
const domain = route.params.domain === CONST.TRAVEL.DEFAULT_DOMAIN ? undefined : route.params.domain;
const [policies] = useOnyx(ONYXKEYS.COLLECTION.POLICY);
const {login: currentUserLogin} = useCurrentUserPersonalDetails();
- const activePolicies = getActivePolicies(policies, currentUserLogin);
- const groupPolicies = activePolicies.filter((policy) => policy.type !== CONST.POLICY.TYPE.PERSONAL);
- const isUserMemberOfSingleGroupPolicy = groupPolicies.length === 1;
const activePolicy = getActivePolicy();
const isActivePolicyGroup = activePolicy?.type !== CONST.POLICY.TYPE.PERSONAL;
@@ -124,15 +121,7 @@ function TravelTerms({route}: TravelTermsPageProps) {
if (isActivePolicyGroup) {
acceptSpotnanaTerms(domain);
- return;
- }
-
- if (!isActivePolicyGroup && isUserMemberOfSingleGroupPolicy) {
- acceptSpotnanaTerms(domain, groupPolicies.at(0)?.id);
- return;
- }
-
- if (!isActivePolicyGroup && !isUserMemberOfSingleGroupPolicy) {
+ } else {
setErrorMessage(translate('travel.termsAndConditions.defaultWorkspaceError'));
}
}}
From 659547e1ad77d65ef7159df4e735dd1c93884169 Mon Sep 17 00:00:00 2001
From: Rutika Pawar <183392827+twilight2294@users.noreply.github.com>
Date: Sun, 23 Mar 2025 17:42:34 +0530
Subject: [PATCH 09/15] remove unused variables
---
src/pages/Travel/TravelTerms.tsx | 3 ---
1 file changed, 3 deletions(-)
diff --git a/src/pages/Travel/TravelTerms.tsx b/src/pages/Travel/TravelTerms.tsx
index 8eb5043aae7d..947317e3822b 100644
--- a/src/pages/Travel/TravelTerms.tsx
+++ b/src/pages/Travel/TravelTerms.tsx
@@ -10,7 +10,6 @@ import HeaderWithBackButton from '@components/HeaderWithBackButton';
import ScreenWrapper from '@components/ScreenWrapper';
import Text from '@components/Text';
import TextLink from '@components/TextLink';
-import useCurrentUserPersonalDetails from '@hooks/useCurrentUserPersonalDetails';
import useLocalize from '@hooks/useLocalize';
import usePermissions from '@hooks/usePermissions';
import useThemeStyles from '@hooks/useThemeStyles';
@@ -37,8 +36,6 @@ function TravelTerms({route}: TravelTermsPageProps) {
const [travelProvisioning] = useOnyx(ONYXKEYS.TRAVEL_PROVISIONING);
const isLoading = travelProvisioning?.isLoading;
const domain = route.params.domain === CONST.TRAVEL.DEFAULT_DOMAIN ? undefined : route.params.domain;
- const [policies] = useOnyx(ONYXKEYS.COLLECTION.POLICY);
- const {login: currentUserLogin} = useCurrentUserPersonalDetails();
const activePolicy = getActivePolicy();
const isActivePolicyGroup = activePolicy?.type !== CONST.POLICY.TYPE.PERSONAL;
From b5a2c8eea12899a17ae101d8dceaabec011a22db Mon Sep 17 00:00:00 2001
From: Rutika Pawar <183392827+twilight2294@users.noreply.github.com>
Date: Mon, 31 Mar 2025 18:55:10 +0530
Subject: [PATCH 10/15] Apply suggestions from code review
Co-authored-by: Shubham Agrawal <58412969+shubham1206agra@users.noreply.github.com>
---
src/components/BookTravelButton.tsx | 10 +++++++---
1 file changed, 7 insertions(+), 3 deletions(-)
diff --git a/src/components/BookTravelButton.tsx b/src/components/BookTravelButton.tsx
index 08c979267fe0..471c1b684c67 100644
--- a/src/components/BookTravelButton.tsx
+++ b/src/components/BookTravelButton.tsx
@@ -55,8 +55,7 @@ function BookTravelButton({text}: BookTravelButtonProps) {
const [policies] = useOnyx(ONYXKEYS.COLLECTION.POLICY);
const {login: currentUserLogin} = useCurrentUserPersonalDetails();
const activePolicies = getActivePolicies(policies, currentUserLogin);
- const groupPolicies = activePolicies.filter((activePolicy) => activePolicy.type !== CONST.POLICY.TYPE.PERSONAL);
- const isUserMemberOfSingleGroupPolicy = groupPolicies.length === 1;
+ const groupPaidPolicies = activePolicies.filter((activePolicy) => activePolicy.type !== CONST.POLICY.TYPE.PERSONAL && isPaidGroupPolicy(activePolicy));
// Flag indicating whether NewDot was launched exclusively for Travel,
// e.g., when the user selects "Trips" from the Expensify Classic menu in HybridApp.
const [wasNewDotLaunchedJustForTravel] = useOnyx(ONYXKEYS.IS_SINGLE_NEW_DOT_ENTRY);
@@ -88,10 +87,15 @@ function BookTravelButton({text}: BookTravelButtonProps) {
return;
}
- if (isUserMemberOfSingleGroupPolicy) {
+ if (groupPaidPolicies.length < 1) {
Navigation.navigate(ROUTES.TRAVEL_UPGRADE);
return;
}
+
+ if (!isPaidGroupPolicy(policy)) {
+ setErrorMessage(translate('travel.termsAndConditions.defaultWorkspaceError'));
+ return;
+ }
const isPolicyProvisioned = policy?.travelSettings?.spotnanaCompanyID ?? policy?.travelSettings?.associatedTravelDomainAccountID;
if (policy?.travelSettings?.hasAcceptedTerms ?? (travelSettings?.hasAcceptedTerms && isPolicyProvisioned)) {
From e64c057c5f222542226c3b16d8dadbca5a960de9 Mon Sep 17 00:00:00 2001
From: Rutika Pawar <183392827+twilight2294@users.noreply.github.com>
Date: Mon, 31 Mar 2025 19:07:18 +0530
Subject: [PATCH 11/15] fix tests
---
src/components/BookTravelButton.tsx | 17 +++--------------
1 file changed, 3 insertions(+), 14 deletions(-)
diff --git a/src/components/BookTravelButton.tsx b/src/components/BookTravelButton.tsx
index 471c1b684c67..dea84b2c1087 100644
--- a/src/components/BookTravelButton.tsx
+++ b/src/components/BookTravelButton.tsx
@@ -13,7 +13,7 @@ import {openTravelDotLink} from '@libs/actions/Link';
import {cleanupTravelProvisioningSession} from '@libs/actions/Travel';
import Log from '@libs/Log';
import Navigation from '@libs/Navigation/Navigation';
-import {getActivePolicies, getAdminsPrivateEmailDomains} from '@libs/PolicyUtils';
+import {getActivePolicies, getAdminsPrivateEmailDomains, isPaidGroupPolicy} from '@libs/PolicyUtils';
import colors from '@styles/theme/colors';
import CONFIG from '@src/CONFIG';
import CONST from '@src/CONST';
@@ -91,7 +91,7 @@ function BookTravelButton({text}: BookTravelButtonProps) {
Navigation.navigate(ROUTES.TRAVEL_UPGRADE);
return;
}
-
+
if (!isPaidGroupPolicy(policy)) {
setErrorMessage(translate('travel.termsAndConditions.defaultWorkspaceError'));
return;
@@ -137,18 +137,7 @@ function BookTravelButton({text}: BookTravelButtonProps) {
Navigation.navigate(ROUTES.TRAVEL_DOMAIN_SELECTOR);
}
}
- }, [
- policy,
- wasNewDotLaunchedJustForTravel,
- travelSettings,
- translate,
- primaryContactMethod,
- setRootStatusBarEnabled,
- isBlockedFromSpotnanaTravel,
- StyleUtils,
- styles,
- isUserMemberOfSingleGroupPolicy,
- ]);
+ }, [policy, wasNewDotLaunchedJustForTravel, travelSettings, translate, primaryContactMethod, setRootStatusBarEnabled, isBlockedFromSpotnanaTravel, StyleUtils, styles]);
return (
<>
From 7c882a435c262098c653064f4cc19cf116f4b231 Mon Sep 17 00:00:00 2001
From: Rutika Pawar <183392827+twilight2294@users.noreply.github.com>
Date: Mon, 31 Mar 2025 19:09:44 +0530
Subject: [PATCH 12/15] add dependency
---
src/components/BookTravelButton.tsx | 13 ++++++++++++-
1 file changed, 12 insertions(+), 1 deletion(-)
diff --git a/src/components/BookTravelButton.tsx b/src/components/BookTravelButton.tsx
index dea84b2c1087..1980acaf5b14 100644
--- a/src/components/BookTravelButton.tsx
+++ b/src/components/BookTravelButton.tsx
@@ -137,7 +137,18 @@ function BookTravelButton({text}: BookTravelButtonProps) {
Navigation.navigate(ROUTES.TRAVEL_DOMAIN_SELECTOR);
}
}
- }, [policy, wasNewDotLaunchedJustForTravel, travelSettings, translate, primaryContactMethod, setRootStatusBarEnabled, isBlockedFromSpotnanaTravel, StyleUtils, styles]);
+ }, [
+ policy,
+ wasNewDotLaunchedJustForTravel,
+ travelSettings,
+ translate,
+ primaryContactMethod,
+ setRootStatusBarEnabled,
+ isBlockedFromSpotnanaTravel,
+ StyleUtils,
+ styles,
+ groupPaidPolicies.length,
+ ]);
return (
<>
From ca5b55d195c87da08237575b020e7510981de70a Mon Sep 17 00:00:00 2001
From: Rutika Pawar <183392827+twilight2294@users.noreply.github.com>
Date: Mon, 31 Mar 2025 19:22:55 +0530
Subject: [PATCH 13/15] remove redundant condition
---
src/pages/Travel/TravelTerms.tsx | 2 --
1 file changed, 2 deletions(-)
diff --git a/src/pages/Travel/TravelTerms.tsx b/src/pages/Travel/TravelTerms.tsx
index 947317e3822b..0598b16de389 100644
--- a/src/pages/Travel/TravelTerms.tsx
+++ b/src/pages/Travel/TravelTerms.tsx
@@ -118,8 +118,6 @@ function TravelTerms({route}: TravelTermsPageProps) {
if (isActivePolicyGroup) {
acceptSpotnanaTerms(domain);
- } else {
- setErrorMessage(translate('travel.termsAndConditions.defaultWorkspaceError'));
}
}}
message={errorMessage}
From 245833dc80434639d0ca0fa37c155d186d35868f Mon Sep 17 00:00:00 2001
From: Rutika Pawar <183392827+twilight2294@users.noreply.github.com>
Date: Mon, 31 Mar 2025 21:29:57 +0530
Subject: [PATCH 14/15] Apply suggestions from code review
Co-authored-by: Shubham Agrawal <58412969+shubham1206agra@users.noreply.github.com>
---
src/pages/Travel/TravelTerms.tsx | 7 +------
1 file changed, 1 insertion(+), 6 deletions(-)
diff --git a/src/pages/Travel/TravelTerms.tsx b/src/pages/Travel/TravelTerms.tsx
index 0598b16de389..6dbb95aeb16b 100644
--- a/src/pages/Travel/TravelTerms.tsx
+++ b/src/pages/Travel/TravelTerms.tsx
@@ -18,7 +18,6 @@ import {acceptSpotnanaTerms, cleanupTravelProvisioningSession} from '@libs/actio
import {getLatestErrorMessage} from '@libs/ErrorUtils';
import Navigation from '@libs/Navigation/Navigation';
import type {TravelNavigatorParamList} from '@libs/Navigation/types';
-import {getActivePolicy} from '@libs/PolicyUtils';
import CONFIG from '@src/CONFIG';
import CONST from '@src/CONST';
import ONYXKEYS from '@src/ONYXKEYS';
@@ -36,8 +35,6 @@ function TravelTerms({route}: TravelTermsPageProps) {
const [travelProvisioning] = useOnyx(ONYXKEYS.TRAVEL_PROVISIONING);
const isLoading = travelProvisioning?.isLoading;
const domain = route.params.domain === CONST.TRAVEL.DEFAULT_DOMAIN ? undefined : route.params.domain;
- const activePolicy = getActivePolicy();
- const isActivePolicyGroup = activePolicy?.type !== CONST.POLICY.TYPE.PERSONAL;
useEffect(() => {
if (travelProvisioning?.error === CONST.TRAVEL.PROVISIONING.ERROR_PERMISSION_DENIED && domain) {
@@ -116,9 +113,7 @@ function TravelTerms({route}: TravelTermsPageProps) {
setErrorMessage('');
}
- if (isActivePolicyGroup) {
- acceptSpotnanaTerms(domain);
- }
+ acceptSpotnanaTerms(domain);
}}
message={errorMessage}
isAlertVisible={!!errorMessage}
From dca5270f2024c0a257c652c48bacd41e66d7a61c Mon Sep 17 00:00:00 2001
From: Rutika Pawar <183392827+twilight2294@users.noreply.github.com>
Date: Thu, 3 Apr 2025 15:44:38 +0000
Subject: [PATCH 15/15] fix error message placement
---
src/components/BookTravelButton.tsx | 14 ++++++++++++--
src/pages/Travel/ManageTrips.tsx | 5 ++++-
2 files changed, 16 insertions(+), 3 deletions(-)
diff --git a/src/components/BookTravelButton.tsx b/src/components/BookTravelButton.tsx
index 84957551c269..7ea2bcca1364 100644
--- a/src/components/BookTravelButton.tsx
+++ b/src/components/BookTravelButton.tsx
@@ -30,6 +30,9 @@ import TextLink from './TextLink';
type BookTravelButtonProps = {
text: string;
+
+ /** Whether to render the error message below the button */
+ shouldRenderErrorMessageBelowButton?: boolean;
};
const navigateToAcceptTerms = (domain: string, isUserValidated?: boolean) => {
@@ -42,7 +45,7 @@ const navigateToAcceptTerms = (domain: string, isUserValidated?: boolean) => {
Navigation.navigate(ROUTES.SETTINGS_WALLET_VERIFY_ACCOUNT.getRoute(Navigation.getActiveRoute(), ROUTES.TRAVEL_TCS.getRoute(domain)));
};
-function BookTravelButton({text}: BookTravelButtonProps) {
+function BookTravelButton({text, shouldRenderErrorMessageBelowButton = false}: BookTravelButtonProps) {
const styles = useThemeStyles();
const StyleUtils = useStyleUtils();
const {translate} = useLocalize();
@@ -159,7 +162,7 @@ function BookTravelButton({text}: BookTravelButtonProps) {
return (
<>
- {!!errorMessage && (
+ {!shouldRenderErrorMessageBelowButton && !!errorMessage && (
+ {shouldRenderErrorMessageBelowButton && !!errorMessage && (
+
+ )}
-
+
>
}
/>