diff --git a/src/CONST.ts b/src/CONST.ts
index 57903e64abcd..9aef93f1a1b8 100755
--- a/src/CONST.ts
+++ b/src/CONST.ts
@@ -1370,6 +1370,9 @@ const CONST = {
MAKE_REQUEST_WITH_SIDE_EFFECTS: 'makeRequestWithSideEffects',
},
+ MAP_PADDING: 50,
+ MAP_MARKER_SIZE: 20,
+
QUICK_REACTIONS: [
{
name: '+1',
diff --git a/src/components/ConfirmedRoute.js b/src/components/ConfirmedRoute.js
new file mode 100644
index 000000000000..07d0fdc6ca97
--- /dev/null
+++ b/src/components/ConfirmedRoute.js
@@ -0,0 +1,118 @@
+import React, {useEffect} from 'react';
+import PropTypes from 'prop-types';
+import {View} from 'react-native';
+import MapView from 'react-native-x-maps';
+import {withOnyx} from 'react-native-onyx';
+import lodashGet from 'lodash/get';
+import _ from 'underscore';
+import ONYXKEYS from '../ONYXKEYS';
+import CONST from '../CONST';
+import * as MapboxToken from '../libs/actions/MapboxToken';
+import * as Expensicons from './Icon/Expensicons';
+import theme from '../styles/themes/default';
+import styles from '../styles/styles';
+import transactionPropTypes from './transactionPropTypes';
+import BlockingView from './BlockingViews/BlockingView';
+import useNetwork from '../hooks/useNetwork';
+import useLocalize from '../hooks/useLocalize';
+
+const propTypes = {
+ /** Transaction that stores the distance request data */
+ transaction: transactionPropTypes,
+
+ /** Token needed to render the map */
+ mapboxToken: PropTypes.string,
+};
+
+const defaultProps = {
+ transaction: {},
+ mapboxToken: '',
+};
+
+const getWaypointMarkers = (waypoints) => {
+ const numberOfWaypoints = _.size(waypoints);
+ const lastWaypointIndex = numberOfWaypoints - 1;
+ return _.filter(
+ _.map(waypoints, (waypoint, key) => {
+ if (!waypoint || waypoint.lng === undefined || waypoint.lat === undefined) {
+ return;
+ }
+
+ const index = Number(key.replace('waypoint', ''));
+ let MarkerComponent;
+ if (index === 0) {
+ MarkerComponent = Expensicons.DotIndicatorUnfilled;
+ } else if (index === lastWaypointIndex) {
+ MarkerComponent = Expensicons.Location;
+ } else {
+ MarkerComponent = Expensicons.DotIndicator;
+ }
+
+ return {
+ coordinate: [waypoint.lng, waypoint.lat],
+ markerComponent: () => (
+
+ ),
+ };
+ }),
+ (waypoint) => waypoint,
+ );
+};
+
+function ConfirmedRoute({mapboxToken, transaction}) {
+ const {isOffline} = useNetwork();
+ const {translate} = useLocalize();
+ const {route0: route} = transaction.routes || {};
+ const waypoints = lodashGet(transaction, 'comment.waypoints', {});
+ const coordinates = lodashGet(route, 'geometry.coordinates', []);
+ const waypointMarkers = getWaypointMarkers(waypoints);
+
+ useEffect(() => {
+ MapboxToken.init();
+ return MapboxToken.stop;
+ }, []);
+
+ return (
+ <>
+ {!isOffline && mapboxToken ? (
+
+ ) : (
+
+
+
+ )}
+ >
+ );
+}
+
+export default withOnyx({
+ transaction: {
+ key: ({transactionID}) => `${ONYXKEYS.COLLECTION.TRANSACTION}${transactionID}`,
+ },
+ mapboxToken: {
+ key: ONYXKEYS.MAPBOX_ACCESS_TOKEN,
+ selector: (mapboxAccessToken) => mapboxAccessToken && mapboxAccessToken.token,
+ },
+})(ConfirmedRoute);
+
+ConfirmedRoute.displayName = 'ConfirmedRoute';
+ConfirmedRoute.propTypes = propTypes;
+ConfirmedRoute.defaultProps = defaultProps;
diff --git a/src/components/DistanceRequest.js b/src/components/DistanceRequest.js
index 55e339b63382..9ba5fd76a95a 100644
--- a/src/components/DistanceRequest.js
+++ b/src/components/DistanceRequest.js
@@ -23,20 +23,28 @@ import useNetwork from '../hooks/useNetwork';
import useLocalize from '../hooks/useLocalize';
import Navigation from '../libs/Navigation/Navigation';
import ROUTES from '../ROUTES';
+import * as IOU from '../libs/actions/IOU';
+import reportPropTypes from '../pages/reportPropTypes';
import transactionPropTypes from './transactionPropTypes';
import DotIndicatorMessage from './DotIndicatorMessage';
import * as ErrorUtils from '../libs/ErrorUtils';
import usePrevious from '../hooks/usePrevious';
+import {iouPropTypes} from '../pages/iou/propTypes';
const MAX_WAYPOINTS = 25;
const MAX_WAYPOINTS_TO_DISPLAY = 4;
-const MAP_PADDING = 50;
const DEFAULT_ZOOM_LEVEL = 10;
const propTypes = {
- /** The transactionID of this request */
- transactionID: PropTypes.string,
+ /** Holds data related to Money Request view state, rather than the underlying Money Request data. */
+ iou: iouPropTypes,
+
+ /** Type of money request (i.e. IOU) */
+ iouType: PropTypes.oneOf(_.values(CONST.IOU.MONEY_REQUEST_TYPE)),
+
+ /** The report to which the distance request is associated */
+ report: reportPropTypes,
/** The optimistic transaction for this request */
transaction: transactionPropTypes,
@@ -52,18 +60,21 @@ const propTypes = {
};
const defaultProps = {
- transactionID: '',
+ iou: {},
+ iouType: '',
+ report: {},
transaction: {},
mapboxAccessToken: {},
};
-function DistanceRequest({transactionID, transaction, mapboxAccessToken}) {
+function DistanceRequest({iou, iouType, report, transaction, mapboxAccessToken}) {
const [shouldShowGradient, setShouldShowGradient] = useState(false);
const [scrollContainerHeight, setScrollContainerHeight] = useState(0);
const [scrollContentHeight, setScrollContentHeight] = useState(0);
const {isOffline} = useNetwork();
const {translate} = useLocalize();
+ const reportID = lodashGet(report, 'reportID', '');
const waypoints = lodashGet(transaction, 'comment.waypoints', {});
const numberOfWaypoints = _.size(waypoints);
@@ -95,8 +106,8 @@ function DistanceRequest({transactionID, transaction, mapboxAccessToken}) {
coordinate: [waypoint.lng, waypoint.lat],
markerComponent: () => (
),
@@ -115,12 +126,12 @@ function DistanceRequest({transactionID, transaction, mapboxAccessToken}) {
}, []);
useEffect(() => {
- if (!transactionID || !_.isEmpty(waypoints)) {
+ if (!iou.transactionID || !_.isEmpty(waypoints)) {
return;
}
// Create the initial start and stop waypoints
- Transaction.createInitialWaypoints(transactionID);
- }, [transactionID, waypoints]);
+ Transaction.createInitialWaypoints(iou.transactionID);
+ }, [iou.transactionID, waypoints]);
const updateGradientVisibility = (event = {}) => {
// If a waypoint extends past the bottom of the visible area show the gradient, else hide it.
@@ -133,8 +144,8 @@ function DistanceRequest({transactionID, transaction, mapboxAccessToken}) {
return;
}
- Transaction.getRoute(transactionID, waypoints);
- }, [shouldFetchRoute, transactionID, waypoints, isOffline]);
+ Transaction.getRoute(iou.transactionID, waypoints);
+ }, [shouldFetchRoute, iou.transactionID, waypoints, isOffline]);
useEffect(updateGradientVisibility, [scrollContainerHeight, scrollContentHeight]);
@@ -197,7 +208,7 @@ function DistanceRequest({transactionID, transaction, mapboxAccessToken}) {