diff --git a/assets/images/arrow-split.svg b/assets/images/arrow-split.svg deleted file mode 100644 index 6cc763cc1824..000000000000 --- a/assets/images/arrow-split.svg +++ /dev/null @@ -1,5 +0,0 @@ - - - - - \ No newline at end of file diff --git a/src/CONST.ts b/src/CONST.ts index 67557704b93e..75ded011afaf 100755 --- a/src/CONST.ts +++ b/src/CONST.ts @@ -1226,7 +1226,6 @@ const CONST = { DELETE: 'delete', RETRACT: 'retract', ADD_EXPENSE: 'addExpense', - SPLIT: 'split', REOPEN: 'reopen', MOVE_EXPENSE: 'moveExpense', PAY: 'pay', @@ -1257,7 +1256,6 @@ const CONST = { }, TRANSACTION_SECONDARY_ACTIONS: { HOLD: 'hold', - SPLIT: 'split', VIEW_DETAILS: 'viewDetails', DELETE: 'delete', }, @@ -2777,7 +2775,6 @@ const CONST = { SEND: 'send', PAY: 'pay', SPLIT: 'split', - SPLIT_EXPENSE: 'split-expense', REQUEST: 'request', INVOICE: 'invoice', SUBMIT: 'submit', diff --git a/src/ROUTES.ts b/src/ROUTES.ts index 1d6937c1ff7c..6a4bcea8c49d 100644 --- a/src/ROUTES.ts +++ b/src/ROUTES.ts @@ -573,24 +573,6 @@ const ROUTES = { return getUrlWithBackToParam(`r/${reportID}/invite` as const, backTo); }, }, - SPLIT_EXPENSE: { - route: 'create/split-expense/overview/:reportID/:transactionID/:splitExpenseTransactionID?', - getRoute: (reportID: string | undefined, originalTransactionID: string | undefined, splitExpenseTransactionID?: string, backTo?: string) => { - if (!reportID || !originalTransactionID) { - Log.warn(`Invalid ${reportID}(reportID) or ${originalTransactionID}(transactionID) is used to build the SPLIT_EXPENSE route`); - } - return getUrlWithBackToParam(`create/split-expense/overview/${reportID}/${originalTransactionID}${splitExpenseTransactionID ? `/${splitExpenseTransactionID}` : ''}`, backTo); - }, - }, - SPLIT_EXPENSE_EDIT: { - route: 'edit/split-expense/overview/:reportID/:transactionID/:splitExpenseTransactionID?', - getRoute: (reportID: string | undefined, originalTransactionID: string | undefined, splitExpenseTransactionID?: string, backTo?: string) => { - if (!reportID || !originalTransactionID) { - Log.warn(`Invalid ${reportID}(reportID) or ${originalTransactionID}(transactionID) is used to build the SPLIT_EXPENSE_EDIT route`); - } - return getUrlWithBackToParam(`edit/split-expense/overview/${reportID}/${originalTransactionID}${splitExpenseTransactionID ? `/${splitExpenseTransactionID}` : ''}`, backTo); - }, - }, MONEY_REQUEST_HOLD_REASON: { route: ':type/edit/reason/:transactionID?/:searchHash?', getRoute: (type: ValueOf, transactionID: string, reportID: string, backTo: string, searchHash?: number) => { diff --git a/src/SCREENS.ts b/src/SCREENS.ts index 96344091d4a8..c3bbffcc8646 100644 --- a/src/SCREENS.ts +++ b/src/SCREENS.ts @@ -264,8 +264,6 @@ const SCREENS = { STEP_SUBRATE_EDIT: 'Money_Request_SubRate_Edit', STEP_REPORT: 'Money_Request_Report', EDIT_REPORT: 'Money_Request_Edit_Report', - SPLIT_EXPENSE: 'Money_Request_Split_Expense', - SPLIT_EXPENSE_EDIT: 'Money_Request_Split_Expense_Edit', }, TRANSACTION_DUPLICATE: { diff --git a/src/components/AmountTextInput.tsx b/src/components/AmountTextInput.tsx index 723ce911b889..256d95ba8419 100644 --- a/src/components/AmountTextInput.tsx +++ b/src/components/AmountTextInput.tsx @@ -39,7 +39,7 @@ type AmountTextInputProps = { /** Hide the focus styles on TextInput */ hideFocusedState?: boolean; -} & Pick; +} & Pick; function AmountTextInput( { diff --git a/src/components/Icon/Expensicons.ts b/src/components/Icon/Expensicons.ts index 7d963960ac04..fa1eb1ac9615 100644 --- a/src/components/Icon/Expensicons.ts +++ b/src/components/Icon/Expensicons.ts @@ -6,7 +6,6 @@ import ArrowCollapse from '@assets/images/arrow-collapse.svg'; import ArrowDownLong from '@assets/images/arrow-down-long.svg'; import ArrowRightLong from '@assets/images/arrow-right-long.svg'; import ArrowRight from '@assets/images/arrow-right.svg'; -import ArrowSplit from '@assets/images/arrow-split.svg'; import ArrowUpLong from '@assets/images/arrow-up-long.svg'; import UpArrow from '@assets/images/arrow-up.svg'; import ArrowsLeftRight from '@assets/images/arrows-leftright.svg'; @@ -239,7 +238,6 @@ export { AnnounceRoomAvatar, Apple, AppleLogo, - ArrowSplit, ArrowCollapse, ArrowRight, ArrowRightLong, diff --git a/src/components/MoneyReportHeader.tsx b/src/components/MoneyReportHeader.tsx index c6f3ab4327bb..7c994bd9f05a 100644 --- a/src/components/MoneyReportHeader.tsx +++ b/src/components/MoneyReportHeader.tsx @@ -69,7 +69,6 @@ import { deleteMoneyRequest, getNavigationUrlOnMoneyRequestDelete, getNextApproverAccountID, - initSplitExpense, payInvoice, payMoneyRequest, reopenReport, @@ -756,19 +755,6 @@ function MoneyReportHeader({ changeMoneyRequestHoldStatus(requestParentReportAction); }, }, - [CONST.REPORT.SECONDARY_ACTIONS.SPLIT]: { - text: translate('iou.split'), - icon: Expensicons.ArrowSplit, - value: CONST.REPORT.SECONDARY_ACTIONS.SPLIT, - onSelected: () => { - if (Number(transactions?.length) !== 1) { - return; - } - - const currentTransaction = transactions.at(0); - initSplitExpense(currentTransaction, moneyRequestReport?.reportID ?? String(CONST.DEFAULT_NUMBER_ID)); - }, - }, [CONST.REPORT.SECONDARY_ACTIONS.CHANGE_WORKSPACE]: { text: translate('iou.changeWorkspace'), icon: Expensicons.Buildings, diff --git a/src/components/MoneyRequestAmountInput.tsx b/src/components/MoneyRequestAmountInput.tsx index 234b3a21d336..0285bbf6aad1 100644 --- a/src/components/MoneyRequestAmountInput.tsx +++ b/src/components/MoneyRequestAmountInput.tsx @@ -94,7 +94,7 @@ type MoneyRequestAmountInputProps = { /** The testID of the input. Used to locate this view in end-to-end tests. */ testID?: string; -} & Pick; +} & Pick; type Selection = { start: number; @@ -132,7 +132,6 @@ function MoneyRequestAmountInput( autoGrowExtraSpace, contentWidth, testID, - submitBehavior, ...props }: MoneyRequestAmountInputProps, forwardedRef: ForwardedRef, @@ -344,7 +343,6 @@ function MoneyRequestAmountInput( onMouseUp={handleMouseUp} contentWidth={contentWidth} testID={testID} - submitBehavior={submitBehavior} /> ); } diff --git a/src/components/MoneyRequestHeader.tsx b/src/components/MoneyRequestHeader.tsx index e43f9fc3a9b7..493352ad6ee2 100644 --- a/src/components/MoneyRequestHeader.tsx +++ b/src/components/MoneyRequestHeader.tsx @@ -10,7 +10,7 @@ import useResponsiveLayout from '@hooks/useResponsiveLayout'; import useTheme from '@hooks/useTheme'; import useThemeStyles from '@hooks/useThemeStyles'; import useTransactionViolations from '@hooks/useTransactionViolations'; -import {deleteMoneyRequest, initSplitExpense} from '@libs/actions/IOU'; +import {deleteMoneyRequest} from '@libs/actions/IOU'; import Navigation from '@libs/Navigation/Navigation'; import {getOriginalMessage, getReportActions, isMoneyRequestAction} from '@libs/ReportActionsUtils'; import {getTransactionThreadPrimaryAction} from '@libs/ReportPrimaryActionUtils'; @@ -201,8 +201,8 @@ function MoneyRequestHeader({report, parentReportAction, policy, onBackButtonPre if (!transaction || !reportActions) { return []; } - return getSecondaryTransactionThreadActions(parentReport, transaction, Object.values(reportActions), policy); - }, [parentReport, policy, transaction]); + return getSecondaryTransactionThreadActions(parentReport, transaction, Object.values(reportActions)); + }, [parentReport, transaction]); const secondaryActionsImplementation: Record, DropdownOption>> = { [CONST.REPORT.TRANSACTION_SECONDARY_ACTIONS.HOLD]: { @@ -217,14 +217,6 @@ function MoneyRequestHeader({report, parentReportAction, policy, onBackButtonPre changeMoneyRequestHoldStatus(parentReportAction); }, }, - [CONST.REPORT.TRANSACTION_SECONDARY_ACTIONS.SPLIT]: { - text: translate('iou.split'), - icon: Expensicons.ArrowSplit, - value: CONST.REPORT.SECONDARY_ACTIONS.SPLIT, - onSelected: () => { - initSplitExpense(transaction, reportID ?? String(CONST.DEFAULT_NUMBER_ID)); - }, - }, [CONST.REPORT.TRANSACTION_SECONDARY_ACTIONS.VIEW_DETAILS]: { value: CONST.REPORT.SECONDARY_ACTIONS.VIEW_DETAILS, text: translate('iou.viewDetails'), diff --git a/src/components/ReportActionItem/MoneyRequestView.tsx b/src/components/ReportActionItem/MoneyRequestView.tsx index e0bcc38cd8bc..eb91ad4e400f 100644 --- a/src/components/ReportActionItem/MoneyRequestView.tsx +++ b/src/components/ReportActionItem/MoneyRequestView.tsx @@ -50,7 +50,6 @@ import { getBillable, getDescription, getDistanceInMeters, - getOriginalTransactionWithSplitInfo, getTagForDisplay, getTaxName, hasMissingSmartscanFields, @@ -292,9 +291,6 @@ function MoneyRequestView({report, shouldShowAnimatedBackground, readonly = fals if (!isDistanceRequest && !isPerDiemRequest) { amountDescription += ` ${CONST.DOT_SEPARATOR} ${translate('iou.cash')}`; } - if (getOriginalTransactionWithSplitInfo(transaction).isExpenseSplit) { - amountDescription += ` ${CONST.DOT_SEPARATOR} ${translate('iou.split')}`; - } if (isCancelled) { amountDescription += ` ${CONST.DOT_SEPARATOR} ${translate('iou.canceled')}`; } else if (isApproved) { diff --git a/src/components/ReportActionItem/TransactionPreview/index.tsx b/src/components/ReportActionItem/TransactionPreview/index.tsx index 04e224ea01df..3bc832ededba 100644 --- a/src/components/ReportActionItem/TransactionPreview/index.tsx +++ b/src/components/ReportActionItem/TransactionPreview/index.tsx @@ -11,8 +11,8 @@ import {convertToDisplayString} from '@libs/CurrencyUtils'; import {canUseTouchScreen} from '@libs/DeviceCapabilities'; import {getIOUActionForReportID, getOriginalMessage, isMoneyRequestAction as isMoneyRequestActionReportActionsUtils} from '@libs/ReportActionsUtils'; import {getTransactionDetails} from '@libs/ReportUtils'; -import {getReviewNavigationRoute} from '@libs/TransactionPreviewUtils'; -import {getOriginalTransactionWithSplitInfo, isCardTransaction, removeSettledAndApprovedTransactions} from '@libs/TransactionUtils'; +import {getOriginalTransactionIfBillIsSplit, getReviewNavigationRoute} from '@libs/TransactionPreviewUtils'; +import {isCardTransaction, removeSettledAndApprovedTransactions} from '@libs/TransactionUtils'; import Navigation from '@navigation/Navigation'; import type {PlatformStackRouteProp} from '@navigation/PlatformStackNavigation/types'; import type {TransactionDuplicateNavigatorParamList} from '@navigation/types'; @@ -78,13 +78,7 @@ function TransactionPreview(props: TransactionPreviewProps) { Navigation.navigate(getReviewNavigationRoute(route, report, transaction, duplicates)); }, [duplicates, report, route, transaction]); - let transactionPreview = transaction; - - const {originalTransaction, isBillSplit} = getOriginalTransactionWithSplitInfo(transaction); - - if (isBillSplit) { - transactionPreview = originalTransaction; - } + const {originalTransaction, isBillSplit} = getOriginalTransactionIfBillIsSplit(transaction); const iouAction = isBillSplit && originalTransaction ? getIOUActionForReportID(chatReportID, originalTransaction.transactionID) ?? action : action; @@ -111,7 +105,7 @@ function TransactionPreview(props: TransactionPreviewProps) { isBillSplit={isBillSplit} chatReport={chatReport} personalDetails={personalDetails} - transaction={transactionPreview} + transaction={originalTransaction} iouReport={iouReport} violations={violations} offlineWithFeedbackOnClose={offlineWithFeedbackOnClose} diff --git a/src/components/ReportWelcomeText.tsx b/src/components/ReportWelcomeText.tsx index 626c70528e40..7c90f319da1a 100644 --- a/src/components/ReportWelcomeText.tsx +++ b/src/components/ReportWelcomeText.tsx @@ -68,12 +68,8 @@ function ReportWelcomeText({report, policy}: ReportWelcomeTextProps) { const policyName = getPolicyName({report}); const filteredOptions = moneyRequestOptions.filter( - ( - item, - ): item is Exclude< - IOUType, - typeof CONST.IOU.TYPE.REQUEST | typeof CONST.IOU.TYPE.SEND | typeof CONST.IOU.TYPE.CREATE | typeof CONST.IOU.TYPE.INVOICE | typeof CONST.IOU.TYPE.SPLIT_EXPENSE - > => item !== CONST.IOU.TYPE.INVOICE, + (item): item is Exclude => + item !== CONST.IOU.TYPE.INVOICE, ); const additionalText = filteredOptions .map( diff --git a/src/components/Search/index.tsx b/src/components/Search/index.tsx index 05eb59ba8e95..9c6f25f26e74 100644 --- a/src/components/Search/index.tsx +++ b/src/components/Search/index.tsx @@ -104,7 +104,7 @@ function mapToItemWithSelectionInfo(item: SearchListItem, selectedTransactions: ...item, shouldAnimateInHighlight, transactions: item.transactions?.map((transaction) => mapToTransactionItemWithSelectionInfo(transaction, selectedTransactions, canSelectMultiple, shouldAnimateInHighlight)), - isSelected: item?.transactions?.length > 0 && item.transactions?.every((transaction) => selectedTransactions[transaction.keyForList]?.isSelected && canSelectMultiple), + isSelected: item.transactions.length > 0 && item.transactions?.every((transaction) => selectedTransactions[transaction.keyForList]?.isSelected && canSelectMultiple), }; } diff --git a/src/components/SelectionList/Search/TransactionListItemRow.tsx b/src/components/SelectionList/Search/TransactionListItemRow.tsx index 774a1e3c9b7b..16ff60fdb7a2 100644 --- a/src/components/SelectionList/Search/TransactionListItemRow.tsx +++ b/src/components/SelectionList/Search/TransactionListItemRow.tsx @@ -407,15 +407,15 @@ function TransactionListItemRow({ diff --git a/src/components/SelectionList/Search/UserInfoCellsWithArrow.tsx b/src/components/SelectionList/Search/UserInfoCellsWithArrow.tsx index e7111a1c3a92..d71777f4e479 100644 --- a/src/components/SelectionList/Search/UserInfoCellsWithArrow.tsx +++ b/src/components/SelectionList/Search/UserInfoCellsWithArrow.tsx @@ -35,10 +35,6 @@ function UserInfoCellsWithArrow({ const styles = useThemeStyles(); const theme = useTheme(); - if (!participantFrom) { - return null; - } - return ( <> diff --git a/src/components/SelectionList/SplitListItem.tsx b/src/components/SelectionList/SplitListItem.tsx deleted file mode 100644 index 6e4aedd6b6f6..000000000000 --- a/src/components/SelectionList/SplitListItem.tsx +++ /dev/null @@ -1,160 +0,0 @@ -import React from 'react'; -import {View} from 'react-native'; -import Icon from '@components/Icon'; -import {Folder, Tag} from '@components/Icon/Expensicons'; -import * as Expensicons from '@components/Icon/Expensicons'; -import MoneyRequestAmountInput from '@components/MoneyRequestAmountInput'; -import Text from '@components/Text'; -import useStyleUtils from '@hooks/useStyleUtils'; -import useTheme from '@hooks/useTheme'; -import useThemeStyles from '@hooks/useThemeStyles'; -import {convertToDisplayStringWithoutCurrency} from '@libs/CurrencyUtils'; -import {getCleanedTagName} from '@libs/PolicyUtils'; -import variables from '@styles/variables'; -import BaseListItem from './BaseListItem'; -import type {ListItem, SplitListItemProps, SplitListItemType} from './types'; - -function SplitListItem({ - item, - isFocused, - showTooltip, - isDisabled, - onSelectRow, - shouldPreventEnterKeySubmit, - rightHandSideComponent, - onFocus, -}: SplitListItemProps) { - const theme = useTheme(); - const styles = useThemeStyles(); - const StyleUtils = useStyleUtils(); - - const splitItem = item as unknown as SplitListItemType; - - const formattedOriginalAmount = convertToDisplayStringWithoutCurrency(splitItem.originalAmount, splitItem.currency); - - const onSplitExpenseAmountChange = (amount: string) => { - splitItem.onSplitExpenseAmountChange(splitItem.transactionID, Number(amount)); - }; - - const isBottomVisible = !!splitItem.category || !!splitItem.tags?.at(0); - - return ( - - - - - - - {splitItem.headerText} - - - - - - {splitItem.merchant} - - - - - {isBottomVisible && ( - - {!!splitItem.category && ( - - - - {splitItem.category} - - - )} - {!!splitItem.tags?.at(0) && ( - - - - {getCleanedTagName(splitItem.tags?.at(0) ?? '')} - - - )} - - )} - - - - - - - - - - - - ); -} - -SplitListItem.displayName = 'SplitListItem'; - -export default SplitListItem; diff --git a/src/components/SelectionList/types.ts b/src/components/SelectionList/types.ts index 8cea5d2d33ee..67988cced68a 100644 --- a/src/components/SelectionList/types.ts +++ b/src/components/SelectionList/types.ts @@ -23,7 +23,7 @@ import type SpendCategorySelectorListItem from '@pages/workspace/categories/Spen import type CursorStyles from '@styles/utils/cursor/types'; import type CONST from '@src/CONST'; import type {Policy, Report} from '@src/types/onyx'; -import type {Attendee, SplitExpense} from '@src/types/onyx/IOU'; +import type {Attendee} from '@src/types/onyx/IOU'; import type {Errors, Icon, PendingAction} from '@src/types/onyx/OnyxCommon'; import type {SearchPersonalDetails, SearchReport, SearchReportAction, SearchTask, SearchTransaction} from '@src/types/onyx/SearchResults'; import type {ReceiptErrors} from '@src/types/onyx/Transaction'; @@ -390,35 +390,6 @@ type UserListItemProps = ListItemProps & { FooterComponent?: ReactElement; }; -type SplitListItemType = ListItem & - SplitExpense & { - /** Item header text */ - headerText: string; - - /** Merchant or vendor name */ - merchant: string; - - /** Currency code */ - currency: string; - - /** ID of split expense */ - transactionID: string; - - /** Currency symbol */ - currencySymbol: string; - - /** Original amount before split */ - originalAmount: number; - - /** Indicates whether a split was opened through this transaction */ - isTransactionLinked: boolean; - - /** Function for updating amount */ - onSplitExpenseAmountChange: (currentItemTransactionID: string, value: number) => void; - }; - -type SplitListItemProps = ListItemProps; - type TransactionSelectionListItem = ListItemProps & Transaction; type InviteMemberListItemProps = UserListItemProps; @@ -846,7 +817,5 @@ export type { ReportActionListItemType, ChatListItemProps, SortableColumnName, - SplitListItemProps, - SplitListItemType, SearchListItem, }; diff --git a/src/components/TextInputWithCurrencySymbol/types.ts b/src/components/TextInputWithCurrencySymbol/types.ts index b0c59971cdcb..8636f1959df1 100644 --- a/src/components/TextInputWithCurrencySymbol/types.ts +++ b/src/components/TextInputWithCurrencySymbol/types.ts @@ -80,7 +80,7 @@ type BaseTextInputWithCurrencySymbolProps = { /** The test ID of TextInput. Used to locate the view in end-to-end tests. */ testID?: string; -} & Pick; +} & Pick; type TextInputWithCurrencySymbolProps = Omit & { onSelectionChange?: (start: number, end: number) => void; diff --git a/src/languages/en.ts b/src/languages/en.ts index 83aff5c3e81a..9e2900e20a5a 100755 --- a/src/languages/en.ts +++ b/src/languages/en.ts @@ -164,8 +164,6 @@ import type { SignUpNewFaceCodeParams, SizeExceededParams, SplitAmountParams, - SplitExpenseEditTitleParams, - SplitExpenseSubtitleParams, SpreadCategoriesParams, SpreadFieldNameParams, SpreadSheetColumnParams, @@ -184,7 +182,6 @@ import type { TermsParams, ThreadRequestReportNameParams, ThreadSentMoneyReportNameParams, - TotalAmountGreaterOrLessThanOriginalParams, ToValidateLoginParams, TransferParams, TrialStartedTitleParams, @@ -936,13 +933,6 @@ const translations = { original: 'Original', split: 'Split', splitExpense: 'Split expense', - splitExpenseSubtitle: ({amount, merchant}: SplitExpenseSubtitleParams) => `${amount} from ${merchant}`, - addSplit: 'Add split', - totalAmountGreaterThanOriginal: ({amount}: TotalAmountGreaterOrLessThanOriginalParams) => `Total amount is ${amount} greater than the original expense.`, - totalAmountLessThanOriginal: ({amount}: TotalAmountGreaterOrLessThanOriginalParams) => `Total amount is ${amount} less than the original expense.`, - splitExpenseZeroAmount: 'Please enter a valid amount before continuing.', - splitExpenseEditTitle: ({amount, merchant}: SplitExpenseEditTitleParams) => `Edit ${amount} for ${merchant}`, - removeSplit: 'Remove split', paySomeone: ({name}: PaySomeoneParams = {}) => `Pay ${name ?? 'someone'}`, expense: 'Expense', categorize: 'Categorize', diff --git a/src/languages/es.ts b/src/languages/es.ts index b9aff5766bcf..37371a25738b 100644 --- a/src/languages/es.ts +++ b/src/languages/es.ts @@ -163,8 +163,6 @@ import type { SignUpNewFaceCodeParams, SizeExceededParams, SplitAmountParams, - SplitExpenseEditTitleParams, - SplitExpenseSubtitleParams, SpreadCategoriesParams, SpreadFieldNameParams, SpreadSheetColumnParams, @@ -183,7 +181,6 @@ import type { TermsParams, ThreadRequestReportNameParams, ThreadSentMoneyReportNameParams, - TotalAmountGreaterOrLessThanOriginalParams, ToValidateLoginParams, TransferParams, TrialStartedTitleParams, @@ -931,13 +928,6 @@ const translations = { original: 'Original', split: 'Dividir', splitExpense: 'Dividir gasto', - splitExpenseSubtitle: ({amount, merchant}: SplitExpenseSubtitleParams) => `${amount} de ${merchant}`, - addSplit: 'Añadir división', - totalAmountGreaterThanOriginal: ({amount}: TotalAmountGreaterOrLessThanOriginalParams) => `El importe total es ${amount} mayor que el gasto original.`, - totalAmountLessThanOriginal: ({amount}: TotalAmountGreaterOrLessThanOriginalParams) => `El importe total es ${amount} menor que el gasto original.`, - splitExpenseZeroAmount: 'Por favor, introduce un importe válido antes de continuar.', - splitExpenseEditTitle: ({amount, merchant}: SplitExpenseEditTitleParams) => `Editar ${amount} para ${merchant}`, - removeSplit: 'Eliminar división', addExpense: 'Agregar gasto', expense: 'Gasto', categorize: 'Categorizar', diff --git a/src/languages/params.ts b/src/languages/params.ts index b988af96101d..fa103fc9aac4 100644 --- a/src/languages/params.ts +++ b/src/languages/params.ts @@ -686,28 +686,11 @@ type CurrencyInputDisabledTextParams = { currency: string; }; -type SplitExpenseSubtitleParams = { - amount: string; - merchant: string; -}; - -type SplitExpenseEditTitleParams = { - amount: string; - merchant: string; -}; - -type TotalAmountGreaterOrLessThanOriginalParams = { - amount: string; -}; - type EmployeeInviteMessageParams = { name: string; }; export type { - SplitExpenseEditTitleParams, - SplitExpenseSubtitleParams, - TotalAmountGreaterOrLessThanOriginalParams, AuthenticationErrorParams, ImportMembersSuccessfulDescriptionParams, ImportedTagsMessageParams, diff --git a/src/libs/API/parameters/SplitTransactionParams.ts b/src/libs/API/parameters/SplitTransactionParams.ts deleted file mode 100644 index 09c345ff3907..000000000000 --- a/src/libs/API/parameters/SplitTransactionParams.ts +++ /dev/null @@ -1,24 +0,0 @@ -type SplitTransactionSplitsParam = Array<{ - amount: number; - category?: string; - tag?: string; - created: string; - merchant?: string; - comment?: { - comment?: string; - }; - nameValuePairs?: { - comment?: string; - }; - splitReportActionID?: string; - transactionThreadReportID?: string; - createdReportActionIDForThread?: string; -}>; - -type SplitTransactionParams = { - transactionID: string; - isReverseSplitOperation: boolean; - [key: string]: string | boolean; -}; - -export type {SplitTransactionParams, SplitTransactionSplitsParam}; diff --git a/src/libs/API/parameters/index.ts b/src/libs/API/parameters/index.ts index b237ac3a8022..9d993d95f7a9 100644 --- a/src/libs/API/parameters/index.ts +++ b/src/libs/API/parameters/index.ts @@ -157,7 +157,6 @@ export type {default as CompleteSplitBillParams} from './CompleteSplitBillParams export type {default as UpdateMoneyRequestParams} from './UpdateMoneyRequestParams'; export type {default as RequestMoneyParams} from './RequestMoneyParams'; export type {default as SplitBillParams} from './SplitBillParams'; -export type {SplitTransactionParams, SplitTransactionSplitsParam} from './SplitTransactionParams'; export type {default as DeleteMoneyRequestParams} from './DeleteMoneyRequestParams'; export type {default as CreateDistanceRequestParams} from './CreateDistanceRequestParams'; export type {default as StartSplitBillParams} from './StartSplitBillParams'; diff --git a/src/libs/API/types.ts b/src/libs/API/types.ts index 3566ef25cb92..d10e3b831712 100644 --- a/src/libs/API/types.ts +++ b/src/libs/API/types.ts @@ -205,7 +205,6 @@ const WRITE_COMMANDS = { CREATE_PER_DIEM_REQUEST: 'CreatePerDiemRequest', SPLIT_BILL: 'SplitBill', SPLIT_BILL_AND_OPEN_REPORT: 'SplitBillAndOpenReport', - SPLIT_TRANSACTION: 'Transaction_Split', DELETE_MONEY_REQUEST: 'DeleteMoneyRequest', CREATE_DISTANCE_REQUEST: 'CreateDistanceRequest', START_SPLIT_BILL: 'StartSplitBill', @@ -673,7 +672,6 @@ type WriteCommandParameters = { [WRITE_COMMANDS.CREATE_PER_DIEM_REQUEST]: Parameters.CreatePerDiemRequestParams; [WRITE_COMMANDS.SPLIT_BILL]: Parameters.SplitBillParams; [WRITE_COMMANDS.SPLIT_BILL_AND_OPEN_REPORT]: Parameters.SplitBillParams; - [WRITE_COMMANDS.SPLIT_TRANSACTION]: Parameters.SplitTransactionParams; [WRITE_COMMANDS.DELETE_MONEY_REQUEST]: Parameters.DeleteMoneyRequestParams; [WRITE_COMMANDS.CREATE_DISTANCE_REQUEST]: Parameters.CreateDistanceRequestParams; [WRITE_COMMANDS.START_SPLIT_BILL]: Parameters.StartSplitBillParams; diff --git a/src/libs/DebugUtils.ts b/src/libs/DebugUtils.ts index 22a00fb14366..6f2b0f862f1b 100644 --- a/src/libs/DebugUtils.ts +++ b/src/libs/DebugUtils.ts @@ -1071,7 +1071,6 @@ function validateTransactionDraftProperty(key: keyof Transaction, value: string) posted: CONST.RED_BRICK_ROAD_PENDING_ACTION, inserted: CONST.RED_BRICK_ROAD_PENDING_ACTION, accountant: CONST.RED_BRICK_ROAD_PENDING_ACTION, - splitExpenses: CONST.RED_BRICK_ROAD_PENDING_ACTION, }, 'string', ); @@ -1109,7 +1108,6 @@ function validateTransactionDraftProperty(key: keyof Transaction, value: string) liabilityType: CONST.TRANSACTION.LIABILITY_TYPE, splits: 'array', dismissedViolations: 'object', - splitExpenses: 'array', }); case 'accountant': return validateObject>(value, { diff --git a/src/libs/IOUUtils.ts b/src/libs/IOUUtils.ts index e7b50ef35c79..94c519f3d2b1 100644 --- a/src/libs/IOUUtils.ts +++ b/src/libs/IOUUtils.ts @@ -148,7 +148,6 @@ function isValidMoneyRequestType(iouType: string): boolean { CONST.IOU.TYPE.REQUEST, CONST.IOU.TYPE.SUBMIT, CONST.IOU.TYPE.SPLIT, - CONST.IOU.TYPE.SPLIT_EXPENSE, CONST.IOU.TYPE.SEND, CONST.IOU.TYPE.PAY, CONST.IOU.TYPE.TRACK, @@ -186,8 +185,8 @@ function isMovingTransactionFromTrackExpense(action?: IOUAction) { return false; } -function shouldUseTransactionDraft(action: IOUAction | undefined, type?: IOUType) { - return action === CONST.IOU.ACTION.CREATE || type === CONST.IOU.TYPE.SPLIT_EXPENSE || isMovingTransactionFromTrackExpense(action); +function shouldUseTransactionDraft(action: IOUAction | undefined) { + return action === CONST.IOU.ACTION.CREATE || isMovingTransactionFromTrackExpense(action); } function formatCurrentUserToAttendee(currentUser?: PersonalDetails, reportID?: string) { diff --git a/src/libs/Navigation/AppNavigator/ModalStackNavigators/index.tsx b/src/libs/Navigation/AppNavigator/ModalStackNavigators/index.tsx index a7f1c14f5e14..a61b24b0cc2e 100644 --- a/src/libs/Navigation/AppNavigator/ModalStackNavigators/index.tsx +++ b/src/libs/Navigation/AppNavigator/ModalStackNavigators/index.tsx @@ -124,8 +124,6 @@ const MoneyRequestModalStackNavigator = createModalStackNavigator require('../../../../pages/iou/request/step/IOURequestStepDestination').default, [SCREENS.MONEY_REQUEST.STEP_TIME_EDIT]: () => require('../../../../pages/iou/request/step/IOURequestStepTime').default, [SCREENS.MONEY_REQUEST.STEP_SUBRATE_EDIT]: () => require('../../../../pages/iou/request/step/IOURequestStepSubrate').default, - [SCREENS.MONEY_REQUEST.SPLIT_EXPENSE]: () => require('../../../../pages/iou/SplitExpensePage').default, - [SCREENS.MONEY_REQUEST.SPLIT_EXPENSE_EDIT]: () => require('../../../../pages/iou/SplitExpenseEditPage').default, }); const TravelModalStackNavigator = createModalStackNavigator({ diff --git a/src/libs/Navigation/linkingConfig/config.ts b/src/libs/Navigation/linkingConfig/config.ts index b27ff3d6ebd4..515970cd075f 100644 --- a/src/libs/Navigation/linkingConfig/config.ts +++ b/src/libs/Navigation/linkingConfig/config.ts @@ -1342,14 +1342,6 @@ const config: LinkingOptions['config'] = { [SCREENS.IOU_SEND.ENABLE_PAYMENTS]: ROUTES.IOU_SEND_ENABLE_PAYMENTS, [SCREENS.IOU_SEND.ADD_BANK_ACCOUNT]: ROUTES.IOU_SEND_ADD_BANK_ACCOUNT, [SCREENS.IOU_SEND.ADD_DEBIT_CARD]: ROUTES.IOU_SEND_ADD_DEBIT_CARD, - [SCREENS.MONEY_REQUEST.SPLIT_EXPENSE]: { - path: ROUTES.SPLIT_EXPENSE.route, - exact: true, - }, - [SCREENS.MONEY_REQUEST.SPLIT_EXPENSE_EDIT]: { - path: ROUTES.SPLIT_EXPENSE_EDIT.route, - exact: true, - }, }, }, [SCREENS.RIGHT_MODAL.TRANSACTION_DUPLICATE]: { diff --git a/src/libs/Navigation/types.ts b/src/libs/Navigation/types.ts index 1a830a3aa79c..669d8e419010 100644 --- a/src/libs/Navigation/types.ts +++ b/src/libs/Navigation/types.ts @@ -1607,8 +1607,6 @@ type RightModalNavigatorParamList = { [SCREENS.RIGHT_MODAL.SEARCH_SAVED_SEARCH]: NavigatorScreenParams; [SCREENS.RIGHT_MODAL.MISSING_PERSONAL_DETAILS]: NavigatorScreenParams; [SCREENS.RIGHT_MODAL.DEBUG]: NavigatorScreenParams; - [SCREENS.MONEY_REQUEST.SPLIT_EXPENSE]: NavigatorScreenParams; - [SCREENS.MONEY_REQUEST.SPLIT_EXPENSE_EDIT]: NavigatorScreenParams; [SCREENS.RIGHT_MODAL.ADD_UNREPORTED_EXPENSE]: NavigatorScreenParams<{reportId: string | undefined}>; [SCREENS.RIGHT_MODAL.SCHEDULE_CALL]: NavigatorScreenParams; }; @@ -1992,21 +1990,6 @@ type MissingPersonalDetailsParamList = { [SCREENS.MISSING_PERSONAL_DETAILS_ROOT]: undefined; }; -type SplitExpenseParamList = { - [SCREENS.MONEY_REQUEST.SPLIT_EXPENSE]: { - reportID: string; - transactionID: string; - splitExpenseTransactionID?: string; - backTo?: Routes; - }; - [SCREENS.MONEY_REQUEST.SPLIT_EXPENSE_EDIT]: { - reportID: string; - transactionID: string; - splitExpenseTransactionID: string; - backTo?: Routes; - }; -}; - type AddUnreportedExpensesParamList = { [SCREENS.ADD_UNREPORTED_EXPENSES_ROOT]: { reportID: string; @@ -2152,7 +2135,6 @@ export type { TestDriveModalNavigatorParamList, WorkspaceScreenName, TestDriveDemoNavigatorParamList, - SplitExpenseParamList, SetParamsAction, WorkspacesTabNavigatorName, }; diff --git a/src/libs/ReportSecondaryActionUtils.ts b/src/libs/ReportSecondaryActionUtils.ts index 1d7aa33f30e0..1c66ed34aa21 100644 --- a/src/libs/ReportSecondaryActionUtils.ts +++ b/src/libs/ReportSecondaryActionUtils.ts @@ -1,4 +1,4 @@ -import type {OnyxCollection, OnyxEntry} from 'react-native-onyx'; +import type {OnyxCollection} from 'react-native-onyx'; import type {ValueOf} from 'type-fest'; import CONST from '@src/CONST'; import ONYXKEYS from '@src/ONYXKEYS'; @@ -23,7 +23,6 @@ import { canEditFieldOfMoneyRequest, canEditReportPolicy, canHoldUnholdReportAction, - getTransactionDetails, hasOnlyHeldExpenses, isArchivedReport, isAwaitingFirstLevelApproval, @@ -45,13 +44,9 @@ import { import {getSession} from './SessionUtils'; import { allHavePendingRTERViolation, - getOriginalTransactionWithSplitInfo, - hasReceipt as hasReceiptTransactionUtils, isCardTransaction as isCardTransactionUtils, isDuplicate, isOnHold as isOnHoldTransactionUtils, - isPending, - isReceiptBeingScanned, shouldShowBrokenConnectionViolationForMultipleTransactions, } from './TransactionUtils'; @@ -65,43 +60,6 @@ function isAddExpenseAction(report: Report, reportTransactions: Transaction[]) { return canAddTransaction(report); } -function isSplitAction(report: Report, reportTransactions: Transaction[], policy?: Policy): boolean { - if (Number(reportTransactions?.length) !== 1) { - return false; - } - - const reportTransaction = reportTransactions.at(0); - - const isScanning = hasReceiptTransactionUtils(reportTransaction) && isReceiptBeingScanned(reportTransaction); - if (isPending(reportTransaction) || isScanning || !!reportTransaction?.errors) { - return false; - } - - const {amount} = getTransactionDetails(reportTransaction) ?? {}; - if (!amount) { - return false; - } - - const {isExpenseSplit, isBillSplit} = getOriginalTransactionWithSplitInfo(reportTransaction); - if (isExpenseSplit || isBillSplit) { - return false; - } - - if (!isExpenseReportUtils(report)) { - return false; - } - - if (report.stateNum && report.stateNum >= CONST.REPORT.STATE_NUM.APPROVED) { - return false; - } - - const isSubmitter = isCurrentUserSubmitter(report.reportID); - const isAdmin = policy?.role === CONST.POLICY.ROLE.ADMIN; - const isManager = (report.managerID ?? CONST.DEFAULT_NUMBER_ID) === getCurrentUserAccountID(); - - return isSubmitter || isAdmin || isManager; -} - function isSubmitAction(report: Report, reportTransactions: Transaction[], policy?: Policy, reportNameValuePairs?: ReportNameValuePairs): boolean { if (isArchivedReport(reportNameValuePairs)) { return false; @@ -537,10 +495,6 @@ function getSecondaryReportActions( options.push(CONST.REPORT.SECONDARY_ACTIONS.HOLD); } - if (isSplitAction(report, reportTransactions, policy)) { - options.push(CONST.REPORT.SECONDARY_ACTIONS.SPLIT); - } - options.push(CONST.REPORT.SECONDARY_ACTIONS.DOWNLOAD_CSV); options.push(CONST.REPORT.SECONDARY_ACTIONS.DOWNLOAD_PDF); @@ -566,7 +520,6 @@ function getSecondaryTransactionThreadActions( parentReport: Report, reportTransaction: Transaction, reportActions: ReportAction[], - policy: OnyxEntry, ): Array> { const options: Array> = []; @@ -574,10 +527,6 @@ function getSecondaryTransactionThreadActions( options.push(CONST.REPORT.TRANSACTION_SECONDARY_ACTIONS.HOLD); } - if (isSplitAction(parentReport, [reportTransaction], policy)) { - options.push(CONST.REPORT.TRANSACTION_SECONDARY_ACTIONS.SPLIT); - } - options.push(CONST.REPORT.TRANSACTION_SECONDARY_ACTIONS.VIEW_DETAILS); if (isDeleteAction(parentReport, [reportTransaction], reportActions ?? [])) { diff --git a/src/libs/ReportUtils.ts b/src/libs/ReportUtils.ts index 8f1c35b42579..eb5b02c36e18 100644 --- a/src/libs/ReportUtils.ts +++ b/src/libs/ReportUtils.ts @@ -8418,9 +8418,9 @@ function temporary_getMoneyRequestOptions( report: OnyxEntry, policy: OnyxEntry, reportParticipants: number[], -): Array> { +): Array> { return getMoneyRequestOptions(report, policy, reportParticipants, true) as Array< - Exclude + Exclude >; } diff --git a/src/libs/SearchUIUtils.ts b/src/libs/SearchUIUtils.ts index e9f9bfab549a..b294cb79715b 100644 --- a/src/libs/SearchUIUtils.ts +++ b/src/libs/SearchUIUtils.ts @@ -318,10 +318,8 @@ function getTransactionsSections(data: OnyxTypes.SearchResults['data'], metadata const shouldShowMerchant = getShouldShowMerchant(data); const doesDataContainAPastYearTransaction = shouldShowYear(data); - const keys = Object.keys(data) as TransactionKey[]; - - return keys - .filter((key) => isTransactionEntry(key) && data[key]?.reportID !== CONST.REPORT.SPLIT_REPORT_ID) + return Object.keys(data) + .filter(isTransactionEntry) .map((key) => { const transactionItem = data[key]; const report = data[`${ONYXKEYS.COLLECTION.REPORT}${transactionItem.reportID}`]; diff --git a/src/libs/TransactionPreviewUtils.ts b/src/libs/TransactionPreviewUtils.ts index 319ee171335a..2562dc0e953e 100644 --- a/src/libs/TransactionPreviewUtils.ts +++ b/src/libs/TransactionPreviewUtils.ts @@ -17,7 +17,7 @@ import StringUtils from './StringUtils'; import { compareDuplicateTransactionFields, getFormattedCreated, - getOriginalTransactionWithSplitInfo, + getTransaction, hasMissingSmartscanFields, hasNoticeTypeViolation, hasPendingRTERViolation, @@ -109,6 +109,22 @@ type TranslationPathOrText = { const dotSeparator: TranslationPathOrText = {text: ` ${CONST.DOT_SEPARATOR} `}; +const getOriginalTransactionIfBillIsSplit = (transaction: OnyxEntry) => { + const {originalTransactionID, source, splits} = transaction?.comment ?? {}; + + if (splits && splits.length > 0) { + return {isBillSplit: true, originalTransaction: getTransaction(originalTransactionID) ?? transaction}; + } + + if (!originalTransactionID || source !== CONST.IOU.TYPE.SPLIT) { + return {isBillSplit: false, originalTransaction: transaction}; + } + + const originalTransaction = getTransaction(originalTransactionID); + + return {isBillSplit: !!originalTransaction, originalTransaction: originalTransaction ?? transaction}; +}; + function getViolationTranslatePath(violations: OnyxTypes.TransactionViolations, hasFieldErrors: boolean, violationMessage: string, isTransactionOnHold: boolean): TranslationPathOrText { const violationsCount = violations?.filter((v) => v.type === CONST.VIOLATION_TYPES.VIOLATION).length ?? 0; @@ -252,7 +268,7 @@ function getTransactionPreviewTextAndTranslationPaths({ } } - const amount = isBillSplit ? getOriginalTransactionWithSplitInfo(transaction).originalTransaction?.amount : requestAmount; + const amount = isBillSplit ? getOriginalTransactionIfBillIsSplit(transaction).originalTransaction?.amount : requestAmount; let displayAmountText: TranslationPathOrText = isScanning ? {translationPath: 'iou.receiptStatusTitle'} : {text: convertToDisplayString(amount, requestCurrency)}; if (isFetchingWaypoints && !requestAmount) { displayAmountText = {translationPath: 'iou.fieldPending'}; @@ -347,5 +363,13 @@ function createTransactionPreviewConditionals({ }; } -export {getReviewNavigationRoute, getIOUData, getTransactionPreviewTextAndTranslationPaths, createTransactionPreviewConditionals, getViolationTranslatePath, getUniqueActionErrors}; +export { + getReviewNavigationRoute, + getIOUData, + getTransactionPreviewTextAndTranslationPaths, + createTransactionPreviewConditionals, + getOriginalTransactionIfBillIsSplit, + getViolationTranslatePath, + getUniqueActionErrors, +}; export type {TranslationPathOrText}; diff --git a/src/libs/TransactionUtils/index.ts b/src/libs/TransactionUtils/index.ts index 44656fe3157a..6984159e2d08 100644 --- a/src/libs/TransactionUtils/index.ts +++ b/src/libs/TransactionUtils/index.ts @@ -43,7 +43,7 @@ import CONST from '@src/CONST'; import type {IOUType} from '@src/CONST'; import ONYXKEYS from '@src/ONYXKEYS'; import type {OnyxInputOrEntry, Policy, RecentWaypoint, Report, ReviewDuplicates, TaxRate, TaxRates, Transaction, TransactionViolation, TransactionViolations} from '@src/types/onyx'; -import type {Attendee, Participant, SplitExpense} from '@src/types/onyx/IOU'; +import type {Attendee} from '@src/types/onyx/IOU'; import type {PendingAction} from '@src/types/onyx/OnyxCommon'; import type {SearchPolicy, SearchReport, SearchTransaction} from '@src/types/onyx/SearchResults'; import type {Comment, Receipt, TransactionChanges, TransactionCustomUnit, TransactionPendingFieldsKey, Waypoint, WaypointCollection} from '@src/types/onyx/Transaction'; @@ -70,8 +70,6 @@ type TransactionParams = { source?: string; filename?: string; customUnit?: TransactionCustomUnit; - splitExpenses?: SplitExpense[]; - participants?: Participant[]; }; type BuildOptimisticTransactionParams = { @@ -263,8 +261,6 @@ function buildOptimisticTransaction(params: BuildOptimisticTransactionParams): T source = '', filename = '', customUnit, - splitExpenses, - participants, } = transactionParams; // transactionIDs are random, positive, 64-bit numeric strings. // Because JS can only handle 53-bit numbers, transactionIDs are strings in the front-end (just like reportActionID) @@ -278,10 +274,6 @@ function buildOptimisticTransaction(params: BuildOptimisticTransactionParams): T commentJSON.originalTransactionID = originalTransactionID; } - if (splitExpenses) { - commentJSON.splitExpenses = splitExpenses; - } - const isDistanceTransaction = !!pendingFields?.waypoints; if (isDistanceTransaction) { // Set the distance unit, which comes from the policy distance unit or the P2P rate data @@ -313,7 +305,6 @@ function buildOptimisticTransaction(params: BuildOptimisticTransactionParams): T billable, reimbursable, inserted: DateUtils.getDBTime(), - participants, }; } @@ -1275,8 +1266,6 @@ function getTaxName(policy: OnyxEntry, transaction: OnyxEntry { return allTransactions?.[`${ONYXKEYS.COLLECTION.TRANSACTION}${transactionID}`]; } @@ -1557,23 +1546,6 @@ function shouldShowRTERViolationMessage(transactions?: Transaction[]) { return transactions?.length === 1 && hasPendingUI(transactions?.at(0), getTransactionViolations(transactions?.at(0)?.transactionID, allTransactionViolations)); } -const getOriginalTransactionWithSplitInfo = (transaction: OnyxEntry) => { - const {originalTransactionID, source, splits} = transaction?.comment ?? {}; - const originalTransaction = allTransactions?.[`${ONYXKEYS.COLLECTION.TRANSACTION}${originalTransactionID}`]; - - if (splits && splits.length > 0) { - return {isBillSplit: true, isExpenseSplit: false, originalTransaction: originalTransaction ?? transaction}; - } - - if (!originalTransactionID || source !== CONST.IOU.TYPE.SPLIT) { - return {isBillSplit: false, isExpenseSplit: false, originalTransaction: transaction}; - } - - // To determine if it’s a split bill or a split expense, we check for the presence of `comment.splits` on the original transaction. - // Since both splits use `comment.originalTransaction`, but split expenses won’t have `comment.splits`. - return {isBillSplit: !!originalTransaction?.comment?.splits, isExpenseSplit: !originalTransaction?.comment?.splits, originalTransaction: originalTransaction ?? transaction}; -}; - /** * Return transactions pending action. */ @@ -1660,8 +1632,6 @@ export { hasWarningTypeViolation, isCustomUnitRateIDForP2P, getRateID, - // TODO: Will be handled in this PR https://github.com/Expensify/App/pull/62434 - // eslint-disable-next-line deprecation/deprecation getTransaction, compareDuplicateTransactionFields, getTransactionID, @@ -1684,7 +1654,6 @@ export { isPendingCardOrScanningTransaction, getTransactionOrDraftTransaction, checkIfShouldShowMarkAsCashButton, - getOriginalTransactionWithSplitInfo, getTransactionPendingAction, }; diff --git a/src/libs/__mocks__/TransactionPreviewUtils.ts b/src/libs/__mocks__/TransactionPreviewUtils.ts index b4d6662ae05b..30eb80c44e04 100644 --- a/src/libs/__mocks__/TransactionPreviewUtils.ts +++ b/src/libs/__mocks__/TransactionPreviewUtils.ts @@ -34,6 +34,7 @@ export { getTransactionPreviewTextAndTranslationPaths, createTransactionPreviewConditionals, getReviewNavigationRoute, + getOriginalTransactionIfBillIsSplit, getViolationTranslatePath, getUniqueActionErrors, } from '../TransactionPreviewUtils'; diff --git a/src/libs/actions/IOU.ts b/src/libs/actions/IOU.ts index 5d99f6a5edfd..20c3fe4a5582 100644 --- a/src/libs/actions/IOU.ts +++ b/src/libs/actions/IOU.ts @@ -29,8 +29,6 @@ import type { SetNameValuePairParams, ShareTrackedExpenseParams, SplitBillParams, - SplitTransactionParams, - SplitTransactionSplitsParam, StartSplitBillParams, SubmitReportParams, TrackExpenseParams, @@ -58,7 +56,7 @@ import Log from '@libs/Log'; import isSearchTopmostFullScreenRoute from '@libs/Navigation/helpers/isSearchTopmostFullScreenRoute'; import Navigation from '@libs/Navigation/Navigation'; import {buildNextStep} from '@libs/NextStepUtils'; -import * as NumberUtils from '@libs/NumberUtils'; +import {rand64} from '@libs/NumberUtils'; import {getManagerMcTestParticipant, getPersonalDetailsForAccountIDs} from '@libs/OptionsListUtils'; import {getCustomUnitID} from '@libs/PerDiemRequestUtils'; import Performance from '@libs/Performance'; @@ -216,16 +214,16 @@ import type {SearchDataTypes, SearchPolicy, SearchReport, SearchTransaction} fro import type {Comment, Receipt, ReceiptSource, Routes, SplitShares, TransactionChanges, TransactionCustomUnit, WaypointCollection} from '@src/types/onyx/Transaction'; import {isEmptyObject} from '@src/types/utils/EmptyObject'; import {clearByKey as clearPdfByOnyxKey} from './CachedPDFPaths'; -import {buildOptimisticPolicyRecentlyUsedCategories, getPolicyCategoriesData} from './Policy/Category'; +import {buildOptimisticPolicyRecentlyUsedCategories} from './Policy/Category'; import {buildAddMembersToWorkspaceOnyxData, buildUpdateWorkspaceMembersRoleOnyxData} from './Policy/Member'; import {buildOptimisticPolicyRecentlyUsedDestinations} from './Policy/PerDiem'; import {buildOptimisticRecentlyUsedCurrencies, buildPolicyData, generatePolicyID} from './Policy/Policy'; -import {buildOptimisticPolicyRecentlyUsedTags, getPolicyTagsData} from './Policy/Tag'; +import {buildOptimisticPolicyRecentlyUsedTags} from './Policy/Tag'; import type {GuidedSetupData} from './Report'; import {buildInviteToRoomOnyxData, completeOnboarding, getCurrentUserAccountID, notifyNewAction} from './Report'; import {clearAllRelatedReportActionErrors} from './ReportActions'; import {getRecentWaypoints, sanitizeRecentWaypoints} from './Transaction'; -import {removeDraftSplitTransaction, removeDraftTransaction, removeDraftTransactions} from './TransactionEdit'; +import {removeDraftTransaction, removeDraftTransactions} from './TransactionEdit'; type IOURequestType = ValueOf; @@ -371,7 +369,6 @@ type RequestMoneyTransactionParams = Omit & { receipt?: Receipt; waypoints?: WaypointCollection; comment?: string; - originalTransactionID?: string; isTestDrive?: boolean; }; @@ -431,7 +428,6 @@ type MoneyRequestInformationParams = { existingTransactionID?: string; existingTransaction?: OnyxEntry; retryParams?: StartSplitBilActionParams | CreateTrackExpenseParams | RequestMoneyInformation | ReplaceReceipt; - isSplitExpense?: boolean; testDriveCommentReportActionID?: string; }; @@ -3231,7 +3227,6 @@ function getMoneyRequestInformation(moneyRequestInformation: MoneyRequestInforma existingTransactionID, moneyRequestReportID = '', retryParams, - isSplitExpense, testDriveCommentReportActionID, } = moneyRequestInformation; const {payeeAccountID = userAccountID, payeeEmail = currentUserEmail, participant} = participantParams; @@ -3280,19 +3275,15 @@ function getMoneyRequestInformation(moneyRequestInformation: MoneyRequestInforma ? buildOptimisticExpenseReport(chatReport.reportID, chatReport.policyID, payeeAccountID, amount, currency) : buildOptimisticIOUReport(payeeAccountID, payerAccountID, amount, chatReport.reportID, currency); } else if (isPolicyExpenseChat) { - // Splitting doesn’t affect the amount, so no adjustment is needed - // The amount remains constant after the split - if (!isSplitExpense) { - iouReport = {...iouReport}; - // Because of the Expense reports are stored as negative values, we subtract the total from the amount - if (iouReport?.currency === currency) { - if (!Number.isNaN(iouReport.total) && iouReport.total !== undefined) { - iouReport.total -= amount; - } + iouReport = {...iouReport}; + // Because of the Expense reports are stored as negative values, we subtract the total from the amount + if (iouReport?.currency === currency) { + if (!Number.isNaN(iouReport.total) && iouReport.total !== undefined) { + iouReport.total -= amount; + } - if (typeof iouReport.unheldTotal === 'number') { - iouReport.unheldTotal -= amount; - } + if (typeof iouReport.unheldTotal === 'number') { + iouReport.unheldTotal -= amount; } } } else { @@ -3304,7 +3295,6 @@ function getMoneyRequestInformation(moneyRequestInformation: MoneyRequestInforma let optimisticTransaction = buildOptimisticTransaction({ existingTransactionID, existingTransaction, - originalTransactionID: transactionParams.originalTransactionID, policy, transactionParams: { amount: isExpenseReport(iouReport) ? -amount : amount, @@ -5186,7 +5176,7 @@ function requestMoney(requestMoneyInformation: RequestMoneyInformation) { isTestDrive, } = transactionParams; - const testDriveCommentReportActionID = isTestDrive ? NumberUtils.rand64() : undefined; + const testDriveCommentReportActionID = isTestDrive ? rand64() : undefined; const sanitizedWaypoints = waypoints ? JSON.stringify(sanitizeRecentWaypoints(waypoints)) : undefined; @@ -8463,7 +8453,7 @@ function getReportFromHoldRequestsOnyxData( } { const {holdReportActions, holdTransactions} = getHoldReportActionsAndTransactions(iouReport?.reportID); const firstHoldTransaction = holdTransactions.at(0); - const newParentReportActionID = NumberUtils.rand64(); + const newParentReportActionID = rand64(); const coefficient = isExpenseReport(iouReport) ? -1 : 1; const isPolicyExpenseChat = isPolicyExpenseChatReportUtil(chatReport); @@ -8517,7 +8507,7 @@ function getReportFromHoldRequestsOnyxData( ], }; - const reportActionID = NumberUtils.rand64(); + const reportActionID = rand64(); addHoldReportActions[reportActionID] = { ...holdReportAction, reportActionID, @@ -11278,406 +11268,6 @@ function getSearchOnyxUpdate({participant, transaction, iouReport}: GetSearchOny } } -/** - * Create a draft transaction to set up split expense details for the split expense flow - */ -function initSplitExpense(transaction: OnyxEntry, reportID: string, isOpenCreatedSplit?: boolean) { - if (!transaction) { - return; - } - - if (isOpenCreatedSplit) { - const originalTransactionID = transaction.comment?.originalTransactionID; - const originalTransaction = allTransactions[`${ONYXKEYS.COLLECTION.TRANSACTION}${originalTransactionID}`]; - - const relatedTransactions = Object.values(allTransactions).filter((currentTransaction) => { - const currentReport = allReports?.[`${ONYXKEYS.COLLECTION.REPORT}${currentTransaction?.reportID}`]; - return currentTransaction?.comment?.originalTransactionID === originalTransactionID && !!currentReport && currentReport?.stateNum !== CONST.REPORT.STATUS_NUM.CLOSED; - }); - - const transactionDetails = getTransactionDetails(originalTransaction); - - const draftTransaction = buildOptimisticTransaction({ - originalTransactionID, - transactionParams: { - splitExpenses: relatedTransactions.map((currentTransaction) => { - const currentTransactionDetails = getTransactionDetails(currentTransaction); - return { - transactionID: currentTransaction?.transactionID ?? String(CONST.DEFAULT_NUMBER_ID), - amount: currentTransactionDetails?.amount ?? 0, - description: currentTransactionDetails?.comment, - category: currentTransactionDetails?.category, - tags: currentTransactionDetails?.tag ? [currentTransactionDetails?.tag] : [], - created: currentTransaction?.created ?? '', - }; - }), - amount: transactionDetails?.amount ?? 0, - currency: transactionDetails?.currency ?? CONST.CURRENCY.USD, - merchant: transactionDetails?.merchant ?? '', - participants: transaction?.participants, - attendees: transactionDetails?.attendees as Attendee[], - reportID: originalTransaction?.reportID, - }, - }); - - Onyx.set(`${ONYXKEYS.COLLECTION.SPLIT_TRANSACTION_DRAFT}${originalTransactionID}`, draftTransaction); - - Navigation.navigate( - ROUTES.SPLIT_EXPENSE.getRoute( - originalTransaction?.reportID ?? String(CONST.DEFAULT_NUMBER_ID), - originalTransactionID, - transaction.transactionID, - Navigation.getActiveRouteWithoutParams(), - ), - ); - return; - } - - const transactionDetails = getTransactionDetails(transaction); - const transactionDetailsAmount = transactionDetails?.amount ?? 0; - - const draftTransaction = buildOptimisticTransaction({ - originalTransactionID: transaction.transactionID, - transactionParams: { - splitExpenses: [ - { - transactionID: NumberUtils.rand64(), - amount: Math.floor(transactionDetailsAmount / 2), - description: transactionDetails?.comment, - category: transactionDetails?.category, - tags: transaction?.tag ? [transaction?.tag] : [], - created: transactionDetails?.created ?? DateUtils.getDBTime(), - }, - { - transactionID: NumberUtils.rand64(), - amount: Math.ceil(transactionDetailsAmount / 2), - description: transactionDetails?.comment, - category: transactionDetails?.category, - tags: transaction?.tag ? [transaction?.tag] : [], - created: transactionDetails?.created ?? DateUtils.getDBTime(), - }, - ], - amount: transactionDetailsAmount, - currency: transactionDetails?.currency ?? CONST.CURRENCY.USD, - merchant: transactionDetails?.merchant ?? '', - participants: transaction?.participants, - attendees: transactionDetails?.attendees as Attendee[], - reportID, - }, - }); - - Onyx.set(`${ONYXKEYS.COLLECTION.SPLIT_TRANSACTION_DRAFT}${transaction?.transactionID}`, draftTransaction); - - Navigation.navigate(ROUTES.SPLIT_EXPENSE.getRoute(reportID ?? String(CONST.DEFAULT_NUMBER_ID), transaction.transactionID, undefined, Navigation.getActiveRoute())); -} - -/** - * Create a draft transaction to set up split expense details for edit split details - */ -function initDraftSplitExpenseDataForEdit(draftTransaction: OnyxEntry, splitExpenseTransactionID: string, reportID: string) { - if (!draftTransaction || !splitExpenseTransactionID) { - return; - } - const originalTransactionID = draftTransaction?.comment?.originalTransactionID; - const originalTransaction = allTransactions?.[`${ONYXKEYS.COLLECTION.TRANSACTION}${originalTransactionID}`]; - const splitTransactionData = draftTransaction?.comment?.splitExpenses?.find((item) => item.transactionID === splitExpenseTransactionID); - - const transactionDetails = getTransactionDetails(originalTransaction); - - const editDraftTransaction = buildOptimisticTransaction({ - existingTransactionID: CONST.IOU.OPTIMISTIC_TRANSACTION_ID, - originalTransactionID, - transactionParams: { - amount: Number(splitTransactionData?.amount), - currency: transactionDetails?.currency ?? CONST.CURRENCY.USD, - comment: splitTransactionData?.description, - tag: splitTransactionData?.tags?.at(0), - merchant: transactionDetails?.merchant ?? '', - participants: draftTransaction?.participants, - attendees: transactionDetails?.attendees as Attendee[], - reportID, - created: splitTransactionData?.created ?? '', - category: splitTransactionData?.category ?? '', - }, - }); - - Onyx.set(`${ONYXKEYS.COLLECTION.SPLIT_TRANSACTION_DRAFT}${CONST.IOU.OPTIMISTIC_TRANSACTION_ID}`, editDraftTransaction); - - Navigation.navigate(ROUTES.SPLIT_EXPENSE_EDIT.getRoute(reportID, originalTransactionID, splitTransactionData?.transactionID, Navigation.getActiveRoute())); -} - -/** - * Append a new split expense entry to the draft transaction’s splitExpenses array - */ -function addSplitExpenseField(transaction: OnyxEntry, draftTransaction: OnyxEntry) { - if (!transaction || !draftTransaction) { - return; - } - - const transactionDetails = getTransactionDetails(transaction); - - Onyx.merge(`${ONYXKEYS.COLLECTION.SPLIT_TRANSACTION_DRAFT}${transaction.transactionID}`, { - comment: { - splitExpenses: [ - ...(draftTransaction.comment?.splitExpenses ?? []), - { - transactionID: NumberUtils.rand64(), - amount: 0, - description: transactionDetails?.comment, - category: transactionDetails?.category, - tags: transaction?.tag ? [transaction?.tag] : [], - created: transactionDetails?.created ?? DateUtils.getDBTime(), - }, - ], - }, - }); -} - -function removeSplitExpenseField(draftTransaction: OnyxEntry, splitExpenseTransactionID: string) { - if (!draftTransaction || !splitExpenseTransactionID) { - return; - } - - const originalTransactionID = draftTransaction?.comment?.originalTransactionID; - - const splitExpenses = draftTransaction.comment?.splitExpenses?.filter((item) => item.transactionID !== splitExpenseTransactionID); - - Onyx.merge(`${ONYXKEYS.COLLECTION.SPLIT_TRANSACTION_DRAFT}${originalTransactionID}`, { - comment: { - splitExpenses, - }, - }); -} - -function updateSplitExpenseField(splitExpenseDraftTransaction: OnyxEntry, splitExpenseTransactionID: string) { - if (!splitExpenseDraftTransaction || !splitExpenseTransactionID) { - return; - } - - const originalTransactionID = splitExpenseDraftTransaction?.comment?.originalTransactionID; - - const draftTransaction = allDraftSplitTransactions[`${ONYXKEYS.COLLECTION.SPLIT_TRANSACTION_DRAFT}${originalTransactionID}`]; - - const splitExpenses = draftTransaction?.comment?.splitExpenses?.map((item) => { - if (item.transactionID === splitExpenseTransactionID) { - const transactionDetails = getTransactionDetails(splitExpenseDraftTransaction); - - return { - ...item, - description: transactionDetails?.comment, - category: transactionDetails?.category, - tags: splitExpenseDraftTransaction?.tag ? [splitExpenseDraftTransaction?.tag] : [], - created: transactionDetails?.created ?? DateUtils.getDBTime(), - }; - } - return item; - }); - - Onyx.merge(`${ONYXKEYS.COLLECTION.SPLIT_TRANSACTION_DRAFT}${originalTransactionID}`, { - comment: { - splitExpenses, - }, - }); -} - -function updateSplitExpenseAmountField(draftTransaction: OnyxEntry, currentItemTransactionID: string, amount: number) { - if (!draftTransaction?.transactionID || !currentItemTransactionID) { - return; - } - - const updatedSplitExpenses = draftTransaction.comment?.splitExpenses?.map((splitExpense) => { - if (splitExpense.transactionID === currentItemTransactionID) { - return { - ...splitExpense, - amount, - }; - } - return splitExpense; - }); - - Onyx.merge(`${ONYXKEYS.COLLECTION.SPLIT_TRANSACTION_DRAFT}${draftTransaction?.comment?.originalTransactionID}`, { - comment: { - splitExpenses: updatedSplitExpenses, - }, - }); -} - -function saveSplitTransactions(draftTransaction: OnyxEntry, hash: number) { - const transactionReport = getReportOrDraftReport(draftTransaction?.reportID); - const parentTransactionReport = getReportOrDraftReport(transactionReport?.parentReportID); - const expenseReport = transactionReport?.type === CONST.REPORT.TYPE.EXPENSE ? transactionReport : parentTransactionReport; - - const originalTransactionID = draftTransaction?.comment?.originalTransactionID ?? CONST.IOU.OPTIMISTIC_TRANSACTION_ID; - const originalTransaction = allTransactions?.[`${ONYXKEYS.COLLECTION.TRANSACTION}${originalTransactionID}`]; - const originalTransactionViolations = allTransactionViolations[`${ONYXKEYS.COLLECTION.TRANSACTION_VIOLATIONS}${originalTransactionID}`] ?? []; - const iouActions = getIOUActionForTransactions([originalTransactionID], expenseReport?.reportID); - - const policy = getPolicy(expenseReport?.policyID); - const policyCategories = getPolicyCategoriesData(expenseReport?.policyID); - const policyTags = getPolicyTagsData(expenseReport?.policyID); - const participants = getMoneyRequestParticipantsFromReport(expenseReport); - const splitExpenses = draftTransaction?.comment?.splitExpenses ?? []; - - const splits: SplitTransactionSplitsParam = - splitExpenses.map((split) => ({ - amount: split.amount, - category: split.category ?? '', - tag: split.tags?.[0] ?? '', - created: DateUtils.extractDate(split.created), - merchant: draftTransaction?.merchant ?? '', - transactionID: split.transactionID, - comment: { - comment: split.description, - }, - })) ?? []; - - const successData = [] as OnyxUpdate[]; - const failureData = [] as OnyxUpdate[]; - const optimisticData = [] as OnyxUpdate[]; - - splitExpenses.forEach((splitExpense, index) => { - const requestMoneyInformation = { - report: expenseReport, - participantParams: { - participant: participants.at(0) ?? ({} as Participant), - payeeEmail: currentUserPersonalDetails?.login ?? '', - payeeAccountID: currentUserPersonalDetails?.accountID ?? CONST.DEFAULT_NUMBER_ID, - }, - policyParams: { - policy, - policyCategories, - policyTags, - }, - transactionParams: { - amount: splitExpense.amount ?? 0, - currency: draftTransaction?.currency ?? CONST.CURRENCY.USD, - created: splitExpense.created, - merchant: draftTransaction?.merchant ?? '', - comment: splitExpense.description, - category: splitExpense.category, - tag: splitExpense.tags?.[0], - originalTransactionID, - attendees: draftTransaction?.comment?.attendees, - }, - }; - - const {report, participantParams, policyParams, transactionParams} = requestMoneyInformation; - const parsedComment = getParsedComment(transactionParams.comment ?? ''); - transactionParams.comment = parsedComment; - - const currentChatReport = getReportOrDraftReport(report?.chatReportID); - const parentChatReport = getReportOrDraftReport(currentChatReport?.parentReportID); - - const existingTransactionID = splitExpense.transactionID; - - const {transactionThreadReportID, createdReportActionIDForThread, onyxData, iouAction} = getMoneyRequestInformation({ - participantParams, - parentChatReport, - policyParams, - transactionParams, - moneyRequestReportID: report?.reportID, - existingTransactionID, - isSplitExpense: true, - }); - - const split = splits.at(index); - if (split) { - // For request params we need to have the transactionThreadReportID, createdReportActionIDForThread and splitReportActionID which we get from moneyRequestInformation - split.transactionThreadReportID = transactionThreadReportID; - split.createdReportActionIDForThread = createdReportActionIDForThread; - split.splitReportActionID = iouAction.reportActionID; - } - - optimisticData.push(...(onyxData.optimisticData ?? [])); - successData.push(...(onyxData.successData ?? [])); - failureData.push(...(onyxData.failureData ?? [])); - }); - - optimisticData.push({ - onyxMethod: Onyx.METHOD.MERGE, - key: `${ONYXKEYS.COLLECTION.TRANSACTION}${originalTransactionID}`, - value: { - ...originalTransaction, - reportID: CONST.REPORT.SPLIT_REPORT_ID, - }, - }); - - const firstIOU = iouActions.at(0); - if (firstIOU) { - const {updatedReportAction, iouReport} = prepareToCleanUpMoneyRequest(originalTransactionID, firstIOU, Permissions.canUseTableReportView(betas)); - optimisticData.push({ - onyxMethod: Onyx.METHOD.MERGE, - key: `${ONYXKEYS.COLLECTION.REPORT_ACTIONS}${iouReport?.reportID}`, - value: updatedReportAction, - }); - - failureData.push({ - onyxMethod: Onyx.METHOD.MERGE, - key: `${ONYXKEYS.COLLECTION.REPORT_ACTIONS}${iouReport?.reportID}`, - value: { - [firstIOU.reportActionID]: { - ...firstIOU, - pendingAction: null, - }, - }, - }); - } - - failureData.push({ - onyxMethod: Onyx.METHOD.MERGE, - key: `${ONYXKEYS.COLLECTION.TRANSACTION}${originalTransactionID}`, - value: originalTransaction, - }); - - optimisticData.push({ - onyxMethod: Onyx.METHOD.MERGE, - key: `${ONYXKEYS.COLLECTION.SNAPSHOT}${hash}`, - value: { - data: { - [`${ONYXKEYS.COLLECTION.TRANSACTION}${originalTransactionID}`]: { - ...originalTransactionViolations, - reportID: CONST.REPORT.SPLIT_REPORT_ID, - }, - }, - }, - }); - - failureData.push({ - onyxMethod: Onyx.METHOD.MERGE, - key: `${ONYXKEYS.COLLECTION.SNAPSHOT}${hash}`, - value: { - data: { - [`${ONYXKEYS.COLLECTION.TRANSACTION}${originalTransactionID}`]: originalTransactionViolations, - }, - }, - }); - - // Prepare splitApiParams for the Transaction_Split API call which requires a specific format for the splits - // The format is: splits[0][amount], splits[0][category], splits[0][tag], etc. - const splitApiParams = {} as Record; - splits.forEach((split, i) => { - Object.entries(split).forEach(([key, value]) => { - const formattedValue = value !== null && typeof value === 'object' ? JSON.stringify(value) : value; - splitApiParams[`splits[${i}][${key}]`] = formattedValue; - }); - }); - - const parameters: SplitTransactionParams = { - ...splitApiParams, - isReverseSplitOperation: false, - transactionID: originalTransactionID, - }; - - API.write(WRITE_COMMANDS.SPLIT_TRANSACTION, parameters, {optimisticData, successData, failureData}); - InteractionManager.runAfterInteractions(() => removeDraftSplitTransaction(originalTransactionID)); - const isSearchPageTopmostFullScreenRoute = isSearchTopmostFullScreenRoute(); - if (isSearchPageTopmostFullScreenRoute || !transactionReport?.parentReportID) { - Navigation.dismissModal(); - return; - } - Navigation.dismissModalWithReport({reportID: transactionReport?.parentReportID}); -} - export { adjustRemainingSplitShares, getNextApproverAccountID, @@ -11771,13 +11361,6 @@ export { canSubmitReport, submitPerDiemExpense, calculateDiffAmount, - initSplitExpense, - addSplitExpenseField, - updateSplitExpenseAmountField, - saveSplitTransactions, - initDraftSplitExpenseDataForEdit, - removeSplitExpenseField, - updateSplitExpenseField, reopenReport, retractReport, }; diff --git a/src/libs/actions/TransactionEdit.ts b/src/libs/actions/TransactionEdit.ts index ba50e7700ba2..57cbcffff354 100644 --- a/src/libs/actions/TransactionEdit.ts +++ b/src/libs/actions/TransactionEdit.ts @@ -86,14 +86,6 @@ function removeDraftTransaction(transactionID: string | undefined) { Onyx.set(`${ONYXKEYS.COLLECTION.TRANSACTION_DRAFT}${transactionID}`, null); } -function removeDraftSplitTransaction(transactionID: string | undefined) { - if (!transactionID) { - return; - } - - Onyx.set(`${ONYXKEYS.COLLECTION.SPLIT_TRANSACTION_DRAFT}${transactionID}`, null); -} - function removeDraftTransactions() { const draftTransactions = getDraftTransactions(); const draftTransactionsSet = draftTransactions.reduce((acc, item) => { @@ -103,12 +95,4 @@ function removeDraftTransactions() { Onyx.multiSet(draftTransactionsSet); } -export { - createBackupTransaction, - removeBackupTransaction, - restoreOriginalTransactionFromBackup, - createDraftTransaction, - removeDraftTransaction, - removeDraftTransactions, - removeDraftSplitTransaction, -}; +export {createBackupTransaction, removeBackupTransaction, restoreOriginalTransactionFromBackup, createDraftTransaction, removeDraftTransaction, removeDraftTransactions}; diff --git a/src/pages/home/report/ReportActionCompose/AttachmentPickerWithMenuItems.tsx b/src/pages/home/report/ReportActionCompose/AttachmentPickerWithMenuItems.tsx index 77de23706b3e..1764a3f3bfa9 100644 --- a/src/pages/home/report/ReportActionCompose/AttachmentPickerWithMenuItems.tsx +++ b/src/pages/home/report/ReportActionCompose/AttachmentPickerWithMenuItems.tsx @@ -35,10 +35,7 @@ import ONYXKEYS from '@src/ONYXKEYS'; import ROUTES from '@src/ROUTES'; import type * as OnyxTypes from '@src/types/onyx'; -type MoneyRequestOptions = Record< - Exclude, - PopoverMenuItem ->; +type MoneyRequestOptions = Record, PopoverMenuItem>; type AttachmentPickerWithMenuItemsProps = { /** The report currently being looked at */ diff --git a/src/pages/iou/SplitExpenseEditPage.tsx b/src/pages/iou/SplitExpenseEditPage.tsx deleted file mode 100644 index 2b7f85cd2c53..000000000000 --- a/src/pages/iou/SplitExpenseEditPage.tsx +++ /dev/null @@ -1,182 +0,0 @@ -import React, {useMemo} from 'react'; -import {View} from 'react-native'; -import {useOnyx} from 'react-native-onyx'; -import FullPageNotFoundView from '@components/BlockingViews/FullPageNotFoundView'; -import Button from '@components/Button'; -import FixedFooter from '@components/FixedFooter'; -import HeaderWithBackButton from '@components/HeaderWithBackButton'; -import MenuItemWithTopDescription from '@components/MenuItemWithTopDescription'; -import ScreenWrapper from '@components/ScreenWrapper'; -import useLocalize from '@hooks/useLocalize'; -import useThemeStyles from '@hooks/useThemeStyles'; -import {removeSplitExpenseField, updateSplitExpenseField} from '@libs/actions/IOU'; -import {convertToDisplayString} from '@libs/CurrencyUtils'; -import Navigation from '@libs/Navigation/Navigation'; -import type {PlatformStackScreenProps} from '@libs/Navigation/PlatformStackNavigation/types'; -import type {SplitExpenseParamList} from '@libs/Navigation/types'; -import {getPolicy} from '@libs/PolicyUtils'; -import type {TransactionDetails} from '@libs/ReportUtils'; -import {getReportOrDraftReport, getTransactionDetails} from '@libs/ReportUtils'; -import CONST from '@src/CONST'; -import ONYXKEYS from '@src/ONYXKEYS'; -import ROUTES from '@src/ROUTES'; -import type SCREENS from '@src/SCREENS'; -import {isEmptyObject} from '@src/types/utils/EmptyObject'; - -type SplitExpensePageProps = PlatformStackScreenProps; - -function SplitExpenseEditPage({route}: SplitExpensePageProps) { - const styles = useThemeStyles(); - const {translate} = useLocalize(); - - const {reportID, transactionID, splitExpenseTransactionID = '', backTo} = route.params; - - const [splitExpenseDraftTransaction] = useOnyx(`${ONYXKEYS.COLLECTION.SPLIT_TRANSACTION_DRAFT}${CONST.IOU.OPTIMISTIC_TRANSACTION_ID}`, {canBeMissing: false}); - const splitExpenseDraftTransactionDetails = useMemo>(() => getTransactionDetails(splitExpenseDraftTransaction) ?? {}, [splitExpenseDraftTransaction]); - - const [transaction] = useOnyx(`${ONYXKEYS.COLLECTION.TRANSACTION}${transactionID}`, {canBeMissing: false}); - const transactionDetails = useMemo>(() => getTransactionDetails(transaction) ?? {}, [transaction]); - const transactionDetailsAmount = transactionDetails?.amount ?? 0; - - const [draftTransactioWithSplitExpenses] = useOnyx(`${ONYXKEYS.COLLECTION.SPLIT_TRANSACTION_DRAFT}${transactionID}`, {canBeMissing: false}); - const splitExpensesList = draftTransactioWithSplitExpenses?.comment?.splitExpenses; - - const currentAmount = transactionDetailsAmount >= 0 ? Math.abs(Number(splitExpenseDraftTransactionDetails?.amount)) : Number(splitExpenseDraftTransactionDetails?.amount); - - const report = getReportOrDraftReport(reportID); - const policy = getPolicy(report?.policyID); - - return ( - - - - Navigation.goBack(backTo)} - /> - - { - Navigation.navigate( - ROUTES.MONEY_REQUEST_STEP_DESCRIPTION.getRoute( - CONST.IOU.ACTION.EDIT, - CONST.IOU.TYPE.SPLIT_EXPENSE, - CONST.IOU.OPTIMISTIC_TRANSACTION_ID, - reportID, - Navigation.getActiveRoute(), - ), - ); - }} - style={[styles.moneyRequestMenuItem]} - titleStyle={styles.flex1} - numberOfLinesTitle={2} - /> - {!!policy?.areCategoriesEnabled && ( - { - Navigation.navigate( - ROUTES.MONEY_REQUEST_STEP_CATEGORY.getRoute( - CONST.IOU.ACTION.EDIT, - CONST.IOU.TYPE.SPLIT_EXPENSE, - CONST.IOU.OPTIMISTIC_TRANSACTION_ID, - reportID, - Navigation.getActiveRoute(), - ), - ); - }} - style={[styles.moneyRequestMenuItem]} - titleStyle={styles.flex1} - /> - )} - {!!policy?.areTagsEnabled && ( - { - Navigation.navigate( - ROUTES.MONEY_REQUEST_STEP_TAG.getRoute( - CONST.IOU.ACTION.EDIT, - CONST.IOU.TYPE.SPLIT_EXPENSE, - 0, - CONST.IOU.OPTIMISTIC_TRANSACTION_ID, - reportID, - Navigation.getActiveRoute(), - ), - ); - }} - style={[styles.moneyRequestMenuItem]} - titleStyle={styles.flex1} - /> - )} - { - Navigation.navigate( - ROUTES.MONEY_REQUEST_STEP_DATE.getRoute( - CONST.IOU.ACTION.EDIT, - CONST.IOU.TYPE.SPLIT_EXPENSE, - CONST.IOU.OPTIMISTIC_TRANSACTION_ID, - reportID, - Navigation.getActiveRoute(), - ), - ); - }} - style={[styles.moneyRequestMenuItem]} - titleStyle={styles.flex1} - /> - - - {Number(splitExpensesList?.length) > 2 && ( -