import { useRef, useEffect } from 'react';

/**
 * 保持对最新值的引用，解决闭包问题
 * 
 * @param value 需要保持最新引用的值
 * @returns ref对象，通过ref.current获取最新值
 * 
 * @example
 * // 在组件中使用:
 * const [count, setCount] = useState(0);
 * const countRef = useLatestValue(count);
 * 
 * // 在useCallback或其他闭包中使用:
 * const handleClick = useCallback(() => {
 *   // 使用countRef.current而不是count来获取最新值
 *   console.log('Current count:', countRef.current);
 * }, []); // 空依赖数组，不会因count变化而重新创建
 */
export function useLatestValue<T>(value: T) {
  const ref = useRef<T>(value);
  
  // 当值变化时更新ref
  useEffect(() => {
    ref.current = value;
  }, [value]);
  
  return ref;
}

/**
 * 保持对多个值的最新引用，解决闭包问题
 * 
 * @param values 需要保持最新引用的值的对象
 * @returns ref对象，通过ref.current获取最新值对象
 * 
 * @example
 * // 在组件中使用:
 * const [state, setState] = useState({ count: 0, name: 'John' });
 * const stateRef = useLatestValues(state);
 * 
 * // 在useCallback或其他闭包中使用:
 * const handleClick = useCallback(() => {
 *   // 使用stateRef.current而不是state来获取最新值
 *   console.log('Current state:', stateRef.current);
 * }, []); // 空依赖数组，不会因state变化而重新创建
 */
export function useLatestValues<T extends object>(values: T) {
  const ref = useRef<T>(values);
  
  // 当值变化时更新ref
  useEffect(() => {
    ref.current = values;
  }, [values]);
  
  return ref;
}

export default useLatestValue; 