diff --git a/src/components/DistanceRequest.js b/src/components/DistanceRequest.js index 19a3b9ec6926..453261f8607b 100644 --- a/src/components/DistanceRequest.js +++ b/src/components/DistanceRequest.js @@ -90,8 +90,8 @@ function DistanceRequest({iou, iouType, report, transaction, mapboxAccessToken}) const previousWaypoints = usePrevious(waypoints); const haveWaypointsChanged = !_.isEqual(previousWaypoints, waypoints); const doesRouteExist = lodashHas(transaction, 'routes.route0.geometry.coordinates'); - const shouldFetchRoute = (!doesRouteExist || haveWaypointsChanged) && !isLoadingRoute && TransactionUtils.validateWaypoints(waypoints); - + const validatedWaypoints = TransactionUtils.getValidWaypoints(waypoints); + const shouldFetchRoute = (!doesRouteExist || haveWaypointsChanged) && !isLoadingRoute && _.size(validatedWaypoints) > 1; const waypointMarkers = useMemo( () => _.filter( @@ -149,14 +149,13 @@ function DistanceRequest({iou, iouType, report, transaction, mapboxAccessToken}) const visibleAreaEnd = lodashGet(event, 'nativeEvent.contentOffset.y', 0) + scrollContainerHeight; setShouldShowGradient(visibleAreaEnd < scrollContentHeight); }; - useEffect(() => { if (isOffline || !shouldFetchRoute) { return; } - Transaction.getRoute(iou.transactionID, waypoints); - }, [shouldFetchRoute, iou.transactionID, waypoints, isOffline]); + Transaction.getRoute(iou.transactionID, validatedWaypoints); + }, [shouldFetchRoute, iou.transactionID, validatedWaypoints, isOffline]); useEffect(updateGradientVisibility, [scrollContainerHeight, scrollContentHeight]); @@ -255,7 +254,7 @@ function DistanceRequest({iou, iouType, report, transaction, mapboxAccessToken}) success style={[styles.w100, styles.mb4, styles.ph4, styles.flexShrink0]} onPress={() => IOU.navigateToNextPage(iou, iouType, reportID, report)} - isDisabled={waypointMarkers.length < 2} + isDisabled={_.size(validatedWaypoints) < 2} text={translate('common.next')} /> diff --git a/src/libs/TransactionUtils.js b/src/libs/TransactionUtils.js index 5c1c688f796f..b31ebb0757c9 100644 --- a/src/libs/TransactionUtils.js +++ b/src/libs/TransactionUtils.js @@ -285,34 +285,56 @@ function getAllReportTransactions(reportID) { } /** - * Verifies that the provided waypoints are valid + * Checks if a waypoint has a valid address + * @param {Object} waypoint + * @returns {Boolean} Returns true if the address is valid + */ +function waypointHasValidAddress(waypoint) { + if (!waypoint || !waypoint.address || typeof waypoint.address !== 'string' || waypoint.address.trim() === '') { + return false; + } + return true; +} + +/** + * Filters the waypoints which are valid and returns those * @param {Object} waypoints - * @returns {Boolean} + * @param {Boolean} reArrangeIndexes + * @returns {Object} validated waypoints */ -function validateWaypoints(waypoints) { +function getValidWaypoints(waypoints, reArrangeIndexes = false) { const waypointValues = _.values(waypoints); - // Ensure the number of waypoints is between 2 and 25 if (waypointValues.length < 2 || waypointValues.length > 25) { - return false; + return {}; } - for (let i = 0; i < waypointValues.length; i++) { - const currentWaypoint = waypointValues[i]; - const previousWaypoint = waypointValues[i - 1]; + let lastWaypointIndex = -1; - // Check if the waypoint has a valid address - if (!currentWaypoint || !currentWaypoint.address || typeof currentWaypoint.address !== 'string' || currentWaypoint.address.trim() === '') { - return false; - } + const validWaypoints = _.reduce( + waypointValues, + (acc, currentWaypoint, index) => { + const previousWaypoint = waypointValues[lastWaypointIndex]; + // Check if the waypoint has a valid address + if (!waypointHasValidAddress(currentWaypoint)) { + return acc; + } - // Check for adjacent waypoints with the same address - if (previousWaypoint && currentWaypoint.address === previousWaypoint.address) { - return false; - } - } + // Check for adjacent waypoints with the same address + if (previousWaypoint && currentWaypoint.address === previousWaypoint.address) { + return acc; + } - return true; + const validatedWaypoints = {...acc, [`waypoint${reArrangeIndexes ? lastWaypointIndex + 1 : index}`]: currentWaypoint}; + + lastWaypointIndex += 1; + + return validatedWaypoints; + }, + {}, + ); + + return validWaypoints; } export { @@ -328,7 +350,7 @@ export { getAllReportTransactions, hasReceipt, isReceiptBeingScanned, - validateWaypoints, + getValidWaypoints, isDistanceRequest, hasMissingSmartscanFields, }; diff --git a/src/libs/actions/IOU.js b/src/libs/actions/IOU.js index 610e67a9c565..b4f04174c1ac 100644 --- a/src/libs/actions/IOU.js +++ b/src/libs/actions/IOU.js @@ -533,7 +533,7 @@ function createDistanceRequest(report, participant, comment, created, transactio createdChatReportActionID, createdIOUReportActionID, reportPreviewReportActionID: reportPreviewAction.reportActionID, - waypoints: JSON.stringify(transaction.comment.waypoints), + waypoints: JSON.stringify(TransactionUtils.getValidWaypoints(transaction.comment.waypoints, true)), created, }, onyxData,