@@ -3,7 +3,7 @@ import {accountIDSelector} from '@selectors/Session';
33import React , { useCallback , useContext , useEffect , useMemo , useRef , useState } from 'react' ;
44import type { NativeScrollEvent , NativeSyntheticEvent , StyleProp , ViewStyle } from 'react-native' ;
55import { View } from 'react-native' ;
6- import type { OnyxEntry } from 'react-native-onyx' ;
6+ import type { OnyxCollection , OnyxEntry } from 'react-native-onyx' ;
77import Animated , { FadeIn , FadeOut , useAnimatedStyle , useSharedValue , withTiming } from 'react-native-reanimated' ;
88import FullPageErrorView from '@components/BlockingViews/FullPageErrorView' ;
99import FullPageOfflineBlockingView from '@components/BlockingViews/FullPageOfflineBlockingView' ;
@@ -12,6 +12,7 @@ import type {ReportActionListItemType, SearchListItem, SelectionListHandle, Tran
1212import SearchRowSkeleton from '@components/Skeletons/SearchRowSkeleton' ;
1313import { WideRHPContext } from '@components/WideRHPContextProvider' ;
1414import useCardFeedsForDisplay from '@hooks/useCardFeedsForDisplay' ;
15+ import useCurrentUserPersonalDetails from '@hooks/useCurrentUserPersonalDetails' ;
1516import useLocalize from '@hooks/useLocalize' ;
1617import useNetwork from '@hooks/useNetwork' ;
1718import useOnyx from '@hooks/useOnyx' ;
@@ -29,6 +30,7 @@ import Log from '@libs/Log';
2930import isSearchTopmostFullScreenRoute from '@libs/Navigation/helpers/isSearchTopmostFullScreenRoute' ;
3031import type { PlatformStackNavigationProp } from '@libs/Navigation/PlatformStackNavigation/types' ;
3132import Performance from '@libs/Performance' ;
33+ import { getPolicyRole , isPaidGroupPolicy as isPaidGroupPolicyPolicyUtils } from '@libs/PolicyUtils' ;
3234import { getIOUActionForTransactionID } from '@libs/ReportActionsUtils' ;
3335import { canEditFieldOfMoneyRequest , selectArchivedReportsIdSet , selectFilteredReportActions } from '@libs/ReportUtils' ;
3436import { buildCannedSearchQuery , buildSearchQueryJSON , buildSearchQueryString } from '@libs/SearchQueryUtils' ;
@@ -90,6 +92,7 @@ function mapTransactionItemToSelectedEntry(
9092 item : TransactionListItemType ,
9193 reportActions : ReportAction [ ] ,
9294 outstandingReportsByPolicyID ?: OutstandingReportsByPolicyIDDerivedValue ,
95+ canMoveExpense = true ,
9396) : [ string , SelectedTransactionInfo ] {
9497 return [
9598 item . keyForList ,
@@ -105,7 +108,7 @@ function mapTransactionItemToSelectedEntry(
105108 undefined ,
106109 undefined ,
107110 outstandingReportsByPolicyID ,
108- true ,
111+ canMoveExpense ,
109112 ) ,
110113 action : item . action ,
111114 reportID : item . reportID ,
@@ -166,6 +169,7 @@ function prepareTransactionsList(
166169 selectedTransactions : SelectedTransactions ,
167170 reportActions : ReportAction [ ] ,
168171 outstandingReportsByPolicyID ?: OutstandingReportsByPolicyIDDerivedValue ,
172+ canMoveExpense = true ,
169173) {
170174 if ( selectedTransactions [ item . keyForList ] ?. isSelected ) {
171175 const { [ item . keyForList ] : omittedTransaction , ...transactions } = selectedTransactions ;
@@ -187,7 +191,7 @@ function prepareTransactionsList(
187191 undefined ,
188192 undefined ,
189193 outstandingReportsByPolicyID ,
190- true ,
194+ canMoveExpense ,
191195 ) ,
192196 action : item . action ,
193197 reportID : item . reportID ,
@@ -201,6 +205,10 @@ function prepareTransactionsList(
201205 } ;
202206}
203207
208+ const activePaidPoliciesSelector = ( allPolicies : OnyxCollection < Policy > ) : OnyxCollection < Policy > => {
209+ return Object . fromEntries ( Object . entries ( allPolicies ?? { } ) . filter ( ( [ , userPolicy ] ) => isPaidGroupPolicyPolicyUtils ( userPolicy ) ) ) ;
210+ } ;
211+
204212function Search ( { queryJSON, searchResults, onSearchListScroll, contentContainerStyle, handleSearch, isMobileSelectionModeEnabled, onSortPressedCallback} : SearchProps ) {
205213 const { type, status, sortBy, sortOrder, hash, similarSearchHash, groupBy} = queryJSON ;
206214 const { isOffline} = useNetwork ( ) ;
@@ -235,6 +243,14 @@ function Search({queryJSON, searchResults, onSearchListScroll, contentContainerS
235243 const [ outstandingReportsByPolicyID ] = useOnyx ( ONYXKEYS . DERIVED . OUTSTANDING_REPORTS_BY_POLICY_ID , { canBeMissing : true } ) ;
236244 const [ violations ] = useOnyx ( ONYXKEYS . COLLECTION . TRANSACTION_VIOLATIONS , { canBeMissing : true } ) ;
237245
246+ const [ activePaidPolicies ] = useOnyx ( ONYXKEYS . COLLECTION . POLICY , {
247+ selector : activePaidPoliciesSelector ,
248+ canBeMissing : true ,
249+ } ) ;
250+
251+ const { login : currentUserLogin } = useCurrentUserPersonalDetails ( ) ;
252+ const isUserWorkspaceMember = ! ! Object . values ( activePaidPolicies ?? { } ) . filter ( ( userPolicy ) => getPolicyRole ( userPolicy , currentUserLogin ) ) . length ;
253+
238254 // Filter violations based on user visibility
239255 const filteredViolations = useMemo ( ( ) => {
240256 if ( ! violations || ! searchResults ?. data ) {
@@ -444,7 +460,7 @@ function Search({queryJSON, searchResults, onSearchListScroll, contentContainerS
444460 undefined ,
445461 undefined ,
446462 outstandingReportsByPolicyID ,
447- true ,
463+ isUserWorkspaceMember ,
448464 ) ,
449465 // eslint-disable-next-line @typescript-eslint/prefer-nullish-coalescing
450466 isSelected : areAllMatchingItemsSelected || selectedTransactions [ transaction . transactionID ] . isSelected ,
@@ -477,7 +493,7 @@ function Search({queryJSON, searchResults, onSearchListScroll, contentContainerS
477493 undefined ,
478494 undefined ,
479495 outstandingReportsByPolicyID ,
480- true ,
496+ isUserWorkspaceMember ,
481497 ) ,
482498 // eslint-disable-next-line @typescript-eslint/prefer-nullish-coalescing
483499 isSelected : areAllMatchingItemsSelected || selectedTransactions [ transaction . transactionID ] . isSelected ,
@@ -499,7 +515,7 @@ function Search({queryJSON, searchResults, onSearchListScroll, contentContainerS
499515
500516 isRefreshingSelection . current = true ;
501517 // eslint-disable-next-line react-compiler/react-compiler, react-hooks/exhaustive-deps
502- } , [ data , setSelectedTransactions , areAllMatchingItemsSelected , isFocused , outstandingReportsByPolicyID ] ) ;
518+ } , [ data , setSelectedTransactions , areAllMatchingItemsSelected , isFocused , outstandingReportsByPolicyID , isUserWorkspaceMember ] ) ;
503519
504520 useEffect ( ( ) => {
505521 if ( ! isSearchResultsEmpty || prevIsSearchResultEmpty ) {
@@ -559,7 +575,7 @@ function Search({queryJSON, searchResults, onSearchListScroll, contentContainerS
559575 if ( isTransactionPendingDelete ( item ) ) {
560576 return ;
561577 }
562- setSelectedTransactions ( prepareTransactionsList ( item , selectedTransactions , reportActionsArray , outstandingReportsByPolicyID ) , data ) ;
578+ setSelectedTransactions ( prepareTransactionsList ( item , selectedTransactions , reportActionsArray , outstandingReportsByPolicyID , isUserWorkspaceMember ) , data ) ;
563579 return ;
564580 }
565581
@@ -581,13 +597,13 @@ function Search({queryJSON, searchResults, onSearchListScroll, contentContainerS
581597 ...Object . fromEntries (
582598 currentTransactions
583599 . filter ( ( t ) => ! isTransactionPendingDelete ( t ) )
584- . map ( ( transactionItem ) => mapTransactionItemToSelectedEntry ( transactionItem , reportActionsArray , outstandingReportsByPolicyID ) ) ,
600+ . map ( ( transactionItem ) => mapTransactionItemToSelectedEntry ( transactionItem , reportActionsArray , outstandingReportsByPolicyID , isUserWorkspaceMember ) ) ,
585601 ) ,
586602 } ,
587603 data ,
588604 ) ;
589605 } ,
590- [ data , reportActionsArray , selectedTransactions , outstandingReportsByPolicyID , setSelectedTransactions ] ,
606+ [ setSelectedTransactions , selectedTransactions , data , reportActionsArray , outstandingReportsByPolicyID , isUserWorkspaceMember ] ,
591607 ) ;
592608
593609 const onSelectRow = useCallback (
@@ -794,7 +810,7 @@ function Search({queryJSON, searchResults, onSearchListScroll, contentContainerS
794810 ( data as TransactionGroupListItemType [ ] ) . flatMap ( ( item ) =>
795811 item . transactions
796812 . filter ( ( t ) => ! isTransactionPendingDelete ( t ) )
797- . map ( ( transactionItem ) => mapTransactionItemToSelectedEntry ( transactionItem , reportActionsArray , outstandingReportsByPolicyID ) ) ,
813+ . map ( ( transactionItem ) => mapTransactionItemToSelectedEntry ( transactionItem , reportActionsArray , outstandingReportsByPolicyID , isUserWorkspaceMember ) ) ,
798814 ) ,
799815 ) ,
800816 data ,
@@ -807,11 +823,11 @@ function Search({queryJSON, searchResults, onSearchListScroll, contentContainerS
807823 Object . fromEntries (
808824 ( data as TransactionListItemType [ ] )
809825 . filter ( ( t ) => ! isTransactionPendingDelete ( t ) )
810- . map ( ( transactionItem ) => mapTransactionItemToSelectedEntry ( transactionItem , reportActionsArray , outstandingReportsByPolicyID ) ) ,
826+ . map ( ( transactionItem ) => mapTransactionItemToSelectedEntry ( transactionItem , reportActionsArray , outstandingReportsByPolicyID , isUserWorkspaceMember ) ) ,
811827 ) ,
812828 data ,
813829 ) ;
814- } , [ clearSelectedTransactions , data , groupBy , reportActionsArray , selectedTransactions , setSelectedTransactions , outstandingReportsByPolicyID ] ) ;
830+ } , [ groupBy , selectedTransactions , setSelectedTransactions , data , clearSelectedTransactions , reportActionsArray , outstandingReportsByPolicyID , isUserWorkspaceMember ] ) ;
815831
816832 const onLayout = useCallback ( ( ) => handleSelectionListScroll ( sortedSelectedData , searchListRef . current ) , [ handleSelectionListScroll , sortedSelectedData ] ) ;
817833
0 commit comments