Skip to content

Instantly share code, notes, and snippets.

@smashingpat
Last active August 19, 2021 11:32
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save smashingpat/df50bd2f0a74ba4f72a460abd186b5fd to your computer and use it in GitHub Desktop.
Save smashingpat/df50bd2f0a74ba4f72a460abd186b5fd to your computer and use it in GitHub Desktop.
import * as React from 'react';
function useDebouncedValue<T>(value: T, timeout: number) {
const [debouncedValue, setDebouncedValue] = React.useState(value);
React.useEffect(() => {
const id = setTimeout(() => setDebouncedValue(value), timeout);
return () => clearTimeout(id);
}, [value, timeout]);
return debouncedValue;
}
async function getSeachResults(signal: AbortSignal, query: string) {
const response = await fetch(`/api/search?q=${encodeURIComponent(query)}`, { signal );
const data = await response.json();
return data;
}
export function SearchPage() {
const [value, setValue] = React.useState('');
const [results, setResults] = React.useState([]);
const debouncedValue = useDebouncedValue(value, 300);
React.useEffect(() => {
const controller = new AbortController();
getSeachResults(controller.signal, debouncedValue).then(setResults);
return () => {
controller.abort();
};
}, [debouncedValue]);
// render
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment