Files
lti-web-client/src/components/input/DebouncedTextInput.tsx
T
2025-10-04 12:15:06 +07:00

43 lines
1.1 KiB
TypeScript

'use client';
import { ChangeEvent, ChangeEventHandler, useEffect, useState } from 'react';
import { useDebounce } from 'use-debounce';
import TextInput, { TextInputProps } from '@/components/input/TextInput';
interface DebouncedTextInputProps extends TextInputProps {
delay?: number;
}
const DebouncedTextInput = (props: DebouncedTextInputProps) => {
const { delay, onChange } = props;
const [internalChangeEvent, setInternalChangeEvent] =
useState<ChangeEvent<HTMLInputElement>>();
const [internalValue, setInternalValue] = useState(props.value);
const [debouncedChangeEvent] = useDebounce(internalChangeEvent, delay ?? 300);
const [debouncedValue] = useDebounce(internalValue, delay ?? 300);
const internalChangeHandler: ChangeEventHandler<HTMLInputElement> = (e) => {
setInternalValue(e.target.value);
setInternalChangeEvent(e);
};
useEffect(() => {
if (debouncedChangeEvent) {
onChange?.(debouncedChangeEvent);
}
}, [debouncedValue]);
return (
<TextInput
{...props}
value={internalValue}
onChange={internalChangeHandler}
/>
);
};
export default DebouncedTextInput;