diff --git a/src/ROUTES.ts b/src/ROUTES.ts index 41fd4b830f12..79c41dd9b975 100644 --- a/src/ROUTES.ts +++ b/src/ROUTES.ts @@ -520,28 +520,48 @@ const ROUTES = { }, MONEY_REQUEST_STEP_AMOUNT: { route: ':action/:iouType/amount/:transactionID/:reportID/:pageIndex?', - getRoute: (action: IOUAction, iouType: IOUType, transactionID: string, reportID: string, pageIndex: string, backTo = '') => - getUrlWithBackToParam(`${action as string}/${iouType as string}/amount/${transactionID}/${reportID}/${pageIndex}`, backTo), + getRoute: (action: IOUAction, iouType: IOUType, transactionID: string | undefined, reportID: string | undefined, pageIndex: string, backTo = '') => { + if (!transactionID || !reportID) { + Log.warn('Invalid transactionID or reportID is used to build the MONEY_REQUEST_STEP_AMOUNT route'); + } + return getUrlWithBackToParam(`${action as string}/${iouType as string}/amount/${transactionID}/${reportID}/${pageIndex}`, backTo); + }, }, MONEY_REQUEST_STEP_TAX_RATE: { route: ':action/:iouType/taxRate/:transactionID/:reportID?', - getRoute: (action: IOUAction, iouType: IOUType, transactionID: string, reportID: string, backTo = '') => - getUrlWithBackToParam(`${action as string}/${iouType as string}/taxRate/${transactionID}/${reportID}`, backTo), + getRoute: (action: IOUAction, iouType: IOUType, transactionID: string | undefined, reportID: string | undefined, backTo = '') => { + if (!transactionID || !reportID) { + Log.warn('Invalid transactionID or reportID is used to build the MONEY_REQUEST_STEP_TAX_RATE route'); + } + return getUrlWithBackToParam(`${action as string}/${iouType as string}/taxRate/${transactionID}/${reportID}`, backTo); + }, }, MONEY_REQUEST_STEP_TAX_AMOUNT: { route: ':action/:iouType/taxAmount/:transactionID/:reportID?', - getRoute: (action: IOUAction, iouType: IOUType, transactionID: string, reportID: string, backTo = '') => - getUrlWithBackToParam(`${action as string}/${iouType as string}/taxAmount/${transactionID}/${reportID}`, backTo), + getRoute: (action: IOUAction, iouType: IOUType, transactionID: string | undefined, reportID: string | undefined, backTo = '') => { + if (!transactionID || !reportID) { + Log.warn('Invalid transactionID or reportID is used to build the MONEY_REQUEST_STEP_TAX_AMOUNT route'); + } + return getUrlWithBackToParam(`${action as string}/${iouType as string}/taxAmount/${transactionID}/${reportID}`, backTo); + }, }, MONEY_REQUEST_STEP_CATEGORY: { route: ':action/:iouType/category/:transactionID/:reportID/:reportActionID?', - getRoute: (action: IOUAction, iouType: IOUType, transactionID: string, reportID: string | undefined, backTo = '', reportActionID?: string) => - getUrlWithBackToParam(`${action as string}/${iouType as string}/category/${transactionID}/${reportID}${reportActionID ? `/${reportActionID}` : ''}`, backTo), + getRoute: (action: IOUAction, iouType: IOUType, transactionID: string | undefined, reportID: string | undefined, backTo = '', reportActionID?: string) => { + if (!transactionID || !reportID) { + Log.warn('Invalid transactionID or reportID is used to build the MONEY_REQUEST_STEP_CATEGORY route'); + } + return getUrlWithBackToParam(`${action as string}/${iouType as string}/category/${transactionID}/${reportID}${reportActionID ? `/${reportActionID}` : ''}`, backTo); + }, }, MONEY_REQUEST_ATTENDEE: { route: ':action/:iouType/attendees/:transactionID/:reportID', - getRoute: (action: IOUAction, iouType: IOUType, transactionID: string, reportID: string, backTo = '') => - getUrlWithBackToParam(`${action as string}/${iouType as string}/attendees/${transactionID}/${reportID}`, backTo), + getRoute: (action: IOUAction, iouType: IOUType, transactionID: string | undefined, reportID: string | undefined, backTo = '') => { + if (!transactionID || !reportID) { + Log.warn('Invalid transactionID or reportID is used to build the MONEY_REQUEST_ATTENDEE route'); + } + return getUrlWithBackToParam(`${action as string}/${iouType as string}/attendees/${transactionID}/${reportID}`, backTo); + }, }, MONEY_REQUEST_UPGRADE: { route: ':action/:iouType/upgrade/:transactionID/:reportID', @@ -676,28 +696,48 @@ const ROUTES = { }, MONEY_REQUEST_STEP_DATE: { route: ':action/:iouType/date/:transactionID/:reportID/:reportActionID?', - getRoute: (action: IOUAction, iouType: IOUType, transactionID: string, reportID: string, backTo = '', reportActionID?: string) => - getUrlWithBackToParam(`${action as string}/${iouType as string}/date/${transactionID}/${reportID}${reportActionID ? `/${reportActionID}` : ''}`, backTo), + getRoute: (action: IOUAction, iouType: IOUType, transactionID: string | undefined, reportID: string | undefined, backTo = '', reportActionID?: string) => { + if (!transactionID || !reportID) { + Log.warn('Invalid transactionID or reportID is used to build the MONEY_REQUEST_STEP_DATE route'); + } + return getUrlWithBackToParam(`${action as string}/${iouType as string}/date/${transactionID}/${reportID}${reportActionID ? `/${reportActionID}` : ''}`, backTo); + }, }, MONEY_REQUEST_STEP_DESCRIPTION: { route: ':action/:iouType/description/:transactionID/:reportID/:reportActionID?', - getRoute: (action: IOUAction, iouType: IOUType, transactionID: string, reportID: string, backTo = '', reportActionID?: string) => - getUrlWithBackToParam(`${action as string}/${iouType as string}/description/${transactionID}/${reportID}${reportActionID ? `/${reportActionID}` : ''}`, backTo), + getRoute: (action: IOUAction, iouType: IOUType, transactionID: string | undefined, reportID: string | undefined, backTo = '', reportActionID?: string) => { + if (!transactionID || !reportID) { + Log.warn('Invalid transactionID or reportID is used to build the MONEY_REQUEST_STEP_DESCRIPTION route'); + } + return getUrlWithBackToParam(`${action as string}/${iouType as string}/description/${transactionID}/${reportID}${reportActionID ? `/${reportActionID}` : ''}`, backTo); + }, }, MONEY_REQUEST_STEP_DISTANCE: { route: ':action/:iouType/distance/:transactionID/:reportID', - getRoute: (action: IOUAction, iouType: IOUType, transactionID: string, reportID: string, backTo = '') => - getUrlWithBackToParam(`${action as string}/${iouType as string}/distance/${transactionID}/${reportID}`, backTo), + getRoute: (action: IOUAction, iouType: IOUType, transactionID: string | undefined, reportID: string | undefined, backTo = '') => { + if (!transactionID || !reportID) { + Log.warn('Invalid transactionID or reportID is used to build the MONEY_REQUEST_STEP_DISTANCE route'); + } + return getUrlWithBackToParam(`${action as string}/${iouType as string}/distance/${transactionID}/${reportID}`, backTo); + }, }, MONEY_REQUEST_STEP_DISTANCE_RATE: { route: ':action/:iouType/distanceRate/:transactionID/:reportID', - getRoute: (action: IOUAction, iouType: IOUType, transactionID: string, reportID: string, backTo = '') => - getUrlWithBackToParam(`${action as string}/${iouType as string}/distanceRate/${transactionID}/${reportID}`, backTo), + getRoute: (action: IOUAction, iouType: IOUType, transactionID: string | undefined, reportID: string | undefined, backTo = '') => { + if (!transactionID || !reportID) { + Log.warn('Invalid transactionID or reportID is used to build the MONEY_REQUEST_STEP_DISTANCE_RATE route'); + } + return getUrlWithBackToParam(`${action as string}/${iouType as string}/distanceRate/${transactionID}/${reportID}`, backTo); + }, }, MONEY_REQUEST_STEP_MERCHANT: { route: ':action/:iouType/merchant/:transactionID/:reportID', - getRoute: (action: IOUAction, iouType: IOUType, transactionID: string, reportID: string, backTo = '') => - getUrlWithBackToParam(`${action as string}/${iouType as string}/merchant/${transactionID}/${reportID}`, backTo), + getRoute: (action: IOUAction, iouType: IOUType, transactionID: string | undefined, reportID: string | undefined, backTo = '') => { + if (!transactionID || !reportID) { + Log.warn('Invalid transactionID or reportID is used to build the MONEY_REQUEST_STEP_MERCHANT route'); + } + return getUrlWithBackToParam(`${action as string}/${iouType as string}/merchant/${transactionID}/${reportID}`, backTo); + }, }, MONEY_REQUEST_STEP_PARTICIPANTS: { route: ':action/:iouType/participants/:transactionID/:reportID', @@ -1653,12 +1693,21 @@ const ROUTES = { TRACK_TRAINING_MODAL: 'track-training', TRAVEL_TRIP_SUMMARY: { route: 'r/:reportID/trip/:transactionID', - getRoute: (reportID: string, transactionID: string, backTo?: string) => getUrlWithBackToParam(`r/${reportID}/trip/${transactionID}`, backTo), + getRoute: (reportID: string | undefined, transactionID: string | undefined, backTo?: string) => { + if (!reportID || !transactionID) { + Log.warn('Invalid reportID or transactionID is used to build the TRAVEL_TRIP_SUMMARY route'); + } + return getUrlWithBackToParam(`r/${reportID}/trip/${transactionID}`, backTo); + }, }, TRAVEL_TRIP_DETAILS: { route: 'r/:reportID/trip/:transactionID/:reservationIndex', - getRoute: (reportID: string, transactionID: string, reservationIndex: number, backTo?: string) => - getUrlWithBackToParam(`r/${reportID}/trip/${transactionID}/${reservationIndex}`, backTo), + getRoute: (reportID: string | undefined, transactionID: string | undefined, reservationIndex: number, backTo?: string) => { + if (!reportID || !transactionID) { + Log.warn('Invalid reportID or transactionID is used to build the TRAVEL_TRIP_DETAILS route'); + } + return getUrlWithBackToParam(`r/${reportID}/trip/${transactionID}/${reservationIndex}`, backTo); + }, }, TRAVEL_DOMAIN_SELECTOR: 'travel/domain-selector', TRAVEL_DOMAIN_PERMISSION_INFO: { diff --git a/src/components/ReportActionItem/MoneyRequestPreview/MoneyRequestPreviewContent.tsx b/src/components/ReportActionItem/MoneyRequestPreview/MoneyRequestPreviewContent.tsx index 26cdbac4d890..e2388ead0dd4 100644 --- a/src/components/ReportActionItem/MoneyRequestPreview/MoneyRequestPreviewContent.tsx +++ b/src/components/ReportActionItem/MoneyRequestPreview/MoneyRequestPreviewContent.tsx @@ -32,6 +32,7 @@ import Navigation from '@libs/Navigation/Navigation'; import type {PlatformStackRouteProp} from '@libs/Navigation/PlatformStackNavigation/types'; import type {TransactionDuplicateNavigatorParamList} from '@libs/Navigation/types'; import {getAvatarsForAccountIDs} from '@libs/OptionsListUtils'; +import Parser from '@libs/Parser'; import {getCleanedTagName} from '@libs/PolicyUtils'; import {getThumbnailAndImageURIs} from '@libs/ReceiptUtils'; import {getOriginalMessage, getReportAction, isMessageDeleted, isMoneyRequestAction as isMoneyRequestActionReportActionsUtils} from '@libs/ReportActionsUtils'; @@ -138,7 +139,7 @@ function MoneyRequestPreviewContent({ category, } = useMemo>(() => getTransactionDetails(transaction) ?? {}, [transaction]); - const description = truncate(StringUtils.lineBreaksToSpaces(requestComment), {length: CONST.REQUEST_PREVIEW.MAX_LENGTH}); + const description = truncate(StringUtils.lineBreaksToSpaces(Parser.htmlToMarkdown(requestComment ?? '')), {length: CONST.REQUEST_PREVIEW.MAX_LENGTH}); const requestMerchant = truncate(merchant, {length: CONST.REQUEST_PREVIEW.MAX_LENGTH}); const hasReceipt = hasReceiptTransactionUtils(transaction); const isScanning = hasReceipt && isReceiptBeingScanned(transaction); diff --git a/src/components/ReportActionItem/MoneyRequestView.tsx b/src/components/ReportActionItem/MoneyRequestView.tsx index acb6b05e077d..af2438549e9a 100644 --- a/src/components/ReportActionItem/MoneyRequestView.tsx +++ b/src/components/ReportActionItem/MoneyRequestView.tsx @@ -603,7 +603,7 @@ function MoneyRequestView({report, shouldShowAnimatedBackground, readonly = fals ; diff --git a/src/libs/API/parameters/ShareTrackedExpenseParams.ts b/src/libs/API/parameters/ShareTrackedExpenseParams.ts index c851af4e227b..be143ae82ed8 100644 --- a/src/libs/API/parameters/ShareTrackedExpenseParams.ts +++ b/src/libs/API/parameters/ShareTrackedExpenseParams.ts @@ -28,6 +28,7 @@ type ShareTrackedExpenseParams = { adminsCreatedReportActionID?: string; engagementChoice?: string; guidedSetupData?: string; + description?: string; }; export default ShareTrackedExpenseParams; diff --git a/src/libs/API/parameters/SplitBillParams.ts b/src/libs/API/parameters/SplitBillParams.ts index 76252abe3292..3fda11b9ca98 100644 --- a/src/libs/API/parameters/SplitBillParams.ts +++ b/src/libs/API/parameters/SplitBillParams.ts @@ -17,6 +17,7 @@ type SplitBillParams = { splitPayerAccountIDs: number[]; taxCode: string; taxAmount: number; + description?: string; }; export default SplitBillParams; diff --git a/src/libs/API/parameters/StartSplitBillParams.ts b/src/libs/API/parameters/StartSplitBillParams.ts index 499073c88de9..10f1029a0fba 100644 --- a/src/libs/API/parameters/StartSplitBillParams.ts +++ b/src/libs/API/parameters/StartSplitBillParams.ts @@ -16,6 +16,7 @@ type StartSplitBillParams = { chatType?: string; taxCode?: string; taxAmount?: number; + description?: string; }; export default StartSplitBillParams; diff --git a/src/libs/API/parameters/TrackExpenseParams.ts b/src/libs/API/parameters/TrackExpenseParams.ts index 89b8d79e3b9a..e11b119e2f83 100644 --- a/src/libs/API/parameters/TrackExpenseParams.ts +++ b/src/libs/API/parameters/TrackExpenseParams.ts @@ -28,6 +28,7 @@ type TrackExpenseParams = { waypoints?: string; actionableWhisperReportActionID?: string; customUnitRateID?: string; + description?: string; }; export default TrackExpenseParams; diff --git a/src/libs/ModifiedExpenseMessage.ts b/src/libs/ModifiedExpenseMessage.ts index 465067a045c4..0254059e4047 100644 --- a/src/libs/ModifiedExpenseMessage.ts +++ b/src/libs/ModifiedExpenseMessage.ts @@ -9,6 +9,7 @@ import {convertToDisplayString} from './CurrencyUtils'; import DateUtils from './DateUtils'; import {translateLocal} from './Localize'; import Log from './Log'; +import Parser from './Parser'; import {getCleanedTagName, getSortedTagKeys} from './PolicyUtils'; import {getOriginalMessage, isModifiedExpenseAction} from './ReportActionsUtils'; // eslint-disable-next-line import/no-cycle @@ -222,8 +223,8 @@ function getForReportAction({ const hasModifiedComment = isReportActionOriginalMessageAnObject && 'oldComment' in reportActionOriginalMessage && 'newComment' in reportActionOriginalMessage; if (hasModifiedComment) { buildMessageFragmentForValue( - reportActionOriginalMessage?.newComment ?? '', - reportActionOriginalMessage?.oldComment ?? '', + Parser.htmlToMarkdown(reportActionOriginalMessage?.newComment ?? ''), + Parser.htmlToMarkdown(reportActionOriginalMessage?.oldComment ?? ''), translateLocal('common.description'), true, setFragments, diff --git a/src/libs/ReportUtils.ts b/src/libs/ReportUtils.ts index 454c25a0b6d1..f63001fcc25b 100644 --- a/src/libs/ReportUtils.ts +++ b/src/libs/ReportUtils.ts @@ -553,6 +553,7 @@ type TransactionDetails = { billable: boolean; tag: string; mccGroup?: ValueOf; + description?: string; cardID: number; originalAmount: number; originalCurrency: string; @@ -3496,6 +3497,7 @@ function getTransactionDetails(transaction: OnyxInputOrEntry, creat function getTransactionCommentObject(transaction: OnyxEntry): Comment { return { ...transaction?.comment, + comment: Parser.htmlToMarkdown(transaction?.comment?.comment ?? ''), waypoints: getWaypoints(transaction), }; } diff --git a/src/libs/actions/IOU.ts b/src/libs/actions/IOU.ts index 1a2686488abe..4b632c07a7ea 100644 --- a/src/libs/actions/IOU.ts +++ b/src/libs/actions/IOU.ts @@ -107,6 +107,7 @@ import { getMoneyRequestSpendBreakdown, getOptimisticDataForParentReportAction, getOutstandingChildRequest, + getParsedComment, getPersonalDetailsForAccountID, getReportNameValuePairs, getReportOrDraftReport, @@ -3977,13 +3978,16 @@ function updateMoneyRequestDate( /** Updates the billable field of an expense */ function updateMoneyRequestBillable( - transactionID: string, - transactionThreadReportID: string, + transactionID: string | undefined, + transactionThreadReportID: string | undefined, value: boolean, policy: OnyxEntry, policyTagList: OnyxEntry, policyCategories: OnyxEntry, ) { + if (!transactionID || !transactionThreadReportID) { + return; + } const transactionChanges: TransactionChanges = { billable: value, }; @@ -4192,8 +4196,9 @@ function updateMoneyRequestDescription( policyTagList: OnyxEntry, policyCategories: OnyxEntry, ) { + const parsedComment = getParsedComment(comment); const transactionChanges: TransactionChanges = { - comment, + comment: parsedComment, }; const transactionThreadReport = allReports?.[`${ONYXKEYS.COLLECTION.REPORT}${transactionThreadReportID}`] ?? null; const parentReport = allReports?.[`${ONYXKEYS.COLLECTION.REPORT}${transactionThreadReport?.parentReportID}`] ?? null; @@ -4204,6 +4209,7 @@ function updateMoneyRequestDescription( data = getUpdateMoneyRequestParams(transactionID, transactionThreadReportID, transactionChanges, policy, policyTagList, policyCategories); } const {params, onyxData} = data; + params.description = parsedComment; API.write(WRITE_COMMANDS.UPDATE_MONEY_REQUEST_DESCRIPTION, params, onyxData); } @@ -4489,6 +4495,7 @@ function categorizeTrackedExpense(trackedExpenseParams: TrackedExpenseParams) { adminsCreatedReportActionID: createdWorkspaceParams?.adminsCreatedReportActionID, engagementChoice: createdWorkspaceParams?.engagementChoice, guidedSetupData: createdWorkspaceParams?.guidedSetupData, + description: transactionParams.comment, }; API.write(WRITE_COMMANDS.CATEGORIZE_TRACKED_EXPENSE, parameters, {optimisticData, successData, failureData}); @@ -4549,6 +4556,7 @@ function shareTrackedExpense(trackedExpenseParams: TrackedExpenseParams) { adminsCreatedReportActionID: createdWorkspaceParams?.adminsCreatedReportActionID, engagementChoice: createdWorkspaceParams?.engagementChoice, guidedSetupData: createdWorkspaceParams?.guidedSetupData, + description: transactionParams.comment, }; API.write(WRITE_COMMANDS.SHARE_TRACKED_EXPENSE, parameters, {optimisticData, successData, failureData}); @@ -4560,6 +4568,8 @@ function shareTrackedExpense(trackedExpenseParams: TrackedExpenseParams) { function requestMoney(requestMoneyInformation: RequestMoneyInformation) { const {report, participantParams, policyParams = {}, transactionParams, gpsPoints, action, reimbursible} = requestMoneyInformation; const {payeeAccountID} = participantParams; + const parsedComment = getParsedComment(transactionParams.comment ?? ''); + transactionParams.comment = parsedComment; const { amount, currency, @@ -4697,6 +4707,7 @@ function requestMoney(requestMoneyInformation: RequestMoneyInformation) { transactionThreadReportID, createdReportActionIDForThread, reimbursible, + description: parsedComment, }; // eslint-disable-next-line rulesdir/no-multiple-api-calls @@ -4806,6 +4817,11 @@ function sendInvoice( companyName?: string, companyWebsite?: string, ) { + const parsedComment = getParsedComment(transaction?.comment?.comment?.trim() ?? ''); + if (transaction?.comment) { + // eslint-disable-next-line no-param-reassign + transaction.comment.comment = parsedComment; + } const { senderWorkspaceID, receiver, @@ -4829,7 +4845,7 @@ function sendInvoice( accountID: currentUserAccountID, amount: transaction?.amount ?? 0, currency: transaction?.currency ?? '', - comment: transaction?.comment?.comment?.trim() ?? '', + comment: parsedComment, merchant: transaction?.merchant ?? '', category: transaction?.category, date: transaction?.created ?? '', @@ -4841,6 +4857,7 @@ function sendInvoice( transactionThreadReportID, companyName, companyWebsite, + description: parsedComment, ...(invoiceChatReport?.reportID ? {receiverInvoiceRoomID: invoiceChatReport.reportID} : {receiverEmail: receiver.login ?? ''}), }; @@ -4863,6 +4880,8 @@ function trackExpense(params: CreateTrackExpenseParams) { const {report, action, isDraftPolicy, participantParams, policyParams: policyData = {}, transactionParams: transactionData} = params; const {participant, payeeAccountID, payeeEmail} = participantParams; const {policy, policyCategories, policyTagList} = policyData; + const parsedComment = getParsedComment(transactionData.comment ?? ''); + transactionData.comment = parsedComment; const { amount, currency, @@ -5065,6 +5084,7 @@ function trackExpense(params: CreateTrackExpenseParams) { createdReportActionIDForThread, waypoints: sanitizedWaypoints, customUnitRateID, + description: parsedComment, }; if (actionableWhisperReportActionIDParam) { parameters.actionableWhisperReportActionID = actionableWhisperReportActionIDParam; @@ -5608,6 +5628,7 @@ function splitBill({ taxCode = '', taxAmount = 0, }: SplitBillActionsParams) { + const parsedComment = getParsedComment(comment); const {splitData, splits, onyxData} = createSplitsAndOnyxData({ participants, currentUserLogin, @@ -5615,7 +5636,7 @@ function splitBill({ existingSplitChatReportID, transactionParams: { amount, - comment, + comment: parsedComment, currency, merchant, created, @@ -5634,7 +5655,7 @@ function splitBill({ amount, splits: JSON.stringify(splits), currency, - comment, + comment: parsedComment, category, merchant, created, @@ -5648,6 +5669,7 @@ function splitBill({ splitPayerAccountIDs, taxCode, taxAmount, + description: parsedComment, }; API.write(WRITE_COMMANDS.SPLIT_BILL, parameters, onyxData); @@ -5679,6 +5701,7 @@ function splitBillAndOpenReport({ taxAmount = 0, existingSplitChatReportID, }: SplitBillActionsParams) { + const parsedComment = getParsedComment(comment); const {splitData, splits, onyxData} = createSplitsAndOnyxData({ participants, currentUserLogin, @@ -5686,7 +5709,7 @@ function splitBillAndOpenReport({ existingSplitChatReportID, transactionParams: { amount, - comment, + comment: parsedComment, currency, merchant, created, @@ -5707,7 +5730,7 @@ function splitBillAndOpenReport({ currency, merchant, created, - comment, + comment: parsedComment, category, tag, billable, @@ -5719,6 +5742,7 @@ function splitBillAndOpenReport({ splitPayerAccountIDs, taxCode, taxAmount, + description: parsedComment, }; API.write(WRITE_COMMANDS.SPLIT_BILL_AND_OPEN_REPORT, parameters, onyxData); @@ -5766,6 +5790,7 @@ function startSplitBill({ const participantAccountIDs = participants.map((participant) => Number(participant.accountID)); const {splitChatReport, existingSplitChatReport} = getOrCreateOptimisticSplitChatReport(existingSplitChatReportID, participants, participantAccountIDs, currentUserAccountID); const isOwnPolicyExpenseChat = !!splitChatReport.isOwnPolicyExpenseChat; + const parsedComment = getParsedComment(comment); const {name: filename, source, state = CONST.IOU.RECEIPT_STATE.SCANREADY} = receipt; const receiptObject: Receipt = {state, source}; @@ -5776,7 +5801,7 @@ function startSplitBill({ amount: 0, currency, reportID: CONST.REPORT.SPLIT_REPORTID, - comment, + comment: parsedComment, merchant: CONST.TRANSACTION.PARTIAL_TRANSACTION_MERCHANT, receipt: receiptObject, category, @@ -5794,7 +5819,7 @@ function startSplitBill({ CONST.IOU.REPORT_ACTION_TYPE.SPLIT, 0, CONST.CURRENCY.USD, - comment, + parsedComment, participants, splitTransaction.transactionID, undefined, @@ -6031,7 +6056,7 @@ function startSplitBill({ transactionID: splitTransaction.transactionID, splits: JSON.stringify(splits), receipt, - comment, + comment: parsedComment, category, tag, currency, @@ -6041,6 +6066,7 @@ function startSplitBill({ chatType: splitChatReport?.chatType, taxCode, taxAmount, + description: parsedComment, }; API.write(WRITE_COMMANDS.START_SPLIT_BILL, parameters, {optimisticData, successData, failureData}); @@ -6064,6 +6090,11 @@ function completeSplitBill( sessionAccountID: number, sessionEmail?: string, ) { + const parsedComment = getParsedComment(updatedTransaction?.comment?.comment ?? ''); + if (updatedTransaction?.comment) { + // eslint-disable-next-line no-param-reassign + updatedTransaction.comment.comment = parsedComment; + } const currentUserEmailForIOUSplit = addSMSDomainIfPhoneNumber(sessionEmail); const transactionID = updatedTransaction?.transactionID; const unmodifiedTransaction = allTransactions[`${ONYXKEYS.COLLECTION.TRANSACTION}${transactionID}`]; @@ -6190,7 +6221,7 @@ function completeSplitBill( amount: isPolicyExpenseChat ? -splitAmount : splitAmount, currency: currency ?? '', reportID: oneOnOneIOUReport?.reportID, - comment: updatedTransaction?.comment?.comment, + comment: parsedComment, created: updatedTransaction?.modifiedCreated, merchant: updatedTransaction?.modifiedMerchant, receipt: {...updatedTransaction?.receipt, state: CONST.IOU.RECEIPT_STATE.OPEN}, @@ -6210,7 +6241,7 @@ function completeSplitBill( CONST.IOU.REPORT_ACTION_TYPE.CREATE, splitAmount, currency ?? '', - updatedTransaction?.comment?.comment ?? '', + parsedComment, currentUserEmailForIOUSplit, [participant], oneOnOneTransaction.transactionID, @@ -6294,6 +6325,7 @@ function completeSplitBill( taxCode: transactionTaxCode, taxAmount: transactionTaxAmount, billable: transactionBillable, + description: parsedComment, }; API.write(WRITE_COMMANDS.COMPLETE_SPLIT_BILL, parameters, {optimisticData, successData, failureData}); @@ -6338,6 +6370,8 @@ function createDistanceRequest(distanceRequestInformation: CreateDistanceRequest policyParams = {}, } = distanceRequestInformation; const {policy, policyCategories, policyTagList} = policyParams; + const parsedComment = getParsedComment(transactionParams.comment); + transactionParams.comment = parsedComment; const {amount, comment, currency, created, category, tag, taxAmount, taxCode, merchant, billable, validWaypoints, customUnitRateID = '', splitShares = {}} = transactionParams; // If the report is an iou or expense report, we should get the linked chat report to be passed to the getMoneyRequestInformation function @@ -6398,6 +6432,7 @@ function createDistanceRequest(distanceRequestInformation: CreateDistanceRequest billable, splits: JSON.stringify(splits), chatType: splitData.chatType, + description: parsedComment, }; } else { const participant = participants.at(0) ?? {}; @@ -6464,6 +6499,7 @@ function createDistanceRequest(distanceRequestInformation: CreateDistanceRequest createdReportActionIDForThread, payerEmail, customUnitRateID, + description: parsedComment, }; } diff --git a/src/pages/iou/SplitBillDetailsPage.tsx b/src/pages/iou/SplitBillDetailsPage.tsx index cb8d6766d8b6..327d88d303fe 100644 --- a/src/pages/iou/SplitBillDetailsPage.tsx +++ b/src/pages/iou/SplitBillDetailsPage.tsx @@ -17,6 +17,7 @@ import Navigation from '@libs/Navigation/Navigation'; import type {PlatformStackScreenProps} from '@libs/Navigation/PlatformStackNavigation/types'; import type {SplitDetailsNavigatorParamList} from '@libs/Navigation/types'; import {getParticipantsOption, getPolicyExpenseReportOption} from '@libs/OptionsListUtils'; +import Parser from '@libs/Parser'; import {getOriginalMessage, isMoneyRequestAction} from '@libs/ReportActionsUtils'; import {getTransactionDetails, isPolicyExpenseChat} from '@libs/ReportUtils'; import type {OptionData} from '@libs/ReportUtils'; @@ -114,7 +115,7 @@ function SplitBillDetailsPage({route, report, reportAction}: SplitBillDetailsPag selectedParticipants={participantsExcludingPayee} iouAmount={splitAmount ?? 0} iouCurrencyCode={splitCurrency} - iouComment={splitComment} + iouComment={Parser.htmlToMarkdown(splitComment ?? '')} iouCreated={splitCreated} shouldDisplayReceipt iouMerchant={splitMerchant} diff --git a/src/pages/iou/request/step/IOURequestStepDescription.tsx b/src/pages/iou/request/step/IOURequestStepDescription.tsx index 70bb913d0738..bb8a7ad5a3ae 100644 --- a/src/pages/iou/request/step/IOURequestStepDescription.tsx +++ b/src/pages/iou/request/step/IOURequestStepDescription.tsx @@ -14,6 +14,7 @@ import useThemeStyles from '@hooks/useThemeStyles'; import {addErrorMessage} from '@libs/ErrorUtils'; import {shouldUseTransactionDraft} from '@libs/IOUUtils'; import Navigation from '@libs/Navigation/Navigation'; +import Parser from '@libs/Parser'; import {isMoneyRequestAction} from '@libs/ReportActionsUtils'; import {canEditMoneyRequest} from '@libs/ReportUtils'; import {areRequiredFieldsEmpty} from '@libs/TransactionUtils'; @@ -64,8 +65,10 @@ function IOURequestStepDescription({ const {inputCallbackRef} = useAutoFocusInput(true); // In the split flow, when editing we use SPLIT_TRANSACTION_DRAFT to save draft value const isEditingSplitBill = iouType === CONST.IOU.TYPE.SPLIT && action === CONST.IOU.ACTION.EDIT; - const currentDescription = isEditingSplitBill && !lodashIsEmpty(splitDraftTransaction) ? splitDraftTransaction?.comment?.comment ?? '' : transaction?.comment?.comment ?? ''; - const descriptionRef = useRef(currentDescription); + const currentDescriptionInMarkdown = Parser.htmlToMarkdown( + isEditingSplitBill && !lodashIsEmpty(splitDraftTransaction) ? splitDraftTransaction?.comment?.comment ?? '' : transaction?.comment?.comment ?? '', + ); + const descriptionRef = useRef(currentDescriptionInMarkdown); const isSavedRef = useRef(false); /** @@ -105,7 +108,7 @@ function IOURequestStepDescription({ const newComment = value.moneyRequestComment.trim(); // Only update comment if it has changed - if (newComment === currentDescription) { + if (newComment === currentDescriptionInMarkdown) { navigateBack(); return; } @@ -159,7 +162,7 @@ function IOURequestStepDescription({ InputComponent={TextInput} inputID={INPUT_IDS.MONEY_REQUEST_COMMENT} name={INPUT_IDS.MONEY_REQUEST_COMMENT} - defaultValue={currentDescription} + defaultValue={currentDescriptionInMarkdown} onValueChange={updateDescriptionRef} label={translate('moneyRequestConfirmationList.whatsItFor')} accessibilityLabel={translate('moneyRequestConfirmationList.whatsItFor')} @@ -179,7 +182,7 @@ function IOURequestStepDescription({ if (isSavedRef.current) { return false; } - return descriptionRef.current !== currentDescription; + return descriptionRef.current !== currentDescriptionInMarkdown; }} />