From c8492ec97849e8749733c9455b6fd0dbb8bd034b Mon Sep 17 00:00:00 2001 From: Rayane <77965000+rayane-d@users.noreply.github.com> Date: Thu, 6 Mar 2025 12:32:24 +0100 Subject: [PATCH 1/8] Update Migrate tooltips --- src/CONST.ts | 8 +- src/components/AccountSwitcher.tsx | 45 ++- .../LHNOptionsList/OptionRowLHN.tsx | 2 + .../ProductTrainingContext/TOOLTIPS.ts | 83 +++--- .../ProductTrainingContext/index.tsx | 3 +- .../SearchPageHeader/SearchPageHeader.tsx | 46 +-- src/languages/en.ts | 46 +-- src/languages/es.ts | 44 +-- src/pages/Search/SearchTypeMenu.tsx | 43 ++- .../ReportActionCompose.tsx | 266 ++++++++---------- .../sidebar/FloatingActionButtonPopover.tsx | 13 - src/styles/variables.ts | 8 +- src/types/onyx/DismissedProductTraining.ts | 20 +- .../ProductTrainingContextProvider.tsx | 8 +- 14 files changed, 295 insertions(+), 340 deletions(-) diff --git a/src/CONST.ts b/src/CONST.ts index b5cfc9d91aae..cf624e389b4e 100755 --- a/src/CONST.ts +++ b/src/CONST.ts @@ -6706,17 +6706,19 @@ const CONST = { BASE_LIST_ITEM_TEST_ID: 'base-list-item-', PRODUCT_TRAINING_TOOLTIP_NAMES: { + // TODO: CONCEIRGE_LHN_GBR tooltip will be replaced by a tooltip in the #admins room + // https://github.com/Expensify/App/issues/57045#issuecomment-2701455668 CONCEIRGE_LHN_GBR: 'conciergeLHNGBR', RENAME_SAVED_SEARCH: 'renameSavedSearch', - QUICK_ACTION_BUTTON: 'quickActionButton', - WORKSAPCE_CHAT_CREATE: 'workspaceChatCreate', - SEARCH_FILTER_BUTTON_TOOLTIP: 'filterButtonTooltip', BOTTOM_NAV_INBOX_TOOLTIP: 'bottomNavInboxTooltip', LHN_WORKSPACE_CHAT_TOOLTIP: 'workspaceChatLHNTooltip', GLOBAL_CREATE_TOOLTIP: 'globalCreateTooltip', SCAN_TEST_TOOLTIP: 'scanTestTooltip', SCAN_TEST_TOOLTIP_MANAGER: 'scanTestTooltipManager', SCAN_TEST_CONFIRMATION: 'scanTestConfirmation', + EXPENSE_REPORTS_FILTER: 'expenseReportsFilter', + GBR_RBR_CHAT: 'GBRRBRChat', + ACCOUNT_SWITCHER: 'accountSwitcher', }, SMART_BANNER_HEIGHT: 152, diff --git a/src/components/AccountSwitcher.tsx b/src/components/AccountSwitcher.tsx index ed2eae7a0a4c..27c8a0de246f 100644 --- a/src/components/AccountSwitcher.tsx +++ b/src/components/AccountSwitcher.tsx @@ -26,7 +26,9 @@ import * as Expensicons from './Icon/Expensicons'; import type {PopoverMenuItem} from './PopoverMenu'; import PopoverMenu from './PopoverMenu'; import {PressableWithFeedback} from './Pressable'; +import {useProductTrainingContext} from './ProductTrainingContext'; import Text from './Text'; +import EducationalTooltip from './Tooltip/EducationalTooltip'; function AccountSwitcher() { const currentUserPersonalDetails = useCurrentUserPersonalDetails(); @@ -49,6 +51,11 @@ function AccountSwitcher() { const canSwitchAccounts = delegators.length > 0 || isActingAsDelegate; const processedTextArray = EmojiUtils.splitTextWithEmojis(currentUserPersonalDetails?.displayName); + const {shouldShowProductTrainingTooltip, renderProductTrainingTooltip, hideProductTrainingTooltip} = useProductTrainingContext( + CONST.PRODUCT_TRAINING_TOOLTIP_NAMES.ACCOUNT_SWITCHER, + canSwitchAccounts, + ); + const createBaseMenuItem = ( personalDetails: PersonalDetails | undefined, errors?: Errors, @@ -124,14 +131,17 @@ function AccountSwitcher() { return [currentUserMenuItem, ...delegatorMenuItems]; }; + const onPressSwitcher = () => { + hideProductTrainingTooltip(); + setShouldShowDelegatorMenu(!shouldShowDelegatorMenu); + }; + return ( <> { - setShouldShowDelegatorMenu(!shouldShowDelegatorMenu); - }} + onPress={onPressSwitcher} ref={buttonRef} interactive={canSwitchAccounts} pressDimmingValue={canSwitchAccounts ? undefined : 1} @@ -156,14 +166,27 @@ function AccountSwitcher() { : currentUserPersonalDetails?.displayName} {!!canSwitchAccounts && ( - - - + + + + + )} {}, opti const isReportsSplitNavigatorLast = useRootNavigationState((state) => state?.routes?.at(-1)?.name === NAVIGATORS.REPORTS_SPLIT_NAVIGATOR); + // TODO: CONCEIRGE_LHN_GBR tooltip will be replaced by a tooltip in the #admins room + // https://github.com/Expensify/App/issues/57045#issuecomment-2701455668 const {tooltipToRender, shouldShowTooltip} = useMemo(() => { const tooltip = shouldShowGetStartedTooltip ? CONST.PRODUCT_TRAINING_TOOLTIP_NAMES.CONCEIRGE_LHN_GBR : CONST.PRODUCT_TRAINING_TOOLTIP_NAMES.LHN_WORKSPACE_CHAT_TOOLTIP; const shouldShowTooltips = shouldShowWokspaceChatTooltip || shouldShowGetStartedTooltip; diff --git a/src/components/ProductTrainingContext/TOOLTIPS.ts b/src/components/ProductTrainingContext/TOOLTIPS.ts index 90e91166fba7..fbf0761dc1e6 100644 --- a/src/components/ProductTrainingContext/TOOLTIPS.ts +++ b/src/components/ProductTrainingContext/TOOLTIPS.ts @@ -6,15 +6,15 @@ import type {TranslationPaths} from '@src/languages/types'; const { CONCEIRGE_LHN_GBR, RENAME_SAVED_SEARCH, - WORKSAPCE_CHAT_CREATE, - QUICK_ACTION_BUTTON, - SEARCH_FILTER_BUTTON_TOOLTIP, BOTTOM_NAV_INBOX_TOOLTIP, LHN_WORKSPACE_CHAT_TOOLTIP, GLOBAL_CREATE_TOOLTIP, SCAN_TEST_TOOLTIP, SCAN_TEST_TOOLTIP_MANAGER, SCAN_TEST_CONFIRMATION, + EXPENSE_REPORTS_FILTER, + GBR_RBR_CHAT, + ACCOUNT_SWITCHER, } = CONST.PRODUCT_TRAINING_TOOLTIP_NAMES; type ProductTrainingTooltipName = ValueOf; @@ -41,7 +41,9 @@ const TOOLTIPS: Record = { onHideTooltip: () => dismissProductTraining(CONCEIRGE_LHN_GBR), name: CONCEIRGE_LHN_GBR, priority: 1300, - shouldShow: ({shouldUseNarrowLayout}) => !!shouldUseNarrowLayout, + // TODO: CONCEIRGE_LHN_GBR tooltip will be replaced by a tooltip in the #admins room + // https://github.com/Expensify/App/issues/57045#issuecomment-2701455668 + shouldShow: () => false, }, [RENAME_SAVED_SEARCH]: { content: [ @@ -61,60 +63,63 @@ const TOOLTIPS: Record = { ], onHideTooltip: () => dismissProductTraining(GLOBAL_CREATE_TOOLTIP), name: GLOBAL_CREATE_TOOLTIP, - priority: 1200, + priority: 1950, shouldShow: () => true, }, - [QUICK_ACTION_BUTTON]: { + [BOTTOM_NAV_INBOX_TOOLTIP]: { content: [ - {text: 'productTrainingTooltip.quickActionButton.part1', isBold: true}, - {text: 'productTrainingTooltip.quickActionButton.part2', isBold: false}, + {text: 'productTrainingTooltip.bottomNavInboxTooltip.part1', isBold: false}, + {text: 'productTrainingTooltip.bottomNavInboxTooltip.part2', isBold: true}, + {text: 'productTrainingTooltip.bottomNavInboxTooltip.part3', isBold: false}, + {text: 'productTrainingTooltip.bottomNavInboxTooltip.part4', isBold: true}, ], - onHideTooltip: () => dismissProductTraining(QUICK_ACTION_BUTTON), - name: QUICK_ACTION_BUTTON, - priority: 1150, + onHideTooltip: () => dismissProductTraining(BOTTOM_NAV_INBOX_TOOLTIP), + name: BOTTOM_NAV_INBOX_TOOLTIP, + priority: 1700, shouldShow: () => true, }, - [WORKSAPCE_CHAT_CREATE]: { + [LHN_WORKSPACE_CHAT_TOOLTIP]: { content: [ - {text: 'productTrainingTooltip.workspaceChatCreate.part1', isBold: false}, - {text: 'productTrainingTooltip.workspaceChatCreate.part2', isBold: true}, - {text: 'productTrainingTooltip.workspaceChatCreate.part3', isBold: false}, + {text: 'productTrainingTooltip.workspaceChatTooltip.part1', isBold: false}, + {text: 'productTrainingTooltip.workspaceChatTooltip.part2', isBold: true}, ], - onHideTooltip: () => dismissProductTraining(WORKSAPCE_CHAT_CREATE), - name: WORKSAPCE_CHAT_CREATE, - priority: 1100, + onHideTooltip: () => dismissProductTraining(LHN_WORKSPACE_CHAT_TOOLTIP), + name: LHN_WORKSPACE_CHAT_TOOLTIP, + priority: 1800, shouldShow: () => true, }, - [SEARCH_FILTER_BUTTON_TOOLTIP]: { + [EXPENSE_REPORTS_FILTER]: { content: [ - {text: 'productTrainingTooltip.searchFilterButtonTooltip.part1', isBold: true}, - {text: 'productTrainingTooltip.searchFilterButtonTooltip.part2', isBold: false}, + {text: 'productTrainingTooltip.expenseReportsFilter.part1', isBold: false}, + {text: 'productTrainingTooltip.expenseReportsFilter.part2', isBold: true}, + {text: 'productTrainingTooltip.expenseReportsFilter.part3', isBold: false}, ], - onHideTooltip: () => dismissProductTraining(SEARCH_FILTER_BUTTON_TOOLTIP), - name: SEARCH_FILTER_BUTTON_TOOLTIP, - priority: 1000, - shouldShow: () => true, + onHideTooltip: () => dismissProductTraining(EXPENSE_REPORTS_FILTER), + name: EXPENSE_REPORTS_FILTER, + priority: 2000, + shouldShow: ({shouldUseNarrowLayout}) => !shouldUseNarrowLayout, }, - [BOTTOM_NAV_INBOX_TOOLTIP]: { + [GBR_RBR_CHAT]: { content: [ - {text: 'productTrainingTooltip.bottomNavInboxTooltip.part1', isBold: true}, - {text: 'productTrainingTooltip.bottomNavInboxTooltip.part2', isBold: false}, - {text: 'productTrainingTooltip.bottomNavInboxTooltip.part3', isBold: false}, + {text: 'productTrainingTooltip.GBRRBRChat.part1', isBold: false}, + {text: 'productTrainingTooltip.GBRRBRChat.part2', isBold: true}, + {text: 'productTrainingTooltip.GBRRBRChat.part3', isBold: false}, + {text: 'productTrainingTooltip.GBRRBRChat.part4', isBold: true}, ], - onHideTooltip: () => dismissProductTraining(BOTTOM_NAV_INBOX_TOOLTIP), - name: BOTTOM_NAV_INBOX_TOOLTIP, - priority: 900, + onHideTooltip: () => dismissProductTraining(GBR_RBR_CHAT), + name: GBR_RBR_CHAT, + priority: 1900, shouldShow: () => true, }, - [LHN_WORKSPACE_CHAT_TOOLTIP]: { + [ACCOUNT_SWITCHER]: { content: [ - {text: 'productTrainingTooltip.workspaceChatTooltip.part1', isBold: true}, - {text: 'productTrainingTooltip.workspaceChatTooltip.part2', isBold: false}, - {text: 'productTrainingTooltip.workspaceChatTooltip.part3', isBold: false}, + {text: 'productTrainingTooltip.accountSwitcher.part1', isBold: false}, + {text: 'productTrainingTooltip.accountSwitcher.part2', isBold: true}, + {text: 'productTrainingTooltip.accountSwitcher.part3', isBold: false}, ], - onHideTooltip: () => dismissProductTraining(LHN_WORKSPACE_CHAT_TOOLTIP), - name: LHN_WORKSPACE_CHAT_TOOLTIP, - priority: 800, + onHideTooltip: () => dismissProductTraining(ACCOUNT_SWITCHER), + name: ACCOUNT_SWITCHER, + priority: 1600, shouldShow: () => true, }, [SCAN_TEST_TOOLTIP]: { diff --git a/src/components/ProductTrainingContext/index.tsx b/src/components/ProductTrainingContext/index.tsx index dabd209bf26b..fc2e232928be 100644 --- a/src/components/ProductTrainingContext/index.tsx +++ b/src/components/ProductTrainingContext/index.tsx @@ -100,9 +100,8 @@ function ProductTrainingContextProvider({children}: ChildrenProps) { return false; } - // We need to make an exception for the QAB tooltip because it is shown in a modal, otherwise it would be hidden if a modal is visible + // We need to make an exception for these tooltips because it is shown in a modal, otherwise it would be hidden if a modal is visible if ( - tooltipName !== CONST.PRODUCT_TRAINING_TOOLTIP_NAMES.QUICK_ACTION_BUTTON && tooltipName !== CONST.PRODUCT_TRAINING_TOOLTIP_NAMES.SCAN_TEST_TOOLTIP && tooltipName !== CONST.PRODUCT_TRAINING_TOOLTIP_NAMES.SCAN_TEST_TOOLTIP_MANAGER && tooltipName !== CONST.PRODUCT_TRAINING_TOOLTIP_NAMES.SCAN_TEST_CONFIRMATION && diff --git a/src/components/Search/SearchPageHeader/SearchPageHeader.tsx b/src/components/Search/SearchPageHeader/SearchPageHeader.tsx index a3b814650a23..71ea26a2662e 100644 --- a/src/components/Search/SearchPageHeader/SearchPageHeader.tsx +++ b/src/components/Search/SearchPageHeader/SearchPageHeader.tsx @@ -1,4 +1,3 @@ -import {useFocusEffect} from '@react-navigation/native'; import React, {useCallback, useMemo, useState} from 'react'; import {InteractionManager, View} from 'react-native'; import {useOnyx} from 'react-native-onyx'; @@ -9,10 +8,8 @@ import ConfirmModal from '@components/ConfirmModal'; import DecisionModal from '@components/DecisionModal'; import * as Expensicons from '@components/Icon/Expensicons'; import {usePersonalDetails} from '@components/OnyxProvider'; -import {useProductTrainingContext} from '@components/ProductTrainingContext'; import {useSearchContext} from '@components/Search/SearchContext'; import type {PaymentData, SearchQueryJSON} from '@components/Search/types'; -import EducationalTooltip from '@components/Tooltip/EducationalTooltip'; import useActiveWorkspace from '@hooks/useActiveWorkspace'; import useLocalize from '@hooks/useLocalize'; import useNetwork from '@hooks/useNetwork'; @@ -75,24 +72,9 @@ function SearchPageHeader({queryJSON, searchName, searchRouterListVisible, hideS const [isDeleteExpensesConfirmModalVisible, setIsDeleteExpensesConfirmModalVisible] = useState(false); const [isOfflineModalVisible, setIsOfflineModalVisible] = useState(false); const [isDownloadErrorModalVisible, setIsDownloadErrorModalVisible] = useState(false); - const [isScreenFocused, setIsScreenFocused] = useState(false); - - const {renderProductTrainingTooltip, shouldShowProductTrainingTooltip, hideProductTrainingTooltip} = useProductTrainingContext( - CONST.PRODUCT_TRAINING_TOOLTIP_NAMES.SEARCH_FILTER_BUTTON_TOOLTIP, - isScreenFocused, - ); const {status, hash} = queryJSON; - useFocusEffect( - useCallback(() => { - setIsScreenFocused(true); - return () => { - setIsScreenFocused(false); - }; - }, []), - ); - const selectedTransactionsKeys = Object.keys(selectedTransactions ?? {}); const handleDeleteExpenses = () => { @@ -330,12 +312,11 @@ function SearchPageHeader({queryJSON, searchName, searchRouterListVisible, hideS ]); const onFiltersButtonPress = useCallback(() => { - hideProductTrainingTooltip(); const filterFormValues = buildFilterFormValuesFromQuery(queryJSON, policyCategories, policyTagsLists, currencyList, personalDetails, allCards, reports, taxRates); updateAdvancedFilters(filterFormValues); Navigation.navigate(ROUTES.SEARCH_ADVANCED_FILTERS); - }, [allCards, currencyList, hideProductTrainingTooltip, personalDetails, policyCategories, policyTagsLists, queryJSON, reports, taxRates]); + }, [allCards, currencyList, personalDetails, policyCategories, policyTagsLists, queryJSON, reports, taxRates]); const InputRightComponent = useMemo(() => { return headerButtonsOptions.length > 0 && (!shouldUseNarrowLayout || selectionMode?.isEnabled) ? ( @@ -349,33 +330,18 @@ function SearchPageHeader({queryJSON, searchName, searchRouterListVisible, hideS shouldUseStyleUtilityForAnchorPosition /> ) : ( - -