import { useMemoizedFn } from 'ahooks';
import { useRef, useEffect } from 'react';
import { useIsActive } from "../../context/IsActiveContext";

/**
 * useActiveExecute Hook
 * 返回一个函数，该函数接收一个回调函数，并返回一个包装后的函数
 * 包装后的函数只在 isActive 为 true 时执行原始回调
 *
 * @example
 * ```tsx
 * const { executeIfActive } = useActiveExecute();
 *
 * // 创建一个包装函数用于事件监听
 * const handleChange = (data) => {
 *   console.log('data:', data);
 * };
 *
 * // 返回的函数会在被调用时检查 isActive
 * pisellos.effects.on('event', executeIfActive(handleChange));
 * ```
 */
export var useActiveExecute = function useActiveExecute() {
  var isActive = useIsActive();
  // 使用 ref 存储最新的 isActive 值，避免闭包陷阱
  var isActiveRef = useRef(isActive);

  // 每次 isActive 变化时更新 ref
  useEffect(function () {
    isActiveRef.current = isActive;
  }, [isActive]);

  /**
   * executeIfActive 接收一个函数，返回一个包装后的函数
   * 包装后的函数会接收所有参数，并在 isActive 为 true 时调用原始函数
   */
  var executeIfActive = useMemoizedFn(function (fn) {
    return function () {
      // 使用 ref.current 获取最新的 isActive 值
      if (!isActiveRef.current) return;
      for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) {
        args[_key] = arguments[_key];
      }
      return fn === null || fn === void 0 ? void 0 : fn.apply(void 0, args);
    };
  });
  return {
    executeIfActive: executeIfActive
  };
};