b170bb9d87
- Dashboard: useClubStatsQuery + useRecentDistributionsQuery with fallback - Members list: useMembersQuery with debounced search + pagination - Member detail: useMemberQuery + useUpdateMemberMutation - Add member: useCreateMemberMutation with invalidation - All pages show loading skeletons during fetch - Graceful fallback to mock data when backend unavailable - New useDebounce hook for search input (300ms delay)
17 lines
457 B
TypeScript
17 lines
457 B
TypeScript
import { useEffect, useState } from "react"
|
|
|
|
/**
|
|
* Debounce a value by a given delay.
|
|
* Returns the debounced value that only updates after the delay.
|
|
*/
|
|
export function useDebounce<T>(value: T, delay: number): T {
|
|
const [debouncedValue, setDebouncedValue] = useState<T>(value)
|
|
|
|
useEffect(() => {
|
|
const timer = setTimeout(() => setDebouncedValue(value), delay)
|
|
return () => clearTimeout(timer)
|
|
}, [value, delay])
|
|
|
|
return debouncedValue
|
|
}
|