Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[vip-travel] Create Trip Details Screen #52823

Merged
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
85 commits
Select commit Hold shift + click to select a range
a33274b
Create trip details screen
blazejkustra Nov 20, 2024
15c9ae3
Add translation for trip support
blazejkustra Nov 20, 2024
3ae7f98
Add undefined type for trip details
blazejkustra Nov 20, 2024
d2e1df5
Fix navigation config
blazejkustra Nov 20, 2024
7394a09
Link the correct backTo on trip details screen
blazejkustra Nov 22, 2024
2c9d2a8
Access data and fix getTripIDFromTransactionParentReportID
blazejkustra Nov 22, 2024
610ed48
Add english translations
blazejkustra Nov 25, 2024
644243c
Make reservationType optional in getTripReservationIcon function
blazejkustra Nov 25, 2024
d5dd2af
Add arrivalGate and cityName fields to Reservation and ReservationTim…
blazejkustra Nov 25, 2024
6c89f5a
Enhance getFormattedTransportDate function to support shorter date fo…
blazejkustra Nov 25, 2024
b47f8a2
Add FlightTripDetails component to display flight reservation informa…
blazejkustra Nov 25, 2024
aeddf58
Integrate FlightTripDetails component into TripDetails screen and wra…
blazejkustra Nov 25, 2024
ae39590
Final touches
blazejkustra Nov 24, 2024
2954e6a
Fix flight page after design changes
blazejkustra Nov 26, 2024
08fd3fb
Change TripDetails into TripDetailsPage
blazejkustra Nov 26, 2024
6e71d43
Create HotelTripDetails
blazejkustra Nov 26, 2024
4ff355f
Add missing translation
blazejkustra Nov 26, 2024
2eb1bb9
Revert "Final touches"
blazejkustra Nov 26, 2024
503cf60
Remove flight from hotel page
blazejkustra Nov 26, 2024
a4a0cde
Add a blank line for improved readability in HotelTripDetails component
blazejkustra Nov 26, 2024
30e27d1
Add CarTripDetails component for displaying car rental information
blazejkustra Nov 26, 2024
a8b78f8
Refactor getReservationsFromTripTransactions to return structured res…
blazejkustra Nov 26, 2024
f4f5501
Add translation for rental car
blazejkustra Nov 26, 2024
d49cdce
Fix navigation route in MoneyRequestView to use parentReportID
blazejkustra Nov 26, 2024
092e430
Refactor TripDetailsView and TripRoomPreview to use structured reserv…
blazejkustra Nov 26, 2024
6c59ca4
Add CarTripDetails component to TripDetailsPage for displaying car re…
blazejkustra Nov 26, 2024
49f946f
Add Trip Summary screen
blazejkustra Nov 27, 2024
9c5963e
Add address translation to common
blazejkustra Nov 27, 2024
34553ef
Add screen to navigator and fix types
blazejkustra Nov 27, 2024
4b3a159
Navigate to summary conditionally
blazejkustra Nov 27, 2024
a1ebfe7
Clean date utils around transport
blazejkustra Nov 27, 2024
aa0fb94
Add reservation index to display just one flight
blazejkustra Nov 27, 2024
1d541a1
Update config configuration
blazejkustra Nov 27, 2024
fe18238
Update styles after design changes
blazejkustra Nov 27, 2024
833bc3e
Merge branch 'main' into feature/trip-details
blazejkustra Nov 27, 2024
c882db8
Rename TRIP_DETAILS screen identifier to maintain consistent naming c…
blazejkustra Nov 27, 2024
c20e09e
Fix typecheck and lint
blazejkustra Nov 27, 2024
7dcfbd0
Add Spanish translations for flight, hotel, and car details
blazejkustra Nov 27, 2024
5ba408a
Refactor reservation type checks to use constants
blazejkustra Nov 28, 2024
7c2d12d
Add cancellation deadline and policy to car and hotel trip details
blazejkustra Nov 28, 2024
0389b73
Rename reservation deadline property and update related components to…
blazejkustra Nov 29, 2024
8cbf341
Merge branch 'main' into feature/trip-details
blazejkustra Nov 29, 2024
f906103
Rename displayName for CarTripDetails component
blazejkustra Nov 29, 2024
79b0cbd
Add Spanish translation for cancellationUntil in booking and car sect…
blazejkustra Nov 29, 2024
7bdea21
Remove unnecessary blank line in HotelTripDetails component
blazejkustra Nov 29, 2024
f202c55
Merge branch 'main' into feature/trip-details
blazejkustra Dec 2, 2024
889416c
Add optional fields for rail reservations in Transaction
blazejkustra Dec 2, 2024
c8557b0
Add TRAIN constant to CONST for transportation options
blazejkustra Dec 2, 2024
9f7ca7e
Add train translations and details to language file
blazejkustra Dec 2, 2024
3477149
Add TrainTripDetails component to display train reservation details
blazejkustra Dec 2, 2024
3c720d1
Update Spanish translations for train terminology
blazejkustra Dec 2, 2024
575918c
Add train icon SVG and import it into Expensicons
blazejkustra Dec 2, 2024
542749b
Update train SVG to remove fixed width and height attributes
blazejkustra Dec 2, 2024
f9b5bbc
Add support for train in TripDetailsView and TripRoomPreview components
blazejkustra Dec 2, 2024
575fa38
Add trip details translation for English and Spanish; update TripSumm…
blazejkustra Dec 3, 2024
0ab84cd
Add customizable icon dimensions and styles to HeaderWithBackButton c…
blazejkustra Dec 3, 2024
13dd939
Add dynamic reservation icon support in TripDetailsPage component
blazejkustra Dec 3, 2024
0a33fd4
Refactor TripDetailsPage to use reservation object for details rendering
blazejkustra Dec 3, 2024
7f7d5d4
Refactor CarTripDetails component to use reservation object for rende…
blazejkustra Dec 3, 2024
3de4fb9
Add shouldUseHeadlineHeader prop to multiple pages for consistent hea…
blazejkustra Dec 3, 2024
a3d68f4
Refactor HotelTripDetails component to use reservation object for ren…
blazejkustra Dec 3, 2024
b9d0da2
Add flight layover translation support and abbreviations in English a…
blazejkustra Dec 3, 2024
9778049
Add FlightLayoverParams type for layover details
blazejkustra Dec 3, 2024
5eac23a
Enhance duration formatting functions to support translation for hour…
blazejkustra Dec 3, 2024
72b825e
Refactor FlightTripDetails component to use reservation object
blazejkustra Dec 3, 2024
6466aec
Refactor TrainTripDetails component to use reservation object for ren…
blazejkustra Dec 3, 2024
c576047
Merge branch 'main' into feature/trip-details
blazejkustra Dec 3, 2024
6dc72b3
Refactor trip details components to remove personal details prop and …
blazejkustra Dec 5, 2024
4e3b48a
Merge branch 'main' into feature/trip-details
blazejkustra Dec 5, 2024
b892fe0
Revert "Refactor trip details components to remove personal details p…
blazejkustra Dec 5, 2024
1457fda
Update trip details components to use traveler information from reser…
blazejkustra Dec 5, 2024
9a9eaf7
Show duration for train, fix truncated confirmatiion number
blazejkustra Dec 5, 2024
c7ebfb2
Display passenger/guest conditionally
blazejkustra Dec 5, 2024
e09dc23
Use label size for layover
blazejkustra Dec 6, 2024
e91d3a8
Remove console log from FlightTripDetails component
blazejkustra Dec 6, 2024
6b31349
Refactor navigation parameters to use tripRoomReportID consistently a…
blazejkustra Dec 6, 2024
9c82c76
Fix modify trip and trip support buttons for all cases
blazejkustra Dec 6, 2024
c69639a
Add network status handling to disable buttons when offline
blazejkustra Dec 6, 2024
0b6030f
Add loading state management for trip modification and support actions
blazejkustra Dec 6, 2024
4e075c8
Merge branch 'main' into feature/trip-details
blazejkustra Dec 6, 2024
d43a884
Merge branch 'main' into feature/trip-details
blazejkustra Dec 6, 2024
8324be8
fix PR comments
SzymczakJ Dec 10, 2024
d0776cf
Merge branch 'main' into feature/trip-details
SzymczakJ Dec 12, 2024
ffe8522
Merge branch 'main' into feature/trip-details
blazejkustra Dec 16, 2024
990300e
Merge branch 'main' into feature/trip-details
blazejkustra Dec 18, 2024
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 3 additions & 0 deletions assets/images/train.svg
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
3 changes: 2 additions & 1 deletion src/CONST.ts
Original file line number Diff line number Diff line change
Expand Up @@ -4452,7 +4452,7 @@ const CONST = {
BOOK_TRAVEL_DEMO_URL: 'https://calendly.com/d/ck2z-xsh-q97/expensify-travel-demo-travel-page',
TRAVEL_DOT_URL: 'https://travel.expensify.com',
STAGING_TRAVEL_DOT_URL: 'https://staging.travel.expensify.com',
TRIP_ID_PATH: (tripID: string) => `trips/${tripID}`,
TRIP_ID_PATH: (tripID?: string) => (tripID ? `trips/${tripID}` : undefined),
SPOTNANA_TMC_ID: '8e8e7258-1cf3-48c0-9cd1-fe78a6e31eed',
STAGING_SPOTNANA_TMC_ID: '7a290c6e-5328-4107-aff6-e48765845b81',
SCREEN_READER_STATES: {
Expand Down Expand Up @@ -5953,6 +5953,7 @@ const CONST = {
CAR: 'car',
HOTEL: 'hotel',
FLIGHT: 'flight',
TRAIN: 'train',
},

DOT_SEPARATOR: '•',
Expand Down
9 changes: 9 additions & 0 deletions src/ROUTES.ts
Original file line number Diff line number Diff line change
Expand Up @@ -1162,16 +1162,16 @@
},
WORKSPACE_REPORT_FIELDS_LIST_VALUES: {
route: 'settings/workspaces/:policyID/reportFields/listValues/:reportFieldID?',
getRoute: (policyID: string, reportFieldID?: string) => `settings/workspaces/${policyID}/reportFields/listValues/${encodeURIComponent(reportFieldID ?? '')}` as const,

Check failure on line 1165 in src/ROUTES.ts

View workflow job for this annotation

GitHub Actions / Changed files ESLint check

},
WORKSPACE_REPORT_FIELDS_ADD_VALUE: {
route: 'settings/workspaces/:policyID/reportFields/addValue/:reportFieldID?',
getRoute: (policyID: string, reportFieldID?: string) => `settings/workspaces/${policyID}/reportFields/addValue/${encodeURIComponent(reportFieldID ?? '')}` as const,

Check failure on line 1169 in src/ROUTES.ts

View workflow job for this annotation

GitHub Actions / Changed files ESLint check

},
WORKSPACE_REPORT_FIELDS_VALUE_SETTINGS: {
route: 'settings/workspaces/:policyID/reportFields/:valueIndex/:reportFieldID?',
getRoute: (policyID: string, valueIndex: number, reportFieldID?: string) =>
`settings/workspaces/${policyID}/reportFields/${valueIndex}/${encodeURIComponent(reportFieldID ?? '')}` as const,

Check failure on line 1174 in src/ROUTES.ts

View workflow job for this annotation

GitHub Actions / Changed files ESLint check

},
WORKSPACE_REPORT_FIELDS_EDIT_VALUE: {
route: 'settings/workspaces/:policyID/reportFields/new/:valueIndex/edit',
Expand Down Expand Up @@ -1365,6 +1365,15 @@
TRAVEL_MY_TRIPS: 'travel',
TRAVEL_TCS: 'travel/terms',
TRACK_TRAINING_MODAL: 'track-training',
TRAVEL_TRIP_SUMMARY: {
route: 'r/:reportID/trip/:transactionID',
getRoute: (reportID: string, transactionID: string, backTo?: string) => getUrlWithBackToParam(`r/${reportID}/trip/${transactionID}`, backTo),
},
TRAVEL_TRIP_DETAILS: {
route: 'r/:reportID/trip/:transactionID/:reservationIndex',
getRoute: (reportID: string, transactionID: string, reservationIndex: number, backTo?: string) =>
getUrlWithBackToParam(`r/${reportID}/trip/${transactionID}/${reservationIndex}`, backTo),
},
ONBOARDING_ROOT: {
route: 'onboarding',
getRoute: (backTo?: string) => getUrlWithBackToParam(`onboarding`, backTo),
Expand Down
2 changes: 2 additions & 0 deletions src/SCREENS.ts
Original file line number Diff line number Diff line change
Expand Up @@ -27,6 +27,8 @@ const SCREENS = {
TRAVEL: {
MY_TRIPS: 'Travel_MyTrips',
TCS: 'Travel_TCS',
TRIP_SUMMARY: 'Travel_TripSummary',
TRIP_DETAILS: 'Travel_TripDetails',
},
SEARCH: {
CENTRAL_PANE: 'Search_Central_Pane',
Expand Down
20 changes: 11 additions & 9 deletions src/components/HeaderWithBackButton/index.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -25,6 +25,9 @@ import type HeaderWithBackButtonProps from './types';
function HeaderWithBackButton({
icon,
iconFill,
iconWidth,
iconHeight,
iconStyles,
guidesCallTaskID = '',
onBackButtonPress = () => Navigation.goBack(),
onCloseButtonPress = () => Navigation.dismissModal(),
Expand All @@ -45,6 +48,7 @@ function HeaderWithBackButton({
shouldSetModalVisibility = true,
shouldShowThreeDotsButton = false,
shouldDisableThreeDotsButton = false,
shouldUseHeadlineHeader = false,
stepCounter,
subtitle = '',
title = '',
Expand Down Expand Up @@ -72,9 +76,6 @@ function HeaderWithBackButton({
const [isDownloadButtonActive, temporarilyDisableDownloadButton] = useThrottledButtonState();
const {translate} = useLocalize();

// If the icon is present, the header bar should be taller and use different font.
const isCentralPaneSettings = !!icon;

const middleContent = useMemo(() => {
if (progressBarPercentage) {
return (
Expand Down Expand Up @@ -106,14 +107,14 @@ function HeaderWithBackButton({
<Header
title={title}
subtitle={stepCounter ? translate('stepCounter', stepCounter) : subtitle}
textStyles={[titleColor ? StyleUtils.getTextColorStyle(titleColor) : {}, isCentralPaneSettings && styles.textHeadlineH2]}
textStyles={[titleColor ? StyleUtils.getTextColorStyle(titleColor) : {}, shouldUseHeadlineHeader && styles.textHeadlineH2]}
subTitleLink={subTitleLink}
/>
);
}, [
StyleUtils,
subTitleLink,
isCentralPaneSettings,
shouldUseHeadlineHeader,
policy,
progressBarPercentage,
report,
Expand All @@ -138,7 +139,7 @@ function HeaderWithBackButton({
dataSet={{dragArea: false}}
style={[
styles.headerBar,
isCentralPaneSettings && styles.headerBarDesktopHeight,
shouldUseHeadlineHeader && styles.headerBarDesktopHeight,
shouldShowBorderBottom && styles.borderBottom,
// progressBarPercentage can be 0 which would
// be falsey, hence using !== undefined explicitly
Expand Down Expand Up @@ -178,9 +179,10 @@ function HeaderWithBackButton({
{!!icon && (
<Icon
src={icon}
width={variables.iconHeader}
height={variables.iconHeader}
additionalStyles={[styles.mr2]}
width={iconWidth ?? variables.iconHeader}
height={iconHeight ?? variables.iconHeader}
additionalStyles={[styles.mr2, iconStyles]}
fill={iconFill ?? theme.icon}
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The ?? theme.icon default caused #54514

/>
)}
{!!policyAvatar && (
Expand Down
12 changes: 12 additions & 0 deletions src/components/HeaderWithBackButton/types.ts
Original file line number Diff line number Diff line change
Expand Up @@ -38,6 +38,15 @@ type HeaderWithBackButtonProps = Partial<ChildrenProps> & {
* */
icon?: IconAsset;

/** Icon Width */
iconWidth?: number;

/** Icon Height */
iconHeight?: number;

/** Any additional styles to pass to the icon container. */
iconStyles?: StyleProp<ViewStyle>;

/** Method to trigger when pressing download button of the header */
onDownloadButtonPress?: () => void;

Expand Down Expand Up @@ -119,6 +128,9 @@ type HeaderWithBackButtonProps = Partial<ChildrenProps> & {
/** Whether we should navigate to report page when the route have a topMostReport */
shouldNavigateToTopMostReport?: boolean;

/** Whether the header should use the headline header style */
shouldUseHeadlineHeader?: boolean;

/** The fill color for the icon. Can be hex, rgb, rgba, or valid react-native named color such as 'red' or 'blue'. */
iconFill?: string;

Expand Down
2 changes: 2 additions & 0 deletions src/components/Icon/Expensicons.ts
Original file line number Diff line number Diff line change
Expand Up @@ -187,6 +187,7 @@ import Task from '@assets/images/task.svg';
import Thread from '@assets/images/thread.svg';
import ThreeDots from '@assets/images/three-dots.svg';
import ThumbsUp from '@assets/images/thumbs-up.svg';
import Train from '@assets/images/train.svg';
import Transfer from '@assets/images/transfer.svg';
import Trashcan from '@assets/images/trashcan.svg';
import Unlock from '@assets/images/unlock.svg';
Expand Down Expand Up @@ -413,5 +414,6 @@ export {
Star,
QBDSquare,
GalleryNotFound,
Train,
boltSlash,
};
12 changes: 6 additions & 6 deletions src/components/ReportActionItem/MoneyRequestView.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -33,7 +33,6 @@
import Navigation from '@navigation/Navigation';
import AnimatedEmptyStateBackground from '@pages/home/report/AnimatedEmptyStateBackground';
import * as IOU from '@userActions/IOU';
import * as Link from '@userActions/Link';
import * as Transaction from '@userActions/Transaction';
import CONST from '@src/CONST';
import type {TranslationPaths} from '@src/languages/types';
Expand Down Expand Up @@ -72,9 +71,9 @@
const receiptFieldViolationNames: OnyxTypes.ViolationName[] = [CONST.VIOLATIONS.MODIFIED_AMOUNT, CONST.VIOLATIONS.MODIFIED_DATE];

const getTransactionID = (report: OnyxEntry<OnyxTypes.Report>, parentReportActions: OnyxEntry<OnyxTypes.ReportActions>) => {
const parentReportAction = parentReportActions?.[report?.parentReportActionID ?? '-1'];

Check failure on line 74 in src/components/ReportActionItem/MoneyRequestView.tsx

View workflow job for this annotation

GitHub Actions / Changed files ESLint check

const originalMessage = parentReportAction && ReportActionsUtils.isMoneyRequestAction(parentReportAction) ? ReportActionsUtils.getOriginalMessage(parentReportAction) : undefined;
return originalMessage?.IOUTransactionID ?? -1;

Check failure on line 76 in src/components/ReportActionItem/MoneyRequestView.tsx

View workflow job for this annotation

GitHub Actions / Changed files ESLint check

};

function MoneyRequestView({report, shouldShowAnimatedBackground, readonly = false, updatedTransaction, isFromReviewDuplicates = false}: MoneyRequestViewProps) {
Expand All @@ -82,9 +81,8 @@
const session = useSession();
const {isOffline} = useNetwork();
const {translate, toLocaleDigit} = useLocalize();
const [activePolicyID] = useOnyx(ONYXKEYS.NVP_ACTIVE_POLICY_ID);
const parentReportID = report?.parentReportID ?? '-1';

Check failure on line 84 in src/components/ReportActionItem/MoneyRequestView.tsx

View workflow job for this annotation

GitHub Actions / Changed files ESLint check

const policyID = report?.policyID ?? '-1';

Check failure on line 85 in src/components/ReportActionItem/MoneyRequestView.tsx

View workflow job for this annotation

GitHub Actions / Changed files ESLint check

const [parentReport] = useOnyx(`${ONYXKEYS.COLLECTION.REPORT}${parentReportID}`);
const [chatReport] = useOnyx(`${ONYXKEYS.COLLECTION.REPORT}${parentReport?.parentReportID}`, {
selector: (chatReportValue) => chatReportValue && {reportID: chatReportValue.reportID, errorFields: chatReportValue.errorFields},
Expand All @@ -99,12 +97,12 @@
});
const [transactionViolations] = useOnyx(`${ONYXKEYS.COLLECTION.TRANSACTION_VIOLATIONS}${getTransactionID(report, parentReportActions)}`);

const parentReportAction = parentReportActions?.[report?.parentReportActionID ?? '-1'];

Check failure on line 100 in src/components/ReportActionItem/MoneyRequestView.tsx

View workflow job for this annotation

GitHub Actions / Changed files ESLint check

const isTrackExpense = ReportUtils.isTrackExpenseReport(report);
const moneyRequestReport = parentReport;
const linkedTransactionID = useMemo(() => {
const originalMessage = parentReportAction && ReportActionsUtils.isMoneyRequestAction(parentReportAction) ? ReportActionsUtils.getOriginalMessage(parentReportAction) : undefined;
return originalMessage?.IOUTransactionID ?? '-1';

Check failure on line 105 in src/components/ReportActionItem/MoneyRequestView.tsx

View workflow job for this annotation

GitHub Actions / Changed files ESLint check

}, [parentReportAction]);

const [transaction] = useOnyx(`${ONYXKEYS.COLLECTION.TRANSACTION}${linkedTransactionID}`);
Expand Down Expand Up @@ -188,7 +186,7 @@
const shouldShowAttendees = useMemo(() => TransactionUtils.shouldShowAttendees(iouType, policy), [iouType, policy]);

const shouldShowTax = isTaxTrackingEnabled(isPolicyExpenseChat, policy, isDistanceRequest);
const tripID = ReportUtils.getTripIDFromTransactionParentReport(parentReport);
const tripID = ReportUtils.getTripIDFromTransactionParentReportID(parentReport?.parentReportID);
const shouldShowViewTripDetails = TransactionUtils.hasReservationList(transaction) && !!tripID;

const {getViolationsForField} = useViolations(transactionViolations ?? [], isReceiptBeingScanned || !ReportUtils.isPaidGroupPolicy(report));
Expand Down Expand Up @@ -229,7 +227,7 @@
if (newBillable === TransactionUtils.getBillable(transaction)) {
return;
}
IOU.updateMoneyRequestBillable(transaction?.transactionID ?? '-1', report?.reportID ?? '-1', newBillable, policy, policyTagList, policyCategories);

Check failure on line 230 in src/components/ReportActionItem/MoneyRequestView.tsx

View workflow job for this annotation

GitHub Actions / Changed files ESLint check

},
[transaction, report, policy, policyTagList, policyCategories],
);
Expand Down Expand Up @@ -699,10 +697,12 @@
<MenuItem
title={translate('travel.viewTripDetails')}
icon={Expensicons.Suitcase}
iconRight={Expensicons.NewWindow}
shouldShowRightIcon
onPress={() => {
Link.openTravelDotLink(activePolicyID, CONST.TRIP_ID_PATH(tripID));
const reservations = transaction?.receipt?.reservationList?.length ?? 0;
if (reservations > 1) {
Navigation.navigate(ROUTES.TRAVEL_TRIP_SUMMARY.getRoute(report?.reportID ?? '-1', transaction?.transactionID ?? '-1', Navigation.getReportRHPActiveRoute()));
}
Navigation.navigate(ROUTES.TRAVEL_TRIP_DETAILS.getRoute(report?.reportID ?? '-1', transaction?.transactionID ?? '-1', 0, Navigation.getReportRHPActiveRoute()));
}}
/>
)}
Expand Down
35 changes: 26 additions & 9 deletions src/components/ReportActionItem/TripDetailsView.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -11,26 +11,31 @@ import useStyleUtils from '@hooks/useStyleUtils';
import useTheme from '@hooks/useTheme';
import useThemeStyles from '@hooks/useThemeStyles';
import DateUtils from '@libs/DateUtils';
import Navigation from '@libs/Navigation/Navigation';
import variables from '@styles/variables';
import * as Expensicons from '@src/components/Icon/Expensicons';
import CONST from '@src/CONST';
import * as ReportUtils from '@src/libs/ReportUtils';
import * as TripReservationUtils from '@src/libs/TripReservationUtils';
import ROUTES from '@src/ROUTES';
import type {Reservation, ReservationTimeDetails} from '@src/types/onyx/Transaction';

type TripDetailsViewProps = {
/** The active tripRoomReportID, used for Onyx subscription */
tripRoomReportID?: string;
tripRoomReportID: string;

/** Whether we should display the horizontal rule below the component */
shouldShowHorizontalRule: boolean;
};

type ReservationViewProps = {
reservation: Reservation;
transactionID: string;
tripRoomReportID: string;
reservationIndex: number;
};

function ReservationView({reservation}: ReservationViewProps) {
function ReservationView({reservation, transactionID, tripRoomReportID, reservationIndex}: ReservationViewProps) {
const theme = useTheme();
const styles = useThemeStyles();
const StyleUtils = useStyleUtils();
Expand Down Expand Up @@ -75,11 +80,14 @@ function ReservationView({reservation}: ReservationViewProps) {
const vendor = reservation.vendor ? `${reservation.vendor} • ` : '';
return `${vendor}${reservation.start.location}`;
}
if (reservation.type === CONST.RESERVATION_TYPE.TRAIN) {
return reservation.route?.name;
}
return reservation.start.address ?? reservation.start.location;
}, [reservation]);

const titleComponent = () => {
if (reservation.type === CONST.RESERVATION_TYPE.FLIGHT) {
if (reservation.type === CONST.RESERVATION_TYPE.FLIGHT || reservation.type === CONST.RESERVATION_TYPE.TRAIN) {
return (
<View style={styles.gap1}>
<View style={[styles.flexRow, styles.alignItemsCenter, styles.gap2]}>
Expand Down Expand Up @@ -129,6 +137,7 @@ function ReservationView({reservation}: ReservationViewProps) {
iconWidth={20}
iconStyles={[StyleUtils.getTripReservationIconContainer(false), styles.mr3]}
secondaryIconFill={theme.icon}
onPress={() => Navigation.navigate(ROUTES.TRAVEL_TRIP_DETAILS.getRoute(tripRoomReportID, transactionID, reservationIndex, Navigation.getReportRHPActiveRoute()))}
/>
);
}
Expand All @@ -138,7 +147,7 @@ function TripDetailsView({tripRoomReportID, shouldShowHorizontalRule}: TripDetai
const {translate} = useLocalize();

const tripTransactions = ReportUtils.getTripTransactions(tripRoomReportID);
const reservations: Reservation[] = TripReservationUtils.getReservationsFromTripTransactions(tripTransactions);
const reservationsData: TripReservationUtils.ReservationData[] = TripReservationUtils.getReservationsFromTripTransactions(tripTransactions);

return (
<View>
Expand All @@ -153,11 +162,18 @@ function TripDetailsView({tripRoomReportID, shouldShowHorizontalRule}: TripDetai
</View>
</View>
<>
{reservations.map((reservation) => (
<OfflineWithFeedback>
<ReservationView reservation={reservation} />
</OfflineWithFeedback>
))}
{reservationsData.map(({reservation, transactionID, reservationIndex}) => {
return (
<OfflineWithFeedback>
<ReservationView
reservation={reservation}
transactionID={transactionID}
tripRoomReportID={tripRoomReportID}
reservationIndex={reservationIndex}
/>
</OfflineWithFeedback>
);
})}
<SpacerView
shouldShow={shouldShowHorizontalRule}
style={[shouldShowHorizontalRule && styles.reportHorizontalRule]}
Expand All @@ -170,3 +186,4 @@ function TripDetailsView({tripRoomReportID, shouldShowHorizontalRule}: TripDetai
TripDetailsView.displayName = 'TripDetailsView';

export default TripDetailsView;
export {ReservationView};
Loading
Loading