From 47fb90bd6956064d3668b8132f3ac7ed098af4c8 Mon Sep 17 00:00:00 2001 From: abzokhattab Date: Mon, 17 Feb 2025 12:16:42 +0100 Subject: [PATCH 1/6] Reverting https://github.com/Expensify/App/pull/38613 --- .../workspace/WorkspaceMoreFeaturesPage.tsx | 13 +++++-------- .../workspace/WorkspacePageWithSections.tsx | 12 +++++------- .../categories/WorkspaceCategoriesPage.tsx | 11 ++++------- .../distanceRates/PolicyDistanceRatesPage.tsx | 12 +++++------- .../workspace/tags/WorkspaceTagsPage.tsx | 7 ++++--- .../workspace/taxes/WorkspaceTaxesPage.tsx | 11 ++++------- .../workflows/WorkspaceWorkflowsPage.tsx | 19 ++++++++----------- 7 files changed, 35 insertions(+), 50 deletions(-) diff --git a/src/pages/workspace/WorkspaceMoreFeaturesPage.tsx b/src/pages/workspace/WorkspaceMoreFeaturesPage.tsx index 6075d58353f93..e2ca775876ceb 100644 --- a/src/pages/workspace/WorkspaceMoreFeaturesPage.tsx +++ b/src/pages/workspace/WorkspaceMoreFeaturesPage.tsx @@ -1,5 +1,4 @@ -import {useFocusEffect} from '@react-navigation/native'; -import React, {useCallback, useState} from 'react'; +import {useCallback, useEffect, useState} from 'react'; import {View} from 'react-native'; import {useOnyx} from 'react-native-onyx'; import ConfirmModal from '@components/ConfirmModal'; @@ -438,13 +437,11 @@ function WorkspaceMoreFeaturesPage({policy, route}: WorkspaceMoreFeaturesPagePro openPolicyMoreFeaturesPage(route.params.policyID); }, [route.params.policyID]); - useNetwork({onReconnect: fetchFeatures}); + useEffect(() => { + fetchFeatures(); + }, [fetchFeatures]); - useFocusEffect( - useCallback(() => { - fetchFeatures(); - }, [fetchFeatures]), - ); + useNetwork({onReconnect: fetchFeatures}); return ( { - fetchData(policyID, shouldSkipVBBACall); - }, [policyID, shouldSkipVBBACall]), - ); + useEffect(() => { + fetchData(policyID, shouldSkipVBBACall); + }, [policyID, shouldSkipVBBACall]); const shouldShowPolicy = useMemo(() => shouldShowPolicyUtil(policy, isOffline, currentUserLogin), [policy, isOffline, currentUserLogin]); const isPendingDelete = isPendingDeletePolicy(policy); diff --git a/src/pages/workspace/categories/WorkspaceCategoriesPage.tsx b/src/pages/workspace/categories/WorkspaceCategoriesPage.tsx index 603a6902869ee..468bc0a41d640 100644 --- a/src/pages/workspace/categories/WorkspaceCategoriesPage.tsx +++ b/src/pages/workspace/categories/WorkspaceCategoriesPage.tsx @@ -1,6 +1,5 @@ -import {useFocusEffect} from '@react-navigation/native'; import lodashSortBy from 'lodash/sortBy'; -import React, {useCallback, useEffect, useMemo, useState} from 'react'; +import {useCallback, useEffect, useMemo, useState} from 'react'; import {ActivityIndicator, View} from 'react-native'; import {useOnyx} from 'react-native-onyx'; import Button from '@components/Button'; @@ -92,11 +91,9 @@ function WorkspaceCategoriesPage({route}: WorkspaceCategoriesPageProps) { const {isOffline} = useNetwork({onReconnect: fetchCategories}); - useFocusEffect( - useCallback(() => { - fetchCategories(); - }, [fetchCategories]), - ); + useEffect(() => { + fetchCategories(); + }, [fetchCategories]); const cleanupSelectedOption = useCallback(() => setSelectedCategories({}), []); useCleanupSelectedOptions(cleanupSelectedOption); diff --git a/src/pages/workspace/distanceRates/PolicyDistanceRatesPage.tsx b/src/pages/workspace/distanceRates/PolicyDistanceRatesPage.tsx index 91860e3823570..90e20dbb7b03a 100644 --- a/src/pages/workspace/distanceRates/PolicyDistanceRatesPage.tsx +++ b/src/pages/workspace/distanceRates/PolicyDistanceRatesPage.tsx @@ -1,5 +1,5 @@ -import {useFocusEffect, useIsFocused} from '@react-navigation/native'; -import React, {useCallback, useEffect, useMemo, useState} from 'react'; +import {useIsFocused} from '@react-navigation/native'; +import {useCallback, useEffect, useMemo, useState} from 'react'; import {ActivityIndicator, View} from 'react-native'; import Button from '@components/Button'; import type {DropdownOption, WorkspaceDistanceRatesBulkActionType} from '@components/ButtonWithDropdownMenu/types'; @@ -96,11 +96,9 @@ function PolicyDistanceRatesPage({ const {isOffline} = useNetwork({onReconnect: fetchDistanceRates}); - useFocusEffect( - useCallback(() => { - fetchDistanceRates(); - }, [fetchDistanceRates]), - ); + useEffect(() => { + fetchDistanceRates(); + }, [fetchDistanceRates]); useEffect(() => { if (isFocused) { diff --git a/src/pages/workspace/tags/WorkspaceTagsPage.tsx b/src/pages/workspace/tags/WorkspaceTagsPage.tsx index 7e61667d6b45b..cd34408194562 100644 --- a/src/pages/workspace/tags/WorkspaceTagsPage.tsx +++ b/src/pages/workspace/tags/WorkspaceTagsPage.tsx @@ -1,6 +1,5 @@ -import {useFocusEffect} from '@react-navigation/native'; import lodashSortBy from 'lodash/sortBy'; -import React, {useCallback, useMemo, useState} from 'react'; +import {useCallback, useEffect, useMemo, useState} from 'react'; import {ActivityIndicator, View} from 'react-native'; import {useOnyx} from 'react-native-onyx'; import Button from '@components/Button'; @@ -93,7 +92,9 @@ function WorkspaceTagsPage({route}: WorkspaceTagsPageProps) { const {isOffline} = useNetwork({onReconnect: fetchTags}); - useFocusEffect(fetchTags); + useEffect(() => { + fetchTags(); + }, [fetchTags]); const cleanupSelectedOption = useCallback(() => setSelectedTags({}), []); useCleanupSelectedOptions(cleanupSelectedOption); diff --git a/src/pages/workspace/taxes/WorkspaceTaxesPage.tsx b/src/pages/workspace/taxes/WorkspaceTaxesPage.tsx index e597e89a956b3..4a1203eb7cb05 100644 --- a/src/pages/workspace/taxes/WorkspaceTaxesPage.tsx +++ b/src/pages/workspace/taxes/WorkspaceTaxesPage.tsx @@ -1,5 +1,4 @@ -import {useFocusEffect} from '@react-navigation/native'; -import React, {useCallback, useMemo, useState} from 'react'; +import {useCallback, useEffect, useMemo, useState} from 'react'; import {ActivityIndicator, View} from 'react-native'; import {useOnyx} from 'react-native-onyx'; import Button from '@components/Button'; @@ -82,11 +81,9 @@ function WorkspaceTaxesPage({ const {isOffline} = useNetwork({onReconnect: fetchTaxes}); - useFocusEffect( - useCallback(() => { - fetchTaxes(); - }, [fetchTaxes]), - ); + useEffect(() => { + fetchTaxes(); + }, [fetchTaxes]); const cleanupSelectedOption = useCallback(() => setSelectedTaxesIDs([]), []); useCleanupSelectedOptions(cleanupSelectedOption); diff --git a/src/pages/workspace/workflows/WorkspaceWorkflowsPage.tsx b/src/pages/workspace/workflows/WorkspaceWorkflowsPage.tsx index ffd7a59b27e24..9c4a10803c702 100644 --- a/src/pages/workspace/workflows/WorkspaceWorkflowsPage.tsx +++ b/src/pages/workspace/workflows/WorkspaceWorkflowsPage.tsx @@ -1,5 +1,4 @@ -import {useFocusEffect} from '@react-navigation/native'; -import React, {useCallback, useMemo, useState} from 'react'; +import {useCallback, useEffect, useMemo, useState} from 'react'; import {ActivityIndicator, InteractionManager, View} from 'react-native'; import {useOnyx} from 'react-native-onyx'; import ApprovalWorkflowSection from '@components/ApprovalWorkflowSection'; @@ -38,10 +37,10 @@ import CONST from '@src/CONST'; import ONYXKEYS from '@src/ONYXKEYS'; import ROUTES from '@src/ROUTES'; import type SCREENS from '@src/SCREENS'; -import ToggleSettingOptionRow from './ToggleSettingsOptionRow'; import type {ToggleSettingOptionRowProps} from './ToggleSettingsOptionRow'; -import {getAutoReportingFrequencyDisplayNames} from './WorkspaceAutoReportingFrequencyPage'; +import ToggleSettingOptionRow from './ToggleSettingsOptionRow'; import type {AutoReportingFrequencyKey} from './WorkspaceAutoReportingFrequencyPage'; +import {getAutoReportingFrequencyDisplayNames} from './WorkspaceAutoReportingFrequencyPage'; type WorkspaceWorkflowsPageProps = WithPolicyProps & PlatformStackScreenProps; @@ -94,13 +93,11 @@ function WorkspaceWorkflowsPage({policy, route}: WorkspaceWorkflowsPageProps) { const {isOffline} = useNetwork({onReconnect: fetchData}); const isPolicyAdmin = PolicyUtils.isPolicyAdmin(policy); - useFocusEffect( - useCallback(() => { - InteractionManager.runAfterInteractions(() => { - fetchData(); - }); - }, [fetchData]), - ); + useEffect(() => { + InteractionManager.runAfterInteractions(() => { + fetchData(); + }); + }, [fetchData]); // User should be allowed to add new Approval Workflow only if he's upgraded to Control Plan, otherwise redirected to the Upgrade Page const addApprovalAction = useCallback(() => { From 6be15eb3fda8df417a632ddcf116a49795549e7e Mon Sep 17 00:00:00 2001 From: abzokhattab Date: Mon, 17 Feb 2025 23:37:29 +0100 Subject: [PATCH 2/6] Importing react --- src/pages/workspace/WorkspaceMoreFeaturesPage.tsx | 1 + src/pages/workspace/WorkspacePageWithSections.tsx | 1 + src/pages/workspace/categories/WorkspaceCategoriesPage.tsx | 1 + src/pages/workspace/distanceRates/PolicyDistanceRatesPage.tsx | 1 + src/pages/workspace/tags/WorkspaceTagsPage.tsx | 1 + src/pages/workspace/taxes/WorkspaceTaxesPage.tsx | 1 + src/pages/workspace/workflows/WorkspaceWorkflowsPage.tsx | 1 + 7 files changed, 7 insertions(+) diff --git a/src/pages/workspace/WorkspaceMoreFeaturesPage.tsx b/src/pages/workspace/WorkspaceMoreFeaturesPage.tsx index e2ca775876ceb..d43c53204cb74 100644 --- a/src/pages/workspace/WorkspaceMoreFeaturesPage.tsx +++ b/src/pages/workspace/WorkspaceMoreFeaturesPage.tsx @@ -1,3 +1,4 @@ +import React from 'react'; import {useCallback, useEffect, useState} from 'react'; import {View} from 'react-native'; import {useOnyx} from 'react-native-onyx'; diff --git a/src/pages/workspace/WorkspacePageWithSections.tsx b/src/pages/workspace/WorkspacePageWithSections.tsx index bf7ae89c28995..d099304462b46 100644 --- a/src/pages/workspace/WorkspacePageWithSections.tsx +++ b/src/pages/workspace/WorkspacePageWithSections.tsx @@ -1,4 +1,5 @@ import {useIsFocused} from '@react-navigation/native'; +import React from 'react'; import type {ReactNode} from 'react'; import {useEffect, useMemo, useRef} from 'react'; import {View} from 'react-native'; diff --git a/src/pages/workspace/categories/WorkspaceCategoriesPage.tsx b/src/pages/workspace/categories/WorkspaceCategoriesPage.tsx index 468bc0a41d640..ee01c6cd70a15 100644 --- a/src/pages/workspace/categories/WorkspaceCategoriesPage.tsx +++ b/src/pages/workspace/categories/WorkspaceCategoriesPage.tsx @@ -1,4 +1,5 @@ import lodashSortBy from 'lodash/sortBy'; +import React from 'react'; import {useCallback, useEffect, useMemo, useState} from 'react'; import {ActivityIndicator, View} from 'react-native'; import {useOnyx} from 'react-native-onyx'; diff --git a/src/pages/workspace/distanceRates/PolicyDistanceRatesPage.tsx b/src/pages/workspace/distanceRates/PolicyDistanceRatesPage.tsx index 90e20dbb7b03a..a81a59e939747 100644 --- a/src/pages/workspace/distanceRates/PolicyDistanceRatesPage.tsx +++ b/src/pages/workspace/distanceRates/PolicyDistanceRatesPage.tsx @@ -1,4 +1,5 @@ import {useIsFocused} from '@react-navigation/native'; +import React from 'react'; import {useCallback, useEffect, useMemo, useState} from 'react'; import {ActivityIndicator, View} from 'react-native'; import Button from '@components/Button'; diff --git a/src/pages/workspace/tags/WorkspaceTagsPage.tsx b/src/pages/workspace/tags/WorkspaceTagsPage.tsx index cd34408194562..776b005822fdd 100644 --- a/src/pages/workspace/tags/WorkspaceTagsPage.tsx +++ b/src/pages/workspace/tags/WorkspaceTagsPage.tsx @@ -1,4 +1,5 @@ import lodashSortBy from 'lodash/sortBy'; +import React from 'react'; import {useCallback, useEffect, useMemo, useState} from 'react'; import {ActivityIndicator, View} from 'react-native'; import {useOnyx} from 'react-native-onyx'; diff --git a/src/pages/workspace/taxes/WorkspaceTaxesPage.tsx b/src/pages/workspace/taxes/WorkspaceTaxesPage.tsx index 4a1203eb7cb05..43e2d0766cd9e 100644 --- a/src/pages/workspace/taxes/WorkspaceTaxesPage.tsx +++ b/src/pages/workspace/taxes/WorkspaceTaxesPage.tsx @@ -1,3 +1,4 @@ +import React from 'react'; import {useCallback, useEffect, useMemo, useState} from 'react'; import {ActivityIndicator, View} from 'react-native'; import {useOnyx} from 'react-native-onyx'; diff --git a/src/pages/workspace/workflows/WorkspaceWorkflowsPage.tsx b/src/pages/workspace/workflows/WorkspaceWorkflowsPage.tsx index 9c4a10803c702..d204f41c9af18 100644 --- a/src/pages/workspace/workflows/WorkspaceWorkflowsPage.tsx +++ b/src/pages/workspace/workflows/WorkspaceWorkflowsPage.tsx @@ -1,3 +1,4 @@ +import React from 'react'; import {useCallback, useEffect, useMemo, useState} from 'react'; import {ActivityIndicator, InteractionManager, View} from 'react-native'; import {useOnyx} from 'react-native-onyx'; From 3cc64f90bfe24f03b22d88b44afffa1a0ad0f0e3 Mon Sep 17 00:00:00 2001 From: abzokhattab Date: Mon, 17 Feb 2025 23:56:05 +0100 Subject: [PATCH 3/6] Fixing eslint --- .../workspace/WorkspaceMoreFeaturesPage.tsx | 3 +- .../workspace/WorkspacePageWithSections.tsx | 3 +- .../categories/WorkspaceCategoriesPage.tsx | 3 +- .../distanceRates/PolicyDistanceRatesPage.tsx | 3 +- .../workspace/tags/WorkspaceTagsPage.tsx | 3 +- .../workspace/taxes/WorkspaceTaxesPage.tsx | 3 +- .../workflows/WorkspaceWorkflowsPage.tsx | 66 ++++++++++--------- 7 files changed, 41 insertions(+), 43 deletions(-) diff --git a/src/pages/workspace/WorkspaceMoreFeaturesPage.tsx b/src/pages/workspace/WorkspaceMoreFeaturesPage.tsx index d43c53204cb74..3603f6aa952cf 100644 --- a/src/pages/workspace/WorkspaceMoreFeaturesPage.tsx +++ b/src/pages/workspace/WorkspaceMoreFeaturesPage.tsx @@ -1,5 +1,4 @@ -import React from 'react'; -import {useCallback, useEffect, useState} from 'react'; +import React, {useCallback, useEffect, useState} from 'react'; import {View} from 'react-native'; import {useOnyx} from 'react-native-onyx'; import ConfirmModal from '@components/ConfirmModal'; diff --git a/src/pages/workspace/WorkspacePageWithSections.tsx b/src/pages/workspace/WorkspacePageWithSections.tsx index d099304462b46..f3782d0a92962 100644 --- a/src/pages/workspace/WorkspacePageWithSections.tsx +++ b/src/pages/workspace/WorkspacePageWithSections.tsx @@ -1,7 +1,6 @@ import {useIsFocused} from '@react-navigation/native'; -import React from 'react'; import type {ReactNode} from 'react'; -import {useEffect, useMemo, useRef} from 'react'; +import React, {useEffect, useMemo, useRef} from 'react'; import {View} from 'react-native'; import type {OnyxEntry} from 'react-native-onyx'; import {useOnyx} from 'react-native-onyx'; diff --git a/src/pages/workspace/categories/WorkspaceCategoriesPage.tsx b/src/pages/workspace/categories/WorkspaceCategoriesPage.tsx index ee01c6cd70a15..18107b3e492d9 100644 --- a/src/pages/workspace/categories/WorkspaceCategoriesPage.tsx +++ b/src/pages/workspace/categories/WorkspaceCategoriesPage.tsx @@ -1,6 +1,5 @@ import lodashSortBy from 'lodash/sortBy'; -import React from 'react'; -import {useCallback, useEffect, useMemo, useState} from 'react'; +import React, {useCallback, useEffect, useMemo, useState} from 'react'; import {ActivityIndicator, View} from 'react-native'; import {useOnyx} from 'react-native-onyx'; import Button from '@components/Button'; diff --git a/src/pages/workspace/distanceRates/PolicyDistanceRatesPage.tsx b/src/pages/workspace/distanceRates/PolicyDistanceRatesPage.tsx index a81a59e939747..f2c1532d39381 100644 --- a/src/pages/workspace/distanceRates/PolicyDistanceRatesPage.tsx +++ b/src/pages/workspace/distanceRates/PolicyDistanceRatesPage.tsx @@ -1,6 +1,5 @@ import {useIsFocused} from '@react-navigation/native'; -import React from 'react'; -import {useCallback, useEffect, useMemo, useState} from 'react'; +import React, {useCallback, useEffect, useMemo, useState} from 'react'; import {ActivityIndicator, View} from 'react-native'; import Button from '@components/Button'; import type {DropdownOption, WorkspaceDistanceRatesBulkActionType} from '@components/ButtonWithDropdownMenu/types'; diff --git a/src/pages/workspace/tags/WorkspaceTagsPage.tsx b/src/pages/workspace/tags/WorkspaceTagsPage.tsx index 776b005822fdd..c0677a5aedded 100644 --- a/src/pages/workspace/tags/WorkspaceTagsPage.tsx +++ b/src/pages/workspace/tags/WorkspaceTagsPage.tsx @@ -1,6 +1,5 @@ import lodashSortBy from 'lodash/sortBy'; -import React from 'react'; -import {useCallback, useEffect, useMemo, useState} from 'react'; +import React, {useCallback, useEffect, useMemo, useState} from 'react'; import {ActivityIndicator, View} from 'react-native'; import {useOnyx} from 'react-native-onyx'; import Button from '@components/Button'; diff --git a/src/pages/workspace/taxes/WorkspaceTaxesPage.tsx b/src/pages/workspace/taxes/WorkspaceTaxesPage.tsx index 43e2d0766cd9e..7dc333ce44160 100644 --- a/src/pages/workspace/taxes/WorkspaceTaxesPage.tsx +++ b/src/pages/workspace/taxes/WorkspaceTaxesPage.tsx @@ -1,5 +1,4 @@ -import React from 'react'; -import {useCallback, useEffect, useMemo, useState} from 'react'; +import React, {useCallback, useEffect, useMemo, useState} from 'react'; import {ActivityIndicator, View} from 'react-native'; import {useOnyx} from 'react-native-onyx'; import Button from '@components/Button'; diff --git a/src/pages/workspace/workflows/WorkspaceWorkflowsPage.tsx b/src/pages/workspace/workflows/WorkspaceWorkflowsPage.tsx index d204f41c9af18..ba3e95f6b2455 100644 --- a/src/pages/workspace/workflows/WorkspaceWorkflowsPage.tsx +++ b/src/pages/workspace/workflows/WorkspaceWorkflowsPage.tsx @@ -1,5 +1,4 @@ -import React from 'react'; -import {useCallback, useEffect, useMemo, useState} from 'react'; +import React, {useCallback, useEffect, useMemo, useState} from 'react'; import {ActivityIndicator, InteractionManager, View} from 'react-native'; import {useOnyx} from 'react-native-onyx'; import ApprovalWorkflowSection from '@components/ApprovalWorkflowSection'; @@ -19,21 +18,29 @@ import useNetwork from '@hooks/useNetwork'; import useResponsiveLayout from '@hooks/useResponsiveLayout'; import useTheme from '@hooks/useTheme'; import useThemeStyles from '@hooks/useThemeStyles'; -import * as ErrorUtils from '@libs/ErrorUtils'; +import {setApprovalWorkflow} from '@libs/actions/Workflow'; +import {getLatestErrorField} from '@libs/ErrorUtils'; import Navigation from '@libs/Navigation/Navigation'; import type {PlatformStackScreenProps} from '@libs/Navigation/PlatformStackNavigation/types'; import {getPaymentMethodDescription} from '@libs/PaymentUtils'; -import * as PersonalDetailsUtils from '@libs/PersonalDetailsUtils'; -import * as PolicyUtils from '@libs/PolicyUtils'; +import {getPersonalDetailByEmail} from '@libs/PersonalDetailsUtils'; +import {getCorrectedAutoReportingFrequency, isControlPolicy, isPaidGroupPolicy as isPaidGroupPolicyPolicyUtils, isPolicyAdmin as isPolicyAdminPolicyUtils} from '@libs/PolicyUtils'; import {convertPolicyEmployeesToApprovalWorkflows, INITIAL_APPROVAL_WORKFLOW} from '@libs/WorkflowUtils'; import type {WorkspaceSplitNavigatorParamList} from '@navigation/types'; import AccessOrNotFoundWrapper from '@pages/workspace/AccessOrNotFoundWrapper'; import type {WithPolicyProps} from '@pages/workspace/withPolicy'; import withPolicy from '@pages/workspace/withPolicy'; import WorkspacePageWithSections from '@pages/workspace/WorkspacePageWithSections'; -import * as Policy from '@userActions/Policy/Policy'; +import { + clearPolicyErrorField, + isCurrencySupportedForDirectReimbursement, + openPolicyWorkflowsPage, + setWorkspaceApprovalMode, + setWorkspaceAutoReportingFrequency, + setWorkspaceReimbursement, + updateGeneralSettings, +} from '@userActions/Policy/Policy'; import {navigateToBankAccountRoute} from '@userActions/ReimbursementAccount'; -import * as Workflow from '@userActions/Workflow'; import CONST from '@src/CONST'; import ONYXKEYS from '@src/ONYXKEYS'; import ROUTES from '@src/ROUTES'; @@ -72,27 +79,27 @@ function WorkspaceWorkflowsPage({policy, route}: WorkspaceWorkflowsPageProps) { const isAdvanceApproval = approvalWorkflows.length > 1 || (approvalWorkflows?.at(0)?.approvers ?? []).length > 1; const updateApprovalMode = isAdvanceApproval ? CONST.POLICY.APPROVAL_MODE.ADVANCED : CONST.POLICY.APPROVAL_MODE.BASIC; const displayNameForAuthorizedPayer = useMemo( - () => PersonalDetailsUtils.getPersonalDetailByEmail(policy?.achAccount?.reimburser ?? '')?.displayName ?? policy?.achAccount?.reimburser, + () => getPersonalDetailByEmail(policy?.achAccount?.reimburser ?? '')?.displayName ?? policy?.achAccount?.reimburser, [policy?.achAccount?.reimburser], ); const onPressAutoReportingFrequency = useCallback(() => Navigation.navigate(ROUTES.WORKSPACE_WORKFLOWS_AUTOREPORTING_FREQUENCY.getRoute(route.params.policyID)), [route.params.policyID]); const fetchData = useCallback(() => { - Policy.openPolicyWorkflowsPage(route.params.policyID); + openPolicyWorkflowsPage(route.params.policyID); }, [route.params.policyID]); const confirmCurrencyChangeAndHideModal = useCallback(() => { if (!policy) { return; } - Policy.updateGeneralSettings(policy.id, policy.name, CONST.CURRENCY.USD); + updateGeneralSettings(policy.id, policy.name, CONST.CURRENCY.USD); setIsCurrencyModalOpen(false); navigateToBankAccountRoute(route.params.policyID, ROUTES.WORKSPACE_WORKFLOWS.getRoute(route.params.policyID)); }, [policy, route.params.policyID]); const {isOffline} = useNetwork({onReconnect: fetchData}); - const isPolicyAdmin = PolicyUtils.isPolicyAdmin(policy); + const isPolicyAdmin = isPolicyAdminPolicyUtils(policy); useEffect(() => { InteractionManager.runAfterInteractions(() => { @@ -102,14 +109,14 @@ function WorkspaceWorkflowsPage({policy, route}: WorkspaceWorkflowsPageProps) { // User should be allowed to add new Approval Workflow only if he's upgraded to Control Plan, otherwise redirected to the Upgrade Page const addApprovalAction = useCallback(() => { - if (!PolicyUtils.isControlPolicy(policy)) { + if (!isControlPolicy(policy)) { Navigation.navigate( ROUTES.WORKSPACE_UPGRADE.getRoute(route.params.policyID, CONST.UPGRADE_FEATURE_INTRO_MAPPING.approvals.alias, ROUTES.WORKSPACE_WORKFLOWS.getRoute(route.params.policyID)), ); return; } - Workflow.setApprovalWorkflow({ + setApprovalWorkflow({ ...INITIAL_APPROVAL_WORKFLOW, availableMembers, usedApproverEmails, @@ -132,16 +139,13 @@ function WorkspaceWorkflowsPage({policy, route}: WorkspaceWorkflowsPageProps) { subtitle: translate('workflowsPage.delaySubmissionDescription'), switchAccessibilityLabel: translate('workflowsPage.delaySubmissionDescription'), onToggle: (isEnabled: boolean) => { - Policy.setWorkspaceAutoReportingFrequency( - route.params.policyID, - isEnabled ? CONST.POLICY.AUTO_REPORTING_FREQUENCIES.WEEKLY : CONST.POLICY.AUTO_REPORTING_FREQUENCIES.INSTANT, - ); + setWorkspaceAutoReportingFrequency(route.params.policyID, isEnabled ? CONST.POLICY.AUTO_REPORTING_FREQUENCIES.WEEKLY : CONST.POLICY.AUTO_REPORTING_FREQUENCIES.INSTANT); }, subMenuItems: ( Policy.clearPolicyErrorField(route.params.policyID, CONST.POLICY.COLLECTION_KEYS.AUTOREPORTING), + errors: getLatestErrorField(policy ?? {}, CONST.POLICY.COLLECTION_KEYS.AUTOREPORTING), + onCloseError: () => clearPolicyErrorField(route.params.policyID, CONST.POLICY.COLLECTION_KEYS.AUTOREPORTING), }, { title: translate('workflowsPage.addApprovalsTitle'), subtitle: translate('workflowsPage.addApprovalsDescription'), switchAccessibilityLabel: translate('workflowsPage.addApprovalsDescription'), onToggle: (isEnabled: boolean) => { - Policy.setWorkspaceApprovalMode(route.params.policyID, policy?.owner ?? '', isEnabled ? updateApprovalMode : CONST.POLICY.APPROVAL_MODE.OPTIONAL); + setWorkspaceApprovalMode(route.params.policyID, policy?.owner ?? '', isEnabled ? updateApprovalMode : CONST.POLICY.APPROVAL_MODE.OPTIONAL); }, subMenuItems: ( <> @@ -194,8 +198,8 @@ function WorkspaceWorkflowsPage({policy, route}: WorkspaceWorkflowsPageProps) { isActive: ([CONST.POLICY.APPROVAL_MODE.BASIC, CONST.POLICY.APPROVAL_MODE.ADVANCED].some((approvalMode) => approvalMode === policy?.approvalMode) && !hasApprovalError) ?? false, pendingAction: policy?.pendingFields?.approvalMode, - errors: ErrorUtils.getLatestErrorField(policy ?? {}, CONST.POLICY.COLLECTION_KEYS.APPROVAL_MODE), - onCloseError: () => Policy.clearPolicyErrorField(route.params.policyID, CONST.POLICY.COLLECTION_KEYS.APPROVAL_MODE), + errors: getLatestErrorField(policy ?? {}, CONST.POLICY.COLLECTION_KEYS.APPROVAL_MODE), + onCloseError: () => clearPolicyErrorField(route.params.policyID, CONST.POLICY.COLLECTION_KEYS.APPROVAL_MODE), }, { title: translate('workflowsPage.makeOrTrackPaymentsTitle'), @@ -205,14 +209,14 @@ function WorkspaceWorkflowsPage({policy, route}: WorkspaceWorkflowsPageProps) { let newReimbursementChoice; if (!isEnabled) { newReimbursementChoice = CONST.POLICY.REIMBURSEMENT_CHOICES.REIMBURSEMENT_NO; - } else if (!!policy?.achAccount && !Policy.isCurrencySupportedForDirectReimbursement(policy?.outputCurrency ?? '')) { + } else if (!!policy?.achAccount && !isCurrencySupportedForDirectReimbursement(policy?.outputCurrency ?? '')) { newReimbursementChoice = CONST.POLICY.REIMBURSEMENT_CHOICES.REIMBURSEMENT_MANUAL; } else { newReimbursementChoice = CONST.POLICY.REIMBURSEMENT_CHOICES.REIMBURSEMENT_YES; } const newReimburserEmail = policy?.achAccount?.reimburser ?? policy?.owner; - Policy.setWorkspaceReimbursement(route.params.policyID, newReimbursementChoice, newReimburserEmail ?? ''); + setWorkspaceReimbursement(route.params.policyID, newReimbursementChoice, newReimburserEmail ?? ''); }, subMenuItems: !isOffline && policy?.isLoadingWorkspaceReimbursement === true ? ( @@ -233,7 +237,7 @@ function WorkspaceWorkflowsPage({policy, route}: WorkspaceWorkflowsPageProps) { titleStyle={shouldShowBankAccount ? undefined : styles.textLabelSupportingEmptyValue} description={getPaymentMethodDescription(CONST.PAYMENT_METHODS.BUSINESS_BANK_ACCOUNT, policy?.achAccount ?? {})} onPress={() => { - if (!Policy.isCurrencySupportedForDirectReimbursement(policy?.outputCurrency ?? '')) { + if (!isCurrencySupportedForDirectReimbursement(policy?.outputCurrency ?? '')) { // TODO remove isDevelopment and isDebugModeEnabled flags once nonUSD flow is complete and update isCurrencySupportedForDirectReimbursement, this will be updated in - https://github.com/Expensify/App/issues/50912 if (isDevelopment || isDebugModeEnabled) { navigateToBankAccountRoute(route.params.policyID, ROUTES.WORKSPACE_WORKFLOWS.getRoute(route.params.policyID)); @@ -260,8 +264,8 @@ function WorkspaceWorkflowsPage({policy, route}: WorkspaceWorkflowsPageProps) { Policy.clearPolicyErrorField(policy?.id, CONST.POLICY.COLLECTION_KEYS.REIMBURSER)} + errors={getLatestErrorField(policy ?? {}, CONST.POLICY.COLLECTION_KEYS.REIMBURSER)} + onClose={() => clearPolicyErrorField(policy?.id, CONST.POLICY.COLLECTION_KEYS.REIMBURSER)} errorRowStyles={[styles.ml7]} > Policy.clearPolicyErrorField(route.params.policyID, CONST.POLICY.COLLECTION_KEYS.REIMBURSEMENT_CHOICE), + errors: getLatestErrorField(policy ?? {}, CONST.POLICY.COLLECTION_KEYS.REIMBURSEMENT_CHOICE), + onCloseError: () => clearPolicyErrorField(route.params.policyID, CONST.POLICY.COLLECTION_KEYS.REIMBURSEMENT_CHOICE), }, ]; }, [ @@ -325,7 +329,7 @@ function WorkspaceWorkflowsPage({policy, route}: WorkspaceWorkflowsPageProps) { ); - const isPaidGroupPolicy = PolicyUtils.isPaidGroupPolicy(policy); + const isPaidGroupPolicy = isPaidGroupPolicyPolicyUtils(policy); const isLoading = !!(policy?.isLoading && policy?.reimbursementChoice === undefined); return ( From 3ed87c68fe79c45a6a45897baa361a3bd34a7247 Mon Sep 17 00:00:00 2001 From: abzokhattab Date: Wed, 19 Feb 2025 14:15:31 +0100 Subject: [PATCH 4/6] removing the fetch request function from the useEffect dependencies --- src/pages/workspace/WorkspaceMoreFeaturesPage.tsx | 4 +++- src/pages/workspace/categories/WorkspaceCategoriesPage.tsx | 4 +++- src/pages/workspace/distanceRates/PolicyDistanceRatesPage.tsx | 4 +++- src/pages/workspace/tags/WorkspaceTagsPage.tsx | 4 +++- src/pages/workspace/taxes/WorkspaceTaxesPage.tsx | 4 +++- src/pages/workspace/workflows/WorkspaceWorkflowsPage.tsx | 4 +++- 6 files changed, 18 insertions(+), 6 deletions(-) diff --git a/src/pages/workspace/WorkspaceMoreFeaturesPage.tsx b/src/pages/workspace/WorkspaceMoreFeaturesPage.tsx index 3603f6aa952cf..72b165821c61c 100644 --- a/src/pages/workspace/WorkspaceMoreFeaturesPage.tsx +++ b/src/pages/workspace/WorkspaceMoreFeaturesPage.tsx @@ -439,7 +439,9 @@ function WorkspaceMoreFeaturesPage({policy, route}: WorkspaceMoreFeaturesPagePro useEffect(() => { fetchFeatures(); - }, [fetchFeatures]); + // eslint-disable-next-line react-compiler/react-compiler + // eslint-disable-next-line react-hooks/exhaustive-deps + }, []); useNetwork({onReconnect: fetchFeatures}); diff --git a/src/pages/workspace/categories/WorkspaceCategoriesPage.tsx b/src/pages/workspace/categories/WorkspaceCategoriesPage.tsx index 18107b3e492d9..4b645b27a43e9 100644 --- a/src/pages/workspace/categories/WorkspaceCategoriesPage.tsx +++ b/src/pages/workspace/categories/WorkspaceCategoriesPage.tsx @@ -93,7 +93,9 @@ function WorkspaceCategoriesPage({route}: WorkspaceCategoriesPageProps) { useEffect(() => { fetchCategories(); - }, [fetchCategories]); + // eslint-disable-next-line react-compiler/react-compiler + // eslint-disable-next-line react-hooks/exhaustive-deps + }, []); const cleanupSelectedOption = useCallback(() => setSelectedCategories({}), []); useCleanupSelectedOptions(cleanupSelectedOption); diff --git a/src/pages/workspace/distanceRates/PolicyDistanceRatesPage.tsx b/src/pages/workspace/distanceRates/PolicyDistanceRatesPage.tsx index f2c1532d39381..0d511e2252511 100644 --- a/src/pages/workspace/distanceRates/PolicyDistanceRatesPage.tsx +++ b/src/pages/workspace/distanceRates/PolicyDistanceRatesPage.tsx @@ -98,7 +98,9 @@ function PolicyDistanceRatesPage({ useEffect(() => { fetchDistanceRates(); - }, [fetchDistanceRates]); + // eslint-disable-next-line react-compiler/react-compiler + // eslint-disable-next-line react-hooks/exhaustive-deps + }, []); useEffect(() => { if (isFocused) { diff --git a/src/pages/workspace/tags/WorkspaceTagsPage.tsx b/src/pages/workspace/tags/WorkspaceTagsPage.tsx index c0677a5aedded..93e64e6dd02f7 100644 --- a/src/pages/workspace/tags/WorkspaceTagsPage.tsx +++ b/src/pages/workspace/tags/WorkspaceTagsPage.tsx @@ -94,7 +94,9 @@ function WorkspaceTagsPage({route}: WorkspaceTagsPageProps) { useEffect(() => { fetchTags(); - }, [fetchTags]); + // eslint-disable-next-line react-compiler/react-compiler + // eslint-disable-next-line react-hooks/exhaustive-deps + }, []); const cleanupSelectedOption = useCallback(() => setSelectedTags({}), []); useCleanupSelectedOptions(cleanupSelectedOption); diff --git a/src/pages/workspace/taxes/WorkspaceTaxesPage.tsx b/src/pages/workspace/taxes/WorkspaceTaxesPage.tsx index 7dc333ce44160..812ce83475ecd 100644 --- a/src/pages/workspace/taxes/WorkspaceTaxesPage.tsx +++ b/src/pages/workspace/taxes/WorkspaceTaxesPage.tsx @@ -83,7 +83,9 @@ function WorkspaceTaxesPage({ useEffect(() => { fetchTaxes(); - }, [fetchTaxes]); + // eslint-disable-next-line react-compiler/react-compiler + // eslint-disable-next-line react-hooks/exhaustive-deps + }, []); const cleanupSelectedOption = useCallback(() => setSelectedTaxesIDs([]), []); useCleanupSelectedOptions(cleanupSelectedOption); diff --git a/src/pages/workspace/workflows/WorkspaceWorkflowsPage.tsx b/src/pages/workspace/workflows/WorkspaceWorkflowsPage.tsx index ba3e95f6b2455..5675e4ee81df4 100644 --- a/src/pages/workspace/workflows/WorkspaceWorkflowsPage.tsx +++ b/src/pages/workspace/workflows/WorkspaceWorkflowsPage.tsx @@ -105,7 +105,9 @@ function WorkspaceWorkflowsPage({policy, route}: WorkspaceWorkflowsPageProps) { InteractionManager.runAfterInteractions(() => { fetchData(); }); - }, [fetchData]); + // eslint-disable-next-line react-compiler/react-compiler + // eslint-disable-next-line react-hooks/exhaustive-deps + }, []); // User should be allowed to add new Approval Workflow only if he's upgraded to Control Plan, otherwise redirected to the Upgrade Page const addApprovalAction = useCallback(() => { From cb402cc637e1efc794c65aced9a88694917c29ac Mon Sep 17 00:00:00 2001 From: abzokhattab Date: Wed, 19 Feb 2025 14:40:42 +0100 Subject: [PATCH 5/6] Removing policyID, shouldSkipVBBACall from the useEffect --- src/pages/workspace/WorkspacePageWithSections.tsx | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/src/pages/workspace/WorkspacePageWithSections.tsx b/src/pages/workspace/WorkspacePageWithSections.tsx index f3782d0a92962..e6bc5fed299b1 100644 --- a/src/pages/workspace/WorkspacePageWithSections.tsx +++ b/src/pages/workspace/WorkspacePageWithSections.tsx @@ -148,8 +148,9 @@ function WorkspacePageWithSections({ useEffect(() => { fetchData(policyID, shouldSkipVBBACall); - }, [policyID, shouldSkipVBBACall]); - + // eslint-disable-next-line react-compiler/react-compiler + // eslint-disable-next-line react-hooks/exhaustive-deps + }, []); const shouldShowPolicy = useMemo(() => shouldShowPolicyUtil(policy, isOffline, currentUserLogin), [policy, isOffline, currentUserLogin]); const isPendingDelete = isPendingDeletePolicy(policy); const prevIsPendingDelete = isPendingDeletePolicy(prevPolicy); From eca1e3837ea50013c69c2efb335cd14c16329de3 Mon Sep 17 00:00:00 2001 From: abzokhattab Date: Wed, 19 Feb 2025 14:55:52 +0100 Subject: [PATCH 6/6] minor edit --- src/pages/workspace/workflows/WorkspaceWorkflowsPage.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/pages/workspace/workflows/WorkspaceWorkflowsPage.tsx b/src/pages/workspace/workflows/WorkspaceWorkflowsPage.tsx index d772cd3d609a1..695bd12808e77 100644 --- a/src/pages/workspace/workflows/WorkspaceWorkflowsPage.tsx +++ b/src/pages/workspace/workflows/WorkspaceWorkflowsPage.tsx @@ -1,4 +1,4 @@ -import React, {useCallback, useMemo} from 'react'; +import React, {useCallback, useEffect, useMemo} from 'react'; import {ActivityIndicator, InteractionManager, View} from 'react-native'; import {useOnyx} from 'react-native-onyx'; import ApprovalWorkflowSection from '@components/ApprovalWorkflowSection';