From 206787ea9ee9a4da30ab0569fdd3c2273bea9cf3 Mon Sep 17 00:00:00 2001 From: Ishpaul Singh Date: Wed, 18 Jun 2025 04:32:06 +0530 Subject: [PATCH 1/6] update autosubmit flow --- src/libs/NextStepUtils.ts | 15 ++++++++++++--- src/libs/ReportUtils.ts | 12 ++++++++++-- src/libs/TransactionUtils/index.ts | 2 +- src/libs/actions/IOU.ts | 30 ++++++++++++++++++++++-------- 4 files changed, 45 insertions(+), 14 deletions(-) diff --git a/src/libs/NextStepUtils.ts b/src/libs/NextStepUtils.ts index e15fb08351a7..bd5db1032061 100644 --- a/src/libs/NextStepUtils.ts +++ b/src/libs/NextStepUtils.ts @@ -5,10 +5,11 @@ import type {OnyxCollection, OnyxEntry} from 'react-native-onyx'; import type {ValueOf} from 'type-fest'; import CONST from '@src/CONST'; import ONYXKEYS from '@src/ONYXKEYS'; -import type {Policy, Report, ReportNextStep, TransactionViolations} from '@src/types/onyx'; +import type {Beta, Policy, Report, ReportNextStep, TransactionViolations} from '@src/types/onyx'; import type {Message} from '@src/types/onyx/ReportNextStep'; import type DeepValueOf from '@src/types/utils/DeepValueOf'; import EmailUtils from './EmailUtils'; +import Permissions from './Permissions'; import {getLoginsByAccountIDs, getPersonalDetailsByIDs} from './PersonalDetailsUtils'; import {getApprovalWorkflow, getCorrectedAutoReportingFrequency, getReimburserAccountID} from './PolicyUtils'; import { @@ -42,6 +43,12 @@ Onyx.connect({ callback: (value) => (allPolicies = value), }); +let allBetas: OnyxEntry; +Onyx.connect({ + key: ONYXKEYS.BETAS, + callback: (value) => (allBetas = value), +}); + let transactionViolations: OnyxCollection; Onyx.connect({ key: ONYXKEYS.COLLECTION.TRANSACTION_VIOLATIONS, @@ -142,7 +149,9 @@ function buildNextStep( const {harvesting, autoReportingOffset} = policy; const autoReportingFrequency = getCorrectedAutoReportingFrequency(policy); const hasViolations = hasViolationsReportUtils(report?.reportID, transactionViolations); - const shouldShowFixMessage = hasViolations && autoReportingFrequency === CONST.POLICY.AUTO_REPORTING_FREQUENCIES.INSTANT; + const isAutoSubmitEnabled = Permissions.isBetaEnabled(CONST.BETAS.AUTO_SUBMIT, allBetas); + const isInstantSubmitEnabled = autoReportingFrequency === CONST.POLICY.AUTO_REPORTING_FREQUENCIES.INSTANT; + const shouldShowFixMessage = hasViolations && isInstantSubmitEnabled && !isAutoSubmitEnabled; const [policyOwnerPersonalDetails, ownerPersonalDetails] = getPersonalDetailsByIDs({ accountIDs: [policy.ownerAccountID ?? CONST.DEFAULT_NUMBER_ID, ownerAccountID], currentUserAccountID, @@ -200,7 +209,7 @@ function buildNextStep( switch (predictedNextStatus) { // Generates an optimistic nextStep once a report has been opened case CONST.REPORT.STATUS_NUM.OPEN: - if (shouldFixViolations) { + if ((isAutoSubmitEnabled && hasViolations && isInstantSubmitEnabled) || shouldFixViolations) { optimisticNextStep = { type, icon: CONST.NEXT_STEP.ICONS.HOURGLASS, diff --git a/src/libs/ReportUtils.ts b/src/libs/ReportUtils.ts index a46a21c5899b..67c826cb13c9 100644 --- a/src/libs/ReportUtils.ts +++ b/src/libs/ReportUtils.ts @@ -5723,6 +5723,13 @@ function buildOptimisticInvoiceReport( * @param policy */ function getExpenseReportStateAndStatus(policy: OnyxEntry, isEmptyOptimisticReport = false) { + const isAutoSubmitBetaEnabled = Permissions.isBetaEnabled(CONST.BETAS.AUTO_SUBMIT, allBetas); + if (isAutoSubmitBetaEnabled) { + return { + stateNum: CONST.REPORT.STATE_NUM.OPEN, + statusNum: CONST.REPORT.STATUS_NUM.OPEN, + }; + } const isInstantSubmitEnabledLocal = isInstantSubmitEnabled(policy); const isSubmitAndCloseLocal = isSubmitAndClose(policy); const arePaymentsDisabled = policy?.reimbursementChoice === CONST.POLICY.REIMBURSEMENT_CHOICES.REIMBURSEMENT_NO; @@ -9464,8 +9471,9 @@ function hasMissingPaymentMethod(userWallet: OnyxEntry, iouReportID: * - we have one, but it's waiting on the payee adding a bank account * - we have one, but we can't add more transactions to it due to: report is approved or settled */ -function shouldCreateNewMoneyRequestReport(existingIOUReport: OnyxInputOrEntry | undefined, chatReport: OnyxInputOrEntry): boolean { - return !existingIOUReport || hasIOUWaitingOnCurrentUserBankAccount(chatReport) || !canAddTransaction(existingIOUReport); +function shouldCreateNewMoneyRequestReport(existingIOUReport: OnyxInputOrEntry | undefined, chatReport: OnyxInputOrEntry, isScanRequest: boolean): boolean { + const isAutoSubmitBetaEnabled = Permissions.isBetaEnabled(CONST.BETAS.AUTO_SUBMIT, allBetas); + return !existingIOUReport || hasIOUWaitingOnCurrentUserBankAccount(chatReport) || !canAddTransaction(existingIOUReport) || (isScanRequest && isAutoSubmitBetaEnabled); } function getTripIDFromTransactionParentReportID(transactionParentReportID: string | undefined): string | undefined { diff --git a/src/libs/TransactionUtils/index.ts b/src/libs/TransactionUtils/index.ts index 6f5605a87cfe..924ddacab087 100644 --- a/src/libs/TransactionUtils/index.ts +++ b/src/libs/TransactionUtils/index.ts @@ -143,7 +143,7 @@ function isDistanceRequest(transaction: OnyxEntry): boolean { return type === CONST.TRANSACTION.TYPE.CUSTOM_UNIT && customUnitName === CONST.CUSTOM_UNITS.NAME_DISTANCE; } -function isScanRequest(transaction: OnyxEntry): boolean { +function isScanRequest(transaction: OnyxEntry | Partial): boolean { // This is used during the expense creation flow before the transaction has been saved to the server if (lodashHas(transaction, 'iouRequestType')) { return transaction?.iouRequestType === CONST.IOU.REQUEST_TYPE.SCAN; diff --git a/src/libs/actions/IOU.ts b/src/libs/actions/IOU.ts index c27b18edec5c..d2c9d0a05b21 100644 --- a/src/libs/actions/IOU.ts +++ b/src/libs/actions/IOU.ts @@ -63,6 +63,7 @@ import {getManagerMcTestParticipant, getPersonalDetailsForAccountIDs} from '@lib import Parser from '@libs/Parser'; import {getCustomUnitID} from '@libs/PerDiemRequestUtils'; import Performance from '@libs/Performance'; +import Permissions from '@libs/Permissions'; import {getAccountIDsByLogins} from '@libs/PersonalDetailsUtils'; import {addSMSDomainIfPhoneNumber} from '@libs/PhoneNumber'; import { @@ -649,6 +650,13 @@ type GetSearchOnyxUpdateParams = { transactionThreadReportID: string | undefined; }; + +let allBetas: OnyxEntry; +Onyx.connect({ + key: ONYXKEYS.BETAS, + callback: (value) => (allBetas = value), +}); + let allTransactions: NonNullable> = {}; Onyx.connect({ key: ONYXKEYS.COLLECTION.TRANSACTION, @@ -1380,6 +1388,7 @@ function buildOnyxDataForMoneyRequest(moneyRequestParams: BuildOnyxDataForMoneyR const isScanRequest = isScanRequestTransactionUtils(transaction); const isPerDiemRequest = isPerDiemRequestTransactionUtils(transaction); + const isAutoSubmitBetaEnabled = Permissions.isBetaEnabled(CONST.BETAS.AUTO_SUBMIT, allBetas); const outstandingChildRequest = getOutstandingChildRequest(iou.report); const clearedPendingFields = Object.fromEntries(Object.keys(transaction.pendingFields ?? {}).map((key) => [key, null])); const isMoneyRequestToManagerMcTest = isTestTransactionReport(iou.report); @@ -1410,7 +1419,8 @@ function buildOnyxDataForMoneyRequest(moneyRequestParams: BuildOnyxDataForMoneyR ...chat.report, lastReadTime: DateUtils.getDBTime(), ...(shouldCreateNewMoneyRequestReport ? {lastVisibleActionCreated: chat.reportPreviewAction.created} : {}), - iouReportID: iou.report.reportID, + // do not update iouReportID if auto submit beta is enabled and it is a scan request + ...(isAutoSubmitBetaEnabled && isScanRequest ? {} : {iouReportID: iou.report.reportID}), ...outstandingChildRequest, ...(isNewChatReport ? {pendingFields: {createChat: CONST.RED_BRICK_ROAD_PENDING_ACTION.ADD}} : {}), }, @@ -2393,6 +2403,7 @@ function buildOnyxDataForTrackExpense({ const {policy, tagList: policyTagList, categories: policyCategories} = policyParams; const isScanRequest = isScanRequestTransactionUtils(transaction); + const isAutoSubmitBetaEnabled = Permissions.isBetaEnabled(CONST.BETAS.AUTO_SUBMIT, allBetas); const isDistanceRequest = isDistanceRequestTransactionUtils(transaction); const clearedPendingFields = Object.fromEntries(Object.keys(transaction.pendingFields ?? {}).map((key) => [key, null])); @@ -2419,7 +2430,8 @@ function buildOnyxDataForTrackExpense({ lastMessageText: getReportActionText(iouAction), lastMessageHtml: getReportActionHtml(iouAction), lastReadTime: DateUtils.getDBTime(), - iouReportID: iouReport?.reportID, + // do not update iouReportID if auto submit beta is enabled and it is a scan request + iouReportID: isAutoSubmitBetaEnabled && isScanRequest ? null : iouReport?.reportID, lastVisibleActionCreated: shouldCreateNewMoneyRequestReport ? reportPreviewAction?.created : chatReport.lastVisibleActionCreated, }, }, @@ -3294,7 +3306,8 @@ function getMoneyRequestInformation(moneyRequestInformation: MoneyRequestInforma iouReport = allReports?.[`${ONYXKEYS.COLLECTION.REPORT}${chatReport.iouReportID}`] ?? null; } - const shouldCreateNewMoneyRequestReport = shouldCreateNewMoneyRequestReportReportUtils(iouReport, chatReport); + const isScanRequest = isScanRequestTransactionUtils({amount, receipt}); + const shouldCreateNewMoneyRequestReport = shouldCreateNewMoneyRequestReportReportUtils(iouReport, chatReport, isScanRequest); if (!iouReport || shouldCreateNewMoneyRequestReport) { iouReport = isPolicyExpenseChat @@ -3552,7 +3565,7 @@ function getPerDiemExpenseInformation(perDiemExpenseInformation: PerDiemExpenseI iouReport = allReports?.[`${ONYXKEYS.COLLECTION.REPORT}${chatReport.iouReportID}`] ?? null; } - const shouldCreateNewMoneyRequestReport = shouldCreateNewMoneyRequestReportReportUtils(iouReport, chatReport); + const shouldCreateNewMoneyRequestReport = shouldCreateNewMoneyRequestReportReportUtils(iouReport, chatReport, false); if (!iouReport || shouldCreateNewMoneyRequestReport) { iouReport = isPolicyExpenseChat @@ -3763,8 +3776,8 @@ function getTrackExpenseInformation(params: GetTrackExpenseInformationParams): T } else { iouReport = allReports?.[`${ONYXKEYS.COLLECTION.REPORT}${chatReport.iouReportID}`] ?? null; } - - shouldCreateNewMoneyRequestReport = shouldCreateNewMoneyRequestReportReportUtils(iouReport, chatReport); + const isScanRequest = isScanRequestTransactionUtils({amount, receipt}); + shouldCreateNewMoneyRequestReport = shouldCreateNewMoneyRequestReportReportUtils(iouReport, chatReport, isScanRequest); if (!iouReport || shouldCreateNewMoneyRequestReport) { iouReport = buildOptimisticExpenseReport(chatReport.reportID, chatReport.policyID, payeeAccountID, amount, currency, amount); } else { @@ -6157,7 +6170,8 @@ function createSplitsAndOnyxData({ // STEP 2: Get existing IOU/Expense report and update its total OR build a new optimistic one let oneOnOneIOUReport: OneOnOneIOUReport = oneOnOneChatReport.iouReportID ? allReports?.[`${ONYXKEYS.COLLECTION.REPORT}${oneOnOneChatReport.iouReportID}`] : null; - const shouldCreateNewOneOnOneIOUReport = shouldCreateNewMoneyRequestReportReportUtils(oneOnOneIOUReport, oneOnOneChatReport); + const isScanRequest = isScanRequestTransactionUtils(splitTransaction); + const shouldCreateNewOneOnOneIOUReport = shouldCreateNewMoneyRequestReportReportUtils(oneOnOneIOUReport, oneOnOneChatReport, isScanRequest); if (!oneOnOneIOUReport || shouldCreateNewOneOnOneIOUReport) { oneOnOneIOUReport = isOwnPolicyExpenseChat @@ -6978,7 +6992,7 @@ function completeSplitBill( } let oneOnOneIOUReport: OneOnOneIOUReport = oneOnOneChatReport?.iouReportID ? allReports?.[`${ONYXKEYS.COLLECTION.REPORT}${oneOnOneChatReport.iouReportID}`] : null; - const shouldCreateNewOneOnOneIOUReport = shouldCreateNewMoneyRequestReportReportUtils(oneOnOneIOUReport, oneOnOneChatReport); + const shouldCreateNewOneOnOneIOUReport = shouldCreateNewMoneyRequestReportReportUtils(oneOnOneIOUReport, oneOnOneChatReport, false); if (!oneOnOneIOUReport || shouldCreateNewOneOnOneIOUReport) { oneOnOneIOUReport = isPolicyExpenseChat From 1cf24b654657cb08990bf4a7d1422391230beb61 Mon Sep 17 00:00:00 2001 From: Ishpaul Singh Date: Thu, 19 Jun 2025 19:44:04 +0530 Subject: [PATCH 2/6] adds requested changes --- src/CONST/index.ts | 2 +- src/ONYXKEYS.ts | 6 +++--- src/components/AutoSubmitModal.tsx | 10 +++++----- src/libs/NextStepUtils.ts | 6 +++--- src/libs/Permissions.ts | 10 ---------- src/libs/ReportUtils.ts | 8 ++++---- src/libs/actions/IOU.ts | 8 ++++---- src/libs/actions/User.ts | 6 +++--- 8 files changed, 23 insertions(+), 33 deletions(-) diff --git a/src/CONST/index.ts b/src/CONST/index.ts index 919f92afac61..7a38937532a0 100755 --- a/src/CONST/index.ts +++ b/src/CONST/index.ts @@ -811,7 +811,7 @@ const CONST = { }, BETAS: { ALL: 'all', - AUTO_SUBMIT: 'autoSubmit', + ASAP_SUBMIT: 'ASAPSubmit', DEFAULT_ROOMS: 'defaultRooms', P2P_DISTANCE_REQUESTS: 'p2pDistanceRequests', SPOTNANA_TRAVEL: 'spotnanaTravel', diff --git a/src/ONYXKEYS.ts b/src/ONYXKEYS.ts index 962b2733dd93..aeaec85a817d 100755 --- a/src/ONYXKEYS.ts +++ b/src/ONYXKEYS.ts @@ -164,12 +164,12 @@ const ONYXKEYS = { NVP_DISMISSED_REFERRAL_BANNERS: 'nvp_dismissedReferralBanners', /** - * This NVP contains if user has ever seen the instant submit explanation modal and user intent to not show the instant submit explanation modal again + * This NVP contains if user has ever seen the ASAP submit explanation modal and user intent to not show the ASAP submit explanation modal again * undefined : user has never seen the modal * false : user has seen the modal but has not chosen "do not show again" * true : user has seen the modal and does not want to see it again */ - NVP_DISMISSED_INSTANT_SUBMIT_EXPLANATION: 'nvp_dismissedInstantSubmitExplanation', + NVP_DISMISSED_ASAP_SUBMIT_EXPLANATION: 'nvp_dismissedASAPSubmitExplanation', /** This NVP contains the training modals the user denied showing again */ NVP_HAS_SEEN_TRACK_TRAINING: 'nvp_hasSeenTrackTraining', @@ -1063,7 +1063,7 @@ type OnyxValuesMapping = { [ONYXKEYS.NVP_RECENT_ATTENDEES]: Attendee[]; [ONYXKEYS.NVP_TRY_FOCUS_MODE]: boolean; [ONYXKEYS.NVP_DISMISSED_HOLD_USE_EXPLANATION]: boolean; - [ONYXKEYS.NVP_DISMISSED_INSTANT_SUBMIT_EXPLANATION]: boolean; + [ONYXKEYS.NVP_DISMISSED_ASAP_SUBMIT_EXPLANATION]: boolean; [ONYXKEYS.NVP_LAST_PAYMENT_METHOD]: OnyxTypes.LastPaymentMethod; [ONYXKEYS.NVP_LAST_LOCATION_PERMISSION_PROMPT]: string; [ONYXKEYS.LAST_EXPORT_METHOD]: OnyxTypes.LastExportMethod; diff --git a/src/components/AutoSubmitModal.tsx b/src/components/AutoSubmitModal.tsx index df8cf7bbc3fc..2c45c517c9e8 100644 --- a/src/components/AutoSubmitModal.tsx +++ b/src/components/AutoSubmitModal.tsx @@ -6,7 +6,7 @@ import useStyleUtils from '@hooks/useStyleUtils'; import useThemeStyles from '@hooks/useThemeStyles'; import colors from '@styles/theme/colors'; import variables from '@styles/variables'; -import {dismissInstantSubmitExplanation} from '@userActions/User'; +import {dismissASAPSubmitExplanation} from '@userActions/User'; import CONST from '@src/CONST'; import type {TranslationPaths} from '@src/languages/types'; import ONYXKEYS from '@src/ONYXKEYS'; @@ -29,7 +29,7 @@ const menuSections = [ ]; function AutoSubmitModal() { - const [dismissedInstantSubmitExplanation] = useOnyx(ONYXKEYS.NVP_DISMISSED_INSTANT_SUBMIT_EXPLANATION, {canBeMissing: true}); + const [dismissedASAPSubmitExplanation] = useOnyx(ONYXKEYS.NVP_DISMISSED_ASAP_SUBMIT_EXPLANATION, {canBeMissing: true}); const {translate} = useLocalize(); const styles = useThemeStyles(); const StyleUtils = useStyleUtils(); @@ -37,9 +37,9 @@ function AutoSubmitModal() { const onClose = useCallback((willShowAgain: boolean) => { InteractionManager.runAfterInteractions(() => { if (!willShowAgain) { - dismissInstantSubmitExplanation(true); + dismissASAPSubmitExplanation(true); } else { - dismissInstantSubmitExplanation(false); + dismissASAPSubmitExplanation(false); } }); }, []); @@ -58,7 +58,7 @@ function AutoSubmitModal() { illustrationInnerContainerStyle={[styles.alignItemsCenter, styles.justifyContentCenter, StyleUtils.getBackgroundColorStyle(colors.green700), styles.p8]} modalInnerContainerStyle={styles.pt0} illustrationOuterContainerStyle={styles.p0} - shouldShowDismissModalOption={dismissedInstantSubmitExplanation === false} + shouldShowDismissModalOption={dismissedASAPSubmitExplanation === false} onConfirm={onClose} titleStyles={[styles.mb1]} contentInnerContainerStyles={[styles.mb5]} diff --git a/src/libs/NextStepUtils.ts b/src/libs/NextStepUtils.ts index bd5db1032061..118deb8f5092 100644 --- a/src/libs/NextStepUtils.ts +++ b/src/libs/NextStepUtils.ts @@ -149,9 +149,9 @@ function buildNextStep( const {harvesting, autoReportingOffset} = policy; const autoReportingFrequency = getCorrectedAutoReportingFrequency(policy); const hasViolations = hasViolationsReportUtils(report?.reportID, transactionViolations); - const isAutoSubmitEnabled = Permissions.isBetaEnabled(CONST.BETAS.AUTO_SUBMIT, allBetas); + const isASAPSubmitBetaEnabled = Permissions.isBetaEnabled(CONST.BETAS.ASAP_SUBMIT, allBetas); const isInstantSubmitEnabled = autoReportingFrequency === CONST.POLICY.AUTO_REPORTING_FREQUENCIES.INSTANT; - const shouldShowFixMessage = hasViolations && isInstantSubmitEnabled && !isAutoSubmitEnabled; + const shouldShowFixMessage = hasViolations && isInstantSubmitEnabled && !isASAPSubmitBetaEnabled; const [policyOwnerPersonalDetails, ownerPersonalDetails] = getPersonalDetailsByIDs({ accountIDs: [policy.ownerAccountID ?? CONST.DEFAULT_NUMBER_ID, ownerAccountID], currentUserAccountID, @@ -209,7 +209,7 @@ function buildNextStep( switch (predictedNextStatus) { // Generates an optimistic nextStep once a report has been opened case CONST.REPORT.STATUS_NUM.OPEN: - if ((isAutoSubmitEnabled && hasViolations && isInstantSubmitEnabled) || shouldFixViolations) { + if ((isASAPSubmitBetaEnabled && hasViolations && isInstantSubmitEnabled) || shouldFixViolations) { optimisticNextStep = { type, icon: CONST.NEXT_STEP.ICONS.HOURGLASS, diff --git a/src/libs/Permissions.ts b/src/libs/Permissions.ts index cd1a048642f4..c423d89c610d 100644 --- a/src/libs/Permissions.ts +++ b/src/libs/Permissions.ts @@ -18,15 +18,6 @@ function canUseLinkPreviews(): boolean { return false; } -/** - * Checks if the user can use the auto-submit feature - * @param betas - The user's beta flags - * @returns true if the user can use auto-submit, false otherwise - */ -function canUseAutoSubmit(betas: OnyxEntry): boolean { - return !!betas?.includes(CONST.BETAS.AUTO_SUBMIT) || canUseAllBetas(betas); -} - function isBetaEnabled(beta: Beta, betas: OnyxEntry): boolean { return !!betas?.includes(beta) || canUseAllBetas(betas); } @@ -35,5 +26,4 @@ export default { canUseLinkPreviews, isBlockedFromSpotnanaTravel, isBetaEnabled, - canUseAutoSubmit, }; diff --git a/src/libs/ReportUtils.ts b/src/libs/ReportUtils.ts index 67c826cb13c9..22de1252b182 100644 --- a/src/libs/ReportUtils.ts +++ b/src/libs/ReportUtils.ts @@ -5723,8 +5723,8 @@ function buildOptimisticInvoiceReport( * @param policy */ function getExpenseReportStateAndStatus(policy: OnyxEntry, isEmptyOptimisticReport = false) { - const isAutoSubmitBetaEnabled = Permissions.isBetaEnabled(CONST.BETAS.AUTO_SUBMIT, allBetas); - if (isAutoSubmitBetaEnabled) { + const isASAPSubmitBetaEnabled = Permissions.isBetaEnabled(CONST.BETAS.ASAP_SUBMIT, allBetas); + if (isASAPSubmitBetaEnabled) { return { stateNum: CONST.REPORT.STATE_NUM.OPEN, statusNum: CONST.REPORT.STATUS_NUM.OPEN, @@ -9472,8 +9472,8 @@ function hasMissingPaymentMethod(userWallet: OnyxEntry, iouReportID: * - we have one, but we can't add more transactions to it due to: report is approved or settled */ function shouldCreateNewMoneyRequestReport(existingIOUReport: OnyxInputOrEntry | undefined, chatReport: OnyxInputOrEntry, isScanRequest: boolean): boolean { - const isAutoSubmitBetaEnabled = Permissions.isBetaEnabled(CONST.BETAS.AUTO_SUBMIT, allBetas); - return !existingIOUReport || hasIOUWaitingOnCurrentUserBankAccount(chatReport) || !canAddTransaction(existingIOUReport) || (isScanRequest && isAutoSubmitBetaEnabled); + const isASAPSubmitBetaEnabled = Permissions.isBetaEnabled(CONST.BETAS.ASAP_SUBMIT, allBetas); + return !existingIOUReport || hasIOUWaitingOnCurrentUserBankAccount(chatReport) || !canAddTransaction(existingIOUReport) || (isScanRequest && isASAPSubmitBetaEnabled); } function getTripIDFromTransactionParentReportID(transactionParentReportID: string | undefined): string | undefined { diff --git a/src/libs/actions/IOU.ts b/src/libs/actions/IOU.ts index d2c9d0a05b21..0552d20f0b16 100644 --- a/src/libs/actions/IOU.ts +++ b/src/libs/actions/IOU.ts @@ -1388,7 +1388,7 @@ function buildOnyxDataForMoneyRequest(moneyRequestParams: BuildOnyxDataForMoneyR const isScanRequest = isScanRequestTransactionUtils(transaction); const isPerDiemRequest = isPerDiemRequestTransactionUtils(transaction); - const isAutoSubmitBetaEnabled = Permissions.isBetaEnabled(CONST.BETAS.AUTO_SUBMIT, allBetas); + const isASAPSubmitBetaEnabled = Permissions.isBetaEnabled(CONST.BETAS.ASAP_SUBMIT, allBetas); const outstandingChildRequest = getOutstandingChildRequest(iou.report); const clearedPendingFields = Object.fromEntries(Object.keys(transaction.pendingFields ?? {}).map((key) => [key, null])); const isMoneyRequestToManagerMcTest = isTestTransactionReport(iou.report); @@ -1420,7 +1420,7 @@ function buildOnyxDataForMoneyRequest(moneyRequestParams: BuildOnyxDataForMoneyR lastReadTime: DateUtils.getDBTime(), ...(shouldCreateNewMoneyRequestReport ? {lastVisibleActionCreated: chat.reportPreviewAction.created} : {}), // do not update iouReportID if auto submit beta is enabled and it is a scan request - ...(isAutoSubmitBetaEnabled && isScanRequest ? {} : {iouReportID: iou.report.reportID}), + ...(isASAPSubmitBetaEnabled && isScanRequest ? {} : {iouReportID: iou.report.reportID}), ...outstandingChildRequest, ...(isNewChatReport ? {pendingFields: {createChat: CONST.RED_BRICK_ROAD_PENDING_ACTION.ADD}} : {}), }, @@ -2403,7 +2403,7 @@ function buildOnyxDataForTrackExpense({ const {policy, tagList: policyTagList, categories: policyCategories} = policyParams; const isScanRequest = isScanRequestTransactionUtils(transaction); - const isAutoSubmitBetaEnabled = Permissions.isBetaEnabled(CONST.BETAS.AUTO_SUBMIT, allBetas); + const isASAPSubmitBetaEnabled = Permissions.isBetaEnabled(CONST.BETAS.ASAP_SUBMIT, allBetas); const isDistanceRequest = isDistanceRequestTransactionUtils(transaction); const clearedPendingFields = Object.fromEntries(Object.keys(transaction.pendingFields ?? {}).map((key) => [key, null])); @@ -2431,7 +2431,7 @@ function buildOnyxDataForTrackExpense({ lastMessageHtml: getReportActionHtml(iouAction), lastReadTime: DateUtils.getDBTime(), // do not update iouReportID if auto submit beta is enabled and it is a scan request - iouReportID: isAutoSubmitBetaEnabled && isScanRequest ? null : iouReport?.reportID, + iouReportID: isASAPSubmitBetaEnabled && isScanRequest ? null : iouReport?.reportID, lastVisibleActionCreated: shouldCreateNewMoneyRequestReport ? reportPreviewAction?.created : chatReport.lastVisibleActionCreated, }, }, diff --git a/src/libs/actions/User.ts b/src/libs/actions/User.ts index 64328ca671a0..9595b68cbae0 100644 --- a/src/libs/actions/User.ts +++ b/src/libs/actions/User.ts @@ -1373,8 +1373,8 @@ function dismissTrackTrainingModal() { * Dismiss the Auto-Submit explanation modal * @param shouldDismiss Whether the user selected "Don't show again" */ -function dismissInstantSubmitExplanation(shouldDismiss: boolean) { - Onyx.merge(ONYXKEYS.NVP_DISMISSED_INSTANT_SUBMIT_EXPLANATION, shouldDismiss); +function dismissASAPSubmitExplanation(shouldDismiss: boolean) { + Onyx.merge(ONYXKEYS.NVP_DISMISSED_ASAP_SUBMIT_EXPLANATION, shouldDismiss); } function requestRefund() { @@ -1436,7 +1436,7 @@ export { closeAccount, dismissReferralBanner, dismissTrackTrainingModal, - dismissInstantSubmitExplanation, + dismissASAPSubmitExplanation, resendValidateCode, requestContactMethodValidateCode, updateNewsletterSubscription, From 3831cc885e887e518c3a5f2f88250be174665a48 Mon Sep 17 00:00:00 2001 From: Ishpaul Singh Date: Thu, 19 Jun 2025 23:06:35 +0530 Subject: [PATCH 3/6] prettier --- src/libs/actions/IOU.ts | 1 - 1 file changed, 1 deletion(-) diff --git a/src/libs/actions/IOU.ts b/src/libs/actions/IOU.ts index a8114ad82c99..f1a63596575a 100644 --- a/src/libs/actions/IOU.ts +++ b/src/libs/actions/IOU.ts @@ -650,7 +650,6 @@ type GetSearchOnyxUpdateParams = { transactionThreadReportID: string | undefined; }; - let allBetas: OnyxEntry; Onyx.connect({ key: ONYXKEYS.BETAS, From 3f9bab94c5bb727b01c41f7ad6cea31d1af97fd4 Mon Sep 17 00:00:00 2001 From: Ishpaul Singh Date: Thu, 19 Jun 2025 23:41:23 +0530 Subject: [PATCH 4/6] fix tests --- src/libs/__mocks__/Permissions.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/libs/__mocks__/Permissions.ts b/src/libs/__mocks__/Permissions.ts index 9b4f9096f5d2..08ef6082c1de 100644 --- a/src/libs/__mocks__/Permissions.ts +++ b/src/libs/__mocks__/Permissions.ts @@ -10,5 +10,5 @@ import type Beta from '@src/types/onyx/Beta'; export default { ...jest.requireActual('../Permissions'), - isBetaEnabled: (beta: Beta, betas: Beta[]) => betas.includes(beta), + isBetaEnabled: (beta: Beta, betas: Beta[]) => !!betas.includes(beta), }; From d96351d759cb1a39462c7f86eeba660b53b08543 Mon Sep 17 00:00:00 2001 From: Ishpaul Singh Date: Thu, 19 Jun 2025 23:42:20 +0530 Subject: [PATCH 5/6] fix tests --- src/libs/__mocks__/Permissions.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/libs/__mocks__/Permissions.ts b/src/libs/__mocks__/Permissions.ts index 08ef6082c1de..1ea5fd66b1f7 100644 --- a/src/libs/__mocks__/Permissions.ts +++ b/src/libs/__mocks__/Permissions.ts @@ -10,5 +10,5 @@ import type Beta from '@src/types/onyx/Beta'; export default { ...jest.requireActual('../Permissions'), - isBetaEnabled: (beta: Beta, betas: Beta[]) => !!betas.includes(beta), + isBetaEnabled: (beta: Beta, betas: Beta[]) => !!betas?.includes(beta), }; From 9215efa72dbec54075197ef2f5094257064ce28a Mon Sep 17 00:00:00 2001 From: Ishpaul Singh Date: Fri, 27 Jun 2025 14:09:01 +0530 Subject: [PATCH 6/6] change beta name --- src/CONST/index.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/CONST/index.ts b/src/CONST/index.ts index 4cd49c5f762c..acff020ebc3f 100755 --- a/src/CONST/index.ts +++ b/src/CONST/index.ts @@ -811,7 +811,7 @@ const CONST = { }, BETAS: { ALL: 'all', - ASAP_SUBMIT: 'ASAPSubmit', + ASAP_SUBMIT: 'asapSubmit', DEFAULT_ROOMS: 'defaultRooms', P2P_DISTANCE_REQUESTS: 'p2pDistanceRequests', SPOTNANA_TRAVEL: 'spotnanaTravel',