|
| 1 | +/* eslint-disable @typescript-eslint/no-shadow */ |
1 | 2 | import _ from 'lodash'; |
2 | 3 | import React, { |
3 | 4 | JSXElementConstructor, |
@@ -89,6 +90,8 @@ const DropdownComponent: <T>( |
89 | 90 | itemAccessibilityLabelField, |
90 | 91 | mode = 'default', |
91 | 92 | closeModalWhenSelectedItem = true, |
| 93 | + excludeItems = [], |
| 94 | + excludeSearchItems = [], |
92 | 95 | } = props; |
93 | 96 |
|
94 | 97 | const ref = useRef<View>(null); |
@@ -123,8 +126,25 @@ const DropdownComponent: <T>( |
123 | 126 | // eslint-disable-next-line react-hooks/exhaustive-deps |
124 | 127 | }, []); |
125 | 128 |
|
| 129 | + const excludeData = useCallback( |
| 130 | + (data: any[]) => { |
| 131 | + if (excludeItems.length > 0) { |
| 132 | + const getData = _.differenceWith( |
| 133 | + data, |
| 134 | + excludeItems, |
| 135 | + (obj1, obj2) => _.get(obj1, valueField) === _.get(obj2, valueField) |
| 136 | + ); |
| 137 | + return getData || []; |
| 138 | + } else { |
| 139 | + return data || []; |
| 140 | + } |
| 141 | + }, |
| 142 | + [excludeItems, valueField] |
| 143 | + ); |
| 144 | + |
126 | 145 | useEffect(() => { |
127 | | - setListData([...data]); |
| 146 | + const filterData = excludeData(data); |
| 147 | + setListData([...filterData]); |
128 | 148 | if (searchText) { |
129 | 149 | onSearch(searchText); |
130 | 150 | } |
@@ -277,7 +297,8 @@ const DropdownComponent: <T>( |
277 | 297 |
|
278 | 298 | _measure(); |
279 | 299 | setVisible(!visible); |
280 | | - setListData(data); |
| 300 | + const filterData = excludeData(data); |
| 301 | + setListData(filterData); |
281 | 302 |
|
282 | 303 | if (!visible) { |
283 | 304 | if (onFocus) { |
@@ -333,12 +354,35 @@ const DropdownComponent: <T>( |
333 | 354 | const dataSearch = data.filter( |
334 | 355 | searchQuery ? propSearchFunction : defaultFilterFunction |
335 | 356 | ); |
336 | | - setListData(dataSearch); |
| 357 | + |
| 358 | + if (excludeSearchItems.length > 0 || excludeItems.length > 0) { |
| 359 | + const excludeSearchData = _.differenceWith( |
| 360 | + dataSearch, |
| 361 | + excludeSearchItems, |
| 362 | + (obj1, obj2) => |
| 363 | + _.get(obj1, valueField) === _.get(obj2, valueField) |
| 364 | + ); |
| 365 | + |
| 366 | + const filterData = excludeData(excludeSearchData); |
| 367 | + setListData(filterData); |
| 368 | + } else { |
| 369 | + setListData(dataSearch); |
| 370 | + } |
337 | 371 | } else { |
338 | | - setListData(data); |
| 372 | + const filterData = excludeData(data); |
| 373 | + setListData(filterData); |
339 | 374 | } |
340 | 375 | }, |
341 | | - [data, searchField, labelField, searchQuery] |
| 376 | + [ |
| 377 | + data, |
| 378 | + searchQuery, |
| 379 | + excludeSearchItems, |
| 380 | + excludeItems, |
| 381 | + searchField, |
| 382 | + labelField, |
| 383 | + valueField, |
| 384 | + excludeData, |
| 385 | + ] |
342 | 386 | ); |
343 | 387 |
|
344 | 388 | const onSelect = useCallback( |
|
0 commit comments