Skip to content

Commit e4d2b33

Browse files
committed
debounced user
1 parent efeea37 commit e4d2b33

File tree

2 files changed

+35
-4
lines changed

2 files changed

+35
-4
lines changed

src/App.tsx

Lines changed: 18 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
import { useContext, useState } from 'react'
1+
import { useContext, useState, useEffect } from 'react'
22
import { Input } from '@/components/ui/input'
33
import { Button } from '@/components/ui/button'
44
import { ExternalLink, LayoutGrid, LayoutList, AlignJustify, ChevronDown } from 'lucide-react'
@@ -23,13 +23,28 @@ import {
2323
import { sortOptions, type SortingOption } from '@/lib/sort'
2424
import { UserContext } from '@/contexts'
2525

26+
import { useDebounce } from '@/lib/useDebounce'
27+
2628
export const App = () => {
2729
const [user, setUser] = useContext(UserContext)
30+
const [userInput, setUserInput] = useState(user)
31+
const debouncedUser = useDebounce(userInput, 1000)
2832

2933
const [page, setPage] = useState(1)
3034
const [view, setView] = useState<View>('covers-text')
3135
const [sort, setSort] = useState<SortingOption>(sortOptions[0])
3236

37+
useEffect(() => {
38+
const onDebouncedUserChange = () => {
39+
setUser(userInput)
40+
setPage(1)
41+
}
42+
43+
onDebouncedUserChange()
44+
45+
// eslint-disable-next-line
46+
}, [debouncedUser])
47+
3348
return (
3449
<div className="overflow-hidden pt-14 pb-8 min-[1680px]:pb-14">
3550
<div className="container">
@@ -41,10 +56,9 @@ export const App = () => {
4156
className="w-auto"
4257
name="user"
4358
placeholder="Discogs username"
44-
value={user}
59+
value={userInput}
4560
onChange={(e) => {
46-
setUser(e.target.value)
47-
setPage(1) // reset page to 1 when user changes
61+
setUserInput(e.target.value)
4862
}}
4963
/>
5064
<Button variant="outline" size="icon" aria-label="Open Discogs profile" asChild>

src/lib/useDebounce.ts

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
import { useState, useEffect } from 'react'
2+
3+
export const useDebounce = <T>(value: T, delay: number = 0): T => {
4+
const [debouncedValue, setDebouncedValue] = useState<T>(value)
5+
6+
useEffect(() => {
7+
// update debounced value after specified delay time
8+
const timerId = setTimeout(() => setDebouncedValue(value), delay)
9+
10+
// cancel the timeout if value changes
11+
return () => {
12+
clearTimeout(timerId)
13+
}
14+
}, [value, delay])
15+
16+
return debouncedValue
17+
}

0 commit comments

Comments
 (0)