/** * usePrevious Hook * Track the previous value of any state or prop * * Features: * - Generic typing for any value type * - Tracks previous value across renders * - Updated on every render with new value * - Useful for comparing current vs previous values * - Works with any data type (primitives, objects, arrays) * * @example * const [count, setCount] = useState(0) * const prevCount = usePrevious(count) * *
*

Current: {count}

*

Previous: {prevCount ?? 'N/A'}

* *
* * @example * // With objects * const [user, setUser] = useState({ name: '', age: 0 }) * const prevUser = usePrevious(user) * * // Detect if user changed * useEffect(() => { * if (prevUser?.name !== user.name) { * console.log('Name changed!') * } * }, [user, prevUser]) * * @example * // With form inputs - detect if value was actually changed * const [email, setEmail] = useState('') * const prevEmail = usePrevious(email) * * const hasChanged = prevEmail !== undefined && email !== prevEmail */ import { useEffect, useRef } from 'react' /** * Hook to track the previous value of any state or prop * @template T - The type of the value being tracked * @param value - Current value to track * @returns Previous value (undefined on first render) */ export function usePrevious(value: T): T | undefined { const ref = useRef(undefined) useEffect(() => { ref.current = value }, [value]) return ref.current }