From a88728a6fef49e5d8ecd40672c23e61957e6bde1 Mon Sep 17 00:00:00 2001 From: Ali Toshmatov Date: Tue, 17 Oct 2023 22:59:17 +0500 Subject: [PATCH 1/4] Setting default empty waypoints to empty object rather than null --- src/components/DistanceRequest/index.js | 2 +- src/libs/actions/Transaction.ts | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/src/components/DistanceRequest/index.js b/src/components/DistanceRequest/index.js index 416fefc5af89..9da5fd33d29a 100644 --- a/src/components/DistanceRequest/index.js +++ b/src/components/DistanceRequest/index.js @@ -170,7 +170,7 @@ function DistanceRequest({transactionID, report, transaction, route, isEditingRe const newWaypoints = {}; _.each(data, (waypoint, index) => { const newWaypoint = lodashGet(waypoints, waypoint, {}); - newWaypoints[`waypoint${index}`] = lodashIsEmpty(newWaypoint) ? null : newWaypoint; + newWaypoints[`waypoint${index}`] = lodashIsEmpty(newWaypoint) ? {} : newWaypoint; }); setOptimisticWaypoints(newWaypoints); diff --git a/src/libs/actions/Transaction.ts b/src/libs/actions/Transaction.ts index 8653b038e381..c3b1d982c445 100644 --- a/src/libs/actions/Transaction.ts +++ b/src/libs/actions/Transaction.ts @@ -32,8 +32,8 @@ function createInitialWaypoints(transactionID: string) { Onyx.merge(`${ONYXKEYS.COLLECTION.TRANSACTION}${transactionID}`, { comment: { waypoints: { - waypoint0: null, - waypoint1: null, + waypoint0: {}, + waypoint1: {}, }, }, }); From 19c8e2548d44128e02b1792c32baf009340d549f Mon Sep 17 00:00:00 2001 From: Ali Toshmatov Date: Tue, 17 Oct 2023 23:42:56 +0500 Subject: [PATCH 2/4] Simplified updateWaypoints --- src/components/DistanceRequest/index.js | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/src/components/DistanceRequest/index.js b/src/components/DistanceRequest/index.js index 9da5fd33d29a..db0571cdcdaf 100644 --- a/src/components/DistanceRequest/index.js +++ b/src/components/DistanceRequest/index.js @@ -2,7 +2,6 @@ import React, {useCallback, useEffect, useMemo, useState, useRef} from 'react'; import {View} from 'react-native'; import {withOnyx} from 'react-native-onyx'; import lodashGet from 'lodash/get'; -import lodashIsEmpty from 'lodash/isEmpty'; import PropTypes from 'prop-types'; import _ from 'underscore'; import ROUTES from '../../ROUTES'; @@ -169,8 +168,7 @@ function DistanceRequest({transactionID, report, transaction, route, isEditingRe const newWaypoints = {}; _.each(data, (waypoint, index) => { - const newWaypoint = lodashGet(waypoints, waypoint, {}); - newWaypoints[`waypoint${index}`] = lodashIsEmpty(newWaypoint) ? {} : newWaypoint; + newWaypoints[`waypoint${index}`] = lodashGet(waypoints, waypoint, {}); }); setOptimisticWaypoints(newWaypoints); From 61574b778857903ddb6e528962d4a7a802383fc5 Mon Sep 17 00:00:00 2001 From: Ali Toshmatov Date: Wed, 18 Oct 2023 02:41:44 +0500 Subject: [PATCH 3/4] Updated waypoint removing logic and types --- src/libs/TransactionUtils.ts | 4 ++-- src/libs/actions/Transaction.ts | 13 +++++++------ src/types/onyx/Transaction.ts | 3 ++- 3 files changed, 11 insertions(+), 9 deletions(-) diff --git a/src/libs/TransactionUtils.ts b/src/libs/TransactionUtils.ts index 77fc4f04f99d..da74003765a9 100644 --- a/src/libs/TransactionUtils.ts +++ b/src/libs/TransactionUtils.ts @@ -399,7 +399,7 @@ function getAllReportTransactions(reportID?: string): Transaction[] { /** * Checks if a waypoint has a valid address */ -function waypointHasValidAddress(waypoint: RecentWaypoint | null): boolean { +function waypointHasValidAddress(waypoint: RecentWaypoint | Record): boolean { return !!waypoint?.address?.trim(); } @@ -423,7 +423,7 @@ function getValidWaypoints(waypoints: WaypointCollection, reArrangeIndexes = fal let lastWaypointIndex = -1; - return waypointValues.reduce((acc, currentWaypoint, index) => { + return waypointValues.reduce((acc, currentWaypoint, index) => { const previousWaypoint = waypointValues[lastWaypointIndex]; // Check if the waypoint has a valid address diff --git a/src/libs/actions/Transaction.ts b/src/libs/actions/Transaction.ts index c3b1d982c445..40866f3e9326 100644 --- a/src/libs/actions/Transaction.ts +++ b/src/libs/actions/Transaction.ts @@ -107,15 +107,16 @@ function removeWaypoint(transactionID: string, currentIndex: string) { const transaction = allTransactions?.[transactionID] ?? {}; const existingWaypoints = transaction?.comment?.waypoints ?? {}; const totalWaypoints = Object.keys(existingWaypoints).length; - // Prevents removing the starting or ending waypoint but clear the stored address only if there are only two waypoints - if (totalWaypoints === 2 && (index === 0 || index === totalWaypoints - 1)) { - saveWaypoint(transactionID, index.toString(), null); - return; - } const waypointValues = Object.values(existingWaypoints); const removed = waypointValues.splice(index, 1); - const isRemovedWaypointEmpty = removed.length > 0 && !TransactionUtils.waypointHasValidAddress(removed[0] ?? null); + + // When there are only two waypoints we are adding empty waypoint back + if (totalWaypoints === 2 && (index === 0 || index === totalWaypoints - 1)) { + waypointValues.splice(index, 0, {}); + } + + const isRemovedWaypointEmpty = removed.length > 0 && !TransactionUtils.waypointHasValidAddress(removed[0] ?? {}); const reIndexedWaypoints: WaypointCollection = {}; waypointValues.forEach((waypoint, idx) => { diff --git a/src/types/onyx/Transaction.ts b/src/types/onyx/Transaction.ts index 292addbb142e..34bc64075188 100644 --- a/src/types/onyx/Transaction.ts +++ b/src/types/onyx/Transaction.ts @@ -3,7 +3,8 @@ import * as OnyxCommon from './OnyxCommon'; import CONST from '../../CONST'; import RecentWaypoint from './RecentWaypoint'; -type WaypointCollection = Record; +// Default waypoint will be `{}`(empty object), that is why we are using Record +type WaypointCollection = Record>; type Comment = { comment?: string; waypoints?: WaypointCollection; From 01016dcaf4da744fe554cc839b47b5780f01c637 Mon Sep 17 00:00:00 2001 From: Ali Toshmatov Date: Wed, 18 Oct 2023 02:54:30 +0500 Subject: [PATCH 4/4] Updated types, introduces Waypoints type --- src/libs/TransactionUtils.ts | 4 ++-- src/libs/actions/Transaction.ts | 3 +-- src/types/onyx/Transaction.ts | 16 +++++++++++++--- 3 files changed, 16 insertions(+), 7 deletions(-) diff --git a/src/libs/TransactionUtils.ts b/src/libs/TransactionUtils.ts index da74003765a9..b1b35a97c959 100644 --- a/src/libs/TransactionUtils.ts +++ b/src/libs/TransactionUtils.ts @@ -6,7 +6,7 @@ import DateUtils from './DateUtils'; import {isExpensifyCard} from './CardUtils'; import * as NumberUtils from './NumberUtils'; import {RecentWaypoint, ReportAction, Transaction} from '../types/onyx'; -import {Receipt, Comment, WaypointCollection} from '../types/onyx/Transaction'; +import {Receipt, Comment, WaypointCollection, Waypoint} from '../types/onyx/Transaction'; type AdditionalTransactionChanges = {comment?: string; waypoints?: WaypointCollection}; @@ -399,7 +399,7 @@ function getAllReportTransactions(reportID?: string): Transaction[] { /** * Checks if a waypoint has a valid address */ -function waypointHasValidAddress(waypoint: RecentWaypoint | Record): boolean { +function waypointHasValidAddress(waypoint: RecentWaypoint | Waypoint): boolean { return !!waypoint?.address?.trim(); } diff --git a/src/libs/actions/Transaction.ts b/src/libs/actions/Transaction.ts index 40866f3e9326..8a7f0f7bd533 100644 --- a/src/libs/actions/Transaction.ts +++ b/src/libs/actions/Transaction.ts @@ -110,14 +110,13 @@ function removeWaypoint(transactionID: string, currentIndex: string) { const waypointValues = Object.values(existingWaypoints); const removed = waypointValues.splice(index, 1); + const isRemovedWaypointEmpty = removed.length > 0 && !TransactionUtils.waypointHasValidAddress(removed[0] ?? {}); // When there are only two waypoints we are adding empty waypoint back if (totalWaypoints === 2 && (index === 0 || index === totalWaypoints - 1)) { waypointValues.splice(index, 0, {}); } - const isRemovedWaypointEmpty = removed.length > 0 && !TransactionUtils.waypointHasValidAddress(removed[0] ?? {}); - const reIndexedWaypoints: WaypointCollection = {}; waypointValues.forEach((waypoint, idx) => { reIndexedWaypoints[`waypoint${idx}`] = waypoint; diff --git a/src/types/onyx/Transaction.ts b/src/types/onyx/Transaction.ts index 34bc64075188..9636ac72a99b 100644 --- a/src/types/onyx/Transaction.ts +++ b/src/types/onyx/Transaction.ts @@ -3,8 +3,18 @@ import * as OnyxCommon from './OnyxCommon'; import CONST from '../../CONST'; import RecentWaypoint from './RecentWaypoint'; -// Default waypoint will be `{}`(empty object), that is why we are using Record -type WaypointCollection = Record>; +type Waypoint = { + /** The full address of the waypoint */ + address?: string; + + /** The lattitude of the waypoint */ + lat?: number; + + /** The longitude of the waypoint */ + lng?: number; +}; + +type WaypointCollection = Record; type Comment = { comment?: string; waypoints?: WaypointCollection; @@ -78,4 +88,4 @@ type Transaction = { }; export default Transaction; -export type {WaypointCollection, Comment, Receipt}; +export type {WaypointCollection, Comment, Receipt, Waypoint};