"use client"; import { useEffect, useRef } from "react"; /** * Track the previous value of a prop. Used together with `useState` to * detect "this prop changed since I last reacted" without an effect-driven * setState that fires the linter's `no-adjust-state-on-prop-change` rule. * * Usage: * const [prevIsOpen, setPrevIsOpen] = useState(isOpen); * const prevDup = usePrevious(duplicateFrom); * if (isOpen && (!prevIsOpen || prevDup !== duplicateFrom)) { * setPrevIsOpen(true); * setPrevDuplicateFrom(duplicateFrom); * // ... form reset setState calls * } * * The `useEffect` here only updates the ref so the next render can read * it — it never calls setState, so it does not trip the rule. */ export function usePrevious(value: T): T | undefined { const ref = useRef(undefined); useEffect(() => { ref.current = value; }); return ref.current; }