diff --git a/src/CONST.ts b/src/CONST.ts index e05a8bd1a014..5e4fbb4adacf 100755 --- a/src/CONST.ts +++ b/src/CONST.ts @@ -738,6 +738,7 @@ const CONST = { DEFAULT_ROOMS: 'defaultRooms', P2P_DISTANCE_REQUESTS: 'p2pDistanceRequests', SPOTNANA_TRAVEL: 'spotnanaTravel', + PREVENT_SPOTNANA_TRAVEL: 'preventSpotnanaTravel', REPORT_FIELDS_FEATURE: 'reportFieldsFeature', NETSUITE_USA_TAX: 'netsuiteUsaTax', COMBINED_TRACK_SUBMIT: 'combinedTrackSubmit', diff --git a/src/libs/Permissions.ts b/src/libs/Permissions.ts index d26ff8c245a9..eda98f2cc70b 100644 --- a/src/libs/Permissions.ts +++ b/src/libs/Permissions.ts @@ -14,6 +14,11 @@ function canUseSpotnanaTravel(betas: OnyxEntry): boolean { return !!betas?.includes(CONST.BETAS.SPOTNANA_TRAVEL) || canUseAllBetas(betas); } +function isBlockedFromSpotnanaTravel(betas: OnyxEntry): boolean { + // Don't check for all betas or nobody can use test travel on dev + return !!betas?.includes(CONST.BETAS.PREVENT_SPOTNANA_TRAVEL); +} + function canUseNetSuiteUSATax(betas: OnyxEntry): boolean { return !!betas?.includes(CONST.BETAS.NETSUITE_USA_TAX) || canUseAllBetas(betas); } @@ -53,6 +58,7 @@ export default { canUseDefaultRooms, canUseLinkPreviews, canUseSpotnanaTravel, + isBlockedFromSpotnanaTravel, canUseNetSuiteUSATax, canUsePerDiem, canUseMergeAccounts, diff --git a/src/pages/Travel/MyTripsPage.tsx b/src/pages/Travel/MyTripsPage.tsx index 58db57685ab7..363a59621e28 100644 --- a/src/pages/Travel/MyTripsPage.tsx +++ b/src/pages/Travel/MyTripsPage.tsx @@ -9,7 +9,7 @@ import ManageTrips from './ManageTrips'; function MyTripsPage() { const {translate} = useLocalize(); - const {canUseSpotnanaTravel} = usePermissions(); + const {canUseSpotnanaTravel, isBlockedFromSpotnanaTravel} = usePermissions(); return ( - + Navigation.goBack()} diff --git a/src/pages/Travel/TripDetailsPage.tsx b/src/pages/Travel/TripDetailsPage.tsx index 2e9df5a6a5e6..67e7463db977 100644 --- a/src/pages/Travel/TripDetailsPage.tsx +++ b/src/pages/Travel/TripDetailsPage.tsx @@ -16,9 +16,9 @@ import useStyleUtils from '@hooks/useStyleUtils'; import useTheme from '@hooks/useTheme'; import useThemeStyles from '@hooks/useThemeStyles'; import type {TravelNavigatorParamList} from '@libs/Navigation/types'; -import * as ReportUtils from '@libs/ReportUtils'; -import * as TripReservationUtils from '@libs/TripReservationUtils'; -import * as Link from '@userActions/Link'; +import {getTripIDFromTransactionParentReportID} from '@libs/ReportUtils'; +import {getTripReservationIcon} from '@libs/TripReservationUtils'; +import {openTravelDotLink} from '@userActions/Link'; import CONST from '@src/CONST'; import ONYXKEYS from '@src/ONYXKEYS'; import type SCREENS from '@src/SCREENS'; @@ -40,7 +40,7 @@ function TripDetailsPage({route}: TripDetailsPageProps) { const styles = useThemeStyles(); const StyleUtils = useStyleUtils(); const {translate} = useLocalize(); - const {canUseSpotnanaTravel} = usePermissions(); + const {canUseSpotnanaTravel, isBlockedFromSpotnanaTravel} = usePermissions(); const {isOffline} = useNetwork(); const [isModifyTripLoading, setIsModifyTripLoading] = useState(false); @@ -51,10 +51,10 @@ function TripDetailsPage({route}: TripDetailsPageProps) { const [report] = useOnyx(`${ONYXKEYS.COLLECTION.REPORT}${transaction?.reportID ?? CONST.DEFAULT_NUMBER_ID}`); const [parentReport] = useOnyx(`${ONYXKEYS.COLLECTION.REPORT}${report?.parentReportID ?? CONST.DEFAULT_NUMBER_ID}`); - const tripID = ReportUtils.getTripIDFromTransactionParentReportID(parentReport?.reportID); + const tripID = getTripIDFromTransactionParentReportID(parentReport?.reportID); const reservationType = transaction?.receipt?.reservationList?.at(route.params.reservationIndex ?? 0)?.type; const reservation = transaction?.receipt?.reservationList?.at(route.params.reservationIndex ?? 0); - const reservationIcon = TripReservationUtils.getTripReservationIcon(reservation?.type); + const reservationIcon = getTripReservationIcon(reservation?.type); const [travelerPersonalDetails] = useOnyx(ONYXKEYS.PERSONAL_DETAILS_LIST, {selector: (personalDetails) => pickTravelerPersonalDetails(personalDetails, reservation)}); return ( @@ -67,7 +67,7 @@ function TripDetailsPage({route}: TripDetailsPageProps) { > { setIsModifyTripLoading(true); - Link.openTravelDotLink(activePolicyID, CONST.TRIP_ID_PATH(tripID))?.finally(() => { + openTravelDotLink(activePolicyID, CONST.TRIP_ID_PATH(tripID))?.finally(() => { setIsModifyTripLoading(false); }); }} @@ -128,7 +128,7 @@ function TripDetailsPage({route}: TripDetailsPageProps) { shouldShowRightIcon onPress={() => { setIsTripSupportLoading(true); - Link.openTravelDotLink(activePolicyID, CONST.TRIP_SUPPORT)?.finally(() => { + openTravelDotLink(activePolicyID, CONST.TRIP_SUPPORT)?.finally(() => { setIsTripSupportLoading(false); }); }} diff --git a/src/pages/Travel/TripSummaryPage.tsx b/src/pages/Travel/TripSummaryPage.tsx index 69926f0e443e..f7b6cb2c67a3 100644 --- a/src/pages/Travel/TripSummaryPage.tsx +++ b/src/pages/Travel/TripSummaryPage.tsx @@ -19,7 +19,7 @@ type TripSummaryPageProps = StackScreenProps canSendInvoicePolicyUtils(allPolicies as OnyxCollection, session?.email), [allPolicies, session?.email]); const isValidReport = !(isEmptyObject(quickActionReport) || isArchivedReport(reportNameValuePairs)); const {environment} = useEnvironment(); @@ -485,7 +485,7 @@ function FloatingActionButtonAndPopover({onHideCreateMenu, onShowCreateMenu, isT }, ] : []), - ...(canUseSpotnanaTravel + ...(canUseSpotnanaTravel && !isBlockedFromSpotnanaTravel ? [ { icon: Expensicons.Suitcase,