Skip to content

Commit a1b2be7

Browse files
committed
useDebouncedValue cleanup
#1747
1 parent aaea04b commit a1b2be7

4 files changed

Lines changed: 17 additions & 10 deletions

File tree

packages/components/src/modal/DebouncedModal.tsx

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,7 @@ function DebouncedModal({
2828
debounceMs,
2929
isOpen = false,
3030
}: DebouncedModalProps): JSX.Element {
31-
const debouncedIsOpen = useDebouncedValue(isOpen, debounceMs);
31+
const { value: debouncedIsOpen } = useDebouncedValue(isOpen, debounceMs);
3232

3333
return (
3434
<>

packages/jsapi-components/src/useCheckIfExistsValue.ts

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -36,7 +36,10 @@ export function useCheckIfExistsValue(
3636
const tableUtils = useTableUtils();
3737

3838
const [valueTrimmed, setValueTrimmed] = useState('');
39-
const valueTrimmedDebounced = useDebouncedValue(valueTrimmed, debounceMs);
39+
const { value: valueTrimmedDebounced } = useDebouncedValue(
40+
valueTrimmed,
41+
debounceMs
42+
);
4043

4144
const trimAndUpdateValue = useCallback((text: string) => {
4245
setValueTrimmed(text.trim());

packages/jsapi-components/src/useDebouncedViewportSelectionFilter.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -44,7 +44,7 @@ export function useDebouncedViewportSelectionFilter<TItem, TValue>({
4444

4545
// Debounce so user can rapidly select multiple items in a row without the
4646
// cost of updating the table on each change
47-
const debouncedValuesSelection = useDebouncedValue(
47+
const { value: debouncedValuesSelection } = useDebouncedValue(
4848
valuesSelection,
4949
DEBOUNCE_MS
5050
);

packages/react-hooks/src/useDebouncedValue.ts

Lines changed: 11 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -13,18 +13,22 @@ export function useDebouncedValue<T>(
1313
debounceMs: number
1414
): { isDebouncing: boolean; value: T } {
1515
const [isDebouncing, setIsDebouncing] = useState(true);
16-
const [debouncedValue, setDebouncedValue] = useState<T>(value);
16+
const [debouncedValue, setDebouncedValue] = useState(value);
1717

18-
// Set isDebouncing to true immediately whenever the value changes. Using
19-
// `useMemo` instead of `useEffect` so that state is never out of sync whenever
20-
// value and / or debounceMs have changed.
21-
useMemo(() => {
18+
// Keep isDebouncing in sync with value and debounceMs by setting state
19+
// during render instead of in `useEffect`
20+
// https://react.dev/learn/you-might-not-need-an-effect#adjusting-some-state-when-a-prop-changes
21+
const [previousValue, setPreviousValue] = useState(value);
22+
const [previousDebounceMs, setPreviousDebounceMs] = useState(debounceMs);
23+
if (value !== previousValue || debounceMs !== previousDebounceMs) {
2224
setIsDebouncing(true);
23-
// eslint-disable-next-line react-hooks/exhaustive-deps
24-
}, [value, debounceMs]);
25+
setPreviousValue(value);
26+
setPreviousDebounceMs(debounceMs);
27+
}
2528

2629
useEffect(() => {
2730
let isCancelled = false;
31+
setIsDebouncing(true);
2832

2933
const timeoutId = setTimeout(() => {
3034
if (!isCancelled) {

0 commit comments

Comments
 (0)