Skip to content

Commit 1b9196e

Browse files
committed
Split SearchUtils into two files
1 parent 927b40d commit 1b9196e

29 files changed

+560
-557
lines changed

src/components/Search/SearchContext.tsx

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
import React, {useCallback, useContext, useMemo, useState} from 'react';
22
import type {ReportActionListItemType, ReportListItemType, TransactionListItemType} from '@components/SelectionList/types';
3-
import * as SearchUtils from '@libs/SearchUtils';
3+
import * as SearchUIUtils from '@libs/SearchUIUtils';
44
import type ChildrenProps from '@src/types/utils/ChildrenProps';
55
import type {SearchContext, SelectedTransactions} from './types';
66

@@ -23,8 +23,8 @@ function getReportsFromSelectedTransactions(data: TransactionListItemType[] | Re
2323
return (data ?? [])
2424
.filter(
2525
(item) =>
26-
!SearchUtils.isTransactionListItemType(item) &&
27-
!SearchUtils.isReportActionListItemType(item) &&
26+
!SearchUIUtils.isTransactionListItemType(item) &&
27+
!SearchUIUtils.isReportActionListItemType(item) &&
2828
item.reportID &&
2929
item?.transactions?.every((transaction: {keyForList: string | number}) => selectedTransactions[transaction.keyForList]?.isSelected),
3030
)

src/components/Search/SearchPageHeader.tsx

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,7 @@ import * as SearchActions from '@libs/actions/Search';
2323
import Log from '@libs/Log';
2424
import Navigation from '@libs/Navigation/Navigation';
2525
import {getAllTaxRates} from '@libs/PolicyUtils';
26-
import * as SearchUtils from '@libs/SearchUtils';
26+
import * as SearchQueryUtils from '@libs/SearchQueryUtils';
2727
import SearchSelectedNarrow from '@pages/Search/SearchSelectedNarrow';
2828
import variables from '@styles/variables';
2929
import CONST from '@src/CONST';
@@ -136,8 +136,8 @@ function SearchPageHeader({queryJSON, hash}: SearchPageHeaderProps) {
136136
const [isDownloadErrorModalVisible, setIsDownloadErrorModalVisible] = useState(false);
137137

138138
const {status, type} = queryJSON;
139-
const isCannedQuery = SearchUtils.isCannedSearchQuery(queryJSON);
140-
const headerText = isCannedQuery ? translate(getHeaderContent(type).titleText) : SearchUtils.getSearchHeaderTitle(queryJSON, personalDetails, cardList, reports, taxRates);
139+
const isCannedQuery = SearchQueryUtils.isCannedSearchQuery(queryJSON);
140+
const headerText = isCannedQuery ? translate(getHeaderContent(type).titleText) : SearchQueryUtils.getSearchHeaderTitle(queryJSON, personalDetails, cardList, reports, taxRates);
141141
const [inputValue, setInputValue] = useState(headerText);
142142

143143
useEffect(() => {
@@ -327,7 +327,7 @@ function SearchPageHeader({queryJSON, hash}: SearchPageHeaderProps) {
327327
}
328328

329329
const onPress = () => {
330-
const filterFormValues = SearchUtils.buildFilterFormValuesFromQuery(queryJSON, policyCategories, policyTagsLists, currencyList, personalDetails, cardList, reports, taxRates);
330+
const filterFormValues = SearchQueryUtils.buildFilterFormValuesFromQuery(queryJSON, policyCategories, policyTagsLists, currencyList, personalDetails, cardList, reports, taxRates);
331331
SearchActions.updateAdvancedFilters(filterFormValues);
332332

333333
Navigation.navigate(ROUTES.SEARCH_ADVANCED_FILTERS);
@@ -337,10 +337,10 @@ function SearchPageHeader({queryJSON, hash}: SearchPageHeaderProps) {
337337
if (!inputValue) {
338338
return;
339339
}
340-
const inputQueryJSON = SearchUtils.buildSearchQueryJSON(inputValue);
340+
const inputQueryJSON = SearchQueryUtils.buildSearchQueryJSON(inputValue);
341341
if (inputQueryJSON) {
342-
const standardizedQuery = SearchUtils.standardizeQueryJSON(inputQueryJSON, cardList, taxRates);
343-
const query = SearchUtils.buildSearchQueryString(standardizedQuery);
342+
const standardizedQuery = SearchQueryUtils.standardizeQueryJSON(inputQueryJSON, cardList, taxRates);
343+
const query = SearchQueryUtils.buildSearchQueryString(standardizedQuery);
344344
SearchActions.clearAllFilters();
345345
Navigation.navigate(ROUTES.SEARCH_CENTRAL_PANE.getRoute({query}));
346346
} else {

src/components/Search/SearchRouter/SearchRouter.tsx

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@ import Log from '@libs/Log';
1616
import * as OptionsListUtils from '@libs/OptionsListUtils';
1717
import {getAllTaxRates} from '@libs/PolicyUtils';
1818
import type {OptionData} from '@libs/ReportUtils';
19-
import * as SearchUtils from '@libs/SearchUtils';
19+
import * as SearchQueryUtils from '@libs/SearchQueryUtils';
2020
import Navigation from '@navigation/Navigation';
2121
import variables from '@styles/variables';
2222
import * as Report from '@userActions/Report';
@@ -117,7 +117,7 @@ function SearchRouter() {
117117
return;
118118
}
119119
listRef.current?.updateAndScrollToFocusedIndex(0);
120-
const queryJSON = SearchUtils.buildSearchQueryJSON(userQuery);
120+
const queryJSON = SearchQueryUtils.buildSearchQueryJSON(userQuery);
121121

122122
if (queryJSON) {
123123
setUserSearchQuery(queryJSON);
@@ -148,8 +148,8 @@ function SearchRouter() {
148148
return;
149149
}
150150
closeSearchRouter();
151-
const standardizedQuery = SearchUtils.standardizeQueryJSON(query, cardList, taxRates);
152-
const queryString = SearchUtils.buildSearchQueryString(standardizedQuery);
151+
const standardizedQuery = SearchQueryUtils.standardizeQueryJSON(query, cardList, taxRates);
152+
const queryString = SearchQueryUtils.buildSearchQueryString(standardizedQuery);
153153
Navigation.navigate(ROUTES.SEARCH_CENTRAL_PANE.getRoute({query: queryString}));
154154
clearUserQuery();
155155
},

src/components/Search/SearchRouter/SearchRouterList.tsx

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@ import useThemeStyles from '@hooks/useThemeStyles';
1515
import Navigation from '@libs/Navigation/Navigation';
1616
import {getAllTaxRates} from '@libs/PolicyUtils';
1717
import type {OptionData} from '@libs/ReportUtils';
18-
import * as SearchUtils from '@libs/SearchUtils';
18+
import * as SearchQueryUtils from '@libs/SearchQueryUtils';
1919
import * as Report from '@userActions/Report';
2020
import ONYXKEYS from '@src/ONYXKEYS';
2121
import ROUTES from '@src/ROUTES';
@@ -113,7 +113,7 @@ function SearchRouterList(
113113
{
114114
text: `${translate('search.searchIn')} ${reportForContextualSearch.text ?? reportForContextualSearch.alternateText}`,
115115
singleIcon: Expensicons.MagnifyingGlass,
116-
query: SearchUtils.getContextualSuggestionQuery(reportForContextualSearch.reportID),
116+
query: SearchQueryUtils.getContextualSuggestionQuery(reportForContextualSearch.reportID),
117117
itemStyle: styles.activeComponentBG,
118118
keyForList: 'contextualSearch',
119119
isContextualSearchItem: true,
@@ -123,9 +123,9 @@ function SearchRouterList(
123123
}
124124

125125
const recentSearchesData = recentSearches?.map(({query}) => {
126-
const searchQueryJSON = SearchUtils.buildSearchQueryJSON(query);
126+
const searchQueryJSON = SearchQueryUtils.buildSearchQueryJSON(query);
127127
return {
128-
text: searchQueryJSON ? SearchUtils.getSearchHeaderTitle(searchQueryJSON, personalDetails, cardList, reports, taxRates) : query,
128+
text: searchQueryJSON ? SearchQueryUtils.getSearchHeaderTitle(searchQueryJSON, personalDetails, cardList, reports, taxRates) : query,
129129
singleIcon: Expensicons.History,
130130
query,
131131
keyForList: query,
@@ -152,7 +152,7 @@ function SearchRouterList(
152152
if (!item?.query) {
153153
return;
154154
}
155-
onSearchSubmit(SearchUtils.buildSearchQueryJSON(item?.query));
155+
onSearchSubmit(SearchQueryUtils.buildSearchQueryJSON(item?.query));
156156
}
157157

158158
// Handle selection of "Recent chat"

src/components/Search/SearchStatusBar.tsx

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@ import useStyleUtils from '@hooks/useStyleUtils';
1111
import useTheme from '@hooks/useTheme';
1212
import useThemeStyles from '@hooks/useThemeStyles';
1313
import Navigation from '@libs/Navigation/Navigation';
14-
import * as SearchUtils from '@libs/SearchUtils';
14+
import * as SearchQueryUtils from '@libs/SearchQueryUtils';
1515
import CONST from '@src/CONST';
1616
import type {TranslationPaths} from '@src/languages/types';
1717
import type {SearchDataTypes} from '@src/types/onyx/SearchResults';
@@ -177,7 +177,7 @@ function SearchStatusBar({queryJSON, onStatusChange}: SearchStatusBarProps) {
177177
{options.map((item, index) => {
178178
const onPress = singleExecution(() => {
179179
onStatusChange?.();
180-
const query = SearchUtils.buildSearchQueryString({...queryJSON, status: item.status});
180+
const query = SearchQueryUtils.buildSearchQueryString({...queryJSON, status: item.status});
181181
Navigation.setParams({q: query});
182182
});
183183
const isActive = queryJSON.status === item.status;

src/components/Search/index.tsx

Lines changed: 17 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,8 @@ import * as DeviceCapabilities from '@libs/DeviceCapabilities';
2222
import Log from '@libs/Log';
2323
import memoize from '@libs/memoize';
2424
import * as ReportUtils from '@libs/ReportUtils';
25-
import * as SearchUtils from '@libs/SearchUtils';
25+
import * as SearchQueryUtils from '@libs/SearchQueryUtils';
26+
import * as SearchUIUtils from '@libs/SearchUIUtils';
2627
import Navigation from '@navigation/Navigation';
2728
import type {AuthScreensParamList} from '@navigation/types';
2829
import EmptySearchView from '@pages/Search/EmptySearchView';
@@ -60,11 +61,11 @@ function mapToItemWithSelectionInfo(
6061
canSelectMultiple: boolean,
6162
shouldAnimateInHighlight: boolean,
6263
) {
63-
if (SearchUtils.isReportActionListItemType(item)) {
64+
if (SearchUIUtils.isReportActionListItemType(item)) {
6465
return item;
6566
}
6667

67-
return SearchUtils.isTransactionListItemType(item)
68+
return SearchUIUtils.isTransactionListItemType(item)
6869
? mapToTransactionItemWithSelectionInfo(item, selectedTransactions, canSelectMultiple, shouldAnimateInHighlight)
6970
: {
7071
...item,
@@ -139,7 +140,7 @@ function Search({queryJSON, onSearchListScroll, contentContainerStyle}: SearchPr
139140

140141
const getItemHeight = useCallback(
141142
(item: TransactionListItemType | ReportListItemType | ReportActionListItemType) => {
142-
if (SearchUtils.isTransactionListItemType(item) || SearchUtils.isReportActionListItemType(item)) {
143+
if (SearchUIUtils.isTransactionListItemType(item) || SearchUIUtils.isReportActionListItemType(item)) {
143144
return isLargeScreenWidth ? variables.optionRowHeight + listItemPadding : transactionItemMobileHeight + listItemPadding;
144145
}
145146

@@ -186,9 +187,9 @@ function Search({queryJSON, onSearchListScroll, contentContainerStyle}: SearchPr
186187
const isDataLoaded = searchResults?.data !== undefined && searchResults?.search?.type === type && searchResults?.search?.status === status;
187188
const shouldShowLoadingState = !isOffline && !isDataLoaded;
188189
const shouldShowLoadingMoreItems = !shouldShowLoadingState && searchResults?.search?.isLoading && searchResults?.search?.offset > 0;
189-
const isSearchResultsEmpty = !searchResults?.data || SearchUtils.isSearchResultsEmpty(searchResults);
190+
const isSearchResultsEmpty = !searchResults?.data || SearchUIUtils.isSearchResultsEmpty(searchResults);
190191
const prevIsSearchResultEmpty = usePrevious(isSearchResultsEmpty);
191-
const data = searchResults === undefined ? [] : SearchUtils.getSections(type, status, searchResults.data, searchResults.search);
192+
const data = searchResults === undefined ? [] : SearchUIUtils.getSections(type, status, searchResults.data, searchResults.search);
192193

193194
useEffect(() => {
194195
/** We only want to display the skeleton for the status filters the first time we load them for a specific data type */
@@ -260,8 +261,8 @@ function Search({queryJSON, onSearchListScroll, contentContainerStyle}: SearchPr
260261
return <FullPageOfflineBlockingView>{null}</FullPageOfflineBlockingView>;
261262
}
262263

263-
const ListItem = SearchUtils.getListItem(type, status);
264-
const sortedData = SearchUtils.getSortedSections(type, status, data, sortBy, sortOrder);
264+
const ListItem = SearchUIUtils.getListItem(type, status);
265+
const sortedData = SearchUIUtils.getSortedSections(type, status, data, sortBy, sortOrder);
265266
const sortedSelectedData = sortedData.map((item) => {
266267
const baseKey = `${ONYXKEYS.COLLECTION.TRANSACTION}${(item as TransactionListItemType).transactionID}`;
267268
// Check if the base key matches the newSearchResultKey (TransactionListItemType)
@@ -288,10 +289,10 @@ function Search({queryJSON, onSearchListScroll, contentContainerStyle}: SearchPr
288289
}
289290

290291
const toggleTransaction = (item: TransactionListItemType | ReportListItemType | ReportActionListItemType) => {
291-
if (SearchUtils.isReportActionListItemType(item)) {
292+
if (SearchUIUtils.isReportActionListItemType(item)) {
292293
return;
293294
}
294-
if (SearchUtils.isTransactionListItemType(item)) {
295+
if (SearchUIUtils.isTransactionListItemType(item)) {
295296
if (!item.keyForList) {
296297
return;
297298
}
@@ -322,21 +323,21 @@ function Search({queryJSON, onSearchListScroll, contentContainerStyle}: SearchPr
322323

323324
const openReport = (item: TransactionListItemType | ReportListItemType | ReportActionListItemType) => {
324325
const isFromSelfDM = item.reportID === CONST.REPORT.UNREPORTED_REPORTID;
325-
let reportID = SearchUtils.isTransactionListItemType(item) && (!item.isFromOneTransactionReport || isFromSelfDM) ? item.transactionThreadReportID : item.reportID;
326+
let reportID = SearchUIUtils.isTransactionListItemType(item) && (!item.isFromOneTransactionReport || isFromSelfDM) ? item.transactionThreadReportID : item.reportID;
326327

327328
if (!reportID) {
328329
return;
329330
}
330331

331332
// If we're trying to open a legacy transaction without a transaction thread, let's create the thread and navigate the user
332-
if (SearchUtils.isTransactionListItemType(item) && reportID === '0' && item.moneyRequestReportActionID) {
333+
if (SearchUIUtils.isTransactionListItemType(item) && reportID === '0' && item.moneyRequestReportActionID) {
333334
reportID = ReportUtils.generateReportID();
334335
SearchActions.createTransactionThread(hash, item.transactionID, reportID, item.moneyRequestReportActionID);
335336
}
336337

337338
const backTo = Navigation.getActiveRoute();
338339

339-
if (SearchUtils.isReportActionListItemType(item)) {
340+
if (SearchUIUtils.isReportActionListItemType(item)) {
340341
const reportActionID = item.reportActionID;
341342
Navigation.navigate(ROUTES.SEARCH_REPORT.getRoute({reportID, reportActionID, backTo}));
342343
return;
@@ -372,11 +373,11 @@ function Search({queryJSON, onSearchListScroll, contentContainerStyle}: SearchPr
372373
};
373374

374375
const onSortPress = (column: SearchColumnType, order: SortOrder) => {
375-
const newQuery = SearchUtils.buildSearchQueryString({...queryJSON, sortBy: column, sortOrder: order});
376+
const newQuery = SearchQueryUtils.buildSearchQueryString({...queryJSON, sortBy: column, sortOrder: order});
376377
navigation.setParams({q: newQuery});
377378
};
378379

379-
const shouldShowYear = SearchUtils.shouldShowYear(searchResults?.data);
380+
const shouldShowYear = SearchUIUtils.shouldShowYear(searchResults?.data);
380381
const shouldShowSorting = sortableSearchStatuses.includes(status);
381382

382383
return (
@@ -401,7 +402,7 @@ function Search({queryJSON, onSearchListScroll, contentContainerStyle}: SearchPr
401402
)
402403
}
403404
isSelected={(item) =>
404-
status !== CONST.SEARCH.STATUS.EXPENSE.ALL && SearchUtils.isReportListItemType(item)
405+
status !== CONST.SEARCH.STATUS.EXPENSE.ALL && SearchUIUtils.isReportListItemType(item)
405406
? item.transactions.some((transaction) => selectedTransactions[transaction.keyForList]?.isSelected)
406407
: !!item.isSelected
407408
}

src/components/SelectionList/BaseSelectionList.tsx

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,7 @@ import useSingleExecution from '@hooks/useSingleExecution';
2424
import useThemeStyles from '@hooks/useThemeStyles';
2525
import getSectionsWithIndexOffset from '@libs/getSectionsWithIndexOffset';
2626
import Log from '@libs/Log';
27-
import * as SearchUtils from '@libs/SearchUtils';
27+
import * as SearchUIUtils from '@libs/SearchUIUtils';
2828
import variables from '@styles/variables';
2929
import CONST from '@src/CONST';
3030
import {isEmptyObject} from '@src/types/utils/EmptyObject';
@@ -437,7 +437,7 @@ function BaseSelectionList<TItem extends ListItem>(
437437
const showTooltip = shouldShowTooltips && normalizedIndex < 10;
438438

439439
const handleOnCheckboxPress = () => {
440-
if (SearchUtils.isReportListItemType(item)) {
440+
if (SearchUIUtils.isReportListItemType(item)) {
441441
return onCheckboxPress;
442442
}
443443
return onCheckboxPress ? () => onCheckboxPress(item) : undefined;

src/components/SelectionList/Search/ExpenseItemHeaderNarrow.tsx

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@ import {PressableWithFeedback} from '@components/Pressable';
77
import useStyleUtils from '@hooks/useStyleUtils';
88
import useTheme from '@hooks/useTheme';
99
import useThemeStyles from '@hooks/useThemeStyles';
10-
import * as SearchUtils from '@libs/SearchUtils';
10+
import * as SearchUIUtils from '@libs/SearchUIUtils';
1111
import variables from '@styles/variables';
1212
import CONST from '@src/CONST';
1313
import type {SearchPersonalDetails, SearchTransactionAction} from '@src/types/onyx/SearchResults';
@@ -50,7 +50,7 @@ function ExpenseItemHeaderNarrow({
5050
const theme = useTheme();
5151

5252
// It might happen that we are missing display names for `From` or `To`, we only display arrow icon if both names exist
53-
const shouldDisplayArrowIcon = SearchUtils.isCorrectSearchUserName(participantFromDisplayName) && SearchUtils.isCorrectSearchUserName(participantToDisplayName);
53+
const shouldDisplayArrowIcon = SearchUIUtils.isCorrectSearchUserName(participantFromDisplayName) && SearchUIUtils.isCorrectSearchUserName(participantToDisplayName);
5454

5555
return (
5656
<View style={[styles.flex1, styles.flexRow, styles.alignItemsCenter, styles.justifyContentBetween, styles.mb3, styles.gap2, containerStyle]}>

src/components/SelectionList/Search/ReportListItem.tsx

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -110,7 +110,7 @@ function ReportListItem<TItem extends ListItem>({
110110
const participantFrom = reportItem.from;
111111
const participantTo = reportItem.to;
112112

113-
// These values should come as part of the item via SearchUtils.getSections() but ReportListItem is not yet 100% handled
113+
// These values should come as part of the item via SearchUIUtils.getSections() but ReportListItem is not yet 100% handled
114114
// This will be simplified in future once sorting of ReportListItem is done
115115
const participantFromDisplayName = participantFrom?.displayName ?? participantFrom?.login ?? '';
116116
const participantToDisplayName = participantTo?.displayName ?? participantTo?.login ?? '';

src/components/SelectionList/Search/UserInfoCell.tsx

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@ import Avatar from '@components/Avatar';
44
import Text from '@components/Text';
55
import useResponsiveLayout from '@hooks/useResponsiveLayout';
66
import useThemeStyles from '@hooks/useThemeStyles';
7-
import * as SearchUtils from '@libs/SearchUtils';
7+
import * as SearchUIUtils from '@libs/SearchUIUtils';
88
import CONST from '@src/CONST';
99
import type {SearchPersonalDetails} from '@src/types/onyx/SearchResults';
1010

@@ -18,7 +18,7 @@ function UserInfoCell({participant, displayName}: UserInfoCellProps) {
1818
const {isLargeScreenWidth} = useResponsiveLayout();
1919
const avatarURL = participant?.avatar;
2020

21-
if (!SearchUtils.isCorrectSearchUserName(displayName)) {
21+
if (!SearchUIUtils.isCorrectSearchUserName(displayName)) {
2222
return null;
2323
}
2424

0 commit comments

Comments
 (0)