diff --git a/package.json b/package.json index d9af716970d95..e91a473b4f990 100644 --- a/package.json +++ b/package.json @@ -46,7 +46,7 @@ "test:debug": "TZ=utc NODE_OPTIONS='--inspect-brk --experimental-vm-modules' jest --runInBand", "perf-test": "NODE_OPTIONS=--experimental-vm-modules npx reassure", "typecheck": "NODE_OPTIONS=--max_old_space_size=8192 tsc", - "lint": "NODE_OPTIONS=--max_old_space_size=8192 eslint . --max-warnings=183 --cache --cache-location=node_modules/.cache/eslint", + "lint": "NODE_OPTIONS=--max_old_space_size=8192 eslint . --max-warnings=182 --cache --cache-location=node_modules/.cache/eslint", "lint-changed": "NODE_OPTIONS=--max_old_space_size=8192 ./scripts/lintChanged.sh", "lint-watch": "npx eslint-watch --watch --changed", "shellcheck": "./scripts/shellCheck.sh", diff --git a/src/components/TestDrive/TestDriveDemo.tsx b/src/components/TestDrive/TestDriveDemo.tsx index 988758ee372b5..efbf2fd0b1cb5 100644 --- a/src/components/TestDrive/TestDriveDemo.tsx +++ b/src/components/TestDrive/TestDriveDemo.tsx @@ -5,6 +5,7 @@ import EmbeddedDemo from '@components/EmbeddedDemo'; import Modal from '@components/Modal'; import SafeAreaConsumer from '@components/SafeAreaConsumer'; import useCurrentUserPersonalDetails from '@hooks/useCurrentUserPersonalDetails'; +import useIsOnboardingTaskParentReportArchived from '@hooks/useIsOnboardingTaskParentReportArchived'; import useOnboardingMessages from '@hooks/useOnboardingMessages'; import useOnyx from '@hooks/useOnyx'; import useResponsiveLayout from '@hooks/useResponsiveLayout'; @@ -26,6 +27,9 @@ function TestDriveDemo() { const [onboarding] = useOnyx(ONYXKEYS.NVP_ONBOARDING, {canBeMissing: false}); const [onboardingReport] = useOnyx(`${ONYXKEYS.COLLECTION.REPORT}${onboarding?.chatReportID}`, {canBeMissing: true}); const [introSelected] = useOnyx(ONYXKEYS.NVP_INTRO_SELECTED, {canBeMissing: true}); + + const isViewTourParentReportArchived = useIsOnboardingTaskParentReportArchived(CONST.ONBOARDING_TASK_TYPE.VIEW_TOUR); + const {testDrive} = useOnboardingMessages(); const currentUserPersonalDetails = useCurrentUserPersonalDetails(); const [isCurrentUserPolicyAdmin = false] = useOnyx(ONYXKEYS.COLLECTION.POLICY, { @@ -36,7 +40,7 @@ function TestDriveDemo() { useEffect(() => { InteractionManager.runAfterInteractions(() => { setIsVisible(true); - completeTestDriveTask(); + completeTestDriveTask(isViewTourParentReportArchived); }); // This should fire only during mount. diff --git a/src/hooks/useIsOnboardingTaskParentReportArchived.ts b/src/hooks/useIsOnboardingTaskParentReportArchived.ts new file mode 100644 index 0000000000000..1aa63f985b8a3 --- /dev/null +++ b/src/hooks/useIsOnboardingTaskParentReportArchived.ts @@ -0,0 +1,15 @@ +import ONYXKEYS from '@src/ONYXKEYS'; +import type {IntroSelectedTask} from '@src/types/onyx/IntroSelected'; +import useOnyx from './useOnyx'; +import useReportIsArchived from './useReportIsArchived'; + +function useIsOnboardingTaskParentReportArchived(taskName: IntroSelectedTask) { + const [introSelected] = useOnyx(ONYXKEYS.NVP_INTRO_SELECTED, {canBeMissing: true}); + const taskReportID = introSelected?.[taskName]; + const [taskReport] = useOnyx(`${ONYXKEYS.COLLECTION.REPORT}${taskReportID}`, {canBeMissing: true}, [taskReportID]); + const [taskParentReport] = useOnyx(`${ONYXKEYS.COLLECTION.REPORT}${taskReport?.parentReportID}`, {canBeMissing: true}); + + return useReportIsArchived(taskParentReport?.reportID); +} + +export default useIsOnboardingTaskParentReportArchived; diff --git a/src/libs/actions/Policy/Category.ts b/src/libs/actions/Policy/Category.ts index 2a23deae43041..886c286646047 100644 --- a/src/libs/actions/Policy/Category.ts +++ b/src/libs/actions/Policy/Category.ts @@ -52,8 +52,8 @@ Onyx.connect({ callback: (val) => (allPolicyCategories = val), }); -function appendSetupCategoriesOnboardingData(onyxData: OnyxData) { - const finishOnboardingTaskData = getFinishOnboardingTaskOnyxData('setupCategories'); +function appendSetupCategoriesOnboardingData(onyxData: OnyxData, isSetupCategoriesTaskParentReportArchived: boolean) { + const finishOnboardingTaskData = getFinishOnboardingTaskOnyxData('setupCategories', isSetupCategoriesTaskParentReportArchived); onyxData.optimisticData?.push(...(finishOnboardingTaskData.optimisticData ?? [])); onyxData.successData?.push(...(finishOnboardingTaskData.successData ?? [])); onyxData.failureData?.push(...(finishOnboardingTaskData.failureData ?? [])); @@ -329,6 +329,7 @@ function buildOptimisticPolicyRecentlyUsedCategories(policyID?: string, category function setWorkspaceCategoryEnabled( policyID: string, categoriesToUpdate: Record, + isSetupCategoriesTaskParentReportArchived: boolean, policyTagLists: PolicyTagLists = {}, allTransactionViolations: OnyxCollection = {}, ) { @@ -398,7 +399,7 @@ function setWorkspaceCategoryEnabled( }; pushTransactionViolationsOnyxData(onyxData, policyID, policyTagLists, policyCategories, allTransactionViolations, {}, optimisticPolicyCategoriesData); - appendSetupCategoriesOnboardingData(onyxData); + appendSetupCategoriesOnboardingData(onyxData, isSetupCategoriesTaskParentReportArchived); const parameters = { policyID, @@ -598,9 +599,9 @@ function removePolicyCategoryReceiptsRequired(policyID: string, categoryName: st API.write(WRITE_COMMANDS.REMOVE_POLICY_CATEGORY_RECEIPTS_REQUIRED, parameters, onyxData); } -function createPolicyCategory(policyID: string, categoryName: string) { +function createPolicyCategory(policyID: string, categoryName: string, isSetupCategoriesTaskParentReportArchived: boolean) { const onyxData = buildOptimisticPolicyCategories(policyID, [categoryName]); - appendSetupCategoriesOnboardingData(onyxData); + appendSetupCategoriesOnboardingData(onyxData, isSetupCategoriesTaskParentReportArchived); const parameters = { policyID, categories: JSON.stringify([{name: categoryName}]), @@ -978,6 +979,7 @@ function clearCategoryErrors(policyID: string, categoryName: string) { function deleteWorkspaceCategories( policyID: string, categoryNamesToDelete: string[], + isSetupCategoriesTaskParentReportArchived: boolean, policyTagLists: PolicyTagLists = {}, transactionViolations: OnyxCollection = {}, ) { @@ -1027,7 +1029,7 @@ function deleteWorkspaceCategories( const optimisticPolicyData: Partial = shouldDisableRequiresCategory ? {requiresCategory: false} : {}; pushTransactionViolationsOnyxData(onyxData, policyID, policyTagLists, policyCategories, transactionViolations, optimisticPolicyData, optimisticPolicyCategoriesData); - appendSetupCategoriesOnboardingData(onyxData); + appendSetupCategoriesOnboardingData(onyxData, isSetupCategoriesTaskParentReportArchived); const parameters = { policyID, diff --git a/src/libs/actions/Task.ts b/src/libs/actions/Task.ts index 6c6ed18b79b79..a0672961f9cb0 100644 --- a/src/libs/actions/Task.ts +++ b/src/libs/actions/Task.ts @@ -89,18 +89,6 @@ Onyx.connect({ callback: (val) => (introSelected = val), }); -let allReportNameValuePair: OnyxCollection; -Onyx.connect({ - key: ONYXKEYS.COLLECTION.REPORT_NAME_VALUE_PAIRS, - waitForCollectionCallback: true, - callback: (value) => { - if (!value) { - return; - } - allReportNameValuePair = value; - }, -}); - /** * Clears out the task info from the store */ @@ -1312,12 +1300,10 @@ function clearTaskErrors(reportID: string | undefined) { }); } -function getFinishOnboardingTaskOnyxData(taskName: IntroSelectedTask): OnyxData { +function getFinishOnboardingTaskOnyxData(taskName: IntroSelectedTask, isParentReportArchived: boolean): OnyxData { const taskReportID = introSelected?.[taskName]; const taskReport = allReports?.[`${ONYXKEYS.COLLECTION.REPORT}${taskReportID}`]; const parentReport = allReports?.[`${ONYXKEYS.COLLECTION.REPORT}${taskReport?.parentReportID}`]; - const parentReportNameValuePairs = allReportNameValuePair?.[`${ONYXKEYS.COLLECTION.REPORT_NAME_VALUE_PAIRS}${parentReport?.reportID}`]; - const isParentReportArchived = ReportUtils.isArchivedReport(parentReportNameValuePairs); if (taskReportID && canActionTask(taskReport, currentUserAccountID, parentReport, isParentReportArchived)) { if (taskReport) { if (taskReport.stateNum !== CONST.REPORT.STATE_NUM.APPROVED || taskReport.statusNum !== CONST.REPORT.STATUS_NUM.APPROVED) { @@ -1328,9 +1314,9 @@ function getFinishOnboardingTaskOnyxData(taskName: IntroSelectedTask): OnyxData return {}; } -function completeTestDriveTask(shouldUpdateSelfTourViewedOnlyLocally = false) { +function completeTestDriveTask(isTaskParentReportArchived: boolean, shouldUpdateSelfTourViewedOnlyLocally = false) { setSelfTourViewed(shouldUpdateSelfTourViewedOnlyLocally); - getFinishOnboardingTaskOnyxData(CONST.ONBOARDING_TASK_TYPE.VIEW_TOUR); + getFinishOnboardingTaskOnyxData(CONST.ONBOARDING_TASK_TYPE.VIEW_TOUR, isTaskParentReportArchived); } export { diff --git a/src/libs/actions/Tour.ts b/src/libs/actions/Tour.ts index 6873ee3d5163f..b685d391c394b 100644 --- a/src/libs/actions/Tour.ts +++ b/src/libs/actions/Tour.ts @@ -10,6 +10,7 @@ function startTestDrive( shouldUpdateSelfTourViewedOnlyLocally: boolean, hasUserBeenAddedToNudgeMigration: boolean, isUserPaidPolicyMember: boolean, + isViewTourTaskParentReportArchived: boolean, ) { InteractionManager.runAfterInteractions(() => { if ( @@ -20,7 +21,7 @@ function startTestDrive( introSelected?.choice === CONST.ONBOARDING_CHOICES.TRACK_WORKSPACE || (introSelected?.choice === CONST.ONBOARDING_CHOICES.SUBMIT && introSelected.inviteType === CONST.ONBOARDING_INVITE_TYPES.WORKSPACE) ) { - completeTestDriveTask(shouldUpdateSelfTourViewedOnlyLocally); + completeTestDriveTask(isViewTourTaskParentReportArchived, shouldUpdateSelfTourViewedOnlyLocally); Navigation.navigate(ROUTES.TEST_DRIVE_DEMO_ROOT); } else { Navigation.navigate(ROUTES.TEST_DRIVE_MODAL_ROOT.route); diff --git a/src/pages/Search/EmptySearchView.tsx b/src/pages/Search/EmptySearchView.tsx index 2db8255c0093b..242c8d2bcf89e 100644 --- a/src/pages/Search/EmptySearchView.tsx +++ b/src/pages/Search/EmptySearchView.tsx @@ -20,6 +20,7 @@ import SearchRowSkeleton from '@components/Skeletons/SearchRowSkeleton'; import Text from '@components/Text'; import TextLink from '@components/TextLink'; import useCurrentUserPersonalDetails from '@hooks/useCurrentUserPersonalDetails'; +import useIsOnboardingTaskParentReportArchived from '@hooks/useIsOnboardingTaskParentReportArchived'; import useLocalize from '@hooks/useLocalize'; import useOnyx from '@hooks/useOnyx'; import useSearchTypeMenuSections from '@hooks/useSearchTypeMenuSections'; @@ -173,6 +174,8 @@ function EmptySearchViewContent({ }); const [tryNewDot] = useOnyx(ONYXKEYS.NVP_TRY_NEW_DOT, {selector: tryNewDotOnyxSelector, canBeMissing: true}); + const isViewTourParentReportArchived = useIsOnboardingTaskParentReportArchived(CONST.ONBOARDING_TASK_TYPE.VIEW_TOUR); + const shouldRedirectToExpensifyClassic = useMemo(() => { return areAllGroupPoliciesExpenseChatDisabled(allPolicies ?? {}); }, [allPolicies]); @@ -269,7 +272,7 @@ function EmptySearchViewContent({ } const startTestDriveAction = () => { - startTestDrive(introSelected, false, tryNewDot?.hasBeenAddedToNudgeMigration ?? false, isUserPaidPolicyMember); + startTestDrive(introSelected, false, tryNewDot?.hasBeenAddedToNudgeMigration ?? false, isUserPaidPolicyMember, isViewTourParentReportArchived); }; // If we are grouping by reports, show a custom message rather than a type-specific message @@ -439,6 +442,9 @@ function EmptySearchViewContent({ styles.textAlignLeft, styles.tripEmptyStateLottieWebView, introSelected, + tryNewDot?.hasBeenAddedToNudgeMigration, + isUserPaidPolicyMember, + isViewTourParentReportArchived, hasResults, defaultViewItemHeader, hasSeenTour, @@ -447,10 +453,8 @@ function EmptySearchViewContent({ activePolicyID, currentUserPersonalDetails, tripViewChildren, - shouldRedirectToExpensifyClassic, hasTransactions, - tryNewDot?.hasBeenAddedToNudgeMigration, - isUserPaidPolicyMember, + shouldRedirectToExpensifyClassic, ]); return ( diff --git a/src/pages/home/sidebar/FloatingActionButtonAndPopover.tsx b/src/pages/home/sidebar/FloatingActionButtonAndPopover.tsx index 15da6a90cfb89..d4ac24d8fc0f4 100644 --- a/src/pages/home/sidebar/FloatingActionButtonAndPopover.tsx +++ b/src/pages/home/sidebar/FloatingActionButtonAndPopover.tsx @@ -13,6 +13,7 @@ import * as Expensicons from '@components/Icon/Expensicons'; import type {PopoverMenuItem} from '@components/PopoverMenu'; import PopoverMenu from '@components/PopoverMenu'; import useCurrentUserPersonalDetails from '@hooks/useCurrentUserPersonalDetails'; +import useIsOnboardingTaskParentReportArchived from '@hooks/useIsOnboardingTaskParentReportArchived'; import useLocalize from '@hooks/useLocalize'; import useNetwork from '@hooks/useNetwork'; import useOnyx from '@hooks/useOnyx'; @@ -152,6 +153,8 @@ function FloatingActionButtonAndPopover({onHideCreateMenu, onShowCreateMenu, ref selector: (policies) => Object.values(policies ?? {}).some((policy) => isPaidGroupPolicy(policy) && isPolicyMember(policy, currentUserPersonalDetails.login)), }); + const isViewTourParentReportArchived = useIsOnboardingTaskParentReportArchived(CONST.ONBOARDING_TASK_TYPE.VIEW_TOUR); + const isReportInSearch = isOnSearchMoneyRequestReportPage(); const groupPoliciesWithChatEnabled = getGroupPaidPoliciesWithExpenseChatEnabled(); @@ -557,7 +560,9 @@ function FloatingActionButtonAndPopover({onHideCreateMenu, onShowCreateMenu, ref iconFill: theme.icon, text: translate('testDrive.quickAction.takeATwoMinuteTestDrive'), onSelected: () => - interceptAnonymousUser(() => startTestDrive(introSelected, isAnonymousUser(), tryNewDot?.hasBeenAddedToNudgeMigration ?? false, isUserPaidPolicyMember)), + interceptAnonymousUser(() => + startTestDrive(introSelected, isAnonymousUser(), tryNewDot?.hasBeenAddedToNudgeMigration ?? false, isUserPaidPolicyMember, isViewTourParentReportArchived), + ), }, ] : []), diff --git a/src/pages/iou/request/step/IOURequestStepConfirmation.tsx b/src/pages/iou/request/step/IOURequestStepConfirmation.tsx index 6963fbd3c9a85..39c0e8b8d4211 100644 --- a/src/pages/iou/request/step/IOURequestStepConfirmation.tsx +++ b/src/pages/iou/request/step/IOURequestStepConfirmation.tsx @@ -17,6 +17,7 @@ import useCurrentUserPersonalDetails from '@hooks/useCurrentUserPersonalDetails' import useDeepCompareRef from '@hooks/useDeepCompareRef'; import useFetchRoute from '@hooks/useFetchRoute'; import useFilesValidation from '@hooks/useFilesValidation'; +import useIsOnboardingTaskParentReportArchived from '@hooks/useIsOnboardingTaskParentReportArchived'; import useLocalize from '@hooks/useLocalize'; import useNetwork from '@hooks/useNetwork'; import useOnyx from '@hooks/useOnyx'; @@ -192,6 +193,8 @@ function IOURequestStepConfirmation({ const isPerDiemRequest = requestType === CONST.IOU.REQUEST_TYPE.PER_DIEM; const [lastLocationPermissionPrompt] = useOnyx(ONYXKEYS.NVP_LAST_LOCATION_PERMISSION_PROMPT, {canBeMissing: true}); + const isViewTourParentReportArchived = useIsOnboardingTaskParentReportArchived(CONST.ONBOARDING_TASK_TYPE.VIEW_TOUR); + const [archivedReportsIdSet = new Set()] = useOnyx(ONYXKEYS.COLLECTION.REPORT_NAME_VALUE_PAIRS, { canBeMissing: true, selector: (all): ArchivedReportsIDSet => { @@ -500,7 +503,7 @@ function IOURequestStepConfirmation({ !!item.linkedTrackedExpenseReportID && archivedReportsIdSet.has(`${ONYXKEYS.COLLECTION.REPORT_NAME_VALUE_PAIRS}${item.linkedTrackedExpenseReportID}`); if (isTestDriveReceipt) { - completeTestDriveTask(); + completeTestDriveTask(isViewTourParentReportArchived); } requestMoneyIOUActions({ @@ -552,9 +555,10 @@ function IOURequestStepConfirmation({ }); }, [ - report, transactions, receiptFiles, + archivedReportsIdSet, + report, currentUserPersonalDetails.login, currentUserPersonalDetails.accountID, policy, @@ -564,9 +568,9 @@ function IOURequestStepConfirmation({ transactionTaxCode, transactionTaxAmount, customUnitRateID, - backToReport, shouldGenerateTransactionThreadReport, - archivedReportsIdSet, + backToReport, + isViewTourParentReportArchived, ], ); diff --git a/src/pages/workspace/categories/CategorySettingsPage.tsx b/src/pages/workspace/categories/CategorySettingsPage.tsx index 5bfdcca4aad4e..885103c24db9a 100644 --- a/src/pages/workspace/categories/CategorySettingsPage.tsx +++ b/src/pages/workspace/categories/CategorySettingsPage.tsx @@ -12,6 +12,7 @@ import ScrollView from '@components/ScrollView'; import Switch from '@components/Switch'; import Text from '@components/Text'; import useEnvironment from '@hooks/useEnvironment'; +import useIsOnboardingTaskParentReportArchived from '@hooks/useIsOnboardingTaskParentReportArchived'; import useLocalize from '@hooks/useLocalize'; import useOnyx from '@hooks/useOnyx'; import usePolicy from '@hooks/usePolicy'; @@ -67,6 +68,7 @@ function CategorySettingsPage({ const shouldPreventDisableOrDelete = isDisablingOrDeletingLastEnabledCategory(policy, policyCategories, [policyCategory]); const areCommentsRequired = policyCategory?.areCommentsRequired ?? false; const isQuickSettingsFlow = name === SCREENS.SETTINGS_CATEGORIES.SETTINGS_CATEGORY_SETTINGS; + const isSetupCategoryTaskParentReportArchived = useIsOnboardingTaskParentReportArchived(CONST.ONBOARDING_TASK_TYPE.SETUP_CATEGORIES); const navigateBack = () => { Navigation.goBack(isQuickSettingsFlow ? ROUTES.SETTINGS_CATEGORIES_ROOT.getRoute(policyID, backTo) : undefined); @@ -129,7 +131,13 @@ function CategorySettingsPage({ setIsCannotDeleteOrDisableLastCategoryModalVisible(true); return; } - setWorkspaceCategoryEnabled(policyID, {[policyCategory.name]: {name: policyCategory.name, enabled: value}}, policyTagLists, allTransactionViolations); + setWorkspaceCategoryEnabled( + policyID, + {[policyCategory.name]: {name: policyCategory.name, enabled: value}}, + isSetupCategoryTaskParentReportArchived, + policyTagLists, + allTransactionViolations, + ); }; const navigateToEditCategory = () => { @@ -139,7 +147,7 @@ function CategorySettingsPage({ }; const deleteCategory = () => { - deleteWorkspaceCategories(policyID, [categoryName], policyTagLists, allTransactionViolations); + deleteWorkspaceCategories(policyID, [categoryName], isSetupCategoryTaskParentReportArchived, policyTagLists, allTransactionViolations); setDeleteCategoryConfirmModalVisible(false); navigateBack(); }; diff --git a/src/pages/workspace/categories/CreateCategoryPage.tsx b/src/pages/workspace/categories/CreateCategoryPage.tsx index e0f5989ce2bf5..0612010e0689d 100644 --- a/src/pages/workspace/categories/CreateCategoryPage.tsx +++ b/src/pages/workspace/categories/CreateCategoryPage.tsx @@ -2,6 +2,7 @@ import React, {useCallback} from 'react'; import type {FormOnyxValues} from '@components/Form/types'; import HeaderWithBackButton from '@components/HeaderWithBackButton'; import ScreenWrapper from '@components/ScreenWrapper'; +import useIsOnboardingTaskParentReportArchived from '@hooks/useIsOnboardingTaskParentReportArchived'; import useLocalize from '@hooks/useLocalize'; import useOnyx from '@hooks/useOnyx'; import useThemeStyles from '@hooks/useThemeStyles'; @@ -26,13 +27,14 @@ function CreateCategoryPage({route}: CreateCategoryPageProps) { const {translate} = useLocalize(); const backTo = route.params?.backTo; const isQuickSettingsFlow = route.name === SCREENS.SETTINGS_CATEGORIES.SETTINGS_CATEGORY_CREATE; + const isSetupCategoryTaskParentReportArchived = useIsOnboardingTaskParentReportArchived(CONST.ONBOARDING_TASK_TYPE.SETUP_CATEGORIES); const createCategory = useCallback( (values: FormOnyxValues) => { - createPolicyCategory(route.params.policyID, values.categoryName.trim()); + createPolicyCategory(route.params.policyID, values.categoryName.trim(), isSetupCategoryTaskParentReportArchived); Navigation.goBack(isQuickSettingsFlow ? ROUTES.SETTINGS_CATEGORIES_ROOT.getRoute(route.params.policyID, backTo) : undefined); }, - [isQuickSettingsFlow, route.params.policyID, backTo], + [route.params.policyID, isSetupCategoryTaskParentReportArchived, isQuickSettingsFlow, backTo], ); return ( diff --git a/src/pages/workspace/categories/WorkspaceCategoriesPage.tsx b/src/pages/workspace/categories/WorkspaceCategoriesPage.tsx index 472fac0a55e69..1d5dd94bc772f 100644 --- a/src/pages/workspace/categories/WorkspaceCategoriesPage.tsx +++ b/src/pages/workspace/categories/WorkspaceCategoriesPage.tsx @@ -26,6 +26,7 @@ import Text from '@components/Text'; import useAutoTurnSelectionModeOffWhenHasNoActiveOption from '@hooks/useAutoTurnSelectionModeOffWhenHasNoActiveOption'; import useCleanupSelectedOptions from '@hooks/useCleanupSelectedOptions'; import useEnvironment from '@hooks/useEnvironment'; +import useIsOnboardingTaskParentReportArchived from '@hooks/useIsOnboardingTaskParentReportArchived'; import useLocalize from '@hooks/useLocalize'; import useMobileSelectionMode from '@hooks/useMobileSelectionMode'; import useNetwork from '@hooks/useNetwork'; @@ -91,6 +92,8 @@ function WorkspaceCategoriesPage({route}: WorkspaceCategoriesPageProps) { const [selectedCategories, setSelectedCategories] = useState([]); const canSelectMultiple = isSmallScreenWidth ? isMobileSelectionModeEnabled : true; + const isSetupCategoryTaskParentReportArchived = useIsOnboardingTaskParentReportArchived(CONST.ONBOARDING_TASK_TYPE.SETUP_CATEGORIES); + const fetchCategories = useCallback(() => { openPolicyCategoriesPage(policyId); }, [policyId]); @@ -141,9 +144,9 @@ function WorkspaceCategoriesPage({route}: WorkspaceCategoriesPageProps) { const updateWorkspaceCategoryEnabled = useCallback( (value: boolean, categoryName: string) => { - setWorkspaceCategoryEnabled(policyId, {[categoryName]: {name: categoryName, enabled: value}}, policyTagLists, allTransactionViolations); + setWorkspaceCategoryEnabled(policyId, {[categoryName]: {name: categoryName, enabled: value}}, isSetupCategoryTaskParentReportArchived, policyTagLists, allTransactionViolations); }, - [policyId, policyTagLists, allTransactionViolations], + [policyId, isSetupCategoryTaskParentReportArchived, policyTagLists, allTransactionViolations], ); const categoryList = useMemo(() => { @@ -254,7 +257,7 @@ function WorkspaceCategoriesPage({route}: WorkspaceCategoriesPageProps) { }; const handleDeleteCategories = () => { - deleteWorkspaceCategories(policyId, selectedCategories, policyTagLists, allTransactionViolations); + deleteWorkspaceCategories(policyId, selectedCategories, isSetupCategoryTaskParentReportArchived, policyTagLists, allTransactionViolations); setDeleteCategoriesConfirmModalVisible(false); InteractionManager.runAfterInteractions(() => { @@ -358,7 +361,7 @@ function WorkspaceCategoriesPage({route}: WorkspaceCategoriesPageProps) { return; } setSelectedCategories([]); - setWorkspaceCategoryEnabled(policyId, categoriesToDisable, policyTagLists, allTransactionViolations); + setWorkspaceCategoryEnabled(policyId, categoriesToDisable, isSetupCategoryTaskParentReportArchived, policyTagLists, allTransactionViolations); }, }); } @@ -380,7 +383,7 @@ function WorkspaceCategoriesPage({route}: WorkspaceCategoriesPageProps) { value: CONST.POLICY.BULK_ACTION_TYPES.ENABLE, onSelected: () => { setSelectedCategories([]); - setWorkspaceCategoryEnabled(policyId, categoriesToEnable, policyTagLists, allTransactionViolations); + setWorkspaceCategoryEnabled(policyId, categoriesToEnable, isSetupCategoryTaskParentReportArchived, policyTagLists, allTransactionViolations); }, }); } diff --git a/tests/actions/PolicyCategoryTest.ts b/tests/actions/PolicyCategoryTest.ts index 351adaf8e982c..591ca1b7e8753 100644 --- a/tests/actions/PolicyCategoryTest.ts +++ b/tests/actions/PolicyCategoryTest.ts @@ -71,7 +71,7 @@ describe('actions/PolicyCategory', () => { mockFetch?.pause?.(); Onyx.set(`${ONYXKEYS.COLLECTION.POLICY}${fakePolicy.id}`, fakePolicy); Onyx.set(`${ONYXKEYS.COLLECTION.POLICY_CATEGORIES}${fakePolicy.id}`, fakeCategories); - Category.createPolicyCategory(fakePolicy.id, newCategoryName); + Category.createPolicyCategory(fakePolicy.id, newCategoryName, false); await waitForBatchedUpdates(); await new Promise((resolve) => { const connection = Onyx.connect({ @@ -169,7 +169,7 @@ describe('actions/PolicyCategory', () => { mockFetch?.pause?.(); Onyx.set(`${ONYXKEYS.COLLECTION.POLICY}${fakePolicy.id}`, fakePolicy); Onyx.set(`${ONYXKEYS.COLLECTION.POLICY_CATEGORIES}${fakePolicy.id}`, fakeCategories); - Category.setWorkspaceCategoryEnabled(fakePolicy.id, categoriesToUpdate); + Category.setWorkspaceCategoryEnabled(fakePolicy.id, categoriesToUpdate, false); await waitForBatchedUpdates(); await new Promise((resolve) => { const connection = Onyx.connect({ @@ -214,7 +214,7 @@ describe('actions/PolicyCategory', () => { mockFetch?.pause?.(); Onyx.set(`${ONYXKEYS.COLLECTION.POLICY}${fakePolicy.id}`, fakePolicy); Onyx.set(`${ONYXKEYS.COLLECTION.POLICY_CATEGORIES}${fakePolicy.id}`, fakeCategories); - Category.deleteWorkspaceCategories(fakePolicy.id, categoriesToDelete); + Category.deleteWorkspaceCategories(fakePolicy.id, categoriesToDelete, false); await waitForBatchedUpdates(); await new Promise((resolve) => { const connection = Onyx.connect({ diff --git a/tests/actions/TaskTest.ts b/tests/actions/TaskTest.ts index 99e0cae6e7ab9..115d50462eaf3 100644 --- a/tests/actions/TaskTest.ts +++ b/tests/actions/TaskTest.ts @@ -272,8 +272,8 @@ describe('actions/Task', () => { }); it('Completes test drive task', () => { - completeTestDriveTask(); - expect(Object.values(getFinishOnboardingTaskOnyxData(CONST.ONBOARDING_TASK_TYPE.VIEW_TOUR)).length).toBe(0); + completeTestDriveTask(false); + expect(Object.values(getFinishOnboardingTaskOnyxData(CONST.ONBOARDING_TASK_TYPE.VIEW_TOUR, false)).length).toBe(0); }); }); @@ -294,15 +294,10 @@ describe('actions/Task', () => { await waitForBatchedUpdates(); }); it('Return not empty object', () => { - expect(Object.values(getFinishOnboardingTaskOnyxData('setupCategories')).length).toBeGreaterThan(0); + expect(Object.values(getFinishOnboardingTaskOnyxData('setupCategories', false)).length).toBeGreaterThan(0); }); - it('Return empty object', async () => { - const reportNameValuePairs = { - private_isArchived: DateUtils.getDBTime(), - }; - await Onyx.set(`${ONYXKEYS.COLLECTION.REPORT_NAME_VALUE_PAIRS}${parentReport.reportID}`, reportNameValuePairs); - await waitForBatchedUpdates(); - expect(Object.values(getFinishOnboardingTaskOnyxData('setupCategories')).length).toBe(0); + it('Return empty object', () => { + expect(Object.values(getFinishOnboardingTaskOnyxData('setupCategories', true)).length).toBe(0); }); }); diff --git a/tests/actions/TourTest.ts b/tests/actions/TourTest.ts index f407fd4ee0907..3a88773fb3165 100644 --- a/tests/actions/TourTest.ts +++ b/tests/actions/TourTest.ts @@ -41,17 +41,17 @@ describe('actions/Tour', () => { describe('startTestDrive', () => { describe('migrated users', () => { it('should show the Test Drive demo if user has been nudged to migrate', async () => { - startTestDrive(undefined, false, true, false); + startTestDrive(undefined, false, true, false, false); await waitForBatchedUpdates(); - expect(Navigation.navigate).toBeCalledWith(ROUTES.TEST_DRIVE_DEMO_ROOT); + expect(Navigation.navigate).toHaveBeenCalledWith(ROUTES.TEST_DRIVE_DEMO_ROOT); }); it("should show the Test Drive demo if user doesn't have the nudge flag but is member of a paid policy", async () => { - startTestDrive(undefined, false, false, true); + startTestDrive(undefined, false, false, true, false); await waitForBatchedUpdates(); - expect(Navigation.navigate).toBeCalledWith(ROUTES.TEST_DRIVE_DEMO_ROOT); + expect(Navigation.navigate).toHaveBeenCalledWith(ROUTES.TEST_DRIVE_DEMO_ROOT); }); }); @@ -96,16 +96,16 @@ describe('actions/Tour', () => { it.each(onboardingChoices.filter((choice) => onboardingDemoChoices.includes(choice)))('should show the Test Drive demo if user has "%s" onboarding choice', async (choice) => { await setTestDriveTaskData(); - startTestDrive({choice}, false, false, false); + startTestDrive({choice}, false, false, false, false); await waitForBatchedUpdates(); expect(Navigation.navigate).toHaveBeenCalledWith(ROUTES.TEST_DRIVE_DEMO_ROOT); // An empty object means the task was completed. - expect(Object.values(getFinishOnboardingTaskOnyxData(CONST.ONBOARDING_TASK_TYPE.VIEW_TOUR)).length).toBe(0); + expect(Object.values(getFinishOnboardingTaskOnyxData(CONST.ONBOARDING_TASK_TYPE.VIEW_TOUR, false)).length).toBe(0); }); it.each(onboardingChoices.filter((choice) => !onboardingDemoChoices.includes(choice)))('should show the Test Drive modal if user has "%s" onboarding choice', async (choice) => { - startTestDrive({choice}, false, false, false); + startTestDrive({choice}, false, false, false, false); await waitForBatchedUpdates(); expect(Navigation.navigate).toHaveBeenCalledWith(ROUTES.TEST_DRIVE_MODAL_ROOT.route); @@ -114,19 +114,19 @@ describe('actions/Tour', () => { it('should show the Test Drive demo if user is an invited employee', async () => { await setTestDriveTaskData(); - startTestDrive({choice: CONST.ONBOARDING_CHOICES.SUBMIT, inviteType: CONST.ONBOARDING_INVITE_TYPES.WORKSPACE}, false, false, false); + startTestDrive({choice: CONST.ONBOARDING_CHOICES.SUBMIT, inviteType: CONST.ONBOARDING_INVITE_TYPES.WORKSPACE}, false, false, false, false); await waitForBatchedUpdates(); - expect(Navigation.navigate).toBeCalledWith(ROUTES.TEST_DRIVE_DEMO_ROOT); + expect(Navigation.navigate).toHaveBeenCalledWith(ROUTES.TEST_DRIVE_DEMO_ROOT); // An empty object means the task was completed. - expect(Object.values(getFinishOnboardingTaskOnyxData(CONST.ONBOARDING_TASK_TYPE.VIEW_TOUR)).length).toBe(0); + expect(Object.values(getFinishOnboardingTaskOnyxData(CONST.ONBOARDING_TASK_TYPE.VIEW_TOUR, false)).length).toBe(0); }); it('should show the Test Drive demo if user is member of a paid policy', async () => { - startTestDrive({choice: CONST.ONBOARDING_CHOICES.LOOKING_AROUND}, false, false, true); + startTestDrive({choice: CONST.ONBOARDING_CHOICES.LOOKING_AROUND}, false, false, true, false); await waitForBatchedUpdates(); - expect(Navigation.navigate).toBeCalledWith(ROUTES.TEST_DRIVE_DEMO_ROOT); + expect(Navigation.navigate).toHaveBeenCalledWith(ROUTES.TEST_DRIVE_DEMO_ROOT); }); }); });