Skip to content

Commit 256bea3

Browse files
authored
Merge pull request #91850 from Expensify/jsenyitko-filter-through-ecard-rules
Add the ability to filter spend rules
2 parents c8ecf8f + afce60e commit 256bea3

1 file changed

Lines changed: 22 additions & 2 deletions

File tree

src/components/SpendRules/SpendRulesSection.tsx

Lines changed: 22 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,12 @@
11
import React, {useEffect} from 'react';
22
import {View} from 'react-native';
3+
import type {TupleToUnion} from 'type-fest';
34
import ActivityIndicator from '@components/ActivityIndicator';
45
import Badge from '@components/Badge';
56
import Icon from '@components/Icon';
67
import MenuItem from '@components/MenuItem';
78
import OfflineWithFeedback from '@components/OfflineWithFeedback';
9+
import SearchBar from '@components/SearchBar';
810
import Section from '@components/Section';
911
import Text from '@components/Text';
1012
import useConfirmModal from '@hooks/useConfirmModal';
@@ -16,11 +18,13 @@ import useLocalize from '@hooks/useLocalize';
1618
import useNetwork from '@hooks/useNetwork';
1719
import useOnyx from '@hooks/useOnyx';
1820
import useResponsiveLayout from '@hooks/useResponsiveLayout';
21+
import useSearchResults from '@hooks/useSearchResults';
1922
import useStyleUtils from '@hooks/useStyleUtils';
2023
import useTheme from '@hooks/useTheme';
2124
import useThemeStyles from '@hooks/useThemeStyles';
2225
import {openPolicyExpensifyCardsPage} from '@libs/actions/Policy/Policy';
2326
import Navigation from '@libs/Navigation/Navigation';
27+
import tokenizedSearch from '@libs/tokenizedSearch';
2428
import variables from '@styles/variables';
2529
import CONST from '@src/CONST';
2630
import ONYXKEYS from '@src/ONYXKEYS';
@@ -45,6 +49,13 @@ function SpendRulesSection({policyID}: SpendRulesSectionProps) {
4549
const [expensifyCardSettings] = useOnyx(`${ONYXKEYS.COLLECTION.PRIVATE_EXPENSIFY_CARD_SETTINGS}${defaultFundID}`);
4650
const {cardRules, isLoadingCardRules} = useExpensifyCardRules(policyID);
4751

52+
const filterCardRules = (cardRule: TupleToUnion<typeof cardRules>, searchInput: string) => {
53+
const results = tokenizedSearch([cardRule], searchInput, (option) => option.searchTokens);
54+
return results.length > 0;
55+
};
56+
57+
const [inputValue, setInputValue, filteredCardRules] = useSearchResults(cardRules, filterCardRules);
58+
4859
useEffect(() => {
4960
if (!defaultFundID || defaultFundID === CONST.DEFAULT_NUMBER_ID) {
5061
return;
@@ -132,8 +143,17 @@ function SpendRulesSection({policyID}: SpendRulesSectionProps) {
132143
isCentralPane
133144
subtitleMuted
134145
>
146+
{cardRules.length >= CONST.STANDARD_LIST_ITEM_LIMIT && (
147+
<SearchBar
148+
label={translate('workspace.card.searchRules')}
149+
inputValue={inputValue}
150+
onChangeText={setInputValue}
151+
shouldShowEmptyState={!isLoadingCardRules && filteredCardRules.length === 0}
152+
style={[styles.mb0, styles.mt5, styles.mh0]}
153+
/>
154+
)}
135155
<MenuItem
136-
wrapperStyle={[styles.borderedContentCard, styles.mt6, styles.ph4, styles.pv4]}
156+
wrapperStyle={[styles.borderedContentCard, styles.mt5, styles.ph4, styles.pv4]}
137157
titleComponent={menuItemBody}
138158
accessibilityLabel={`${descriptionLabel}. ${blockLabel} ${defaultRuleTitle}`}
139159
sentryLabel={CONST.SENTRY_LABEL.WORKSPACE.RULES.SPEND_RULE_ITEM}
@@ -152,7 +172,7 @@ function SpendRulesSection({policyID}: SpendRulesSectionProps) {
152172
/>
153173
</View>
154174
) : (
155-
cardRules.map((rule) => (
175+
filteredCardRules.map((rule) => (
156176
<OfflineWithFeedback
157177
key={rule.ruleID}
158178
pendingAction={rule.pendingAction}

0 commit comments

Comments
 (0)