|
1 | 1 | /* eslint-disable rulesdir/no-acc-spread-in-reduce */
|
| 2 | +import lodashDebounce from 'lodash/debounce'; |
2 | 3 | import type {ForwardedRef, ReactNode, RefObject} from 'react';
|
3 |
| -import React, {forwardRef, useCallback, useEffect, useLayoutEffect, useMemo} from 'react'; |
| 4 | +import React, {forwardRef, useCallback, useEffect, useLayoutEffect, useMemo, useState} from 'react'; |
4 | 5 | import {View} from 'react-native';
|
5 | 6 | import type {StyleProp, TextInputProps, ViewStyle} from 'react-native';
|
6 | 7 | import {useOnyx} from 'react-native-onyx';
|
@@ -134,6 +135,18 @@ function SearchAutocompleteInput(
|
134 | 135 | return focusedSharedValue.get() ? wrapperFocusedStyle : wrapperStyle ?? {};
|
135 | 136 | });
|
136 | 137 |
|
| 138 | + const [localValue, setLocalValue] = useState(value); |
| 139 | + |
| 140 | + const debouncedOnSearchQueryChange = useMemo(() => lodashDebounce(onSearchQueryChange, CONST.TIMING.USE_DEBOUNCED_STATE_DELAY), [onSearchQueryChange]); |
| 141 | + |
| 142 | + const handleChangeText = useCallback( |
| 143 | + (text: string) => { |
| 144 | + setLocalValue(text); |
| 145 | + debouncedOnSearchQueryChange(text); |
| 146 | + }, |
| 147 | + [debouncedOnSearchQueryChange], |
| 148 | + ); |
| 149 | + |
137 | 150 | useEffect(() => {
|
138 | 151 | runOnLiveMarkdownRuntime(() => {
|
139 | 152 | 'worklet';
|
@@ -193,8 +206,8 @@ function SearchAutocompleteInput(
|
193 | 206 | >
|
194 | 207 | <TextInput
|
195 | 208 | testID="search-autocomplete-text-input"
|
196 |
| - value={value} |
197 |
| - onChangeText={onSearchQueryChange} |
| 209 | + value={localValue} |
| 210 | + onChangeText={handleChangeText} |
198 | 211 | autoFocus={autoFocus}
|
199 | 212 | shouldDelayFocus={shouldDelayFocus}
|
200 | 213 | caretHidden={caretHidden}
|
|
0 commit comments