forked from Expensify/App
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathSearch.tsx
80 lines (66 loc) · 2.72 KB
/
Search.tsx
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
import React, {useEffect} from 'react';
import {useOnyx} from 'react-native-onyx';
import useNetwork from '@hooks/useNetwork';
import useThemeStyles from '@hooks/useThemeStyles';
import * as SearchActions from '@libs/actions/Search';
import * as DeviceCapabilities from '@libs/DeviceCapabilities';
import * as SearchUtils from '@libs/SearchUtils';
import Navigation from '@navigation/Navigation';
import EmptySearchView from '@pages/Search/EmptySearchView';
import useCustomBackHandler from '@pages/Search/useCustomBackHandler';
import ONYXKEYS from '@src/ONYXKEYS';
import ROUTES from '@src/ROUTES';
import {isEmptyObject} from '@src/types/utils/EmptyObject';
import isLoadingOnyxValue from '@src/types/utils/isLoadingOnyxValue';
import SelectionList from './SelectionList';
import SearchTableHeader from './SelectionList/SearchTableHeader';
import TableListItemSkeleton from './Skeletons/TableListItemSkeleton';
type SearchProps = {
query: string;
};
function Search({query}: SearchProps) {
const {isOffline} = useNetwork();
const styles = useThemeStyles();
useCustomBackHandler();
const hash = SearchUtils.getQueryHash(query);
const [searchResults, searchResultsMeta] = useOnyx(`${ONYXKEYS.COLLECTION.SNAPSHOT}${hash}`);
useEffect(() => {
if (isOffline) {
return;
}
SearchActions.search(query);
}, [query, isOffline]);
const isLoading = (!isOffline && isLoadingOnyxValue(searchResultsMeta)) || searchResults?.data === undefined;
const shouldShowEmptyState = !isLoading && isEmptyObject(searchResults?.data);
if (isLoading) {
return <TableListItemSkeleton shouldAnimate />;
}
if (shouldShowEmptyState) {
return <EmptySearchView />;
}
const openReport = (reportID?: string) => {
if (!reportID) {
return;
}
Navigation.navigate(ROUTES.SEARCH_REPORT.getRoute(query, reportID));
};
const ListItem = SearchUtils.getListItem();
const data = SearchUtils.getSections(searchResults?.data ?? {});
const shouldShowMerchant = SearchUtils.getShouldShowMerchant(searchResults?.data ?? {});
return (
<SelectionList
customListHeader={<SearchTableHeader shouldShowMerchant={shouldShowMerchant} />}
ListItem={ListItem}
sections={[{data, isDisabled: false}]}
onSelectRow={(item) => {
openReport(item.transactionThreadReportID);
}}
shouldPreventDefaultFocusOnSelectRow={!DeviceCapabilities.canUseTouchScreen()}
listHeaderWrapperStyle={[styles.ph9, styles.pv3, styles.pb5]}
containerStyle={[styles.pv0]}
/>
);
}
Search.displayName = 'Search';
export type {SearchProps};
export default Search;