From 42973c80773201181bfc4d5a7c37749b8616e8c3 Mon Sep 17 00:00:00 2001 From: Julian Kobrynski Date: Mon, 16 Dec 2024 15:09:09 +0100 Subject: [PATCH 1/9] remove canUseCombinedTrackSubmit function --- src/components/ReportWelcomeText.tsx | 4 +--- src/libs/Permissions.ts | 10 ---------- src/libs/ReportUtils.ts | 4 +--- src/libs/actions/Report.ts | 16 +++++++--------- .../AttachmentPickerWithMenuItems.tsx | 17 ++++++----------- src/pages/iou/request/IOURequestStartPage.tsx | 6 ++---- 6 files changed, 17 insertions(+), 40 deletions(-) diff --git a/src/components/ReportWelcomeText.tsx b/src/components/ReportWelcomeText.tsx index cc7dbed1f6e9..a9018104d4f1 100644 --- a/src/components/ReportWelcomeText.tsx +++ b/src/components/ReportWelcomeText.tsx @@ -3,7 +3,6 @@ import {View} from 'react-native'; import type {OnyxEntry} from 'react-native-onyx'; import {useOnyx} from 'react-native-onyx'; import useLocalize from '@hooks/useLocalize'; -import usePermissions from '@hooks/usePermissions'; import useThemeStyles from '@hooks/useThemeStyles'; import Navigation from '@libs/Navigation/Navigation'; import * as OptionsListUtils from '@libs/OptionsListUtils'; @@ -47,7 +46,6 @@ function ReportWelcomeText({report, policy}: ReportWelcomeTextProps) { const welcomeMessage = SidebarUtils.getWelcomeMessage(report, policy); const moneyRequestOptions = ReportUtils.temporary_getMoneyRequestOptions(report, policy, participantAccountIDs); const canEditReportDescription = ReportUtils.canEditReportDescription(report, policy); - const {canUseCombinedTrackSubmit} = usePermissions(); const filteredOptions = moneyRequestOptions.filter( (item): item is Exclude => item !== CONST.IOU.TYPE.INVOICE, @@ -56,7 +54,7 @@ function ReportWelcomeText({report, policy}: ReportWelcomeTextProps) { .map( (item, index) => `${index === filteredOptions.length - 1 && index > 0 ? `${translate('common.or')} ` : ''}${translate( - canUseCombinedTrackSubmit && item === 'submit' ? `reportActionsView.create` : `reportActionsView.iouTypes.${item}`, + item === 'submit' ? `reportActionsView.create` : `reportActionsView.iouTypes.${item}`, )}`, ) .join(', '); diff --git a/src/libs/Permissions.ts b/src/libs/Permissions.ts index 4a7bba3932a3..146de150c164 100644 --- a/src/libs/Permissions.ts +++ b/src/libs/Permissions.ts @@ -1,9 +1,6 @@ import type {OnyxEntry} from 'react-native-onyx'; import CONST from '@src/CONST'; import type Beta from '@src/types/onyx/Beta'; -import * as SessionUtils from './SessionUtils'; - -const isAccountIDEven = (accountID: number) => accountID % 2 === 0; function canUseAllBetas(betas: OnyxEntry): boolean { return !!betas?.includes(CONST.BETAS.ALL); @@ -25,12 +22,6 @@ function canUseCategoryAndTagApprovers(betas: OnyxEntry): boolean { return !!betas?.includes(CONST.BETAS.CATEGORY_AND_TAG_APPROVERS) || canUseAllBetas(betas); } -function canUseCombinedTrackSubmit(): boolean { - // We don't need to show this to all betas since this will be used for developing a feature for A/B testing. - const session = SessionUtils.getSession(); - return isAccountIDEven(session?.accountID ?? -1); -} - function canUsePerDiem(betas: OnyxEntry): boolean { return !!betas?.includes(CONST.BETAS.PER_DIEM) || canUseAllBetas(betas); } @@ -47,7 +38,6 @@ export default { canUseLinkPreviews, canUseSpotnanaTravel, canUseNetSuiteUSATax, - canUseCombinedTrackSubmit, canUseCategoryAndTagApprovers, canUsePerDiem, }; diff --git a/src/libs/ReportUtils.ts b/src/libs/ReportUtils.ts index eb728586f8f2..f655e95e32fa 100644 --- a/src/libs/ReportUtils.ts +++ b/src/libs/ReportUtils.ts @@ -7351,9 +7351,7 @@ function canCreateRequest(report: OnyxEntry, policy: OnyxEntry, } const requestOptions = getMoneyRequestOptions(report, policy, participantAccountIDs); - if (Permissions.canUseCombinedTrackSubmit()) { - requestOptions.push(CONST.IOU.TYPE.CREATE); - } + requestOptions.push(CONST.IOU.TYPE.CREATE); return requestOptions.includes(iouType); } diff --git a/src/libs/actions/Report.ts b/src/libs/actions/Report.ts index 7baf66adc5c5..f088462dc562 100644 --- a/src/libs/actions/Report.ts +++ b/src/libs/actions/Report.ts @@ -3518,16 +3518,14 @@ function prepareOnboardingOptimisticData( wasInvited?: boolean, ) { // If the user has the "combinedTrackSubmit" beta enabled we'll show different tasks for track and submit expense. - if (Permissions.canUseCombinedTrackSubmit()) { - if (engagementChoice === CONST.ONBOARDING_CHOICES.PERSONAL_SPEND) { - // eslint-disable-next-line no-param-reassign - data = CONST.COMBINED_TRACK_SUBMIT_ONBOARDING_MESSAGES[CONST.ONBOARDING_CHOICES.PERSONAL_SPEND]; - } + if (engagementChoice === CONST.ONBOARDING_CHOICES.PERSONAL_SPEND) { + // eslint-disable-next-line no-param-reassign + data = CONST.COMBINED_TRACK_SUBMIT_ONBOARDING_MESSAGES[CONST.ONBOARDING_CHOICES.PERSONAL_SPEND]; + } - if (engagementChoice === CONST.ONBOARDING_CHOICES.EMPLOYER || engagementChoice === CONST.ONBOARDING_CHOICES.SUBMIT) { - // eslint-disable-next-line no-param-reassign - data = CONST.COMBINED_TRACK_SUBMIT_ONBOARDING_MESSAGES[CONST.ONBOARDING_CHOICES.SUBMIT]; - } + if (engagementChoice === CONST.ONBOARDING_CHOICES.EMPLOYER || engagementChoice === CONST.ONBOARDING_CHOICES.SUBMIT) { + // eslint-disable-next-line no-param-reassign + data = CONST.COMBINED_TRACK_SUBMIT_ONBOARDING_MESSAGES[CONST.ONBOARDING_CHOICES.SUBMIT]; } // Guides are assigned and tasks are posted in the #admins room for the MANAGE_TEAM onboarding action, except for emails that have a '+'. diff --git a/src/pages/home/report/ReportActionCompose/AttachmentPickerWithMenuItems.tsx b/src/pages/home/report/ReportActionCompose/AttachmentPickerWithMenuItems.tsx index b182bf43a52b..be19706465e3 100644 --- a/src/pages/home/report/ReportActionCompose/AttachmentPickerWithMenuItems.tsx +++ b/src/pages/home/report/ReportActionCompose/AttachmentPickerWithMenuItems.tsx @@ -12,7 +12,6 @@ import PopoverMenu from '@components/PopoverMenu'; import PressableWithFeedback from '@components/Pressable/PressableWithFeedback'; import Tooltip from '@components/Tooltip/PopoverAnchorTooltip'; import useLocalize from '@hooks/useLocalize'; -import usePermissions from '@hooks/usePermissions'; import usePrevious from '@hooks/usePrevious'; import useResponsiveLayout from '@hooks/useResponsiveLayout'; import useTheme from '@hooks/useTheme'; @@ -121,7 +120,6 @@ function AttachmentPickerWithMenuItems({ const {isDelegateAccessRestricted} = useDelegateUserDetails(); const [isNoDelegateAccessMenuVisible, setIsNoDelegateAccessMenuVisible] = useState(false); const [policy] = useOnyx(`${ONYXKEYS.COLLECTION.POLICY}${report?.policyID}`); - const {canUseCombinedTrackSubmit} = usePermissions(); /** * Returns the list of IOU Options @@ -143,8 +141,8 @@ function AttachmentPickerWithMenuItems({ onSelected: () => selectOption(() => IOU.startMoneyRequest(CONST.IOU.TYPE.SPLIT, report?.reportID ?? '-1'), true), }, [CONST.IOU.TYPE.SUBMIT]: { - icon: canUseCombinedTrackSubmit ? getIconForAction(CONST.IOU.TYPE.CREATE) : getIconForAction(CONST.IOU.TYPE.REQUEST), - text: canUseCombinedTrackSubmit ? translate('iou.createExpense') : translate('iou.submitExpense'), + icon: getIconForAction(CONST.IOU.TYPE.CREATE), + text: translate('iou.createExpense'), onSelected: () => selectOption(() => IOU.startMoneyRequest(CONST.IOU.TYPE.SUBMIT, report?.reportID ?? '-1'), true), }, [CONST.IOU.TYPE.PAY]: { @@ -159,8 +157,8 @@ function AttachmentPickerWithMenuItems({ }, }, [CONST.IOU.TYPE.TRACK]: { - icon: canUseCombinedTrackSubmit ? getIconForAction(CONST.IOU.TYPE.CREATE) : getIconForAction(CONST.IOU.TYPE.TRACK), - text: canUseCombinedTrackSubmit ? translate('iou.createExpense') : translate('iou.trackExpense'), + icon: getIconForAction(CONST.IOU.TYPE.CREATE), + text: translate('iou.createExpense'), onSelected: () => selectOption(() => IOU.startMoneyRequest(CONST.IOU.TYPE.TRACK, report?.reportID ?? '-1'), true), }, [CONST.IOU.TYPE.INVOICE]: { @@ -174,11 +172,8 @@ function AttachmentPickerWithMenuItems({ ...options[option], })); - return canUseCombinedTrackSubmit - ? // Removes track option for the workspace with the canUseCombinedTrackSubmit enabled - moneyRequestOptionsList.filter((item, index, self) => index === self.findIndex((t) => t.text === item.text)) - : moneyRequestOptionsList; - }, [translate, canUseCombinedTrackSubmit, report, policy, reportParticipantIDs, isDelegateAccessRestricted]); + return moneyRequestOptionsList.filter((item, index, self) => index === self.findIndex((t) => t.text === item.text)); + }, [translate, report, policy, reportParticipantIDs, isDelegateAccessRestricted]); /** * Determines if we can show the task option diff --git a/src/pages/iou/request/IOURequestStartPage.tsx b/src/pages/iou/request/IOURequestStartPage.tsx index 78dac9220742..0794c1142eff 100644 --- a/src/pages/iou/request/IOURequestStartPage.tsx +++ b/src/pages/iou/request/IOURequestStartPage.tsx @@ -8,7 +8,6 @@ import HeaderWithBackButton from '@components/HeaderWithBackButton'; import ScreenWrapper from '@components/ScreenWrapper'; import TabSelector from '@components/TabSelector/TabSelector'; import useLocalize from '@hooks/useLocalize'; -import usePermissions from '@hooks/usePermissions'; import usePolicy from '@hooks/usePolicy'; import useThemeStyles from '@hooks/useThemeStyles'; import * as DeviceCapabilities from '@libs/DeviceCapabilities'; @@ -48,15 +47,14 @@ function IOURequestStartPage({ // eslint-disable-next-line @typescript-eslint/prefer-nullish-coalescing const [transaction] = useOnyx(`${ONYXKEYS.COLLECTION.TRANSACTION_DRAFT}${route?.params.transactionID || -1}`); const [allPolicies] = useOnyx(ONYXKEYS.COLLECTION.POLICY); - const {canUseCombinedTrackSubmit} = usePermissions(); const tabTitles = { [CONST.IOU.TYPE.REQUEST]: translate('iou.createExpense'), - [CONST.IOU.TYPE.SUBMIT]: canUseCombinedTrackSubmit ? translate('iou.createExpense') : translate('iou.submitExpense'), + [CONST.IOU.TYPE.SUBMIT]: translate('iou.createExpense'), [CONST.IOU.TYPE.SEND]: translate('iou.paySomeone', {name: ReportUtils.getPayeeName(report)}), [CONST.IOU.TYPE.PAY]: translate('iou.paySomeone', {name: ReportUtils.getPayeeName(report)}), [CONST.IOU.TYPE.SPLIT]: translate('iou.createExpense'), - [CONST.IOU.TYPE.TRACK]: canUseCombinedTrackSubmit ? translate('iou.createExpense') : translate('iou.trackExpense'), + [CONST.IOU.TYPE.TRACK]: translate('iou.createExpense'), [CONST.IOU.TYPE.INVOICE]: translate('workspace.invoices.sendInvoice'), [CONST.IOU.TYPE.CREATE]: translate('iou.createExpense'), }; From ff7f4e00c3e40ccfadedc6e568413d317396318b Mon Sep 17 00:00:00 2001 From: Julian Kobrynski Date: Wed, 18 Dec 2024 15:05:22 +0100 Subject: [PATCH 2/9] fix ID fallback warnings --- src/components/ReportWelcomeText.tsx | 8 ++++---- src/libs/actions/Report.ts | 1 - .../AttachmentPickerWithMenuItems.tsx | 10 +++++----- src/pages/iou/request/IOURequestStartPage.tsx | 2 +- 4 files changed, 10 insertions(+), 11 deletions(-) diff --git a/src/components/ReportWelcomeText.tsx b/src/components/ReportWelcomeText.tsx index a9018104d4f1..7ebefe25144f 100644 --- a/src/components/ReportWelcomeText.tsx +++ b/src/components/ReportWelcomeText.tsx @@ -108,7 +108,7 @@ function ReportWelcomeText({report, policy}: ReportWelcomeTextProps) { if (!canEditPolicyDescription) { return; } - Navigation.navigate(ROUTES.WORKSPACE_PROFILE_DESCRIPTION.getRoute(policy?.id ?? '-1')); + Navigation.navigate(ROUTES.WORKSPACE_PROFILE_DESCRIPTION.getRoute(policy?.id ?? String(CONST.DEFAULT_NUMBER_ID))); }} style={[styles.renderHTML, canEditPolicyDescription ? styles.cursorPointer : styles.cursorText]} accessibilityLabel={translate('reportDescriptionPage.roomDescription')} @@ -133,7 +133,7 @@ function ReportWelcomeText({report, policy}: ReportWelcomeTextProps) { return; } const activeRoute = Navigation.getActiveRoute(); - Navigation.navigate(ROUTES.REPORT_DESCRIPTION.getRoute(report?.reportID ?? '-1', activeRoute)); + Navigation.navigate(ROUTES.REPORT_DESCRIPTION.getRoute(report?.reportID ?? String(CONST.DEFAULT_NUMBER_ID), activeRoute)); }} style={[styles.renderHTML, canEditReportDescription ? styles.cursorPointer : styles.cursorText]} accessibilityLabel={translate('reportDescriptionPage.roomDescription')} @@ -162,10 +162,10 @@ function ReportWelcomeText({report, policy}: ReportWelcomeTextProps) { onPress={() => { const activeRoute = Navigation.getActiveRoute(); if (canEditReportDescription) { - Navigation.navigate(ROUTES.REPORT_DESCRIPTION.getRoute(report?.reportID ?? '-1', activeRoute)); + Navigation.navigate(ROUTES.REPORT_DESCRIPTION.getRoute(report?.reportID ?? String(CONST.DEFAULT_NUMBER_ID), activeRoute)); return; } - Navigation.navigate(ROUTES.REPORT_WITH_ID_DETAILS.getRoute(report?.reportID ?? '-1', activeRoute)); + Navigation.navigate(ROUTES.REPORT_WITH_ID_DETAILS.getRoute(report?.reportID ?? String(CONST.DEFAULT_NUMBER_ID), activeRoute)); }} style={styles.renderHTML} accessibilityLabel={translate('reportDescriptionPage.roomDescription')} diff --git a/src/libs/actions/Report.ts b/src/libs/actions/Report.ts index f088462dc562..d6caa6c70fc9 100644 --- a/src/libs/actions/Report.ts +++ b/src/libs/actions/Report.ts @@ -73,7 +73,6 @@ import enhanceParameters from '@libs/Network/enhanceParameters'; import type {NetworkStatus} from '@libs/NetworkConnection'; import LocalNotification from '@libs/Notification/LocalNotification'; import Parser from '@libs/Parser'; -import Permissions from '@libs/Permissions'; import * as PersonalDetailsUtils from '@libs/PersonalDetailsUtils'; import * as PhoneNumber from '@libs/PhoneNumber'; import getPolicyEmployeeAccountIDs from '@libs/PolicyEmployeeListUtils'; diff --git a/src/pages/home/report/ReportActionCompose/AttachmentPickerWithMenuItems.tsx b/src/pages/home/report/ReportActionCompose/AttachmentPickerWithMenuItems.tsx index be19706465e3..2354605c72c9 100644 --- a/src/pages/home/report/ReportActionCompose/AttachmentPickerWithMenuItems.tsx +++ b/src/pages/home/report/ReportActionCompose/AttachmentPickerWithMenuItems.tsx @@ -138,12 +138,12 @@ function AttachmentPickerWithMenuItems({ [CONST.IOU.TYPE.SPLIT]: { icon: Expensicons.Transfer, text: translate('iou.splitExpense'), - onSelected: () => selectOption(() => IOU.startMoneyRequest(CONST.IOU.TYPE.SPLIT, report?.reportID ?? '-1'), true), + onSelected: () => selectOption(() => IOU.startMoneyRequest(CONST.IOU.TYPE.SPLIT, report?.reportID ?? String(CONST.DEFAULT_NUMBER_ID)), true), }, [CONST.IOU.TYPE.SUBMIT]: { icon: getIconForAction(CONST.IOU.TYPE.CREATE), text: translate('iou.createExpense'), - onSelected: () => selectOption(() => IOU.startMoneyRequest(CONST.IOU.TYPE.SUBMIT, report?.reportID ?? '-1'), true), + onSelected: () => selectOption(() => IOU.startMoneyRequest(CONST.IOU.TYPE.SUBMIT, report?.reportID ?? String(CONST.DEFAULT_NUMBER_ID)), true), }, [CONST.IOU.TYPE.PAY]: { icon: getIconForAction(CONST.IOU.TYPE.SEND), @@ -153,18 +153,18 @@ function AttachmentPickerWithMenuItems({ setIsNoDelegateAccessMenuVisible(true); return; } - selectOption(() => IOU.startMoneyRequest(CONST.IOU.TYPE.PAY, report?.reportID ?? '-1'), false); + selectOption(() => IOU.startMoneyRequest(CONST.IOU.TYPE.PAY, report?.reportID ?? String(CONST.DEFAULT_NUMBER_ID)), false); }, }, [CONST.IOU.TYPE.TRACK]: { icon: getIconForAction(CONST.IOU.TYPE.CREATE), text: translate('iou.createExpense'), - onSelected: () => selectOption(() => IOU.startMoneyRequest(CONST.IOU.TYPE.TRACK, report?.reportID ?? '-1'), true), + onSelected: () => selectOption(() => IOU.startMoneyRequest(CONST.IOU.TYPE.TRACK, report?.reportID ?? String(CONST.DEFAULT_NUMBER_ID)), true), }, [CONST.IOU.TYPE.INVOICE]: { icon: Expensicons.InvoiceGeneric, text: translate('workspace.invoices.sendInvoice'), - onSelected: () => selectOption(() => IOU.startMoneyRequest(CONST.IOU.TYPE.INVOICE, report?.reportID ?? '-1'), false), + onSelected: () => selectOption(() => IOU.startMoneyRequest(CONST.IOU.TYPE.INVOICE, report?.reportID ?? String(CONST.DEFAULT_NUMBER_ID)), false), }, }; diff --git a/src/pages/iou/request/IOURequestStartPage.tsx b/src/pages/iou/request/IOURequestStartPage.tsx index 0794c1142eff..d6e9c7e5e534 100644 --- a/src/pages/iou/request/IOURequestStartPage.tsx +++ b/src/pages/iou/request/IOURequestStartPage.tsx @@ -45,7 +45,7 @@ function IOURequestStartPage({ const [selectedTab = CONST.TAB_REQUEST.SCAN, selectedTabResult] = useOnyx(`${ONYXKEYS.COLLECTION.SELECTED_TAB}${CONST.TAB.IOU_REQUEST_TYPE}`); const isLoadingSelectedTab = shouldUseTab ? isLoadingOnyxValue(selectedTabResult) : false; // eslint-disable-next-line @typescript-eslint/prefer-nullish-coalescing - const [transaction] = useOnyx(`${ONYXKEYS.COLLECTION.TRANSACTION_DRAFT}${route?.params.transactionID || -1}`); + const [transaction] = useOnyx(`${ONYXKEYS.COLLECTION.TRANSACTION_DRAFT}${route?.params.transactionID ?? CONST.DEFAULT_NUMBER_ID}`); const [allPolicies] = useOnyx(ONYXKEYS.COLLECTION.POLICY); const tabTitles = { From cb5bc0245ca09986ba00aaf440a06e06f50f1d14 Mon Sep 17 00:00:00 2001 From: Julian Kobrynski Date: Wed, 18 Dec 2024 15:24:38 +0100 Subject: [PATCH 3/9] fix remaining ID fallback warnings --- src/components/ReportWelcomeText.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/components/ReportWelcomeText.tsx b/src/components/ReportWelcomeText.tsx index 7ebefe25144f..30bffd7ff441 100644 --- a/src/components/ReportWelcomeText.tsx +++ b/src/components/ReportWelcomeText.tsx @@ -33,7 +33,7 @@ function ReportWelcomeText({report, policy}: ReportWelcomeTextProps) { const [personalDetails] = useOnyx(ONYXKEYS.PERSONAL_DETAILS_LIST); const isPolicyExpenseChat = ReportUtils.isPolicyExpenseChat(report); // eslint-disable-next-line @typescript-eslint/prefer-nullish-coalescing - const [reportNameValuePairs] = useOnyx(`${ONYXKEYS.COLLECTION.REPORT_NAME_VALUE_PAIRS}${report?.reportID || -1}`); + const [reportNameValuePairs] = useOnyx(`${ONYXKEYS.COLLECTION.REPORT_NAME_VALUE_PAIRS}${report?.reportID ?? CONST.DEFAULT_NUMBER_ID}`); const isArchivedRoom = ReportUtils.isArchivedRoom(report, reportNameValuePairs); const isChatRoom = ReportUtils.isChatRoom(report); const isSelfDM = ReportUtils.isSelfDM(report); From 07cbb1edaec9f2fa15cc2b8ed921391c344d70ce Mon Sep 17 00:00:00 2001 From: Julian Kobrynski Date: Tue, 7 Jan 2025 09:48:47 +0100 Subject: [PATCH 4/9] fix typecheck errors --- src/pages/iou/request/step/IOURequestStepDestination.tsx | 6 ++---- src/pages/iou/request/step/IOURequestStepSubrate.tsx | 6 ++---- src/pages/iou/request/step/IOURequestStepTime.tsx | 6 ++---- 3 files changed, 6 insertions(+), 12 deletions(-) diff --git a/src/pages/iou/request/step/IOURequestStepDestination.tsx b/src/pages/iou/request/step/IOURequestStepDestination.tsx index bec4d3862f68..6e7ff0e4cdf0 100644 --- a/src/pages/iou/request/step/IOURequestStepDestination.tsx +++ b/src/pages/iou/request/step/IOURequestStepDestination.tsx @@ -11,7 +11,6 @@ import WorkspaceEmptyStateSection from '@components/WorkspaceEmptyStateSection'; import useCurrentUserPersonalDetails from '@hooks/useCurrentUserPersonalDetails'; import useLocalize from '@hooks/useLocalize'; import useNetwork from '@hooks/useNetwork'; -import usePermissions from '@hooks/usePermissions'; import useTheme from '@hooks/useTheme'; import useThemeStyles from '@hooks/useThemeStyles'; import Navigation from '@libs/Navigation/Navigation'; @@ -55,7 +54,6 @@ function IOURequestStepDestination({ const styles = useThemeStyles(); const theme = useTheme(); const {translate} = useLocalize(); - const {canUseCombinedTrackSubmit} = usePermissions(); // eslint-disable-next-line rulesdir/no-negated-variables const shouldShowNotFoundPage = isEmptyObject(policy); @@ -93,11 +91,11 @@ function IOURequestStepDestination({ const tabTitles = { [CONST.IOU.TYPE.REQUEST]: translate('iou.createExpense'), - [CONST.IOU.TYPE.SUBMIT]: canUseCombinedTrackSubmit ? translate('iou.createExpense') : translate('iou.submitExpense'), + [CONST.IOU.TYPE.SUBMIT]: translate('iou.createExpense'), [CONST.IOU.TYPE.SEND]: translate('iou.paySomeone', {name: ''}), [CONST.IOU.TYPE.PAY]: translate('iou.paySomeone', {name: ''}), [CONST.IOU.TYPE.SPLIT]: translate('iou.createExpense'), - [CONST.IOU.TYPE.TRACK]: canUseCombinedTrackSubmit ? translate('iou.createExpense') : translate('iou.trackExpense'), + [CONST.IOU.TYPE.TRACK]: translate('iou.createExpense'), [CONST.IOU.TYPE.INVOICE]: translate('workspace.invoices.sendInvoice'), [CONST.IOU.TYPE.CREATE]: translate('iou.createExpense'), }; diff --git a/src/pages/iou/request/step/IOURequestStepSubrate.tsx b/src/pages/iou/request/step/IOURequestStepSubrate.tsx index 1bda72212354..75381b87e9dc 100644 --- a/src/pages/iou/request/step/IOURequestStepSubrate.tsx +++ b/src/pages/iou/request/step/IOURequestStepSubrate.tsx @@ -16,7 +16,6 @@ import TextInput from '@components/TextInput'; import ValuePicker from '@components/ValuePicker'; import useAutoFocusInput from '@hooks/useAutoFocusInput'; import useLocalize from '@hooks/useLocalize'; -import usePermissions from '@hooks/usePermissions'; import usePolicy from '@hooks/usePolicy'; import useThemeStyles from '@hooks/useThemeStyles'; import useWindowDimensions from '@hooks/useWindowDimensions'; @@ -68,7 +67,6 @@ function IOURequestStepWaypoint({ report, }: IOURequestStepWaypointProps) { const styles = useThemeStyles(); - const {canUseCombinedTrackSubmit} = usePermissions(); const policy = usePolicy(report?.policyID); const customUnit = PolicyUtils.getPerDiemCustomUnit(policy); const {windowWidth} = useWindowDimensions(); @@ -150,11 +148,11 @@ function IOURequestStepWaypoint({ const tabTitles = { [CONST.IOU.TYPE.REQUEST]: translate('iou.createExpense'), - [CONST.IOU.TYPE.SUBMIT]: canUseCombinedTrackSubmit ? translate('iou.createExpense') : translate('iou.submitExpense'), + [CONST.IOU.TYPE.SUBMIT]: translate('iou.createExpense'), [CONST.IOU.TYPE.SEND]: translate('iou.paySomeone', {name: ''}), [CONST.IOU.TYPE.PAY]: translate('iou.paySomeone', {name: ''}), [CONST.IOU.TYPE.SPLIT]: translate('iou.createExpense'), - [CONST.IOU.TYPE.TRACK]: canUseCombinedTrackSubmit ? translate('iou.createExpense') : translate('iou.trackExpense'), + [CONST.IOU.TYPE.TRACK]: translate('iou.createExpense'), [CONST.IOU.TYPE.INVOICE]: translate('workspace.invoices.sendInvoice'), [CONST.IOU.TYPE.CREATE]: translate('iou.createExpense'), }; diff --git a/src/pages/iou/request/step/IOURequestStepTime.tsx b/src/pages/iou/request/step/IOURequestStepTime.tsx index d5186dd0f36e..d1ab6b894a56 100644 --- a/src/pages/iou/request/step/IOURequestStepTime.tsx +++ b/src/pages/iou/request/step/IOURequestStepTime.tsx @@ -8,7 +8,6 @@ import InputWrapper from '@components/Form/InputWrapper'; import type {FormOnyxValues} from '@components/Form/types'; import TimeModalPicker from '@components/TimeModalPicker'; import useLocalize from '@hooks/useLocalize'; -import usePermissions from '@hooks/usePermissions'; import useThemeStyles from '@hooks/useThemeStyles'; import DateUtils from '@libs/DateUtils'; import * as ErrorUtils from '@libs/ErrorUtils'; @@ -45,7 +44,6 @@ function IOURequestStepTime({ const styles = useThemeStyles(); const [policy] = useOnyx(`${ONYXKEYS.COLLECTION.POLICY}${IOU.getIOURequestPolicyID(transaction, report)}`); const {translate} = useLocalize(); - const {canUseCombinedTrackSubmit} = usePermissions(); const currentDateAttributes = transaction?.comment?.customUnit?.attributes?.dates; const currentStartDate = currentDateAttributes?.start ? DateUtils.extractDate(currentDateAttributes.start) : undefined; const currentEndDate = currentDateAttributes?.end ? DateUtils.extractDate(currentDateAttributes.end) : undefined; @@ -89,11 +87,11 @@ function IOURequestStepTime({ const tabTitles = { [CONST.IOU.TYPE.REQUEST]: translate('iou.createExpense'), - [CONST.IOU.TYPE.SUBMIT]: canUseCombinedTrackSubmit ? translate('iou.createExpense') : translate('iou.submitExpense'), + [CONST.IOU.TYPE.SUBMIT]: translate('iou.createExpense'), [CONST.IOU.TYPE.SEND]: translate('iou.paySomeone', {name: ''}), [CONST.IOU.TYPE.PAY]: translate('iou.paySomeone', {name: ''}), [CONST.IOU.TYPE.SPLIT]: translate('iou.createExpense'), - [CONST.IOU.TYPE.TRACK]: canUseCombinedTrackSubmit ? translate('iou.createExpense') : translate('iou.trackExpense'), + [CONST.IOU.TYPE.TRACK]: translate('iou.createExpense'), [CONST.IOU.TYPE.INVOICE]: translate('workspace.invoices.sendInvoice'), [CONST.IOU.TYPE.CREATE]: translate('iou.createExpense'), }; From e5101df0b5985754f5185d78eb9bf31445d0a6d4 Mon Sep 17 00:00:00 2001 From: Julian Kobrynski Date: Thu, 9 Jan 2025 09:34:27 +0100 Subject: [PATCH 5/9] fix #54844 --- src/components/MoneyRequestConfirmationList.tsx | 6 +++--- src/languages/en.ts | 1 + src/languages/es.ts | 1 + 3 files changed, 5 insertions(+), 3 deletions(-) diff --git a/src/components/MoneyRequestConfirmationList.tsx b/src/components/MoneyRequestConfirmationList.tsx index c470f0c50806..043d02d9a28f 100755 --- a/src/components/MoneyRequestConfirmationList.tsx +++ b/src/components/MoneyRequestConfirmationList.tsx @@ -429,16 +429,16 @@ function MoneyRequestConfirmationList({ text = translate('common.next'); } } else if (isTypeTrackExpense) { - text = translate('iou.trackExpense'); + text = translate('iou.createExpenseWithAmount', {amount: formattedAmount}); } else if (isTypeSplit && iouAmount === 0) { text = translate('iou.splitExpense'); } else if ((receiptPath && isTypeRequest) || isDistanceRequestWithPendingRoute || isPerDiemRequest) { text = translate('iou.submitExpense'); if (iouAmount !== 0) { - text = translate('iou.submitAmount', {amount: formattedAmount}); + text = translate('iou.createExpenseWithAmount', {amount: formattedAmount}); } } else { - const translationKey = isTypeSplit ? 'iou.splitAmount' : 'iou.submitAmount'; + const translationKey = isTypeSplit ? 'iou.splitAmount' : 'iou.createExpenseWithAmount'; text = translate(translationKey, {amount: formattedAmount}); } return [ diff --git a/src/languages/en.ts b/src/languages/en.ts index 1ff4ef4c0ae4..6480b7e779ea 100755 --- a/src/languages/en.ts +++ b/src/languages/en.ts @@ -870,6 +870,7 @@ const translations = { createExpense: 'Create expense', trackExpense: 'Track expense', chooseRecipient: 'Choose recipient', + createExpenseWithAmount: ({amount}: {amount: string}) => `Create ${amount} expense`, confirmDetails: 'Confirm details', pay: 'Pay', cancelPayment: 'Cancel payment', diff --git a/src/languages/es.ts b/src/languages/es.ts index 92e94446aa48..b53787bfea3d 100644 --- a/src/languages/es.ts +++ b/src/languages/es.ts @@ -865,6 +865,7 @@ const translations = { paySomeone: ({name}: PaySomeoneParams = {}) => `Pagar a ${name ?? 'alguien'}`, trackExpense: 'Seguimiento de gastos', chooseRecipient: 'Elige destinatario', + createExpenseWithAmount: ({amount}: {amount: string}) => `Crear un gasto de ${amount}`, confirmDetails: 'Confirma los detalles', pay: 'Pagar', cancelPayment: 'Cancelar el pago', From 8f2d3e9fa0829409355ab3801156f7fd673fc94a Mon Sep 17 00:00:00 2001 From: Julian Kobrynski Date: Thu, 9 Jan 2025 10:17:10 +0100 Subject: [PATCH 6/9] fix #54861 --- src/components/MoneyRequestConfirmationList.tsx | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/src/components/MoneyRequestConfirmationList.tsx b/src/components/MoneyRequestConfirmationList.tsx index 043d02d9a28f..d4a5af3fb5cf 100755 --- a/src/components/MoneyRequestConfirmationList.tsx +++ b/src/components/MoneyRequestConfirmationList.tsx @@ -429,11 +429,14 @@ function MoneyRequestConfirmationList({ text = translate('common.next'); } } else if (isTypeTrackExpense) { - text = translate('iou.createExpenseWithAmount', {amount: formattedAmount}); + text = translate('iou.createExpense'); + if (iouAmount !== 0) { + text = translate('iou.createExpenseWithAmount', {amount: formattedAmount}); + } } else if (isTypeSplit && iouAmount === 0) { text = translate('iou.splitExpense'); } else if ((receiptPath && isTypeRequest) || isDistanceRequestWithPendingRoute || isPerDiemRequest) { - text = translate('iou.submitExpense'); + text = translate('iou.createExpense'); if (iouAmount !== 0) { text = translate('iou.createExpenseWithAmount', {amount: formattedAmount}); } From 35086797604c70ce0e7969131a3baa898d8961d4 Mon Sep 17 00:00:00 2001 From: Julian Kobrynski Date: Fri, 10 Jan 2025 15:13:04 +0100 Subject: [PATCH 7/9] remove track/submit expense translations, replace with create expense --- src/CONST.ts | 4 ++-- src/languages/en.ts | 8 +++----- src/languages/es.ts | 4 +--- src/libs/ReportUtils.ts | 2 +- src/pages/iou/MoneyRequestAmountForm.tsx | 5 +---- src/pages/iou/request/step/IOURequestStepDistance.tsx | 4 +--- 6 files changed, 9 insertions(+), 18 deletions(-) diff --git a/src/CONST.ts b/src/CONST.ts index c6b19393d447..ef71bd04b97f 100755 --- a/src/CONST.ts +++ b/src/CONST.ts @@ -173,9 +173,9 @@ const onboardingPersonalSpendMessage: OnboardingMessage = { 'Here’s how to track an expense:\n' + '\n' + '1. Click the green *+* button.\n' + - '2. Choose *Track expense*.\n' + + '2. Choose *Create expense*.\n' + '3. Enter an amount or scan a receipt.\n' + - '4. Click *Track*.\n' + + '4. Click *Create*.\n' + '\n' + 'And you’re done! Yep, it’s that easy.', }, diff --git a/src/languages/en.ts b/src/languages/en.ts index 6480b7e779ea..dfcdf4572101 100755 --- a/src/languages/en.ts +++ b/src/languages/en.ts @@ -837,15 +837,15 @@ const translations = { quickAction: { scanReceipt: 'Scan receipt', recordDistance: 'Record distance', - requestMoney: 'Submit expense', + requestMoney: 'Create expense', splitBill: 'Split expense', splitScan: 'Split receipt', splitDistance: 'Split distance', paySomeone: ({name}: PaySomeoneParams = {}) => `Pay ${name ?? 'someone'}`, assignTask: 'Assign task', header: 'Quick action', - trackManual: 'Track expense', - trackScan: 'Track receipt', + trackManual: 'Create expense', + trackScan: 'Create expense for receipt', trackDistance: 'Track distance', noLongerHaveReportAccess: 'You no longer have access to your previous quick action destination. Pick a new one below.', updateDestination: 'Update destination', @@ -866,9 +866,7 @@ const translations = { categorize: 'Categorize', share: 'Share', participants: 'Participants', - submitExpense: 'Submit expense', createExpense: 'Create expense', - trackExpense: 'Track expense', chooseRecipient: 'Choose recipient', createExpenseWithAmount: ({amount}: {amount: string}) => `Create ${amount} expense`, confirmDetails: 'Confirm details', diff --git a/src/languages/es.ts b/src/languages/es.ts index b53787bfea3d..d0483e857a33 100644 --- a/src/languages/es.ts +++ b/src/languages/es.ts @@ -832,7 +832,7 @@ const translations = { quickAction: { scanReceipt: 'Escanear recibo', recordDistance: 'Grabar distancia', - requestMoney: 'Presentar gasto', + requestMoney: 'Crear gasto', splitBill: 'Dividir gasto', splitScan: 'Dividir recibo', splitDistance: 'Dividir distancia', @@ -860,10 +860,8 @@ const translations = { categorize: 'Categorizar', share: 'Compartir', participants: 'Participantes', - submitExpense: 'Presentar gasto', createExpense: 'Crear gasto', paySomeone: ({name}: PaySomeoneParams = {}) => `Pagar a ${name ?? 'alguien'}`, - trackExpense: 'Seguimiento de gastos', chooseRecipient: 'Elige destinatario', createExpenseWithAmount: ({amount}: {amount: string}) => `Crear un gasto de ${amount}`, confirmDetails: 'Confirma los detalles', diff --git a/src/libs/ReportUtils.ts b/src/libs/ReportUtils.ts index 919e3daca52e..7a44ab4ec896 100644 --- a/src/libs/ReportUtils.ts +++ b/src/libs/ReportUtils.ts @@ -3554,7 +3554,7 @@ function getTransactionReportName(reportAction: OnyxEntry Date: Fri, 10 Jan 2025 15:56:56 +0100 Subject: [PATCH 8/9] fix id fallbacks --- .../parameters/UpdateMoneyRequestParams.ts | 2 +- src/libs/actions/IOU.ts | 12 ++++---- src/libs/actions/TransactionEdit.ts | 12 ++++++-- .../request/step/IOURequestStepDistance.tsx | 29 ++++++++++++------- 4 files changed, 35 insertions(+), 20 deletions(-) diff --git a/src/libs/API/parameters/UpdateMoneyRequestParams.ts b/src/libs/API/parameters/UpdateMoneyRequestParams.ts index 549d02260beb..0f210d6c661d 100644 --- a/src/libs/API/parameters/UpdateMoneyRequestParams.ts +++ b/src/libs/API/parameters/UpdateMoneyRequestParams.ts @@ -2,7 +2,7 @@ import type {TransactionDetails} from '@libs/ReportUtils'; type UpdateMoneyRequestParams = Partial & { reportID?: string; - transactionID: string; + transactionID?: string; reportActionID?: string; }; diff --git a/src/libs/actions/IOU.ts b/src/libs/actions/IOU.ts index ee49b1c8e803..c6e0b445d479 100644 --- a/src/libs/actions/IOU.ts +++ b/src/libs/actions/IOU.ts @@ -2852,8 +2852,8 @@ function calculateDiffAmount( * @param policyCategories */ function getUpdateMoneyRequestParams( - transactionID: string, - transactionThreadReportID: string, + transactionID: string | undefined, + transactionThreadReportID: string | undefined, transactionChanges: TransactionChanges, policy: OnyxEntry, policyTagList: OnyxTypes.OnyxInputOrEntry, @@ -3197,8 +3197,8 @@ function getUpdateMoneyRequestParams( * @param policy May be undefined, an empty object, or an object matching the Policy type (src/types/onyx/Policy.ts) */ function getUpdateTrackExpenseParams( - transactionID: string, - transactionThreadReportID: string, + transactionID: string | undefined, + transactionThreadReportID: string | undefined, transactionChanges: TransactionChanges, policy: OnyxEntry, ): UpdateMoneyRequestData { @@ -3503,8 +3503,8 @@ function updateMoneyRequestTaxRate({transactionID, optimisticReportActionID, tax } type UpdateMoneyRequestDistanceParams = { - transactionID: string; - transactionThreadReportID: string; + transactionID: string | undefined; + transactionThreadReportID: string | undefined; waypoints: WaypointCollection; routes?: Routes; policy?: OnyxEntry; diff --git a/src/libs/actions/TransactionEdit.ts b/src/libs/actions/TransactionEdit.ts index a76cb8f25b75..f39172e61e5c 100644 --- a/src/libs/actions/TransactionEdit.ts +++ b/src/libs/actions/TransactionEdit.ts @@ -28,11 +28,19 @@ function createBackupTransaction(transaction: OnyxEntry) { /** * Removes a transaction from Onyx that was only used temporary in the edit flow */ -function removeBackupTransaction(transactionID: string) { +function removeBackupTransaction(transactionID: string | undefined) { + if (!transactionID) { + return; + } + Onyx.set(`${ONYXKEYS.COLLECTION.TRANSACTION_BACKUP}${transactionID}`, null); } -function restoreOriginalTransactionFromBackup(transactionID: string, isDraft: boolean) { +function restoreOriginalTransactionFromBackup(transactionID: string | undefined, isDraft: boolean) { + if (!transactionID) { + return; + } + connection = Onyx.connect({ key: `${ONYXKEYS.COLLECTION.TRANSACTION_BACKUP}${transactionID}`, callback: (backupTransaction) => { diff --git a/src/pages/iou/request/step/IOURequestStepDistance.tsx b/src/pages/iou/request/step/IOURequestStepDistance.tsx index 44f7c2c0fe0e..61c5a3841c2f 100644 --- a/src/pages/iou/request/step/IOURequestStepDistance.tsx +++ b/src/pages/iou/request/step/IOURequestStepDistance.tsx @@ -66,7 +66,7 @@ function IOURequestStepDistance({ const {isOffline} = useNetwork(); const {translate} = useLocalize(); const [allReports] = useOnyx(ONYXKEYS.COLLECTION.REPORT); - const [reportNameValuePairs] = useOnyx(`${ONYXKEYS.COLLECTION.REPORT_NAME_VALUE_PAIRS}${report?.reportID ?? -1}`); + const [reportNameValuePairs] = useOnyx(`${ONYXKEYS.COLLECTION.REPORT_NAME_VALUE_PAIRS}${report?.reportID ?? CONST.DEFAULT_NUMBER_ID}`); const [transactionBackup] = useOnyx(`${ONYXKEYS.COLLECTION.TRANSACTION_BACKUP}${transactionID}`); const policy = usePolicy(report?.policyID); const [personalDetails] = useOnyx(ONYXKEYS.PERSONAL_DETAILS_LIST); @@ -122,7 +122,7 @@ function IOURequestStepDistance({ const isCreatingNewRequest = !(backTo || isEditing); const [recentWaypoints, {status: recentWaypointsStatus}] = useOnyx(ONYXKEYS.NVP_RECENT_WAYPOINTS); const iouRequestType = TransactionUtils.getRequestType(transaction); - const customUnitRateID = TransactionUtils.getRateID(transaction) ?? '-1'; + const customUnitRateID = TransactionUtils.getRateID(transaction); // Sets `amount` and `split` share data before moving to the next step to avoid briefly showing `0.00` as the split share for participants const setDistanceRequestData = useCallback( @@ -138,9 +138,16 @@ function IOURequestStepDistance({ const mileageRates = DistanceRequestUtils.getMileageRates(IOUpolicy); const defaultMileageRate = DistanceRequestUtils.getDefaultMileageRate(IOUpolicy); - const mileageRate: MileageRate = TransactionUtils.isCustomUnitRateIDForP2P(transaction) - ? DistanceRequestUtils.getRateForP2P(policyCurrency, transaction) - : mileageRates?.[customUnitRateID] ?? defaultMileageRate; + + let mileageRate: MileageRate | undefined; + + if (TransactionUtils.isCustomUnitRateIDForP2P(transaction)) { + mileageRate = DistanceRequestUtils.getRateForP2P(policyCurrency, transaction); + } else if (customUnitRateID !== undefined && mileageRates?.[customUnitRateID] !== undefined) { + mileageRate = mileageRates[customUnitRateID]; + } else { + mileageRate = defaultMileageRate; + } const {unit, rate} = mileageRate ?? {}; const distance = TransactionUtils.getDistanceInMeters(transaction, unit); @@ -148,7 +155,7 @@ function IOURequestStepDistance({ const amount = DistanceRequestUtils.getDistanceRequestAmount(distance, unit ?? CONST.CUSTOM_UNITS.DISTANCE_UNIT_MILES, rate ?? 0); IOU.setMoneyRequestAmount(transactionID, amount, currency); - const participantAccountIDs: number[] | undefined = participants?.map((participant) => Number(participant.accountID ?? -1)); + const participantAccountIDs: number[] | undefined = participants?.map((participant) => Number(participant.accountID ?? CONST.DEFAULT_NUMBER_ID)); if (isSplitRequest && amount && currency && !isPolicyExpenseChat) { IOU.setSplitShares(transaction, amount, currency ?? '', participantAccountIDs ?? []); } @@ -223,10 +230,10 @@ function IOURequestStepDistance({ // If the user cancels out of the modal without without saving changes, then the original transaction // needs to be restored from the backup so that all changes are removed. if (transactionWasSaved.current) { - TransactionEdit.removeBackupTransaction(transaction?.transactionID ?? '-1'); + TransactionEdit.removeBackupTransaction(transaction?.transactionID); return; } - TransactionEdit.restoreOriginalTransactionFromBackup(transaction?.transactionID ?? '-1', IOUUtils.shouldUseTransactionDraft(action)); + TransactionEdit.restoreOriginalTransactionFromBackup(transaction?.transactionID, IOUUtils.shouldUseTransactionDraft(action)); // If the user opens IOURequestStepDistance in offline mode and then goes online, re-open the report to fill in missing fields from the transaction backup if (!transaction?.reportID) { @@ -298,7 +305,7 @@ function IOURequestStepDistance({ if (report?.reportID && !ReportUtils.isArchivedRoom(report, reportNameValuePairs) && iouType !== CONST.IOU.TYPE.CREATE) { const selectedParticipants = IOU.setMoneyRequestParticipantsFromReport(transactionID, report); const participants = selectedParticipants.map((participant) => { - const participantAccountID = participant?.accountID ?? -1; + const participantAccountID = participant?.accountID ?? CONST.DEFAULT_NUMBER_ID; return participantAccountID ? OptionsListUtils.getParticipantsOption(participant, personalDetails) : OptionsListUtils.getReportOption(participant); }); setDistanceRequestData(participants); @@ -454,8 +461,8 @@ function IOURequestStepDistance({ return; } IOU.updateMoneyRequestDistance({ - transactionID: transaction?.transactionID ?? '-1', - transactionThreadReportID: report?.reportID ?? '-1', + transactionID: transaction?.transactionID, + transactionThreadReportID: report?.reportID, waypoints, ...(hasRouteChanged ? {routes: transaction?.routes} : {}), policy, From e6b5552c79b1b9fb37184219cde90271c37e17d6 Mon Sep 17 00:00:00 2001 From: Julian Kobrynski Date: Thu, 16 Jan 2025 16:47:18 +0100 Subject: [PATCH 9/9] fix lint errors --- .../MoneyRequestConfirmationList.tsx | 143 ++++++++++-------- .../AttachmentPickerWithMenuItems.tsx | 42 ++--- src/pages/iou/MoneyRequestAmountForm.tsx | 18 +-- src/pages/iou/request/IOURequestStartPage.tsx | 24 +-- .../step/IOURequestStepDestination.tsx | 34 +++-- .../request/step/IOURequestStepSubrate.tsx | 22 +-- .../iou/request/step/IOURequestStepTime.tsx | 14 +- 7 files changed, 163 insertions(+), 134 deletions(-) diff --git a/src/components/MoneyRequestConfirmationList.tsx b/src/components/MoneyRequestConfirmationList.tsx index 29d9fe3c6449..01539b0d5776 100755 --- a/src/components/MoneyRequestConfirmationList.tsx +++ b/src/components/MoneyRequestConfirmationList.tsx @@ -11,19 +11,45 @@ import {MouseProvider} from '@hooks/useMouseContext'; import usePrevious from '@hooks/usePrevious'; import useThemeStyles from '@hooks/useThemeStyles'; import blurActiveElement from '@libs/Accessibility/blurActiveElement'; -import * as CurrencyUtils from '@libs/CurrencyUtils'; +// +import {convertToBackendAmount, convertToDisplayString, convertToDisplayStringWithoutCurrency, getCurrencyDecimals} from '@libs/CurrencyUtils'; import DistanceRequestUtils from '@libs/DistanceRequestUtils'; -import * as IOUUtils from '@libs/IOUUtils'; +import {calculateAmount, insertTagIntoTransactionTagsString, isMovingTransactionFromTrackExpense as isMovingTransactionFromTrackExpenseUtil} from '@libs/IOUUtils'; import Log from '@libs/Log'; -import * as MoneyRequestUtils from '@libs/MoneyRequestUtils'; +import {validateAmount} from '@libs/MoneyRequestUtils'; import Navigation from '@libs/Navigation/Navigation'; -import * as OptionsListUtils from '@libs/OptionsListUtils'; -import * as PolicyUtils from '@libs/PolicyUtils'; -import {getDistanceRateCustomUnitRate, isTaxTrackingEnabled} from '@libs/PolicyUtils'; -import * as ReportUtils from '@libs/ReportUtils'; +import {getIOUConfirmationOptionsFromPayeePersonalDetail, hasEnabledOptions} from '@libs/OptionsListUtils'; +import {getDistanceRateCustomUnitRate, getTagLists, isTaxTrackingEnabled} from '@libs/PolicyUtils'; +import {isDraftReport, isOptimisticPersonalDetail} from '@libs/ReportUtils'; +import type {OptionData} from '@libs/ReportUtils'; import playSound, {SOUNDS} from '@libs/Sound'; -import * as TransactionUtils from '@libs/TransactionUtils'; -import * as IOU from '@userActions/IOU'; +import { + areRequiredFieldsEmpty, + calculateTaxAmount, + getDefaultTaxCode, + getDistanceInMeters, + getRateID, + getTag, + getTaxValue, + hasMissingSmartscanFields, + hasRoute as hasRouteUtil, + isMerchantMissing, + isScanRequest as isScanRequestUtil, +} from '@libs/TransactionUtils'; +import { + adjustRemainingSplitShares, + resetSplitShares, + setCustomUnitRateID, + setIndividualShare, + setMoneyRequestAmount, + setMoneyRequestCategory, + setMoneyRequestMerchant, + setMoneyRequestPendingFields, + setMoneyRequestTag, + setMoneyRequestTaxAmount, + setMoneyRequestTaxRate, + setSplitShares, +} from '@userActions/IOU'; import {hasInvoicingDetails} from '@userActions/Policy/Policy'; import type {IOUAction, IOUType} from '@src/CONST'; import CONST from '@src/CONST'; @@ -145,7 +171,7 @@ type MoneyRequestConfirmationListProps = { isConfirmed?: boolean; }; -type MoneyRequestConfirmationListItem = Participant | ReportUtils.OptionData; +type MoneyRequestConfirmationListItem = Participant | OptionData; function MoneyRequestConfirmationList({ transaction, @@ -204,10 +230,10 @@ function MoneyRequestConfirmationList({ const isTypeSend = iouType === CONST.IOU.TYPE.PAY; const isTypeTrackExpense = iouType === CONST.IOU.TYPE.TRACK; const isTypeInvoice = iouType === CONST.IOU.TYPE.INVOICE; - const isScanRequest = useMemo(() => TransactionUtils.isScanRequest(transaction), [transaction]); + const isScanRequest = useMemo(() => isScanRequestUtil(transaction), [transaction]); const transactionID = transaction?.transactionID; - const customUnitRateID = TransactionUtils.getRateID(transaction); + const customUnitRateID = getRateID(transaction); useEffect(() => { if (customUnitRateID !== '-1' || !isDistanceRequest || !transactionID || !policy?.id) { @@ -222,7 +248,7 @@ function MoneyRequestConfirmationList({ return; } - IOU.setCustomUnitRateID(transactionID, rateID); + setCustomUnitRateID(transactionID, rateID); }, [defaultMileageRate, customUnitRateID, lastSelectedDistanceRates, policy?.id, transactionID, isDistanceRequest]); const mileageRate = DistanceRequestUtils.getRate({transaction, policy, policyDraft}); @@ -233,11 +259,11 @@ function MoneyRequestConfirmationList({ const prevCurrency = usePrevious(currency); // A flag for showing the categories field - const shouldShowCategories = (isPolicyExpenseChat || isTypeInvoice) && (!!iouCategory || OptionsListUtils.hasEnabledOptions(Object.values(policyCategories ?? {}))); + const shouldShowCategories = (isPolicyExpenseChat || isTypeInvoice) && (!!iouCategory || hasEnabledOptions(Object.values(policyCategories ?? {}))); const shouldShowMerchant = shouldShowSmartScanFields && !isDistanceRequest && !isTypeSend && !isPerDiemRequest; - const policyTagLists = useMemo(() => PolicyUtils.getTagLists(policyTags), [policyTags]); + const policyTagLists = useMemo(() => getTagLists(policyTags), [policyTags]); const shouldShowTax = isTaxTrackingEnabled(isPolicyExpenseChat, policy, isDistanceRequest) && !isPerDiemRequest; @@ -259,26 +285,26 @@ function MoneyRequestConfirmationList({ ) { return; } - const defaultTaxCode = TransactionUtils.getDefaultTaxCode(policy, transaction); - IOU.setMoneyRequestTaxRate(transactionID, defaultTaxCode ?? ''); + const defaultTaxCode = getDefaultTaxCode(policy, transaction); + setMoneyRequestTaxRate(transactionID, defaultTaxCode ?? ''); }, [customUnitRateID, policy, previousCustomUnitRateID, previousTransactionCurrency, previousTransactionModifiedCurrency, shouldShowTax, transaction, transactionID]); - const isMovingTransactionFromTrackExpense = IOUUtils.isMovingTransactionFromTrackExpense(action); + const isMovingTransactionFromTrackExpense = isMovingTransactionFromTrackExpenseUtil(action); - const distance = TransactionUtils.getDistanceInMeters(transaction, unit); + const distance = getDistanceInMeters(transaction, unit); const prevDistance = usePrevious(distance); const shouldCalculateDistanceAmount = isDistanceRequest && (iouAmount === 0 || prevRate !== rate || prevDistance !== distance || prevCurrency !== currency); - const hasRoute = TransactionUtils.hasRoute(transaction, isDistanceRequest); + const hasRoute = hasRouteUtil(transaction, isDistanceRequest); const isDistanceRequestWithPendingRoute = isDistanceRequest && (!hasRoute || !rate) && !isMovingTransactionFromTrackExpense; const distanceRequestAmount = DistanceRequestUtils.getDistanceRequestAmount(distance, unit ?? CONST.CUSTOM_UNITS.DISTANCE_UNIT_MILES, rate ?? 0); const formattedAmount = isDistanceRequestWithPendingRoute ? '' - : CurrencyUtils.convertToDisplayString(shouldCalculateDistanceAmount ? distanceRequestAmount : iouAmount, isDistanceRequest ? currency : iouCurrencyCode); + : convertToDisplayString(shouldCalculateDistanceAmount ? distanceRequestAmount : iouAmount, isDistanceRequest ? currency : iouCurrencyCode); const formattedAmountPerAttendee = isDistanceRequestWithPendingRoute ? '' - : CurrencyUtils.convertToDisplayString( + : convertToDisplayString( (shouldCalculateDistanceAmount ? distanceRequestAmount : iouAmount) / (iouAttendees?.length && iouAttendees.length > 0 ? iouAttendees.length : 1), isDistanceRequest ? currency : iouCurrencyCode, ); @@ -293,25 +319,20 @@ function MoneyRequestConfirmationList({ return false; } - return (!!hasSmartScanFailed && TransactionUtils.hasMissingSmartscanFields(transaction)) || (didConfirmSplit && TransactionUtils.areRequiredFieldsEmpty(transaction)); + return (!!hasSmartScanFailed && hasMissingSmartscanFields(transaction)) || (didConfirmSplit && areRequiredFieldsEmpty(transaction)); }, [isEditingSplitBill, hasSmartScanFailed, transaction, didConfirmSplit]); - const isMerchantEmpty = useMemo(() => !iouMerchant || TransactionUtils.isMerchantMissing(transaction), [transaction, iouMerchant]); + const isMerchantEmpty = useMemo(() => !iouMerchant || isMerchantMissing(transaction), [transaction, iouMerchant]); const isMerchantRequired = isPolicyExpenseChat && (!isScanRequest || isEditingSplitBill) && shouldShowMerchant; const isCategoryRequired = !!policy?.requiresCategory; const shouldDisableParticipant = (participant: Participant): boolean => { - if (ReportUtils.isDraftReport(participant.reportID)) { + if (isDraftReport(participant.reportID)) { return true; } - if ( - !participant.isInvoiceRoom && - !participant.isPolicyExpenseChat && - !participant.isSelfDM && - ReportUtils.isOptimisticPersonalDetail(participant.accountID ?? CONST.DEFAULT_NUMBER_ID) - ) { + if (!participant.isInvoiceRoom && !participant.isPolicyExpenseChat && !participant.isSelfDM && isOptimisticPersonalDetail(participant.accountID ?? CONST.DEFAULT_NUMBER_ID)) { return true; } @@ -344,7 +365,7 @@ function MoneyRequestConfirmationList({ return; } const amount = DistanceRequestUtils.getDistanceRequestAmount(distance, unit ?? CONST.CUSTOM_UNITS.DISTANCE_UNIT_MILES, rate ?? 0); - IOU.setMoneyRequestAmount(transactionID, amount, currency ?? ''); + setMoneyRequestAmount(transactionID, amount, currency ?? ''); isFirstUpdatedDistanceAmount.current = true; }, [distance, rate, unit, transactionID, currency, isDistanceRequest]); @@ -354,12 +375,12 @@ function MoneyRequestConfirmationList({ } const amount = distanceRequestAmount; - IOU.setMoneyRequestAmount(transactionID, amount, currency ?? ''); + setMoneyRequestAmount(transactionID, amount, currency ?? ''); // If it's a split request among individuals, set the split shares const participantAccountIDs: number[] = selectedParticipantsProp.map((participant) => participant.accountID ?? CONST.DEFAULT_NUMBER_ID); if (isTypeSplit && !isPolicyExpenseChat && amount && transaction?.currency) { - IOU.setSplitShares(transaction, amount, currency, participantAccountIDs); + setSplitShares(transaction, amount, currency, participantAccountIDs); } }, [shouldCalculateDistanceAmount, distanceRequestAmount, transactionID, currency, isTypeSplit, isPolicyExpenseChat, selectedParticipantsProp, transaction]); @@ -389,14 +410,14 @@ function MoneyRequestConfirmationList({ } } else { taxableAmount = transaction.amount ?? 0; - taxCode = transaction.taxCode ?? TransactionUtils.getDefaultTaxCode(policy, transaction) ?? ''; + taxCode = transaction.taxCode ?? getDefaultTaxCode(policy, transaction) ?? ''; } if (taxCode && taxableAmount) { - const taxPercentage = TransactionUtils.getTaxValue(policy, transaction, taxCode) ?? ''; - const taxAmount = TransactionUtils.calculateTaxAmount(taxPercentage, taxableAmount, transaction.currency); - const taxAmountInSmallestCurrencyUnits = CurrencyUtils.convertToBackendAmount(Number.parseFloat(taxAmount.toString())); - IOU.setMoneyRequestTaxAmount(transaction.transactionID, taxAmountInSmallestCurrencyUnits); + const taxPercentage = getTaxValue(policy, transaction, taxCode) ?? ''; + const taxAmount = calculateTaxAmount(taxPercentage, taxableAmount, transaction.currency); + const taxAmountInSmallestCurrencyUnits = convertToBackendAmount(Number.parseFloat(taxAmount.toString())); + setMoneyRequestTaxAmount(transaction.transactionID, taxAmountInSmallestCurrencyUnits); } }, [ policy, @@ -470,8 +491,8 @@ function MoneyRequestConfirmationList({ if (!transaction?.transactionID) { return; } - const amountInCents = CurrencyUtils.convertToBackendAmount(value); - IOU.setIndividualShare(transaction?.transactionID, accountID, amountInCents); + const amountInCents = convertToBackendAmount(value); + setIndividualShare(transaction?.transactionID, accountID, amountInCents); }, [transaction], ); @@ -512,7 +533,7 @@ function MoneyRequestConfirmationList({ if (!isTypeSplit || !transaction?.splitShares) { return; } - IOU.adjustRemainingSplitShares(transaction); + adjustRemainingSplitShares(transaction); }, [isTypeSplit, transaction]); const selectedParticipants = useMemo(() => selectedParticipantsProp.filter((participant) => participant.selected), [selectedParticipantsProp]); @@ -524,7 +545,7 @@ function MoneyRequestConfirmationList({ return []; } - const payeeOption = OptionsListUtils.getIOUConfirmationOptionsFromPayeePersonalDetail(payeePersonalDetails); + const payeeOption = getIOUConfirmationOptionsFromPayeePersonalDetail(payeePersonalDetails); if (shouldShowReadOnlySplits) { return [payeeOption, ...selectedParticipants].map((participantOption: Participant) => { const isPayer = participantOption.accountID === payeeOption.accountID; @@ -532,7 +553,7 @@ function MoneyRequestConfirmationList({ if (iouAmount > 0) { amount = transaction?.comment?.splits?.find((split) => split.accountID === participantOption.accountID)?.amount ?? - IOUUtils.calculateAmount(selectedParticipants.length, iouAmount, iouCurrencyCode ?? '', isPayer); + calculateAmount(selectedParticipants.length, iouAmount, iouCurrencyCode ?? '', isPayer); } return { ...participantOption, @@ -540,7 +561,7 @@ function MoneyRequestConfirmationList({ isInteractive: !shouldDisableParticipant(participantOption), rightElement: ( - {amount ? CurrencyUtils.convertToDisplayString(amount, iouCurrencyCode) : ''} + {amount ? convertToDisplayString(amount, iouCurrencyCode) : ''} ), }; @@ -548,7 +569,7 @@ function MoneyRequestConfirmationList({ } const currencySymbol = currencyList?.[iouCurrencyCode ?? '']?.symbol ?? iouCurrencyCode; - const formattedTotalAmount = CurrencyUtils.convertToDisplayStringWithoutCurrency(iouAmount, iouCurrencyCode); + const formattedTotalAmount = convertToDisplayStringWithoutCurrency(iouAmount, iouCurrencyCode); return [payeeOption, ...selectedParticipants].map((participantOption: Participant) => ({ ...participantOption, @@ -570,7 +591,7 @@ function MoneyRequestConfirmationList({ inputStyle={[styles.optionRowAmountInput]} containerStyle={[styles.textInputContainer]} touchableInputWrapperStyle={[styles.ml3]} - onFormatAmount={CurrencyUtils.convertToDisplayStringWithoutCurrency} + onFormatAmount={convertToDisplayStringWithoutCurrency} onAmountChange={(value: string) => onSplitShareChange(participantOption.accountID ?? CONST.DEFAULT_NUMBER_ID, Number(value))} maxLength={formattedTotalAmount.length} contentWidth={formattedTotalAmount.length * 8} @@ -611,7 +632,7 @@ function MoneyRequestConfirmationList({ {!shouldShowReadOnlySplits && !!isSplitModified && ( { - IOU.resetSplitShares(transaction); + resetSplitShares(transaction); }} accessibilityLabel={CONST.ROLE.BUTTON} role={CONST.ROLE.BUTTON} @@ -645,7 +666,7 @@ function MoneyRequestConfirmationList({ ...[ { title: translate('moneyRequestConfirmationList.paidBy'), - data: [OptionsListUtils.getIOUConfirmationOptionsFromPayeePersonalDetail(payeePersonalDetails)], + data: [getIOUConfirmationOptionsFromPayeePersonalDetail(payeePersonalDetails)], shouldShow: true, }, { @@ -682,10 +703,10 @@ function MoneyRequestConfirmationList({ When the user completes the initial steps of the IOU flow offline and then goes online on the confirmation page. In this scenario, the route will be fetched from the server, and the waypoints will no longer be pending. */ - IOU.setMoneyRequestPendingFields(transactionID, {waypoints: isDistanceRequestWithPendingRoute ? CONST.RED_BRICK_ROAD_PENDING_ACTION.ADD : null}); + setMoneyRequestPendingFields(transactionID, {waypoints: isDistanceRequestWithPendingRoute ? CONST.RED_BRICK_ROAD_PENDING_ACTION.ADD : null}); const distanceMerchant = DistanceRequestUtils.getDistanceMerchant(hasRoute, distance, unit, rate ?? 0, currency ?? CONST.CURRENCY.USD, translate, toLocaleDigit); - IOU.setMoneyRequestMerchant(transactionID, distanceMerchant, true); + setMoneyRequestMerchant(transactionID, distanceMerchant, true); }, [ isDistanceRequestWithPendingRoute, hasRoute, @@ -708,7 +729,7 @@ function MoneyRequestConfirmationList({ if (!transactionID || iouCategory || !shouldShowCategories || enabledCategories.length !== 1 || !isCategoryRequired) { return; } - IOU.setMoneyRequestCategory(transactionID, enabledCategories.at(0)?.name ?? '', policy?.id); + setMoneyRequestCategory(transactionID, enabledCategories.at(0)?.name ?? '', policy?.id); // Keep 'transaction' out to ensure that we autoselect the option only once // eslint-disable-next-line react-compiler/react-compiler, react-hooks/exhaustive-deps }, [shouldShowCategories, policyCategories, isCategoryRequired, policy?.id]); @@ -719,20 +740,20 @@ function MoneyRequestConfirmationList({ return; } - let updatedTagsString = TransactionUtils.getTag(transaction); + let updatedTagsString = getTag(transaction); policyTagLists.forEach((tagList, index) => { const isTagListRequired = tagList.required ?? false; if (!isTagListRequired) { return; } const enabledTags = Object.values(tagList.tags).filter((tag) => tag.enabled); - if (enabledTags.length !== 1 || TransactionUtils.getTag(transaction, index)) { + if (enabledTags.length !== 1 || getTag(transaction, index)) { return; } - updatedTagsString = IOUUtils.insertTagIntoTransactionTagsString(updatedTagsString, enabledTags.at(0)?.name ?? '', index); + updatedTagsString = insertTagIntoTransactionTagsString(updatedTagsString, enabledTags.at(0)?.name ?? '', index); }); - if (updatedTagsString !== TransactionUtils.getTag(transaction) && updatedTagsString) { - IOU.setMoneyRequestTag(transactionID, updatedTagsString); + if (updatedTagsString !== getTag(transaction) && updatedTagsString) { + setMoneyRequestTag(transactionID, updatedTagsString); } // Keep 'transaction' out to ensure that we autoselect the option only once // eslint-disable-next-line react-compiler/react-compiler, react-hooks/exhaustive-deps @@ -773,7 +794,7 @@ function MoneyRequestConfirmationList({ setFormError('iou.error.noParticipantSelected'); return; } - if (!isEditingSplitBill && isMerchantRequired && (isMerchantEmpty || (shouldDisplayFieldError && TransactionUtils.isMerchantMissing(transaction)))) { + if (!isEditingSplitBill && isMerchantRequired && (isMerchantEmpty || (shouldDisplayFieldError && isMerchantMissing(transaction)))) { setFormError('iou.error.invalidMerchant'); return; } @@ -789,13 +810,13 @@ function MoneyRequestConfirmationList({ if (iouType !== CONST.IOU.TYPE.PAY) { // validate the amount for distance expenses - const decimals = CurrencyUtils.getCurrencyDecimals(iouCurrencyCode); - if (isDistanceRequest && !isDistanceRequestWithPendingRoute && !MoneyRequestUtils.validateAmount(String(iouAmount), decimals)) { + const decimals = getCurrencyDecimals(iouCurrencyCode); + if (isDistanceRequest && !isDistanceRequestWithPendingRoute && !validateAmount(String(iouAmount), decimals)) { setFormError('common.error.invalidAmount'); return; } - if (isEditingSplitBill && TransactionUtils.areRequiredFieldsEmpty(transaction)) { + if (isEditingSplitBill && areRequiredFieldsEmpty(transaction)) { setDidConfirmSplit(true); setFormError('iou.error.genericSmartscanFailureMessage'); return; diff --git a/src/pages/home/report/ReportActionCompose/AttachmentPickerWithMenuItems.tsx b/src/pages/home/report/ReportActionCompose/AttachmentPickerWithMenuItems.tsx index 2354605c72c9..363977b381c8 100644 --- a/src/pages/home/report/ReportActionCompose/AttachmentPickerWithMenuItems.tsx +++ b/src/pages/home/report/ReportActionCompose/AttachmentPickerWithMenuItems.tsx @@ -17,15 +17,15 @@ import useResponsiveLayout from '@hooks/useResponsiveLayout'; import useTheme from '@hooks/useTheme'; import useThemeStyles from '@hooks/useThemeStyles'; import useWindowDimensions from '@hooks/useWindowDimensions'; -import * as Browser from '@libs/Browser'; +import {isSafari} from '@libs/Browser'; import getIconForAction from '@libs/getIconForAction'; import Navigation from '@libs/Navigation/Navigation'; -import * as ReportUtils from '@libs/ReportUtils'; -import * as SubscriptionUtils from '@libs/SubscriptionUtils'; -import * as IOU from '@userActions/IOU'; -import * as Modal from '@userActions/Modal'; -import * as Report from '@userActions/Report'; -import * as Task from '@userActions/Task'; +import {canCreateTaskInReport, getPayeeName, temporary_getMoneyRequestOptions} from '@libs/ReportUtils'; +import {shouldRestrictUserBillableActions} from '@libs/SubscriptionUtils'; +import {startMoneyRequest} from '@userActions/IOU'; +import {close} from '@userActions/Modal'; +import {setIsComposerFullSize} from '@userActions/Report'; +import {clearOutTaskInfoAndNavigate} from '@userActions/Task'; import DelegateNoAccessModal from '@src/components/DelegateNoAccessModal'; import type {IOUType} from '@src/CONST'; import CONST from '@src/CONST'; @@ -126,7 +126,7 @@ function AttachmentPickerWithMenuItems({ */ const moneyRequestOptions = useMemo(() => { const selectOption = (onSelected: () => void, shouldRestrictAction: boolean) => { - if (shouldRestrictAction && policy && SubscriptionUtils.shouldRestrictUserBillableActions(policy.id)) { + if (shouldRestrictAction && policy && shouldRestrictUserBillableActions(policy.id)) { Navigation.navigate(ROUTES.RESTRICTED_ACTION.getRoute(policy.id)); return; } @@ -138,37 +138,37 @@ function AttachmentPickerWithMenuItems({ [CONST.IOU.TYPE.SPLIT]: { icon: Expensicons.Transfer, text: translate('iou.splitExpense'), - onSelected: () => selectOption(() => IOU.startMoneyRequest(CONST.IOU.TYPE.SPLIT, report?.reportID ?? String(CONST.DEFAULT_NUMBER_ID)), true), + onSelected: () => selectOption(() => startMoneyRequest(CONST.IOU.TYPE.SPLIT, report?.reportID ?? String(CONST.DEFAULT_NUMBER_ID)), true), }, [CONST.IOU.TYPE.SUBMIT]: { icon: getIconForAction(CONST.IOU.TYPE.CREATE), text: translate('iou.createExpense'), - onSelected: () => selectOption(() => IOU.startMoneyRequest(CONST.IOU.TYPE.SUBMIT, report?.reportID ?? String(CONST.DEFAULT_NUMBER_ID)), true), + onSelected: () => selectOption(() => startMoneyRequest(CONST.IOU.TYPE.SUBMIT, report?.reportID ?? String(CONST.DEFAULT_NUMBER_ID)), true), }, [CONST.IOU.TYPE.PAY]: { icon: getIconForAction(CONST.IOU.TYPE.SEND), - text: translate('iou.paySomeone', {name: ReportUtils.getPayeeName(report)}), + text: translate('iou.paySomeone', {name: getPayeeName(report)}), onSelected: () => { if (isDelegateAccessRestricted) { setIsNoDelegateAccessMenuVisible(true); return; } - selectOption(() => IOU.startMoneyRequest(CONST.IOU.TYPE.PAY, report?.reportID ?? String(CONST.DEFAULT_NUMBER_ID)), false); + selectOption(() => startMoneyRequest(CONST.IOU.TYPE.PAY, report?.reportID ?? String(CONST.DEFAULT_NUMBER_ID)), false); }, }, [CONST.IOU.TYPE.TRACK]: { icon: getIconForAction(CONST.IOU.TYPE.CREATE), text: translate('iou.createExpense'), - onSelected: () => selectOption(() => IOU.startMoneyRequest(CONST.IOU.TYPE.TRACK, report?.reportID ?? String(CONST.DEFAULT_NUMBER_ID)), true), + onSelected: () => selectOption(() => startMoneyRequest(CONST.IOU.TYPE.TRACK, report?.reportID ?? String(CONST.DEFAULT_NUMBER_ID)), true), }, [CONST.IOU.TYPE.INVOICE]: { icon: Expensicons.InvoiceGeneric, text: translate('workspace.invoices.sendInvoice'), - onSelected: () => selectOption(() => IOU.startMoneyRequest(CONST.IOU.TYPE.INVOICE, report?.reportID ?? String(CONST.DEFAULT_NUMBER_ID)), false), + onSelected: () => selectOption(() => startMoneyRequest(CONST.IOU.TYPE.INVOICE, report?.reportID ?? String(CONST.DEFAULT_NUMBER_ID)), false), }, }; - const moneyRequestOptionsList = ReportUtils.temporary_getMoneyRequestOptions(report, policy, reportParticipantIDs ?? []).map((option) => ({ + const moneyRequestOptionsList = temporary_getMoneyRequestOptions(report, policy, reportParticipantIDs ?? []).map((option) => ({ ...options[option], })); @@ -179,7 +179,7 @@ function AttachmentPickerWithMenuItems({ * Determines if we can show the task option */ const taskOption: PopoverMenuItem[] = useMemo(() => { - if (!ReportUtils.canCreateTaskInReport(report)) { + if (!canCreateTaskInReport(report)) { return []; } @@ -187,7 +187,7 @@ function AttachmentPickerWithMenuItems({ { icon: Expensicons.Task, text: translate('newTaskPage.assignTask'), - onSelected: () => Task.clearOutTaskInfoAndNavigate(reportID, report), + onSelected: () => clearOutTaskInfoAndNavigate(reportID, report), }, ]; }, [report, reportID, translate]); @@ -295,7 +295,7 @@ function AttachmentPickerWithMenuItems({ onPress={(e) => { e?.preventDefault(); raiseIsScrollLikelyLayoutTriggered(); - Report.setIsComposerFullSize(reportID, false); + setIsComposerFullSize(reportID, false); }} // Keep focus on the composer when Collapse button is clicked. onMouseDown={(e) => e.preventDefault()} @@ -316,7 +316,7 @@ function AttachmentPickerWithMenuItems({ onPress={(e) => { e?.preventDefault(); raiseIsScrollLikelyLayoutTriggered(); - Report.setIsComposerFullSize(reportID, true); + setIsComposerFullSize(reportID, true); }} // Keep focus on the composer when Expand button is clicked. onMouseDown={(e) => e.preventDefault()} @@ -347,11 +347,11 @@ function AttachmentPickerWithMenuItems({ // function must be called from within a event handler that was initiated // by the user on Safari. if (index === menuItems.length - 1) { - if (Browser.isSafari()) { + if (isSafari()) { triggerAttachmentPicker(); return; } - Modal.close(() => { + close(() => { triggerAttachmentPicker(); }); } diff --git a/src/pages/iou/MoneyRequestAmountForm.tsx b/src/pages/iou/MoneyRequestAmountForm.tsx index 1d6714e876aa..a948e43d8656 100644 --- a/src/pages/iou/MoneyRequestAmountForm.tsx +++ b/src/pages/iou/MoneyRequestAmountForm.tsx @@ -15,9 +15,9 @@ import useLocalize from '@hooks/useLocalize'; import usePrevious from '@hooks/usePrevious'; import useResponsiveLayout from '@hooks/useResponsiveLayout'; import useThemeStyles from '@hooks/useThemeStyles'; -import * as CurrencyUtils from '@libs/CurrencyUtils'; -import * as DeviceCapabilities from '@libs/DeviceCapabilities'; -import * as MoneyRequestUtils from '@libs/MoneyRequestUtils'; +import {convertToDisplayString, convertToFrontendAmountAsInteger, convertToFrontendAmountAsString} from '@libs/CurrencyUtils'; +import {canUseTouchScreen as canUseTouchScreenUtil} from '@libs/DeviceCapabilities'; +import {addLeadingZero} from '@libs/MoneyRequestUtils'; import Navigation from '@libs/Navigation/Navigation'; import variables from '@styles/variables'; import type {BaseTextInputRef} from '@src/components/TextInput/BaseTextInput/types'; @@ -72,7 +72,7 @@ type MoneyRequestAmountFormProps = { const isAmountInvalid = (amount: string) => !amount.length || parseFloat(amount) < 0.01; const isTaxAmountInvalid = (currentAmount: string, taxAmount: number, isTaxAmountForm: boolean, currency: string) => - isTaxAmountForm && Number.parseFloat(currentAmount) > CurrencyUtils.convertToFrontendAmountAsInteger(Math.abs(taxAmount), currency); + isTaxAmountForm && Number.parseFloat(currentAmount) > convertToFrontendAmountAsInteger(Math.abs(taxAmount), currency); const AMOUNT_VIEW_ID = 'amountView'; const NUM_PAD_CONTAINER_VIEW_ID = 'numPadContainerView'; @@ -109,7 +109,7 @@ function MoneyRequestAmountForm( const isFocused = useIsFocused(); const wasFocused = usePrevious(isFocused); - const formattedTaxAmount = CurrencyUtils.convertToDisplayString(Math.abs(taxAmount), currency); + const formattedTaxAmount = convertToDisplayString(Math.abs(taxAmount), currency); /** * Event occurs when a user presses a mouse button over an DOM element. @@ -151,7 +151,7 @@ function MoneyRequestAmountForm( const initializeAmount = useCallback( (newAmount: number) => { - const frontendAmount = newAmount ? CurrencyUtils.convertToFrontendAmountAsString(newAmount, currency) : ''; + const frontendAmount = newAmount ? convertToFrontendAmountAsString(newAmount, currency) : ''; moneyRequestAmountInput.current?.changeAmount(frontendAmount); moneyRequestAmountInput.current?.changeSelection({ start: frontendAmount.length, @@ -186,11 +186,11 @@ function MoneyRequestAmountForm( if (currentAmount.length > 0) { const selectionStart = selection.start === selection.end ? selection.start - 1 : selection.start; const newAmount = `${currentAmount.substring(0, selectionStart)}${currentAmount.substring(selection.end)}`; - moneyRequestAmountInput.current?.setNewAmount(MoneyRequestUtils.addLeadingZero(newAmount)); + moneyRequestAmountInput.current?.setNewAmount(addLeadingZero(newAmount)); } return; } - const newAmount = MoneyRequestUtils.addLeadingZero(`${currentAmount.substring(0, selection.start)}${key}${currentAmount.substring(selection.end)}`); + const newAmount = addLeadingZero(`${currentAmount.substring(0, selection.start)}${key}${currentAmount.substring(selection.end)}`); moneyRequestAmountInput.current?.setNewAmount(newAmount); }, [shouldUpdateSelection], @@ -242,7 +242,7 @@ function MoneyRequestAmountForm( return isEditing ? translate('common.save') : translate('common.next'); }, [skipConfirmation, iouType, isEditing, translate]); - const canUseTouchScreen = DeviceCapabilities.canUseTouchScreen(); + const canUseTouchScreen = canUseTouchScreenUtil(); useEffect(() => { setFormError(''); diff --git a/src/pages/iou/request/IOURequestStartPage.tsx b/src/pages/iou/request/IOURequestStartPage.tsx index 7bebde4b6c3e..e5572bd34294 100644 --- a/src/pages/iou/request/IOURequestStartPage.tsx +++ b/src/pages/iou/request/IOURequestStartPage.tsx @@ -11,14 +11,14 @@ import useLocalize from '@hooks/useLocalize'; import usePermissions from '@hooks/usePermissions'; import usePolicy from '@hooks/usePolicy'; import useThemeStyles from '@hooks/useThemeStyles'; -import * as DeviceCapabilities from '@libs/DeviceCapabilities'; +import {canUseTouchScreen} from '@libs/DeviceCapabilities'; import Navigation from '@libs/Navigation/Navigation'; import OnyxTabNavigator, {TabScreenWithFocusTrapWrapper, TopTab} from '@libs/Navigation/OnyxTabNavigator'; -import * as PolicyUtils from '@libs/PolicyUtils'; -import * as ReportUtils from '@libs/ReportUtils'; +import {getActivePolicies, getPerDiemCustomUnit} from '@libs/PolicyUtils'; +import {getPayeeName} from '@libs/ReportUtils'; import AccessOrNotFoundWrapper from '@pages/workspace/AccessOrNotFoundWrapper'; import type {IOURequestType} from '@userActions/IOU'; -import * as IOU from '@userActions/IOU'; +import {initMoneyRequest} from '@userActions/IOU'; import CONST from '@src/CONST'; import ONYXKEYS from '@src/ONYXKEYS'; import type SCREENS from '@src/SCREENS'; @@ -57,8 +57,8 @@ function IOURequestStartPage({ const tabTitles = { [CONST.IOU.TYPE.REQUEST]: translate('iou.createExpense'), [CONST.IOU.TYPE.SUBMIT]: translate('iou.createExpense'), - [CONST.IOU.TYPE.SEND]: translate('iou.paySomeone', {name: ReportUtils.getPayeeName(report)}), - [CONST.IOU.TYPE.PAY]: translate('iou.paySomeone', {name: ReportUtils.getPayeeName(report)}), + [CONST.IOU.TYPE.SEND]: translate('iou.paySomeone', {name: getPayeeName(report)}), + [CONST.IOU.TYPE.PAY]: translate('iou.paySomeone', {name: getPayeeName(report)}), [CONST.IOU.TYPE.SPLIT]: translate('iou.createExpense'), [CONST.IOU.TYPE.TRACK]: translate('iou.createExpense'), [CONST.IOU.TYPE.INVOICE]: translate('workspace.invoices.sendInvoice'), @@ -75,7 +75,7 @@ function IOURequestStartPage({ if (transaction?.reportID === reportID || isLoadingSelectedTab) { return; } - IOU.initMoneyRequest(reportID, policy, isFromGlobalCreate, transaction?.iouRequestType, transactionRequestType); + initMoneyRequest(reportID, policy, isFromGlobalCreate, transaction?.iouRequestType, transactionRequestType); }, [transaction, policy, reportID, iouType, isFromGlobalCreate, transactionRequestType, isLoadingSelectedTab]); const navigateBack = () => { @@ -87,7 +87,7 @@ function IOURequestStartPage({ if (transaction?.iouRequestType === newIOUType) { return; } - IOU.initMoneyRequest(reportID, policy, isFromGlobalCreate, transaction?.iouRequestType, newIOUType); + initMoneyRequest(reportID, policy, isFromGlobalCreate, transaction?.iouRequestType, newIOUType); }, [policy, reportID, isFromGlobalCreate, transaction], ); @@ -100,15 +100,15 @@ function IOURequestStartPage({ return [headerWithBackBtnContainerElement, tabBarContainerElement, activeTabContainerElement].filter((element) => !!element) as HTMLElement[]; }, [headerWithBackBtnContainerElement, tabBarContainerElement, activeTabContainerElement]); - const perDiemCustomUnits = PolicyUtils.getActivePolicies(allPolicies, session?.email) - .map((mappedPolicy) => ({policyID: mappedPolicy.id, customUnit: PolicyUtils.getPerDiemCustomUnit(mappedPolicy)})) + const perDiemCustomUnits = getActivePolicies(allPolicies, session?.email) + .map((mappedPolicy) => ({policyID: mappedPolicy.id, customUnit: getPerDiemCustomUnit(mappedPolicy)})) .filter(({customUnit}) => !isEmptyObject(customUnit) && !!customUnit.enabled); const doesPerDiemPolicyExist = perDiemCustomUnits.length > 0; const moreThanOnePerDiemExist = perDiemCustomUnits.length > 1; - const currentPolicyPerDiemUnit = PolicyUtils.getPerDiemCustomUnit(policy); + const currentPolicyPerDiemUnit = getPerDiemCustomUnit(policy); const doesCurrentPolicyPerDiemExist = !isEmptyObject(currentPolicyPerDiemUnit) && !!currentPolicyPerDiemUnit.enabled; @@ -134,7 +134,7 @@ function IOURequestStartPage({ > - {PolicyUtils.isPolicyAdmin(policy) && !!policy?.areCategoriesEnabled && ( + {isPolicyAdmin(policy) && !!policy?.areCategoriesEnabled && (