Skip to content
Open
Show file tree
Hide file tree
Changes from 3 commits
Commits
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
6 changes: 1 addition & 5 deletions src/pages/iou/request/IOURequestStartPage.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -97,7 +97,6 @@ function IOURequestStartPage({
});

const [lastSelectedDistanceRates] = useOnyx(ONYXKEYS.NVP_LAST_SELECTED_DISTANCE_RATES);
const [isMultiScanEnabled, setIsMultiScanEnabled] = useState(false);
const [currentDate] = useOnyx(ONYXKEYS.CURRENT_DATE);
const {isOffline} = useNetwork();
const [hasUserSubmittedExpenseOrScannedReceipt] = useOnyx(ONYXKEYS.NVP_DISMISSED_PRODUCT_TRAINING, {selector: isTestReceiptTooltipDismissedSelector});
Expand Down Expand Up @@ -186,7 +185,6 @@ function IOURequestStartPage({
if (transaction?.iouRequestType === newIOUType) {
return;
}
setIsMultiScanEnabled(false);
initMoneyRequest({
reportID,
policy,
Expand Down Expand Up @@ -340,14 +338,12 @@ function IOURequestStartPage({
{() => (
<TabScreenWithFocusTrapWrapper>
<IOURequestStepScan
key={selectedTab ?? CONST.TAB_REQUEST.SCAN}
route={route}
navigation={navigation}
onLayout={(setTestReceiptAndNavigate) => {
setTestReceiptAndNavigateRef.current = setTestReceiptAndNavigate;
}}
isMultiScanEnabled={isMultiScanEnabled}
setIsMultiScanEnabled={setIsMultiScanEnabled}
isStartingScan
/>
</TabScreenWithFocusTrapWrapper>
)}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -43,10 +43,9 @@
iouType: IOUType;
currentUserPersonalDetails: CurrentUserPersonalDetails;
reportID: string;
isMultiScanEnabled?: boolean;
isStartingScan?: boolean;
isStartingScan: boolean;
updateScanAndNavigate: (file: FileObject, source: string) => void;
setIsMultiScanEnabled?: (value: boolean) => void;
setIsMultiScanEnabled: (value: boolean) => void;
PDFValidationComponent: React.ReactNode;
shouldAcceptMultipleFiles: boolean;
receiptFiles: ReceiptFile[];
Expand All @@ -56,9 +55,10 @@
navigateToConfirmationStep: (files: ReceiptFile[], locationPermissionGranted?: boolean, isTestTransaction?: boolean) => void;
shouldSkipConfirmation: boolean;
setStartLocationPermissionFlow: (value: boolean) => void;
onLayout?: () => void;
onBackButtonPress: () => void;
shouldShowWrapper: boolean;
isMultiScanEnabled?: boolean;
onLayout?: () => void;
};

/**
Expand Down Expand Up @@ -103,7 +103,6 @@
iouType,
currentUserPersonalDetails,
reportID,
isMultiScanEnabled = false,
isStartingScan,
updateScanAndNavigate,
setIsMultiScanEnabled,
Expand All @@ -116,9 +115,10 @@
navigateToConfirmationStep,
shouldSkipConfirmation,
setStartLocationPermissionFlow,
onLayout,
onBackButtonPress,
shouldShowWrapper,
isMultiScanEnabled = false,
onLayout,
}: MobileWebCameraViewProps) {
const {blinkStyle, canUseMultiScan, shouldShowMultiScanEducationalPopup, showBlink, toggleMultiScan, dismissMultiScanEducationalPopup, submitReceipts, submitMultiScanReceipts} =
useMobileReceiptScan({
Expand Down Expand Up @@ -444,7 +444,7 @@
) : null}
<Animated.View
pointerEvents="none"
style={[StyleSheet.absoluteFillObject, styles.backgroundWhite, blinkStyle, styles.zIndex10]}

Check failure on line 447 in src/pages/iou/request/step/IOURequestStepScan/components/MobileWebCameraView.tsx

View workflow job for this annotation

GitHub Actions / Changed files ESLint check

`absoluteFillObject` is deprecated. Use `StyleSheet.absoluteFill`

Check failure on line 447 in src/pages/iou/request/step/IOURequestStepScan/components/MobileWebCameraView.tsx

View workflow job for this annotation

GitHub Actions / Changed files ESLint check

`absoluteFillObject` is deprecated. Use `StyleSheet.absoluteFill`
/>
</View>
)}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -19,7 +19,7 @@ function useMobileReceiptScan({
initialTransaction,
iouType,
isMultiScanEnabled = false,
isStartingScan = false,
isStartingScan,
receiptFiles,
navigateToConfirmationStep,
shouldSkipConfirmation,
Expand Down Expand Up @@ -78,7 +78,7 @@ function useMobileReceiptScan({
}
removeTransactionReceipt(CONST.IOU.OPTIMISTIC_TRANSACTION_ID);
removeDraftTransactionsByIDs(draftTransactionIDs, true);
setIsMultiScanEnabled?.(!isMultiScanEnabled);
setIsMultiScanEnabled(!isMultiScanEnabled);
}

function dismissMultiScanEducationalPopup() {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -37,8 +37,6 @@ function useReceiptScan({
currentUserPersonalDetails,
backTo,
backToReport,
isMultiScanEnabled = false,
isStartingScan = false,
updateScanAndNavigate,
getSource,
}: UseReceiptScanParams) {
Expand Down Expand Up @@ -69,6 +67,8 @@ function useReceiptScan({
const [userBillingGracePeriodEnds] = useOnyx(ONYXKEYS.COLLECTION.SHARED_NVP_PRIVATE_USER_BILLING_GRACE_PERIOD_END);
const [ownerBillingGracePeriodEnd] = useOnyx(ONYXKEYS.NVP_PRIVATE_OWNER_BILLING_GRACE_PERIOD_END);
const draftTransactionIDs = Object.keys(allTransactionDrafts ?? {});
const [isMultiScanEnabled, setIsMultiScanEnabled] = useState((transactions ?? []).length > 1);
const isStartingScan = action === CONST.IOU.ACTION.CREATE;

const isEditing = action === CONST.IOU.ACTION.EDIT;
const isArchived = isArchivedReport(reportNameValuePairs);
Expand Down Expand Up @@ -232,6 +232,9 @@ function useReceiptScan({
});
return {
transactions,
isMultiScanEnabled,
setIsMultiScanEnabled,
isStartingScan,
isEditing,
isReplacingReceipt,
shouldAcceptMultipleFiles,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -64,9 +64,6 @@ function IOURequestStepScan({
transaction: initialTransaction,
currentUserPersonalDetails,
onLayout,
isMultiScanEnabled = false,
isStartingScan = false,
setIsMultiScanEnabled,
}: IOURequestStepScanProps) {
const theme = useTheme();
const styles = useThemeStyles();
Expand Down Expand Up @@ -288,6 +285,9 @@ function IOURequestStepScan({
const getSource = useCallback((file: FileObject) => file.uri ?? '', []);

const {
isMultiScanEnabled,
setIsMultiScanEnabled,
isStartingScan,
isEditing,
shouldAcceptMultipleFiles,
shouldSkipConfirmation,
Expand All @@ -310,8 +310,6 @@ function IOURequestStepScan({
currentUserPersonalDetails,
backTo,
backToReport,
isMultiScanEnabled,
isStartingScan,
updateScanAndNavigate,
getSource,
});
Expand Down
10 changes: 4 additions & 6 deletions src/pages/iou/request/step/IOURequestStepScan/index.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -32,9 +32,6 @@ function IOURequestStepScan({
transaction: initialTransaction,
currentUserPersonalDetails,
onLayout,
isMultiScanEnabled = false,
isStartingScan = false,
setIsMultiScanEnabled,
}: Omit<IOURequestStepScanProps, 'user'>) {
const isMobileWeb = isMobile();
const policy = usePolicy(report?.policyID);
Expand Down Expand Up @@ -62,6 +59,9 @@ function IOURequestStepScan({

const {
transactions,
isMultiScanEnabled,
setIsMultiScanEnabled,
isStartingScan,
isEditing,
isReplacingReceipt,
shouldAcceptMultipleFiles,
Expand All @@ -85,8 +85,6 @@ function IOURequestStepScan({
currentUserPersonalDetails,
backTo,
backToReport,
isMultiScanEnabled,
isStartingScan,
updateScanAndNavigate,
getSource,
});
Expand Down Expand Up @@ -127,7 +125,7 @@ function IOURequestStepScan({
if (isAllScanFilesCanBeRead) {
return;
}
setIsMultiScanEnabled?.(false);
setIsMultiScanEnabled(false);
removeTransactionReceipt(CONST.IOU.OPTIMISTIC_TRANSACTION_ID);
removeDraftTransactionsByIDs(draftTransactionIDs, true);
});
Expand Down
21 changes: 3 additions & 18 deletions src/pages/iou/request/step/IOURequestStepScan/types.ts
Original file line number Diff line number Diff line change
Expand Up @@ -38,12 +38,6 @@ type UseReceiptScanParams = {
/** Report ID to navigate back to */
backToReport: string | undefined;

/** Whether multi-scan is enabled */
isMultiScanEnabled: boolean | undefined;

/** Whether the user is starting a scan request */
isStartingScan: boolean | undefined;

/** Callback to replace receipt and navigate back when editing */
updateScanAndNavigate: (file: FileObject, source: string) => void;

Expand All @@ -62,7 +56,7 @@ type UseMobileReceiptScanParams = {
isMultiScanEnabled?: boolean;

/** Whether the user is starting a scan request */
isStartingScan?: boolean;
isStartingScan: boolean;

/** The current receipt files being scanned */
receiptFiles: ReceiptFile[];
Expand All @@ -76,8 +70,8 @@ type UseMobileReceiptScanParams = {
/** Callback to start the location permission flow */
setStartLocationPermissionFlow: (value: boolean) => void;

/** Callback to update multi-scan enabled state in parent */
setIsMultiScanEnabled: ((value: boolean) => void) | undefined;
/** Callback to update multi-scan enabled state */
setIsMultiScanEnabled: (value: boolean) => void;
};

type IOURequestStepScanProps = WithCurrentUserPersonalDetailsProps &
Expand All @@ -90,15 +84,6 @@ type IOURequestStepScanProps = WithCurrentUserPersonalDetailsProps &
* Receives a function (`setTestReceiptAndNavigate`) as an argument,
*/
onLayout?: (setTestReceiptAndNavigate: () => void) => void;

/** If the receipts preview should be shown */
isMultiScanEnabled?: boolean;

/** Updates isMultiScanEnabled flag */
setIsMultiScanEnabled?: (value: boolean) => void;

/** Indicates whether users start to create scan request */
isStartingScan?: boolean;
};

type ReceiptFile = {
Expand Down
10 changes: 7 additions & 3 deletions tests/ui/IOURequestStepScanTest.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -171,15 +171,22 @@ describe('IOURequestStepScan', () => {
const REPORT_ID = '1';
const POLICY_ID = 'policy-1';
const TRANSACTION_ID_1 = '101';
const TRANSACTION_ID_2 = '102';

const transaction1 = createRandomTransaction(1);
transaction1.reportID = REPORT_ID;
transaction1.transactionID = TRANSACTION_ID_1;
transaction1.receipt = {source: 'file://first-receipt.png', state: CONST.IOU.RECEIPT_STATE.OPEN};

const transaction2 = createRandomTransaction(2);
transaction2.reportID = REPORT_ID;
transaction2.transactionID = TRANSACTION_ID_2;
transaction2.receipt = {source: 'file://second-receipt.png', state: CONST.IOU.RECEIPT_STATE.OPEN};

await act(async () => {
await Onyx.merge(`${ONYXKEYS.COLLECTION.REPORT}${REPORT_ID}`, createMinimalReport(REPORT_ID, POLICY_ID));
await Onyx.merge(`${ONYXKEYS.COLLECTION.TRANSACTION_DRAFT}${TRANSACTION_ID_1}`, transaction1);
await Onyx.merge(`${ONYXKEYS.COLLECTION.TRANSACTION_DRAFT}${TRANSACTION_ID_2}`, transaction2);
});
await waitForBatchedUpdates();

Expand All @@ -202,9 +209,6 @@ describe('IOURequestStepScan', () => {
} as unknown as PlatformStackScreenProps<MoneyRequestNavigatorParamList, typeof SCREENS.MONEY_REQUEST.STEP_SCAN>['route']
}
navigation={{} as never}
isMultiScanEnabled
isStartingScan
setIsMultiScanEnabled={jest.fn()}
/>
</NavigationContainer>
</LocaleContextProvider>
Expand Down
32 changes: 23 additions & 9 deletions tests/unit/hooks/useReceiptScan.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -62,8 +62,6 @@ function createDefaultParams(): Parameters<typeof useReceiptScan>[0] {
getSource: (file: {uri?: string}) => file?.uri ?? 'file://image.png',
backTo: undefined,
backToReport: undefined,
isMultiScanEnabled: false,
isStartingScan: true,
};
}

Expand Down Expand Up @@ -298,9 +296,9 @@ describe('useReceiptScan', () => {
});

it('should clear receiptFiles when isMultiScanEnabled changes from true to false', async () => {
const multiScanParams = {...params, isMultiScanEnabled: true};
const {result, rerender} = renderHook((p: Parameters<typeof useReceiptScan>[0]) => useReceiptScan(p), {
initialProps: multiScanParams,
const {result} = renderHook(() => useReceiptScan(params));
await act(async () => {
result.current.setIsMultiScanEnabled(true);
});
await waitForBatchedUpdatesWithAct();

Expand All @@ -311,7 +309,9 @@ describe('useReceiptScan', () => {
await waitForBatchedUpdatesWithAct();
expect(result.current.receiptFiles).toHaveLength(1);

rerender({...multiScanParams, isMultiScanEnabled: false});
await act(async () => {
result.current.setIsMultiScanEnabled(false);
});
await waitForBatchedUpdatesWithAct();
expect(result.current.receiptFiles).toEqual([]);
});
Expand Down Expand Up @@ -382,6 +382,11 @@ describe('useReceiptScan', () => {
const {result} = renderHook(() => useReceiptScan(params));
await waitForBatchedUpdatesWithAct();

await act(async () => {
result.current.setIsMultiScanEnabled(false);
});
await waitForBatchedUpdatesWithAct();

const files = [{uri: 'file://receipt.jpg', name: 'receipt.jpg', type: 'image/jpeg'}];
await act(async () => {
result.current.validateFiles(files);
Expand All @@ -407,8 +412,12 @@ describe('useReceiptScan', () => {
});

it('should not call removeDraftTransactionsByIDs when multi-scan is enabled', async () => {
const multiScanParams = {...params, isMultiScanEnabled: true, setIsMultiScanEnabled: jest.fn()};
const {result} = renderHook(() => useReceiptScan(multiScanParams));
const {result} = renderHook(() => useReceiptScan(params));
await waitForBatchedUpdatesWithAct();

await act(async () => {
result.current.setIsMultiScanEnabled(true);
});
await waitForBatchedUpdatesWithAct();

const files = [{uri: 'file://receipt.jpg', name: 'receipt.jpg', type: 'image/jpeg'}];
Expand All @@ -420,7 +429,7 @@ describe('useReceiptScan', () => {
});

it('should not call removeDraftTransactionsByIDs when isStartingScan is false', async () => {
const nonStartingParams = {...params, isStartingScan: false};
const nonStartingParams = {...params, action: CONST.IOU.ACTION.SUBMIT};
const {result} = renderHook(() => useReceiptScan(nonStartingParams));
await waitForBatchedUpdatesWithAct();

Expand All @@ -443,6 +452,11 @@ describe('useReceiptScan', () => {
const {result} = renderHook(() => useReceiptScan(params));
await waitForBatchedUpdatesWithAct();

await act(async () => {
result.current.setIsMultiScanEnabled(false);
});
await waitForBatchedUpdatesWithAct();

const files = [{uri: 'file://receipt.jpg', name: 'receipt.jpg', type: 'image/jpeg'}];
await act(async () => {
result.current.validateFiles(files);
Expand Down
Loading