7079462503
- react 18.2.0 to 19.2.6
- react-dom 18.2.0 to 19.2.6
- @types/react 18.2.39 to 19.2.15
- @types/react-dom 18.2.17 to 19.2.3
React 19 breaking changes fixed:
- useRef<T>(null) now returns RefObject<T | null>; cast to
RefObject<T> at 16 component call sites (safe, runtime unchanged)
- useRef<T>() without arg no longer valid; add | undefined>(undefined)
in useDebounce, useFileDrop, useThrottle, useVirtualPaginator hooks,
RoomInput, RoomTimeline, and ClientNonUIFeatures
- useReducer<typeof reducer> 1-arg form removed; drop explicit type arg
in useForceUpdate (inferred from reducer function)
- global JSX namespace removed; import type { JSX } from react in
react-custom-html-parser.tsx
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
35 lines
912 B
TypeScript
35 lines
912 B
TypeScript
import { useCallback, useRef } from 'react';
|
|
|
|
export interface DebounceOptions {
|
|
wait?: number;
|
|
immediate?: boolean;
|
|
}
|
|
export type DebounceCallback<T extends unknown[]> = (...args: T) => void;
|
|
|
|
export function useDebounce<T extends unknown[]>(
|
|
callback: DebounceCallback<T>,
|
|
options?: DebounceOptions,
|
|
): DebounceCallback<T> {
|
|
const timeoutIdRef = useRef<number | undefined>(undefined);
|
|
const { wait, immediate } = options ?? {};
|
|
|
|
const debounceCallback = useCallback(
|
|
(...cbArgs: T) => {
|
|
if (timeoutIdRef.current) {
|
|
clearTimeout(timeoutIdRef.current);
|
|
timeoutIdRef.current = undefined;
|
|
} else if (immediate) {
|
|
callback(...cbArgs);
|
|
}
|
|
|
|
timeoutIdRef.current = window.setTimeout(() => {
|
|
callback(...cbArgs);
|
|
timeoutIdRef.current = undefined;
|
|
}, wait);
|
|
},
|
|
[callback, wait, immediate],
|
|
);
|
|
|
|
return debounceCallback;
|
|
}
|