diff --git a/src/components/PromotedActionsBar.tsx b/src/components/PromotedActionsBar.tsx index a7ba6da8389a..a4b6035fc263 100644 --- a/src/components/PromotedActionsBar.tsx +++ b/src/components/PromotedActionsBar.tsx @@ -5,14 +5,11 @@ import useLocalize from '@hooks/useLocalize'; import useTheme from '@hooks/useTheme'; import useThemeStyles from '@hooks/useThemeStyles'; import {getPinMenuItem, getShareMenuItem} from '@libs/HeaderUtils'; -import isSearchTopmostFullScreenRoute from '@libs/Navigation/helpers/isSearchTopmostFullScreenRoute'; import Navigation from '@libs/Navigation/Navigation'; -import {changeMoneyRequestHoldStatus} from '@libs/ReportUtils'; import {joinRoom, navigateToAndOpenReport, navigateToAndOpenReportWithAccountIDs} from '@userActions/Report'; import {callFunctionIfActionIsAllowed} from '@userActions/Session'; import CONST from '@src/CONST'; import ROUTES from '@src/ROUTES'; -import type {ReportAction} from '@src/types/onyx'; import type OnyxReport from '@src/types/onyx/Report'; import Button from './Button'; import type {ThreeDotsMenuItem} from './HeaderWithBackButton/types'; @@ -28,15 +25,6 @@ type PromotedActionsType = Record P [CONST.PROMOTED_ACTIONS.SHARE]: (report: OnyxReport, backTo?: string) => PromotedAction; } & { [CONST.PROMOTED_ACTIONS.MESSAGE]: (params: {reportID?: string; accountID?: number; login?: string}) => PromotedAction; -} & { - [CONST.PROMOTED_ACTIONS.HOLD]: (params: { - isTextHold: boolean; - reportAction: ReportAction | undefined; - reportID?: string; - isDelegateAccessRestricted: boolean; - setIsNoDelegateAccessMenuVisible: (isVisible: boolean) => void; - currentSearchHash?: number; - }) => PromotedAction; }; const PromotedActions = { @@ -77,28 +65,6 @@ const PromotedActions = { } }, }), - hold: ({isTextHold, reportAction, isDelegateAccessRestricted, setIsNoDelegateAccessMenuVisible, currentSearchHash}) => ({ - key: CONST.PROMOTED_ACTIONS.HOLD, - icon: Expensicons.Stopwatch, - translationKey: `iou.${isTextHold ? 'hold' : 'unhold'}`, - onSelected: () => { - if (isDelegateAccessRestricted) { - setIsNoDelegateAccessMenuVisible(true); // Show the menu - return; - } - - if (!isTextHold) { - Navigation.goBack(); - } - - if (!isSearchTopmostFullScreenRoute()) { - changeMoneyRequestHoldStatus(reportAction); - return; - } - - changeMoneyRequestHoldStatus(reportAction, currentSearchHash); - }, - }), } satisfies PromotedActionsType; type PromotedActionsBarProps = { diff --git a/src/libs/ReportUtils.ts b/src/libs/ReportUtils.ts index d63c2b173d85..05e6bde88bd5 100644 --- a/src/libs/ReportUtils.ts +++ b/src/libs/ReportUtils.ts @@ -4042,7 +4042,7 @@ function canHoldUnholdReportAction(reportAction: OnyxInputOrEntry) return {canHoldRequest, canUnholdRequest}; } -const changeMoneyRequestHoldStatus = (reportAction: OnyxEntry, searchHash?: number): void => { +const changeMoneyRequestHoldStatus = (reportAction: OnyxEntry): void => { if (!isMoneyRequestAction(reportAction)) { return; } @@ -4065,10 +4065,10 @@ const changeMoneyRequestHoldStatus = (reportAction: OnyxEntry, sea const policy = allPolicies?.[`${ONYXKEYS.COLLECTION.POLICY}${moneyRequestReport.policyID}`] ?? null; if (isOnHold) { - unholdRequest(transactionID, reportAction.childReportID, searchHash); + unholdRequest(transactionID, reportAction.childReportID); } else { const activeRoute = encodeURIComponent(Navigation.getActiveRoute()); - Navigation.navigate(ROUTES.MONEY_REQUEST_HOLD_REASON.getRoute(policy?.type ?? CONST.POLICY.TYPE.PERSONAL, transactionID, reportAction.childReportID, activeRoute, searchHash)); + Navigation.navigate(ROUTES.MONEY_REQUEST_HOLD_REASON.getRoute(policy?.type ?? CONST.POLICY.TYPE.PERSONAL, transactionID, reportAction.childReportID, activeRoute)); } }; diff --git a/src/libs/actions/IOU.ts b/src/libs/actions/IOU.ts index 5b58a185e747..f8d34f35c26c 100644 --- a/src/libs/actions/IOU.ts +++ b/src/libs/actions/IOU.ts @@ -10672,7 +10672,7 @@ function putOnHold(transactionID: string, comment: string, reportID: string, sea /** * Remove expense from HOLD */ -function unholdRequest(transactionID: string, reportID: string, searchHash?: number) { +function unholdRequest(transactionID: string, reportID: string) { const createdReportAction = buildOptimisticUnHoldReportAction(); const transactionViolations = allTransactionViolations[`${ONYXKEYS.COLLECTION.TRANSACTION_VIOLATIONS}${transactionID}`]; const transaction = allTransactions[`${ONYXKEYS.COLLECTION.TRANSACTION}${transactionID}`]; @@ -10768,34 +10768,6 @@ function unholdRequest(transactionID: string, reportID: string, searchHash?: num }, ]; - // If we are un-holding from the search page, we optimistically update the snapshot data that search uses so that it is kept in sync - if (searchHash) { - optimisticData.push({ - onyxMethod: Onyx.METHOD.MERGE, - key: `${ONYXKEYS.COLLECTION.SNAPSHOT}${searchHash}`, - value: { - data: { - [`${ONYXKEYS.COLLECTION.TRANSACTION}${transactionID}`]: { - canHold: true, - canUnhold: false, - }, - }, - } as Record>>, - }); - failureData.push({ - onyxMethod: Onyx.METHOD.MERGE, - key: `${ONYXKEYS.COLLECTION.SNAPSHOT}${searchHash}`, - value: { - data: { - [`${ONYXKEYS.COLLECTION.TRANSACTION}${transactionID}`]: { - canHold: false, - canUnhold: true, - }, - }, - } as Record>>, - }); - } - API.write( 'UnHoldRequest', { diff --git a/src/pages/ReportDetailsPage.tsx b/src/pages/ReportDetailsPage.tsx index aad4d7078dc4..8c6934bd194d 100644 --- a/src/pages/ReportDetailsPage.tsx +++ b/src/pages/ReportDetailsPage.tsx @@ -7,8 +7,6 @@ import type {ValueOf} from 'type-fest'; import AvatarWithImagePicker from '@components/AvatarWithImagePicker'; import FullPageNotFoundView from '@components/BlockingViews/FullPageNotFoundView'; import ConfirmModal from '@components/ConfirmModal'; -import DecisionModal from '@components/DecisionModal'; -import DelegateNoAccessModal from '@components/DelegateNoAccessModal'; import DisplayNames from '@components/DisplayNames'; import FixedFooter from '@components/FixedFooter'; import HeaderWithBackButton from '@components/HeaderWithBackButton'; @@ -26,16 +24,12 @@ import PromotedActionsBar, {PromotedActions} from '@components/PromotedActionsBa import RoomHeaderAvatars from '@components/RoomHeaderAvatars'; import ScreenWrapper from '@components/ScreenWrapper'; import ScrollView from '@components/ScrollView'; -import {useSearchContext} from '@components/Search/SearchContext'; -import Text from '@components/Text'; import TextWithCopy from '@components/TextWithCopy'; -import useDelegateUserDetails from '@hooks/useDelegateUserDetails'; import useLocalize from '@hooks/useLocalize'; import useNetwork from '@hooks/useNetwork'; import usePaginatedReportActions from '@hooks/usePaginatedReportActions'; import usePermissions from '@hooks/usePermissions'; import useReportIsArchived from '@hooks/useReportIsArchived'; -import useResponsiveLayout from '@hooks/useResponsiveLayout'; import useThemeStyles from '@hooks/useThemeStyles'; import getBase62ReportID from '@libs/getBase62ReportID'; import Navigation from '@libs/Navigation/Navigation'; @@ -43,13 +37,12 @@ import type {PlatformStackScreenProps} from '@libs/Navigation/PlatformStackNavig import type {ReportDetailsNavigatorParamList} from '@libs/Navigation/types'; import {getPersonalDetailsForAccountIDs} from '@libs/OptionsListUtils'; import Parser from '@libs/Parser'; -import {getConnectedIntegration, isPolicyAdmin as isPolicyAdminUtil, isPolicyEmployee as isPolicyEmployeeUtil, shouldShowPolicy} from '@libs/PolicyUtils'; +import {isPolicyAdmin as isPolicyAdminUtil, isPolicyEmployee as isPolicyEmployeeUtil, shouldShowPolicy} from '@libs/PolicyUtils'; import {getOneTransactionThreadReportID, getOriginalMessage, getTrackExpenseActionableWhisper, isDeletedAction, isMoneyRequestAction, isTrackExpenseAction} from '@libs/ReportActionsUtils'; import { canDeleteCardTransactionByLiabilityType, canDeleteTransaction, canEditReportDescription as canEditReportDescriptionUtil, - canHoldUnholdReportAction as canHoldUnholdReportActionUtil, canJoinChat, canLeaveChat, canWriteInReport, @@ -75,7 +68,6 @@ import { isConciergeChatReport, isDefaultRoom as isDefaultRoomUtil, isExpenseReport as isExpenseReportUtil, - isExported, isFinancialReportsForBusinesses as isFinancialReportsForBusinessesUtil, isGroupChat as isGroupChatUtil, isHiddenForCurrentUser, @@ -96,25 +88,14 @@ import { isUserCreatedPolicyRoom as isUserCreatedPolicyRoomUtil, navigateBackOnDeleteTransaction, navigateToPrivateNotes, - reportTransactionsSelector, shouldDisableRename as shouldDisableRenameUtil, shouldUseFullTitleToDisplay, } from '@libs/ReportUtils'; import StringUtils from '@libs/StringUtils'; -import { - canCancelPayment, - cancelPayment as cancelPaymentAction, - canUnapproveIOU, - deleteMoneyRequest, - deleteTrackExpense, - getNavigationUrlAfterTrackExpenseDelete, - getNavigationUrlOnMoneyRequestDelete, - unapproveExpenseReport, -} from '@userActions/IOU'; +import {deleteMoneyRequest, deleteTrackExpense, getNavigationUrlAfterTrackExpenseDelete, getNavigationUrlOnMoneyRequestDelete} from '@userActions/IOU'; import { clearAvatarErrors, clearPolicyRoomNameErrors, - exportReportToCSV, getReportPrivateNote, hasErrorInPrivateNotes, leaveGroupChat, @@ -161,7 +142,7 @@ type CaseID = ValueOf; function ReportDetailsPage({policies, report, route, reportMetadata}: ReportDetailsPageProps) { const {translate} = useLocalize(); const {isOffline} = useNetwork(); - const {canUseTableReportView, canUseTrackFlows} = usePermissions(); + const {canUseTrackFlows} = usePermissions(); const styles = useThemeStyles(); const backTo = route.params.backTo; @@ -173,14 +154,8 @@ function ReportDetailsPage({policies, report, route, reportMetadata}: ReportDeta }); const [reportNameValuePairs] = useOnyx(`${ONYXKEYS.COLLECTION.REPORT_NAME_VALUE_PAIRS}${report?.reportID}`, {canBeMissing: false}); - const [parentReportNameValuePairs] = useOnyx(`${ONYXKEYS.COLLECTION.REPORT_NAME_VALUE_PAIRS}${report?.parentReportID}`, {canBeMissing: true}); const {reportActions} = usePaginatedReportActions(report.reportID); - const {currentSearchHash} = useSearchContext(); - - // We need to use isSmallScreenWidth instead of shouldUseNarrowLayout to apply the correct modal type for the decision modal - // eslint-disable-next-line rulesdir/prefer-shouldUseNarrowLayout-instead-of-isSmallScreenWidth - const {isSmallScreenWidth} = useResponsiveLayout(); const transactionThreadReportID = useMemo(() => getOneTransactionThreadReportID(report.reportID, reportActions ?? [], isOffline), [report.reportID, reportActions, isOffline]); @@ -189,20 +164,11 @@ function ReportDetailsPage({policies, report, route, reportMetadata}: ReportDeta const [isDebugModeEnabled] = useOnyx(ONYXKEYS.ACCOUNT, {selector: (account) => !!account?.isDebugModeEnabled, canBeMissing: false}); const [personalDetails] = useOnyx(ONYXKEYS.PERSONAL_DETAILS_LIST, {canBeMissing: false}); const [session] = useOnyx(ONYXKEYS.SESSION, {canBeMissing: false}); - const [transactions] = useOnyx(ONYXKEYS.COLLECTION.TRANSACTION, { - selector: (_transactions) => reportTransactionsSelector(_transactions, report.reportID), - initialValue: [], - canBeMissing: true, - }); const {removeTransaction} = useMoneyRequestReportContext(); const [isLastMemberLeavingGroupModalVisible, setIsLastMemberLeavingGroupModalVisible] = useState(false); const [isDeleteModalVisible, setIsDeleteModalVisible] = useState(false); - const [isUnapproveModalVisible, setIsUnapproveModalVisible] = useState(false); - const [isConfirmModalVisible, setIsConfirmModalVisible] = useState(false); - const [offlineModalVisible, setOfflineModalVisible] = useState(false); - const [downloadErrorModalVisible, setDownloadErrorModalVisible] = useState(false); const policy = useMemo(() => policies?.[`${ONYXKEYS.COLLECTION.POLICY}${report?.policyID}`], [policies, report?.policyID]); const isPolicyAdmin = useMemo(() => isPolicyAdminUtil(policy), [policy]); const isPolicyEmployee = useMemo(() => isPolicyEmployeeUtil(report?.policyID, policies), [report?.policyID, policies]); @@ -252,7 +218,6 @@ function ReportDetailsPage({policies, report, route, reportMetadata}: ReportDeta const participants = useMemo(() => { return getParticipantsList(report, personalDetails, shouldOpenRoomMembersPage); }, [report, personalDetails, shouldOpenRoomMembersPage]); - const connectedIntegration = getConnectedIntegration(policy); let caseID: CaseID; if (isMoneyRequestReport || isInvoiceReport) { @@ -266,13 +231,6 @@ function ReportDetailsPage({policies, report, route, reportMetadata}: ReportDeta caseID = CASES.DEFAULT; } - const transactionIDList = useMemo(() => { - if (caseID !== CASES.MONEY_REPORT || !transactions) { - return []; - } - return transactions.map((transaction) => transaction.transactionID); - }, [caseID, transactions]); - // Get the active chat members by filtering out the pending members with delete action const activeChatMembers = participants.flatMap((accountID) => { const pendingMember = reportMetadata?.pendingChatMembers?.findLast((member) => member.accountID === accountID.toString()); @@ -307,8 +265,6 @@ function ReportDetailsPage({policies, report, route, reportMetadata}: ReportDeta return report; }, [caseID, parentReport, report]); - const moneyRequestAction = transactionThreadReportID ? requestParentReportAction : parentReportAction; - const shouldShowTaskDeleteButton = isTaskReport && !isCanceledTaskReport && @@ -350,22 +306,6 @@ function ReportDetailsPage({policies, report, route, reportMetadata}: ReportDeta }); }, [isPolicyEmployee, isPolicyExpenseChat, isRootGroupChat, report.reportID, report.visibility]); - const [moneyRequestReportActions] = useOnyx(`${ONYXKEYS.COLLECTION.REPORT_ACTIONS}${moneyRequestReport?.reportID}`, {canBeMissing: true}); - const isMoneyRequestExported = isExported(moneyRequestReportActions); - const {isDelegateAccessRestricted} = useDelegateUserDetails(); - const [isNoDelegateAccessMenuVisible, setIsNoDelegateAccessMenuVisible] = useState(false); - - const unapproveExpenseReportOrShowModal = useCallback(() => { - if (isDelegateAccessRestricted) { - setIsNoDelegateAccessMenuVisible(true); - } else if (isMoneyRequestExported) { - setIsUnapproveModalVisible(true); - return; - } - Navigation.goBack(backTo); - unapproveExpenseReport(moneyRequestReport); - }, [isDelegateAccessRestricted, isMoneyRequestExported, backTo, moneyRequestReport]); - const shouldShowLeaveButton = canLeaveChat(report, policy); const shouldShowGoToWorkspace = shouldShowPolicy(policy, false, session?.email) && !policy?.isJoinRequestPending; @@ -388,17 +328,6 @@ function ReportDetailsPage({policies, report, route, reportMetadata}: ReportDeta const shouldShowNotificationPref = !isMoneyRequestReport && !isHiddenForCurrentUser(report); const shouldShowWriteCapability = !isMoneyRequestReport; const shouldShowMenuItem = shouldShowNotificationPref || shouldShowWriteCapability || (!!report?.visibility && report.chatType !== CONST.REPORT.CHAT_TYPE.INVOICE); - const shouldShowCancelPaymentButton = caseID === CASES.MONEY_REPORT && canCancelPayment(moneyRequestReport, session); - const [chatReport] = useOnyx(`${ONYXKEYS.COLLECTION.REPORT}${moneyRequestReport?.chatReportID}`, {canBeMissing: true}); - - const cancelPayment = useCallback(() => { - if (!chatReport) { - return; - } - - cancelPaymentAction(moneyRequestReport, chatReport); - setIsConfirmModalVisible(false); - }, [moneyRequestReport, chatReport]); const menuItems: ReportDetailsPageMenuItem[] = useMemo(() => { const items: ReportDetailsPageMenuItem[] = []; @@ -532,57 +461,6 @@ function ReportDetailsPage({policies, report, route, reportMetadata}: ReportDeta } } - if (!canUseTableReportView && shouldShowCancelPaymentButton) { - items.push({ - key: CONST.REPORT_DETAILS_MENU_ITEM.CANCEL_PAYMENT, - icon: Expensicons.Trashcan, - translationKey: 'iou.cancelPayment', - isAnonymousAction: false, - action: () => setIsConfirmModalVisible(true), - }); - } - - if (caseID === CASES.MONEY_REPORT) { - items.push({ - key: CONST.REPORT_DETAILS_MENU_ITEM.DOWNLOAD_CSV, - translationKey: 'common.downloadAsCSV', - icon: Expensicons.Table, - isAnonymousAction: false, - action: () => { - if (isOffline) { - setOfflineModalVisible(true); - return; - } - - exportReportToCSV({reportID: report.reportID, transactionIDList}, () => { - setDownloadErrorModalVisible(true); - }); - }, - }); - } - - if (policy && connectedIntegration && isPolicyAdmin && !isSingleTransactionView && isExpenseReport) { - items.push({ - key: CONST.REPORT_DETAILS_MENU_ITEM.EXPORT, - translationKey: 'common.export', - icon: Expensicons.Export, - isAnonymousAction: false, - action: () => { - Navigation.navigate(ROUTES.REPORT_WITH_ID_DETAILS_EXPORT.getRoute(report?.reportID, connectedIntegration, backTo)); - }, - }); - } - - if (!canUseTableReportView && canUnapproveIOU(report, policy)) { - items.push({ - key: CONST.REPORT_DETAILS_MENU_ITEM.UNAPPROVE, - icon: Expensicons.CircularArrowBackwards, - translationKey: 'iou.unapprove', - isAnonymousAction: false, - action: () => unapproveExpenseReportOrShowModal(), - }); - } - if (shouldShowGoToWorkspace) { items.push({ key: CONST.REPORT_DETAILS_MENU_ITEM.GO_TO_WORKSPACE, @@ -647,14 +525,6 @@ function ReportDetailsPage({policies, report, route, reportMetadata}: ReportDeta isInvoiceReport, isTaskReport, isCanceledTaskReport, - canUseTableReportView, - shouldShowCancelPaymentButton, - caseID, - policy, - connectedIntegration, - isPolicyAdmin, - isSingleTransactionView, - isExpenseReport, shouldShowGoToWorkspace, shouldShowLeaveButton, isDebugModeEnabled, @@ -666,9 +536,6 @@ function ReportDetailsPage({policies, report, route, reportMetadata}: ReportDeta moneyRequestReport?.reportID, session, isTaskActionable, - isOffline, - transactionIDList, - unapproveExpenseReportOrShowModal, isRootGroupChat, leaveChat, canUseTrackFlows, @@ -691,14 +558,6 @@ function ReportDetailsPage({policies, report, route, reportMetadata}: ReportDeta /> ) : null; - const connectedIntegrationName = connectedIntegration ? translate('workspace.accounting.connectionName', {connectionName: connectedIntegration}) : ''; - const unapproveWarningText = ( - - {translate('iou.headsUp')}{' '} - {translate('iou.unapproveWithIntegrationWarning', {accountingIntegration: connectedIntegrationName})} - - ); - const renderedAvatar = useMemo(() => { if (isMoneyRequestReport || isInvoiceReport) { return ( @@ -745,11 +604,6 @@ function ReportDetailsPage({policies, report, route, reportMetadata}: ReportDeta ); }, [report, icons, isMoneyRequestReport, isInvoiceReport, isGroupChat, isThread, styles]); - const canHoldUnholdReportAction = canHoldUnholdReportActionUtil(moneyRequestAction); - const shouldShowHoldAction = - caseID !== CASES.DEFAULT && - (canHoldUnholdReportAction.canHoldRequest || canHoldUnholdReportAction.canUnholdRequest) && - !isArchivedNonExpenseReport(transactionThreadReportID ? report : parentReport, transactionThreadReportID ? reportNameValuePairs : parentReportNameValuePairs); const canJoin = canJoinChat(report, parentReportAction, policy, reportNameValuePairs); const promotedActions = useMemo(() => { @@ -759,19 +613,6 @@ function ReportDetailsPage({policies, report, route, reportMetadata}: ReportDeta result.push(PromotedActions.join(report)); } - if (!canUseTableReportView && isExpenseReport && shouldShowHoldAction) { - result.push( - PromotedActions.hold({ - isTextHold: canHoldUnholdReportAction.canHoldRequest, - reportAction: moneyRequestAction, - reportID: transactionThreadReportID ? report.reportID : moneyRequestAction?.childReportID, - isDelegateAccessRestricted, - setIsNoDelegateAccessMenuVisible, - currentSearchHash, - }), - ); - } - if (report) { result.push(PromotedActions.pin(report)); } @@ -779,19 +620,7 @@ function ReportDetailsPage({policies, report, route, reportMetadata}: ReportDeta result.push(PromotedActions.share(report, backTo)); return result; - }, [ - canJoin, - canUseTableReportView, - isExpenseReport, - shouldShowHoldAction, - report, - backTo, - canHoldUnholdReportAction.canHoldRequest, - moneyRequestAction, - transactionThreadReportID, - isDelegateAccessRestricted, - currentSearchHash, - ]); + }, [canJoin, report, backTo]); const nameSectionExpenseIOU = ( @@ -1076,19 +905,6 @@ function ReportDetailsPage({policies, report, route, reportMetadata}: ReportDeta confirmText={translate('common.leave')} cancelText={translate('common.cancel')} /> - {!canUseTableReportView && ( - setIsConfirmModalVisible(false)} - prompt={translate('iou.cancelPaymentConfirmation')} - confirmText={translate('iou.cancelPayment')} - cancelText={translate('common.dismiss')} - danger - shouldEnableNewFocusManagement - /> - )} - {!canUseTableReportView && ( - setIsNoDelegateAccessMenuVisible(false)} - /> - )} - { - setIsUnapproveModalVisible(false); - Navigation.goBack(backTo); - unapproveExpenseReport(moneyRequestReport); - }} - cancelText={translate('common.cancel')} - onCancel={() => setIsUnapproveModalVisible(false)} - prompt={unapproveWarningText} - /> - setOfflineModalVisible(false)} - secondOptionText={translate('common.buttonConfirm')} - isVisible={offlineModalVisible} - onClose={() => setOfflineModalVisible(false)} - /> - setDownloadErrorModalVisible(false)} - secondOptionText={translate('common.buttonConfirm')} - isVisible={downloadErrorModalVisible} - onClose={() => setDownloadErrorModalVisible(false)} - /> ); diff --git a/tests/unit/PromotedActionsBarTest.ts b/tests/unit/PromotedActionsBarTest.ts deleted file mode 100644 index 97dfa2e8bd35..000000000000 --- a/tests/unit/PromotedActionsBarTest.ts +++ /dev/null @@ -1,142 +0,0 @@ -import Onyx from 'react-native-onyx'; -import {PromotedActions} from '@components/PromotedActionsBar'; -import OnyxUpdateManager from '@libs/actions/OnyxUpdateManager'; -import isSearchTopmostFullScreenRoute from '@libs/Navigation/helpers/isSearchTopmostFullScreenRoute'; -import CONST from '@src/CONST'; -import ONYXKEYS from '@src/ONYXKEYS'; -import type {ReportAction, Transaction} from '@src/types/onyx'; -import createRandomReportAction from '../utils/collections/reportActions'; -import createRandomTransaction from '../utils/collections/transaction'; -import {getGlobalFetchMock} from '../utils/TestHelper'; -import waitForBatchedUpdates from '../utils/waitForBatchedUpdates'; - -jest.mock('@libs/Navigation/helpers/isSearchTopmostFullScreenRoute', () => jest.fn()); - -const mockedIsSearchTopmostFullScreenRoute = isSearchTopmostFullScreenRoute as jest.MockedFunction; - -OnyxUpdateManager(); -describe('PromotedActionsBar', () => { - beforeAll(() => { - Onyx.init({ - keys: ONYXKEYS, - }); - }); - - beforeEach(() => { - global.fetch = getGlobalFetchMock(); - mockedIsSearchTopmostFullScreenRoute.mockReset(); - return Onyx.clear().then(waitForBatchedUpdates); - }); - - describe('hold', () => { - it('should not optimistically update the search snapshot if the topmost central pane is not search', async () => { - // Given a held transaction - const IOUReportID = '1'; - const IOUTransactionID = '2'; - const searchHash = 2; - const reportAction: ReportAction<'IOU'> = { - ...createRandomReportAction(0), - actionName: CONST.REPORT.ACTIONS.TYPE.IOU, - originalMessage: { - amount: 100, - currency: 'USD', - type: 'create', - IOUReportID, - IOUTransactionID, - }, - message: [], - previousMessage: [], - }; - const transaction: Transaction = { - ...createRandomTransaction(Number(IOUTransactionID)), - comment: { - hold: '1', - }, - }; - await Onyx.merge(`${ONYXKEYS.COLLECTION.REPORT}${IOUReportID}`, { - reportID: IOUReportID, - }); - await Onyx.merge(`${ONYXKEYS.COLLECTION.TRANSACTION}${IOUTransactionID}`, transaction); - - // When the user unheld the transaction not from the search central pane - PromotedActions.hold({ - isTextHold: false, - reportAction, - reportID: '1', - isDelegateAccessRestricted: false, - setIsNoDelegateAccessMenuVisible: () => {}, - currentSearchHash: searchHash, - }).onSelected(); - - await waitForBatchedUpdates(); - - // Then the search snapshot should not be updated optimistically - await new Promise((resolve) => { - const connection = Onyx.connect({ - key: `${ONYXKEYS.COLLECTION.SNAPSHOT}${searchHash}`, - callback: (snapshot) => { - Onyx.disconnect(connection); - expect(snapshot).toBeUndefined(); - resolve(); - }, - }); - }); - }); - - it('should optimistically update the search snapshot if the topmost central pane is search', async () => { - // Given a held transaction - const IOUReportID = '1'; - const IOUTransactionID = '2'; - const searchHash = 2; - const reportAction: ReportAction<'IOU'> = { - ...createRandomReportAction(0), - childReportID: '3', - actionName: CONST.REPORT.ACTIONS.TYPE.IOU, - originalMessage: { - amount: 100, - currency: 'USD', - type: 'create', - IOUReportID, - IOUTransactionID, - }, - message: [], - previousMessage: [], - }; - const transaction: Transaction = { - ...createRandomTransaction(Number(IOUTransactionID)), - comment: { - hold: '1', - }, - }; - await Onyx.merge(`${ONYXKEYS.COLLECTION.REPORT}${IOUReportID}`, { - reportID: IOUReportID, - }); - await Onyx.merge(`${ONYXKEYS.COLLECTION.TRANSACTION}${IOUTransactionID}`, transaction); - - // When the user unheld the transaction from the search central pane - mockedIsSearchTopmostFullScreenRoute.mockReturnValueOnce(true); - PromotedActions.hold({ - isTextHold: false, - reportAction, - reportID: '1', - isDelegateAccessRestricted: false, - setIsNoDelegateAccessMenuVisible: () => {}, - currentSearchHash: searchHash, - }).onSelected(); - - await waitForBatchedUpdates(); - - // Then the search snapshot should be updated optimistically - await new Promise((resolve) => { - const connection = Onyx.connect({ - key: `${ONYXKEYS.COLLECTION.SNAPSHOT}${searchHash}`, - callback: (snapshot) => { - Onyx.disconnect(connection); - expect(snapshot).not.toBeUndefined(); - resolve(); - }, - }); - }); - }); - }); -});