Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Feat/Dupe detection review fields #42503

Merged
Merged
Show file tree
Hide file tree
Changes from 48 commits
Commits
Show all changes
50 commits
Select commit Hold shift + click to select a range
59d4c25
feat: add review fields screens, add function to detect which fields …
kubabutkiewicz May 10, 2024
e51cccb
ref: did some cleaning
kubabutkiewicz May 10, 2024
bf5c4ba
feat: add review fields ui, create a hook to determine where to navig…
kubabutkiewicz May 13, 2024
602ac8d
Merge branch 'feat/dupe-detection-initial' of github.com:kubabutkiewi…
kubabutkiewicz May 14, 2024
1a6e6cd
feat: add new review fields pages
kubabutkiewicz May 15, 2024
8d7177e
Merge branch 'feat/dupe-detection-initial' of github.com:kubabutkiewi…
kubabutkiewicz May 15, 2024
ec5fff0
fix: adding undefined to change object
kubabutkiewicz May 16, 2024
8d3b086
Merge branch 'feat/dupe-detection-initial' of github.com:kubabutkiewi…
kubabutkiewicz May 16, 2024
d81ec66
fix: crash on review description
kubabutkiewicz May 16, 2024
973512f
fix: wip
kubabutkiewicz May 17, 2024
533555b
Merge branch 'feat/dupe-detection-initial' of github.com:kubabutkiewi…
kubabutkiewicz May 17, 2024
c7f2e3d
fix: added translations
kubabutkiewicz May 17, 2024
1212907
fix: add english translations
kubabutkiewicz May 17, 2024
411e1a4
fixes
kubabutkiewicz May 17, 2024
5b3affd
Merge branch 'feat/dupe-detection-initial' of github.com:kubabutkiewi…
kubabutkiewicz May 20, 2024
c628016
fix: ts and lint issues
kubabutkiewicz May 20, 2024
1cead1e
fix: ts issue
kubabutkiewicz May 20, 2024
6de32f9
fix: simplify function comapreDuplicatedTransactions and resolve lint…
kubabutkiewicz May 20, 2024
c45ef8c
Merge branch 'feat/dupe-detection-initial' of github.com:kubabutkiewi…
kubabutkiewicz May 20, 2024
8211628
Merge branch 'feat/dupe-detection-initial' of github.com:kubabutkiewi…
kubabutkiewicz May 20, 2024
673b386
fixes
kubabutkiewicz May 20, 2024
98986f3
fix: add comment to function compareDuplicateTransactionFields
kubabutkiewicz May 20, 2024
9e5488b
fix: linter
kubabutkiewicz May 20, 2024
d39e238
Merge branch 'feat/dupe-detection-initial' of github.com:kubabutkiewi…
kubabutkiewicz May 21, 2024
69f9d64
fix: resolve comments
kubabutkiewicz May 22, 2024
03d31a5
fix
kubabutkiewicz May 22, 2024
940c392
Merge branch 'feat/dupe-detection-initial' of github.com:kubabutkiewi…
kubabutkiewicz May 22, 2024
d802409
fix: added small fix to include only unique fields to change
kubabutkiewicz May 23, 2024
2bcdadf
Merge branch 'feat/dupe-detection-initial' of github.com:kubabutkiewi…
kubabutkiewicz May 24, 2024
1f9d158
Merge branch 'feat/dupe-detection-initial' of github.com:kubabutkiewi…
kubabutkiewicz May 27, 2024
679cc5d
Merge branch 'feat/dupe-detection-initial' of github.com:kubabutkiewi…
kubabutkiewicz Jun 3, 2024
c865dab
Merge branch 'feat/dupe-detection-initial' of github.com:kubabutkiewi…
kubabutkiewicz Jun 5, 2024
7dd92ef
Merge branch 'main' of github.com:kubabutkiewicz/expensify-app into f…
kubabutkiewicz Jun 24, 2024
1e191f2
fix: formatting fixes
kubabutkiewicz Jun 24, 2024
ea828bf
fix: lint and typecheck
kubabutkiewicz Jun 24, 2024
a56946d
Merge branch 'main' of github.com:kubabutkiewicz/expensify-app into f…
kubabutkiewicz Jun 25, 2024
fb16076
Merge branch 'main' of github.com:kubabutkiewicz/expensify-app into f…
kubabutkiewicz Jun 26, 2024
5d0c79b
fix: spanish transaltions
kubabutkiewicz Jun 26, 2024
41f8648
fix: resolve comments
kubabutkiewicz Jun 26, 2024
7ee779e
Merge branch 'main' of github.com:kubabutkiewicz/expensify-app into f…
kubabutkiewicz Jun 27, 2024
7c8096e
fix: ts, resolve comments
kubabutkiewicz Jun 27, 2024
2506c95
Merge branch 'main' of github.com:kubabutkiewicz/expensify-app into f…
kubabutkiewicz Jun 28, 2024
dd3b3f3
fix: too much space when there isnt stepper
kubabutkiewicz Jun 28, 2024
a88a444
fix: add margin
kubabutkiewicz Jun 28, 2024
009800f
Merge branch 'main' of github.com:kubabutkiewicz/expensify-app into f…
kubabutkiewicz Jul 1, 2024
b3f4b20
Merge branch 'main' of github.com:kubabutkiewicz/expensify-app into f…
kubabutkiewicz Jul 2, 2024
26fcf52
Merge branch 'main' of github.com:kubabutkiewicz/expensify-app into f…
kubabutkiewicz Jul 3, 2024
6b0b42a
fix: spanish translations
kubabutkiewicz Jul 3, 2024
13e6293
fix: checking for merchant field instead only for modifiedMerchant
kubabutkiewicz Jul 4, 2024
05eb138
Merge branch 'main' of github.com:kubabutkiewicz/expensify-app into f…
kubabutkiewicz Jul 4, 2024
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
1 change: 1 addition & 0 deletions src/CONST.ts
Original file line number Diff line number Diff line change
Expand Up @@ -3885,6 +3885,7 @@ const CONST = {
TAX_REQUIRED: 'taxRequired',
HOLD: 'hold',
},
REVIEW_DUPLICATES_ORDER: ['merchant', 'category', 'tag', 'description', 'taxCode', 'billable', 'reimbursable'],

/** Context menu types */
CONTEXT_MENU_TYPES: {
Expand Down
28 changes: 28 additions & 0 deletions src/ROUTES.ts
Original file line number Diff line number Diff line change
Expand Up @@ -846,6 +846,34 @@ const ROUTES = {
route: 'r/:threadReportID/duplicates/review',
getRoute: (threadReportID: string) => `r/${threadReportID}/duplicates/review` as const,
},
TRANSACTION_DUPLICATE_REVIEW_MERCHANT_PAGE: {
route: 'r/:threadReportID/duplicates/review/merchant',
getRoute: (threadReportID: string) => `r/${threadReportID}/duplicates/review/merchant` as const,
},
TRANSACTION_DUPLICATE_REVIEW_CATEGORY_PAGE: {
route: 'r/:threadReportID/duplicates/review/category',
getRoute: (threadReportID: string) => `r/${threadReportID}/duplicates/review/category` as const,
},
TRANSACTION_DUPLICATE_REVIEW_TAG_PAGE: {
route: 'r/:threadReportID/duplicates/review/tag',
getRoute: (threadReportID: string) => `r/${threadReportID}/duplicates/review/tag` as const,
},
TRANSACTION_DUPLICATE_REVIEW_TAX_CODE_PAGE: {
route: 'r/:threadReportID/duplicates/review/tax-code',
getRoute: (threadReportID: string) => `r/${threadReportID}/duplicates/review/tax-code` as const,
},
TRANSACTION_DUPLICATE_REVIEW_DESCRIPTION_PAGE: {
route: 'r/:threadReportID/duplicates/confirm',
getRoute: (threadReportID: string) => `r/${threadReportID}/duplicates/confirm` as const,
},
TRANSACTION_DUPLICATE_REVIEW_REIMBURSABLE_PAGE: {
route: 'r/:threadReportID/duplicates/review/reimbursable',
getRoute: (threadReportID: string) => `r/${threadReportID}/duplicates/review/reimbursable` as const,
},
TRANSACTION_DUPLICATE_REVIEW_BILLABLE_PAGE: {
route: 'r/:threadReportID/duplicates/review/billable',
getRoute: (threadReportID: string) => `r/${threadReportID}/duplicates/review/billable` as const,
},

POLICY_ACCOUNTING_XERO_IMPORT: {
route: 'settings/workspaces/:policyID/accounting/xero/import',
Expand Down
7 changes: 7 additions & 0 deletions src/SCREENS.ts
Original file line number Diff line number Diff line change
Expand Up @@ -186,6 +186,13 @@ const SCREENS = {

TRANSACTION_DUPLICATE: {
REVIEW: 'Transaction_Duplicate_Review',
MERCHANT: 'Transaction_Duplicate_Merchant',
CATEGORY: 'Transaction_Duplicate_Category',
TAG: 'Transaction_Duplicate_Tag',
DESCRIPTION: 'Transaction_Duplicate_Description',
TAX_CODE: 'Transaction_Duplicate_Tax_Code',
REIMBURSABLE: 'Transaction_Duplicate_Reimburable',
BILLABLE: 'Transaction_Duplicate_Billable',
},

IOU_SEND: {
Expand Down
Original file line number Diff line number Diff line change
@@ -1,9 +1,11 @@
import type {RouteProp} from '@react-navigation/native';
import {useRoute} from '@react-navigation/native';
import lodashSortBy from 'lodash/sortBy';
import truncate from 'lodash/truncate';
import React, {useMemo} from 'react';
import {View} from 'react-native';
import type {GestureResponderEvent} from 'react-native';
import {useOnyx} from 'react-native-onyx';
import type {OnyxEntry} from 'react-native-onyx';
import Button from '@components/Button';
import Icon from '@components/Icon';
Expand All @@ -27,6 +29,8 @@ import ControlSelection from '@libs/ControlSelection';
import * as CurrencyUtils from '@libs/CurrencyUtils';
import * as DeviceCapabilities from '@libs/DeviceCapabilities';
import * as IOUUtils from '@libs/IOUUtils';
import Navigation from '@libs/Navigation/Navigation';
import type {TransactionDuplicateNavigatorParamList} from '@libs/Navigation/types';
import * as OptionsListUtils from '@libs/OptionsListUtils';
import * as ReceiptUtils from '@libs/ReceiptUtils';
import * as ReportActionsUtils from '@libs/ReportActionsUtils';
Expand All @@ -41,6 +45,7 @@ import * as Report from '@userActions/Report';
import * as Transaction from '@userActions/Transaction';
import CONST from '@src/CONST';
import ONYXKEYS from '@src/ONYXKEYS';
import ROUTES from '@src/ROUTES';
import SCREENS from '@src/SCREENS';
import type {OriginalMessageIOU} from '@src/types/onyx/OriginalMessage';
import {isEmptyObject} from '@src/types/utils/EmptyObject';
Expand Down Expand Up @@ -72,7 +77,7 @@ function MoneyRequestPreviewContent({
const StyleUtils = useStyleUtils();
const {translate} = useLocalize();
const {windowWidth} = useWindowDimensions();
const route = useRoute();
const route = useRoute<RouteProp<TransactionDuplicateNavigatorParamList, typeof SCREENS.TRANSACTION_DUPLICATE.REVIEW>>();
const {shouldUseNarrowLayout} = useResponsiveLayout();

const sessionAccountID = session?.accountID;
Expand Down Expand Up @@ -126,6 +131,9 @@ function MoneyRequestPreviewContent({
const showCashOrCard = isCardTransaction ? translate('iou.card') : translate('iou.cash');
const shouldShowHoldMessage = !(isSettled && !isSettlementOrApprovalPartial) && isOnHold;

const [report] = useOnyx(`${ONYXKEYS.COLLECTION.REPORT}${route.params?.threadReportID}`);
const parentReportAction = ReportActionsUtils.getReportAction(report?.parentReportID ?? '', report?.parentReportActionID ?? '');
const reviewingTransactionID = ReportActionsUtils.isMoneyRequestAction(parentReportAction) ? ReportActionsUtils.getOriginalMessage(parentReportAction)?.IOUTransactionID ?? '-1' : '-1';
Comment on lines +134 to +136
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Technically, it is getTransactionID function but I think we should listen to onyx report which will render live updates to the component.

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

not sure if I understand correctly @parasharrajat, you mean that I should take this iouTransactionID from useOnyx rather than from this method?

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I am not suggesting any change here. Just noting down why we should use Onyx values rather than getting the values from the util function.

// Get transaction violations for given transaction id from onyx, find duplicated transactions violations and get duplicates
const duplicates = useMemo(
() =>
Expand Down Expand Up @@ -264,6 +272,29 @@ function MoneyRequestPreviewContent({
[shouldShowSplitShare, isPolicyExpenseChat, action.actorAccountID, participantAccountIDs.length, transaction?.comment?.splits, requestAmount, requestCurrency, sessionAccountID],
);

const navigateToReviewFields = () => {
const comparisonResult = TransactionUtils.compareDuplicateTransactionFields(reviewingTransactionID);
const allTransactionIDsDuplicates = [reviewingTransactionID, ...duplicates].filter((id) => id !== transaction?.transactionID);
Transaction.setReviewDuplicatesKey({...comparisonResult.keep, duplicates: allTransactionIDsDuplicates, transactionID: transaction?.transactionID ?? ''});
if ('merchant' in comparisonResult.change) {
Navigation.navigate(ROUTES.TRANSACTION_DUPLICATE_REVIEW_MERCHANT_PAGE.getRoute(route.params?.threadReportID));
} else if ('category' in comparisonResult.change) {
Navigation.navigate(ROUTES.TRANSACTION_DUPLICATE_REVIEW_CATEGORY_PAGE.getRoute(route.params?.threadReportID));
} else if ('tag' in comparisonResult.change) {
Navigation.navigate(ROUTES.TRANSACTION_DUPLICATE_REVIEW_TAG_PAGE.getRoute(route.params?.threadReportID));
} else if ('description' in comparisonResult.change) {
Navigation.navigate(ROUTES.TRANSACTION_DUPLICATE_REVIEW_DESCRIPTION_PAGE.getRoute(route.params?.threadReportID));
kubabutkiewicz marked this conversation as resolved.
Show resolved Hide resolved
} else if ('taxCode' in comparisonResult.change) {
Navigation.navigate(ROUTES.TRANSACTION_DUPLICATE_REVIEW_TAX_CODE_PAGE.getRoute(route.params?.threadReportID));
} else if ('billable' in comparisonResult.change) {
Navigation.navigate(ROUTES.TRANSACTION_DUPLICATE_REVIEW_BILLABLE_PAGE.getRoute(route.params?.threadReportID));
} else if ('reimbursable' in comparisonResult.change) {
Navigation.navigate(ROUTES.TRANSACTION_DUPLICATE_REVIEW_REIMBURSABLE_PAGE.getRoute(route.params?.threadReportID));
} else {
// Navigation to confirm screen will be done in seperate PR
}
};

const childContainer = (
<View>
<OfflineWithFeedback
Expand Down Expand Up @@ -407,9 +438,7 @@ function MoneyRequestPreviewContent({
success
medium
style={styles.p4}
onPress={() => {
Transaction.setReviewDuplicatesKey(transaction?.transactionID ?? '', duplicates);
}}
onPress={navigateToReviewFields}
/>
)}
</PressableWithoutFeedback>
Expand Down
52 changes: 52 additions & 0 deletions src/hooks/useReviewDuplicatesNavigation.tsx
Original file line number Diff line number Diff line change
@@ -0,0 +1,52 @@
import {useEffect, useMemo, useState} from 'react';
import Navigation from '@libs/Navigation/Navigation';
import CONST from '@src/CONST';
import ROUTES from '@src/ROUTES';

type StepName = 'description' | 'merchant' | 'category' | 'billable' | 'tag' | 'taxCode' | 'reimbursable';

function useReviewDuplicatesNavigation(stepNames: string[], currentScreenName: StepName, threadReportID: string) {
const [nextScreen, setNextScreen] = useState<StepName>(currentScreenName);
const [currentScreenIndex, setCurrentScreenIndex] = useState(0);
const intersection = useMemo(() => CONST.REVIEW_DUPLICATES_ORDER.filter((element) => stepNames.includes(element)), [stepNames]);

useEffect(() => {
const currentIndex = intersection.indexOf(currentScreenName);
const nextScreenIndex = currentIndex + 1;
setCurrentScreenIndex(currentIndex);
setNextScreen(intersection[nextScreenIndex] ?? '');
}, [currentScreenName, intersection]);

const navigateToNextScreen = () => {
switch (nextScreen) {
case 'merchant':
Navigation.navigate(ROUTES.TRANSACTION_DUPLICATE_REVIEW_MERCHANT_PAGE.getRoute(threadReportID));
break;
case 'category':
Navigation.navigate(ROUTES.TRANSACTION_DUPLICATE_REVIEW_CATEGORY_PAGE.getRoute(threadReportID));
break;
case 'tag':
Navigation.navigate(ROUTES.TRANSACTION_DUPLICATE_REVIEW_TAG_PAGE.getRoute(threadReportID));
break;
case 'description':
Navigation.navigate(ROUTES.TRANSACTION_DUPLICATE_REVIEW_DESCRIPTION_PAGE.getRoute(threadReportID));
break;
case 'taxCode':
Navigation.navigate(ROUTES.TRANSACTION_DUPLICATE_REVIEW_TAX_CODE_PAGE.getRoute(threadReportID));
break;
case 'reimbursable':
Navigation.navigate(ROUTES.TRANSACTION_DUPLICATE_REVIEW_REIMBURSABLE_PAGE.getRoute(threadReportID));
break;
case 'billable':
Navigation.navigate(ROUTES.TRANSACTION_DUPLICATE_REVIEW_BILLABLE_PAGE.getRoute(threadReportID));
break;
default:
// Navigation to confirm screen will be done in seperate PR
break;
}
};

return {navigateToNextScreen, currentScreenIndex};
}

export default useReviewDuplicatesNavigation;
8 changes: 8 additions & 0 deletions src/languages/en.ts
Original file line number Diff line number Diff line change
Expand Up @@ -3459,6 +3459,14 @@ export default {
taxOutOfPolicy: ({taxName}: ViolationsTaxOutOfPolicyParams) => `${taxName ?? 'Tax'} no longer valid`,
taxRateChanged: 'Tax rate was modified',
taxRequired: 'Missing tax rate',
none: 'None',
taxCodeToKeep: 'Choose which tax code to keep',
tagToKeep: 'Choose which tag to keep',
isTransactionReimbursable: 'Choose if transaction is reimbursable',
merchantToKeep: 'Choose which merchant to keep',
descriptionToKeep: 'Choose which description to keep',
categoryToKeep: 'Choose which category to keep',
isTransactionBillable: 'Choose if transaction is billable',
keepThisOne: 'Keep this one',
hold: 'Hold',
},
Expand Down
8 changes: 8 additions & 0 deletions src/languages/es.ts
Original file line number Diff line number Diff line change
Expand Up @@ -3959,6 +3959,14 @@ export default {
taxOutOfPolicy: ({taxName}: ViolationsTaxOutOfPolicyParams) => `${taxName ?? 'El impuesto'} ya no es válido`,
taxRateChanged: 'La tasa de impuesto fue modificada',
taxRequired: 'Falta la tasa de impuesto',
none: 'Ninguno',
taxCodeToKeep: 'Elige qué tasa de impuesto quieres conservar',
tagToKeep: 'Elige qué etiqueta quieres conservar',
isTransactionReimbursable: 'Elige si la transacción es reembolsable',
merchantToKeep: 'Elige qué comerciante quieres conservar',
descriptionToKeep: 'Elige qué descripción quieres conservar',
categoryToKeep: 'Elige qué categoría quieres conservar',
isTransactionBillable: 'Elige si la transacción es facturable',
keepThisOne: 'Mantener éste',
hold: 'Bloqueado',
},
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -405,6 +405,13 @@ const ProcessMoneyRequestHoldStackNavigator = createModalStackNavigator({

const TransactionDuplicateStackNavigator = createModalStackNavigator<TransactionDuplicateNavigatorParamList>({
[SCREENS.TRANSACTION_DUPLICATE.REVIEW]: () => require<ReactComponentModule>('../../../../pages/TransactionDuplicate/Review').default,
[SCREENS.TRANSACTION_DUPLICATE.MERCHANT]: () => require<ReactComponentModule>('../../../../pages/TransactionDuplicate/ReviewMerchant').default,
[SCREENS.TRANSACTION_DUPLICATE.CATEGORY]: () => require<ReactComponentModule>('../../../../pages/TransactionDuplicate/ReviewCategory').default,
[SCREENS.TRANSACTION_DUPLICATE.TAG]: () => require<ReactComponentModule>('../../../../pages/TransactionDuplicate/ReviewTag').default,
[SCREENS.TRANSACTION_DUPLICATE.DESCRIPTION]: () => require<ReactComponentModule>('../../../../pages/TransactionDuplicate/ReviewDescription').default,
[SCREENS.TRANSACTION_DUPLICATE.TAX_CODE]: () => require<ReactComponentModule>('../../../../pages/TransactionDuplicate/ReviewTaxCode').default,
[SCREENS.TRANSACTION_DUPLICATE.BILLABLE]: () => require<ReactComponentModule>('../../../../pages/TransactionDuplicate/ReviewBillable').default,
[SCREENS.TRANSACTION_DUPLICATE.REIMBURSABLE]: () => require<ReactComponentModule>('../../../../pages/TransactionDuplicate/ReviewReimbursable').default,
});

const SearchReportModalStackNavigator = createModalStackNavigator<SearchReportParamList>({
Expand Down
28 changes: 28 additions & 0 deletions src/libs/Navigation/linkingConfig/config.ts
Original file line number Diff line number Diff line change
Expand Up @@ -747,6 +747,34 @@ const config: LinkingOptions<RootStackParamList>['config'] = {
path: ROUTES.TRANSACTION_DUPLICATE_REVIEW_PAGE.route,
exact: true,
},
[SCREENS.TRANSACTION_DUPLICATE.MERCHANT]: {
path: ROUTES.TRANSACTION_DUPLICATE_REVIEW_MERCHANT_PAGE.route,
exact: true,
},
[SCREENS.TRANSACTION_DUPLICATE.CATEGORY]: {
path: ROUTES.TRANSACTION_DUPLICATE_REVIEW_CATEGORY_PAGE.route,
exact: true,
},
[SCREENS.TRANSACTION_DUPLICATE.TAG]: {
path: ROUTES.TRANSACTION_DUPLICATE_REVIEW_TAG_PAGE.route,
exact: true,
},
[SCREENS.TRANSACTION_DUPLICATE.DESCRIPTION]: {
path: ROUTES.TRANSACTION_DUPLICATE_REVIEW_DESCRIPTION_PAGE.route,
exact: true,
},
[SCREENS.TRANSACTION_DUPLICATE.TAX_CODE]: {
path: ROUTES.TRANSACTION_DUPLICATE_REVIEW_TAX_CODE_PAGE.route,
exact: true,
},
[SCREENS.TRANSACTION_DUPLICATE.REIMBURSABLE]: {
path: ROUTES.TRANSACTION_DUPLICATE_REVIEW_REIMBURSABLE_PAGE.route,
exact: true,
},
[SCREENS.TRANSACTION_DUPLICATE.BILLABLE]: {
path: ROUTES.TRANSACTION_DUPLICATE_REVIEW_BILLABLE_PAGE.route,
exact: true,
},
},
},
[SCREENS.RIGHT_MODAL.SPLIT_DETAILS]: {
Expand Down
21 changes: 21 additions & 0 deletions src/libs/Navigation/types.ts
Original file line number Diff line number Diff line change
Expand Up @@ -801,6 +801,27 @@ type TransactionDuplicateNavigatorParamList = {
[SCREENS.TRANSACTION_DUPLICATE.REVIEW]: {
threadReportID: string;
};
[SCREENS.TRANSACTION_DUPLICATE.MERCHANT]: {
threadReportID: string;
};
[SCREENS.TRANSACTION_DUPLICATE.CATEGORY]: {
threadReportID: string;
};
[SCREENS.TRANSACTION_DUPLICATE.TAG]: {
threadReportID: string;
};
[SCREENS.TRANSACTION_DUPLICATE.DESCRIPTION]: {
threadReportID: string;
};
[SCREENS.TRANSACTION_DUPLICATE.TAX_CODE]: {
threadReportID: string;
};
[SCREENS.TRANSACTION_DUPLICATE.BILLABLE]: {
threadReportID: string;
};
[SCREENS.TRANSACTION_DUPLICATE.REIMBURSABLE]: {
threadReportID: string;
};
};

type LeftModalNavigatorParamList = {
Expand Down
1 change: 1 addition & 0 deletions src/libs/ReportActionsUtils.ts
Original file line number Diff line number Diff line change
Expand Up @@ -24,6 +24,7 @@ import {parseHtmlToText} from './OnyxAwareParser';
import * as PersonalDetailsUtils from './PersonalDetailsUtils';
import type {OptimisticIOUReportAction, PartialReportAction} from './ReportUtils';
import StringUtils from './StringUtils';
// eslint-disable-next-line import/no-cycle
import * as TransactionUtils from './TransactionUtils';

type LastVisibleMessage = {
Expand Down
Loading
Loading