Skip to content

Commit 2fb2789

Browse files
authored
Merge pull request #54760 from shubham1206agra/per-diem-6
Implemented BE part of Per Diem Request
2 parents 3c588ad + 2ae74b1 commit 2fb2789

28 files changed

Lines changed: 1099 additions & 394 deletions

src/CONST.ts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2328,6 +2328,8 @@ const CONST = {
23282328

23292329
IOU: {
23302330
MAX_RECENT_REPORTS_TO_SHOW: 5,
2331+
// This will guranatee that the quantity input will not exceed 9,007,199,254,740,991 (Number.MAX_SAFE_INTEGER).
2332+
QUANTITY_MAX_LENGTH: 12,
23312333
// This is the transactionID used when going through the create expense flow so that it mimics a real transaction (like the edit flow)
23322334
OPTIMISTIC_TRANSACTION_ID: '1',
23332335
// Note: These payment types are used when building IOU reportAction message values in the server and should

src/components/Attachments/AttachmentView/index.tsx

Lines changed: 13 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@ import DistanceEReceipt from '@components/DistanceEReceipt';
99
import EReceipt from '@components/EReceipt';
1010
import Icon from '@components/Icon';
1111
import * as Expensicons from '@components/Icon/Expensicons';
12+
import PerDiemEReceipt from '@components/PerDiemEReceipt';
1213
import ScrollView from '@components/ScrollView';
1314
import Text from '@components/Text';
1415
import {usePlaybackContext} from '@components/VideoPlayerContexts/PlaybackContext';
@@ -18,10 +19,10 @@ import useStyledSafeAreaInsets from '@hooks/useStyledSafeAreaInsets';
1819
import useStyleUtils from '@hooks/useStyleUtils';
1920
import useTheme from '@hooks/useTheme';
2021
import useThemeStyles from '@hooks/useThemeStyles';
21-
import * as CachedPDFPaths from '@libs/actions/CachedPDFPaths';
22+
import {add as addCachedPDFPaths} from '@libs/actions/CachedPDFPaths';
2223
import addEncryptedAuthTokenToURL from '@libs/addEncryptedAuthTokenToURL';
23-
import * as FileUtils from '@libs/fileDownload/FileUtils';
24-
import * as TransactionUtils from '@libs/TransactionUtils';
24+
import {getFileResolution, isHighResolutionImage} from '@libs/fileDownload/FileUtils';
25+
import {hasEReceipt, hasReceiptSource, isDistanceRequest, isPerDiemRequest} from '@libs/TransactionUtils';
2526
import type {ColorValue} from '@styles/utils/types';
2627
import variables from '@styles/variables';
2728
import ONYXKEYS from '@src/ONYXKEYS';
@@ -133,8 +134,8 @@ function AttachmentView({
133134
const {isOffline} = useNetwork({onReconnect: () => setImageError(false)});
134135

135136
useEffect(() => {
136-
FileUtils.getFileResolution(file).then((resolution) => {
137-
setIsHighResolution(FileUtils.isHighResolutionImage(resolution));
137+
getFileResolution(file).then((resolution) => {
138+
setIsHighResolution(isHighResolutionImage(resolution));
138139
});
139140
}, [file]);
140141

@@ -160,7 +161,11 @@ function AttachmentView({
160161
);
161162
}
162163

163-
if (transaction && !TransactionUtils.hasReceiptSource(transaction) && TransactionUtils.hasEReceipt(transaction)) {
164+
if (isPerDiemRequest(transaction) && transaction && !hasReceiptSource(transaction)) {
165+
return <PerDiemEReceipt transactionID={transaction.transactionID} />;
166+
}
167+
168+
if (transaction && !hasReceiptSource(transaction) && hasEReceipt(transaction)) {
164169
return (
165170
<View style={[styles.flex1, styles.alignItemsCenter]}>
166171
<ScrollView
@@ -183,7 +188,7 @@ function AttachmentView({
183188
const onPDFLoadComplete = (path: string) => {
184189
const id = (transaction && transaction.transactionID) ?? reportActionID;
185190
if (path && id) {
186-
CachedPDFPaths.add(id, path);
191+
addCachedPDFPaths(id, path);
187192
}
188193
if (!loadComplete) {
189194
setLoadComplete(true);
@@ -215,7 +220,7 @@ function AttachmentView({
215220
);
216221
}
217222

218-
if (TransactionUtils.isDistanceRequest(transaction) && transaction) {
223+
if (isDistanceRequest(transaction) && transaction) {
219224
return <DistanceEReceipt transaction={transaction} />;
220225
}
221226

src/components/EReceiptThumbnail.tsx

Lines changed: 24 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -1,32 +1,26 @@
11
import React, {useMemo} from 'react';
22
import {View} from 'react-native';
3-
import type {OnyxEntry} from 'react-native-onyx';
4-
import {withOnyx} from 'react-native-onyx';
3+
import {useOnyx} from 'react-native-onyx';
54
import useStyleUtils from '@hooks/useStyleUtils';
65
import useThemeStyles from '@hooks/useThemeStyles';
7-
import * as ReportUtils from '@libs/ReportUtils';
8-
import * as TripReservationUtils from '@libs/TripReservationUtils';
6+
import {getTransactionDetails} from '@libs/ReportUtils';
7+
import {isPerDiemRequest as isPerDiemRequestTransactionUtils} from '@libs/TransactionUtils';
8+
import {getTripEReceiptIcon} from '@libs/TripReservationUtils';
99
import colors from '@styles/theme/colors';
1010
import variables from '@styles/variables';
1111
import CONST from '@src/CONST';
1212
import ONYXKEYS from '@src/ONYXKEYS';
13-
import type {Transaction} from '@src/types/onyx';
1413
import Icon from './Icon';
1514
import * as eReceiptBGs from './Icon/EReceiptBGs';
1615
import * as Expensicons from './Icon/Expensicons';
1716
import * as MCCIcons from './Icon/MCCIcons';
1817
import Image from './Image';
1918
import Text from './Text';
2019

21-
type EReceiptThumbnailOnyxProps = {
22-
transaction: OnyxEntry<Transaction>;
23-
};
24-
2520
type IconSize = 'x-small' | 'small' | 'medium' | 'large';
2621

27-
type EReceiptThumbnailProps = EReceiptThumbnailOnyxProps & {
28-
/** TransactionID of the transaction this EReceipt corresponds to. It's used by withOnyx HOC */
29-
// eslint-disable-next-line react/no-unused-prop-types
22+
type EReceiptThumbnailProps = {
23+
/** TransactionID of the transaction this EReceipt corresponds to. */
3024
transactionID: string;
3125

3226
/** Border radius to be applied on the parent view. */
@@ -54,20 +48,22 @@ const backgroundImages = {
5448
[CONST.ERECEIPT_COLORS.PINK]: eReceiptBGs.EReceiptBG_Pink,
5549
};
5650

57-
function EReceiptThumbnail({transaction, borderRadius, fileExtension, isReceiptThumbnail = false, centerIconV = true, iconSize = 'large'}: EReceiptThumbnailProps) {
51+
function EReceiptThumbnail({transactionID, borderRadius, fileExtension, isReceiptThumbnail = false, centerIconV = true, iconSize = 'large'}: EReceiptThumbnailProps) {
5852
const styles = useThemeStyles();
5953
const StyleUtils = useStyleUtils();
54+
const [transaction] = useOnyx(`${ONYXKEYS.COLLECTION.TRANSACTION}${transactionID}`);
6055
const colorCode = isReceiptThumbnail ? StyleUtils.getFileExtensionColorCode(fileExtension) : StyleUtils.getEReceiptColorCode(transaction);
6156

6257
const backgroundImage = useMemo(() => backgroundImages[colorCode], [colorCode]);
6358

6459
const colorStyles = StyleUtils.getEReceiptColorStyles(colorCode);
6560
const primaryColor = colorStyles?.backgroundColor;
6661
const secondaryColor = colorStyles?.color;
67-
const transactionDetails = ReportUtils.getTransactionDetails(transaction);
62+
const transactionDetails = getTransactionDetails(transaction);
6863
const transactionMCCGroup = transactionDetails?.mccGroup;
6964
const MCCIcon = transactionMCCGroup ? MCCIcons[`${transactionMCCGroup}`] : undefined;
70-
const tripIcon = TripReservationUtils.getTripEReceiptIcon(transaction);
65+
const tripIcon = getTripEReceiptIcon(transaction);
66+
const isPerDiemRequest = isPerDiemRequestTransactionUtils(transaction);
7167

7268
let receiptIconWidth: number = variables.eReceiptIconWidth;
7369
let receiptIconHeight: number = variables.eReceiptIconHeight;
@@ -135,15 +131,23 @@ function EReceiptThumbnail({transaction, borderRadius, fileExtension, isReceiptT
135131
{fileExtension.toUpperCase()}
136132
</Text>
137133
)}
138-
{MCCIcon && !isReceiptThumbnail ? (
134+
{isPerDiemRequest ? (
135+
<Icon
136+
src={Expensicons.CalendarSolid}
137+
height={receiptMCCSize}
138+
width={receiptMCCSize}
139+
fill={primaryColor}
140+
/>
141+
) : null}
142+
{!isPerDiemRequest && MCCIcon && !isReceiptThumbnail ? (
139143
<Icon
140144
src={MCCIcon}
141145
height={receiptMCCSize}
142146
width={receiptMCCSize}
143147
fill={primaryColor}
144148
/>
145149
) : null}
146-
{!MCCIcon && tripIcon ? (
150+
{!isPerDiemRequest && !MCCIcon && tripIcon ? (
147151
<Icon
148152
src={tripIcon}
149153
height={receiptMCCSize}
@@ -158,9 +162,6 @@ function EReceiptThumbnail({transaction, borderRadius, fileExtension, isReceiptT
158162
}
159163

160164
EReceiptThumbnail.displayName = 'EReceiptThumbnail';
161-
export default withOnyx<EReceiptThumbnailProps, EReceiptThumbnailOnyxProps>({
162-
transaction: {
163-
key: ({transactionID}) => `${ONYXKEYS.COLLECTION.TRANSACTION}${transactionID}`,
164-
},
165-
})(EReceiptThumbnail);
166-
export type {IconSize, EReceiptThumbnailProps, EReceiptThumbnailOnyxProps};
165+
export default EReceiptThumbnail;
166+
167+
export type {IconSize, EReceiptThumbnailProps};

0 commit comments

Comments
 (0)