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 && ( + + )} - + } />