diff --git a/src/CONST/index.ts b/src/CONST/index.ts index 8d7fc60458c21..dfa2ef7ab86b0 100755 --- a/src/CONST/index.ts +++ b/src/CONST/index.ts @@ -743,7 +743,6 @@ const CONST = { EUR_BILLING: 'eurBilling', NO_OPTIMISTIC_TRANSACTION_THREADS: 'noOptimisticTransactionThreads', UBER_FOR_BUSINESS: 'uberForBusiness', - CUSTOM_REPORT_NAMES: 'newExpensifyCustomReportNames', NEW_DOT_DEW: 'newDotDEW', GPS_MILEAGE: 'gpsMileage', PERSONAL_CARD_IMPORT: 'personalCardImport', diff --git a/src/components/KYCWall/BaseKYCWall.tsx b/src/components/KYCWall/BaseKYCWall.tsx index 8b272119dc87c..0cbd48c33edfa 100644 --- a/src/components/KYCWall/BaseKYCWall.tsx +++ b/src/components/KYCWall/BaseKYCWall.tsx @@ -7,7 +7,6 @@ import useCurrentUserPersonalDetails from '@hooks/useCurrentUserPersonalDetails' import useLocalize from '@hooks/useLocalize'; import useOnyx from '@hooks/useOnyx'; import useParentReportAction from '@hooks/useParentReportAction'; -import usePermissions from '@hooks/usePermissions'; import useReportTransactions from '@hooks/useReportTransactions'; import {openPersonalBankAccountSetupView} from '@libs/actions/BankAccounts'; import {completePaymentOnboarding, savePreferredPaymentMethod} from '@libs/actions/IOU'; @@ -72,8 +71,6 @@ function KYCWall({ const personalDetails = usePersonalDetails(); const employeeEmail = personalDetails?.[iouReport?.ownerAccountID ?? CONST.DEFAULT_NUMBER_ID]?.login ?? ''; const reportTransactions = useReportTransactions(iouReport?.reportID); - const {isBetaEnabled} = usePermissions(); - const isCustomReportNamesBetaEnabled = isBetaEnabled(CONST.BETAS.CUSTOM_REPORT_NAMES); const anchorRef = useRef(null); const transferBalanceButtonRef = useRef(null); @@ -139,7 +136,7 @@ function KYCWall({ if (iouReport && isIOUReport(iouReport)) { const adminPolicy = policies?.[`${ONYXKEYS.COLLECTION.POLICY}${policy?.id}`]; if (adminPolicy) { - const inviteResult = moveIOUReportToPolicyAndInviteSubmitter(iouReport, adminPolicy, formatPhoneNumber, reportTransactions, isCustomReportNamesBetaEnabled); + const inviteResult = moveIOUReportToPolicyAndInviteSubmitter(iouReport, adminPolicy, formatPhoneNumber, reportTransactions); if (inviteResult?.policyExpenseChatReportID) { setNavigationActionToMicrotaskQueue(() => { Navigation.navigate(ROUTES.REPORT_WITH_ID.getRoute(inviteResult.policyExpenseChatReportID)); @@ -149,7 +146,7 @@ function KYCWall({ Navigation.navigate(ROUTES.BANK_ACCOUNT_WITH_STEP_TO_OPEN.getRoute(adminPolicy.id)); }); } else { - const moveResult = moveIOUReportToPolicy(iouReport, adminPolicy, true, reportTransactions, isCustomReportNamesBetaEnabled); + const moveResult = moveIOUReportToPolicy(iouReport, adminPolicy, true, reportTransactions); savePreferredPaymentMethod(iouReport.policyID, adminPolicy.id, CONST.LAST_PAYMENT_METHOD.IOU, lastPaymentMethod?.[adminPolicy.id]); if (moveResult?.policyExpenseChatReportID && !moveResult.useTemporaryOptimisticExpenseChatReportID) { @@ -212,7 +209,6 @@ function KYCWall({ currentUserEmail, employeeEmail, reportTransactions, - isCustomReportNamesBetaEnabled, introSelected, formatPhoneNumber, lastPaymentMethod, diff --git a/src/libs/ReportTitleUtils.ts b/src/libs/ReportTitleUtils.ts index b865def86ff8f..8ce0719c477b6 100644 --- a/src/libs/ReportTitleUtils.ts +++ b/src/libs/ReportTitleUtils.ts @@ -4,15 +4,11 @@ */ import type {OnyxUpdate} from 'react-native-onyx'; import Onyx from 'react-native-onyx'; -import CONST from '@src/CONST'; import ONYXKEYS from '@src/ONYXKEYS'; -import type {Beta, BetaConfiguration, Policy, Report, ReportNameValuePairs} from '@src/types/onyx'; -import Permissions from './Permissions'; +import type {Policy, Report, ReportNameValuePairs} from '@src/types/onyx'; import {getTitleReportField, isChatReport} from './ReportUtils'; let allReportNameValuePairs: Record = {}; -let betas: Beta[] = []; -let betaConfiguration: BetaConfiguration = {}; /** * We use Onyx.connectWithoutView because we do not use this in React components and this logic is not tied directly to the UI. @@ -26,18 +22,6 @@ Onyx.connectWithoutView({ allReportNameValuePairs = (val as Record) ?? {}; }, }); -Onyx.connectWithoutView({ - key: ONYXKEYS.BETAS, - callback: (val) => { - betas = val ?? []; - }, -}); -Onyx.connectWithoutView({ - key: ONYXKEYS.BETA_CONFIGURATION, - callback: (val) => { - betaConfiguration = val ?? {}; - }, -}); /** * Get the title field from report name value pairs @@ -53,9 +37,6 @@ function getTitleFieldFromRNVP(reportID: string) { * This is the JavaScript equivalent of the backend updateTitleFieldToMatchPolicy function */ function updateTitleFieldToMatchPolicy(reportID: string, policy?: Policy): Array> { - if (!Permissions.isBetaEnabled(CONST.BETAS.CUSTOM_REPORT_NAMES, betas, betaConfiguration)) { - return []; - } if (!reportID || !policy) { return []; } @@ -87,9 +68,6 @@ function updateTitleFieldToMatchPolicy(reportID: string, policy?: Policy): Array * Remove title field from report's rNVP when report is manually renamed to indicate that the manual name should be preserved, and the custom report name formula should no longer update the name. */ function removeTitleFieldFromReport(reportID: string): Array> { - if (!Permissions.isBetaEnabled(CONST.BETAS.CUSTOM_REPORT_NAMES, betas, betaConfiguration)) { - return []; - } if (!reportID) { return []; } diff --git a/src/libs/ReportUtils.ts b/src/libs/ReportUtils.ts index ec2ea11770d23..c6ac51810132c 100644 --- a/src/libs/ReportUtils.ts +++ b/src/libs/ReportUtils.ts @@ -6972,22 +6972,19 @@ function buildOptimisticExpenseReport({ expenseReport.managerID = submitToAccountID; } - // Only compute optimistic report name if the user is on the CUSTOM_REPORT_NAMES beta - if (Permissions.isBetaEnabled(CONST.BETAS.CUSTOM_REPORT_NAMES, allBetas)) { - const titleReportField = getTitleReportField(getReportFieldsByPolicyID(policyID) ?? {}); - if (!!titleReportField && isGroupPolicy(policy?.type ?? '')) { - const formulaContext: FormulaContext = { - report: expenseReport, - policy, - allTransactions: reportTransactions ?? {}, - }; + const titleReportField = getTitleReportField(getReportFieldsByPolicyID(policyID) ?? {}); + if (!!titleReportField && isGroupPolicy(policy?.type ?? '')) { + const formulaContext: FormulaContext = { + report: expenseReport, + policy, + allTransactions: reportTransactions ?? {}, + }; - // We use dynamic require here to avoid a circular dependency between ReportUtils and Formula - // eslint-disable-next-line @typescript-eslint/no-require-imports, @typescript-eslint/no-var-requires - const Formula = require('./Formula') as {compute: (formula?: string, context?: FormulaContext) => string}; - const computedName = Formula.compute(titleReportField.defaultValue, formulaContext); - expenseReport.reportName = computedName ?? expenseReport.reportName; - } + // We use dynamic require here to avoid a circular dependency between ReportUtils and Formula + // eslint-disable-next-line @typescript-eslint/no-require-imports, @typescript-eslint/no-var-requires + const Formula = require('./Formula') as {compute: (formula?: string, context?: FormulaContext) => string}; + const computedName = Formula.compute(titleReportField.defaultValue, formulaContext); + expenseReport.reportName = computedName ?? expenseReport.reportName; } expenseReport.fieldList = policy?.fieldList; @@ -7027,20 +7024,17 @@ function buildOptimisticEmptyReport( managerID: getManagerAccountID(policy, {ownerAccountID: accountID}), }; - // Only compute optimistic report name if the user is on the CUSTOM_REPORT_NAMES beta - if (Permissions.isBetaEnabled(CONST.BETAS.CUSTOM_REPORT_NAMES, allBetas)) { - const formulaContext: FormulaContext = { - report: optimisticEmptyReport as Report, - policy, - allTransactions: {}, - }; + const formulaContext: FormulaContext = { + report: optimisticEmptyReport as Report, + policy, + allTransactions: {}, + }; - // We use dynamic require here to avoid a circular dependency between ReportUtils and Formula - // eslint-disable-next-line @typescript-eslint/no-require-imports, @typescript-eslint/no-var-requires - const Formula = require('./Formula') as {compute: (formula?: string, context?: FormulaContext) => string}; - const optimisticReportName = Formula.compute(titleReportField?.defaultValue ?? CONST.POLICY.DEFAULT_REPORT_NAME_PATTERN, formulaContext); - optimisticEmptyReport.reportName = optimisticReportName ?? ''; - } + // We use dynamic require here to avoid a circular dependency between ReportUtils and Formula + // eslint-disable-next-line @typescript-eslint/no-require-imports, @typescript-eslint/no-var-requires + const Formula = require('./Formula') as {compute: (formula?: string, context?: FormulaContext) => string}; + const optimisticReportName = Formula.compute(titleReportField?.defaultValue ?? CONST.POLICY.DEFAULT_REPORT_NAME_PATTERN, formulaContext); + optimisticEmptyReport.reportName = optimisticReportName ?? ''; optimisticEmptyReport.participants = accountID ? { diff --git a/src/libs/actions/Report/index.ts b/src/libs/actions/Report/index.ts index be3be480ac217..2fcb2f99f859a 100644 --- a/src/libs/actions/Report/index.ts +++ b/src/libs/actions/Report/index.ts @@ -5475,7 +5475,6 @@ function moveIOUReportToPolicy( policy: Policy, isFromSettlementButton?: boolean, reportTransactions: Transaction[] = [], - isCustomReportNamesBetaEnabled?: boolean, ): {policyExpenseChatReportID?: string; useTemporaryOptimisticExpenseChatReportID: boolean} | undefined { // This flow only works for IOU reports if (!policy || !iouReport || !isIOUReportUsingReport(iouReport)) { @@ -5502,7 +5501,6 @@ function moveIOUReportToPolicy( policyID, optimisticExpenseChatReportID, reportTransactions, - isCustomReportNamesBetaEnabled, ); const parameters: MoveIOUReportToExistingPolicyParams = { @@ -5525,7 +5523,6 @@ function moveIOUReportToPolicyAndInviteSubmitter( policy: Policy, formatPhoneNumber: LocaleContextProps['formatPhoneNumber'], reportTransactions: Transaction[] = [], - isCustomReportNamesBetaEnabled?: boolean, ): {policyExpenseChatReportID?: string} | undefined { if (!policy || !iouReport) { return; @@ -5656,7 +5653,7 @@ function moveIOUReportToPolicyAndInviteSubmitter( failureData: convertedFailureData, movedExpenseReportAction, movedReportAction, - } = convertIOUReportToExpenseReport(iouReport, policy, policyID, optimisticPolicyExpenseChatReportID, reportTransactions, isCustomReportNamesBetaEnabled); + } = convertIOUReportToExpenseReport(iouReport, policy, policyID, optimisticPolicyExpenseChatReportID, reportTransactions); optimisticData.push(...convertedOptimisticData); successData.push(...convertedSuccessData); @@ -5675,14 +5672,7 @@ function moveIOUReportToPolicyAndInviteSubmitter( return {policyExpenseChatReportID: optimisticPolicyExpenseChatReportID}; } -function convertIOUReportToExpenseReport( - iouReport: Report, - policy: Policy, - policyID: string, - optimisticPolicyExpenseChatReportID: string, - reportTransactions: Transaction[] = [], - isCustomReportNamesBetaEnabled?: boolean, -) { +function convertIOUReportToExpenseReport(iouReport: Report, policy: Policy, policyID: string, optimisticPolicyExpenseChatReportID: string, reportTransactions: Transaction[] = []) { const optimisticData: Array> = []; const successData: Array> = []; const failureData: Array> = []; @@ -5704,27 +5694,24 @@ function convertIOUReportToExpenseReport( expenseReport.managerID = nextApproverAccountID; } - // Only compute optimistic report name if the user is on the CUSTOM_REPORT_NAMES beta - if (isCustomReportNamesBetaEnabled) { - const titleReportField = getTitleReportField(getReportFieldsByPolicyID(policyID) ?? {}); - if (!!titleReportField && isPaidGroupPolicy(policy)) { - // Convert transactions array to Record for FormulaContext - const transactionsRecord: Record = {}; - for (const transaction of reportTransactions) { - if (transaction?.transactionID) { - transactionsRecord[transaction.transactionID] = transaction; - } + const titleReportField = getTitleReportField(getReportFieldsByPolicyID(policyID) ?? {}); + if (!!titleReportField && isPaidGroupPolicy(policy)) { + // Convert transactions array to Record for FormulaContext + const transactionsRecord: Record = {}; + for (const transaction of reportTransactions) { + if (transaction?.transactionID) { + transactionsRecord[transaction.transactionID] = transaction; } - - // eslint-disable-next-line @typescript-eslint/no-require-imports, @typescript-eslint/no-var-requires - const Formula = require('@libs/Formula') as {compute: (formula?: string, context?: {report: Report; policy: Policy; allTransactions?: Record}) => string}; - const computedName = Formula.compute(titleReportField.defaultValue, { - report: expenseReport, - policy, - allTransactions: transactionsRecord, - }); - expenseReport.reportName = computedName ?? expenseReport.reportName; } + + // eslint-disable-next-line @typescript-eslint/no-require-imports, @typescript-eslint/no-var-requires + const Formula = require('@libs/Formula') as {compute: (formula?: string, context?: {report: Report; policy: Policy; allTransactions?: Record}) => string}; + const computedName = Formula.compute(titleReportField.defaultValue, { + report: expenseReport, + policy, + allTransactions: transactionsRecord, + }); + expenseReport.reportName = computedName ?? expenseReport.reportName; } const reportID = iouReport.reportID; diff --git a/src/pages/ReportChangeWorkspacePage.tsx b/src/pages/ReportChangeWorkspacePage.tsx index e074764021445..31dbefcfe99ec 100644 --- a/src/pages/ReportChangeWorkspacePage.tsx +++ b/src/pages/ReportChangeWorkspacePage.tsx @@ -70,7 +70,6 @@ function ReportChangeWorkspacePage({report, route}: ReportChangeWorkspacePagePro const shouldShowLoadingIndicator = isLoadingApp && !isOffline; const {isBetaEnabled} = usePermissions(); const isASAPSubmitBetaEnabled = isBetaEnabled(CONST.BETAS.ASAP_SUBMIT); - const isCustomReportNamesBetaEnabled = isBetaEnabled(CONST.BETAS.CUSTOM_REPORT_NAMES); const session = useSession(); const hasViolations = hasViolationsReportUtils(report?.reportID, transactionViolations, session?.accountID ?? CONST.DEFAULT_NUMBER_ID, session?.email ?? ''); @@ -87,9 +86,9 @@ function ReportChangeWorkspacePage({report, route}: ReportChangeWorkspacePagePro const {backTo} = route.params; Navigation.goBack(backTo); if (isIOUReport(reportID)) { - const invite = moveIOUReportToPolicyAndInviteSubmitter(report, policy, formatPhoneNumber, reportTransactions, isCustomReportNamesBetaEnabled); + const invite = moveIOUReportToPolicyAndInviteSubmitter(report, policy, formatPhoneNumber, reportTransactions); if (!invite?.policyExpenseChatReportID) { - moveIOUReportToPolicy(report, policy, false, reportTransactions, isCustomReportNamesBetaEnabled); + moveIOUReportToPolicy(report, policy, false, reportTransactions); } // This will be fixed as part of https://github.com/Expensify/Expensify/issues/507850 // eslint-disable-next-line @typescript-eslint/no-deprecated @@ -136,7 +135,6 @@ function ReportChangeWorkspacePage({report, route}: ReportChangeWorkspacePagePro session?.email, hasViolations, isASAPSubmitBetaEnabled, - isCustomReportNamesBetaEnabled, reportNextStep, isChangePolicyTrainingModalDismissed, ], diff --git a/src/pages/Search/SearchPage.tsx b/src/pages/Search/SearchPage.tsx index 3f6397704e016..09cc07ffab279 100644 --- a/src/pages/Search/SearchPage.tsx +++ b/src/pages/Search/SearchPage.tsx @@ -136,7 +136,6 @@ function SearchPage({route}: SearchPageProps) { const {showConfirmModal} = useConfirmModal(); const {isBetaEnabled} = usePermissions(); const isDEWBetaEnabled = isBetaEnabled(CONST.BETAS.NEW_DOT_DEW); - const isCustomReportNamesBetaEnabled = isBetaEnabled(CONST.BETAS.CUSTOM_REPORT_NAMES); const [isHoldEducationalModalVisible, setIsHoldEducationalModalVisible] = useState(false); const [rejectModalAction, setRejectModalAction] = useState => !!transaction && transaction.reportID === itemReportID, ); - const invite = moveIOUReportToPolicyAndInviteSubmitter(itemReport, adminPolicy, formatPhoneNumber, reportTransactions, isCustomReportNamesBetaEnabled); + const invite = moveIOUReportToPolicyAndInviteSubmitter(itemReport, adminPolicy, formatPhoneNumber, reportTransactions); if (!invite?.policyExpenseChatReportID) { - moveIOUReportToPolicy(itemReport, adminPolicy, false, reportTransactions, isCustomReportNamesBetaEnabled); + moveIOUReportToPolicy(itemReport, adminPolicy, false, reportTransactions); } } } @@ -584,7 +583,6 @@ function SearchPage({route}: SearchPageProps) { showDelegateNoAccessModal, personalPolicyID, allTransactions, - isCustomReportNamesBetaEnabled, allReports, ], ); diff --git a/tests/unit/usePermissionsTest.tsx b/tests/unit/usePermissionsTest.tsx index 775d1efbde744..aebb2d0e58054 100644 --- a/tests/unit/usePermissionsTest.tsx +++ b/tests/unit/usePermissionsTest.tsx @@ -78,7 +78,7 @@ describe('usePermissions', () => { it('should handle explicit only and exclusion betas correctly', async () => { // Given: A beta configuration with both explicit only and exclusion betas - const explicitOnlyBeta = CONST.BETAS.CUSTOM_REPORT_NAMES; + const explicitOnlyBeta = CONST.BETAS.ASAP_SUBMIT; const exclusionBeta = CONST.BETAS.PREVENT_SPOTNANA_TRAVEL; const betaConfiguration = { explicitOnly: [explicitOnlyBeta],