/**
 * React Hooks 支持
 * 提供便捷的 React 组件事件订阅能力
 */ import { useEffect, useRef, useCallback } from "react";
/**
 * 使用事件总线的 Hook
 * 
 * @param eventBus - 事件总线实例
 * @param event - 事件名称
 * @param listener - 事件监听器
 * @param options - 监听器选项
 * 
 * @example
 * ```tsx
 * import { useAppEventBus } from '@vlian/framework';
 * 
 * function MyComponent() {
 *   useAppEvent('user:login', (data, metadata) => {
 *     console.log('用户登录:', data);
 *   });
 *   
 *   return <div>My Component</div>;
 * }
 * ```
 */ export function useAppEvent(eventBus, event, listener, options) {
    // 使用 ref 保存最新的 listener，避免重复订阅
    const listenerRef = useRef(listener);
    listenerRef.current = listener;
    // 使用 ref 保存 options
    const optionsRef = useRef(options);
    optionsRef.current = options;
    useEffect(()=>{
        // 创建包装的监听器，使用最新的 listener
        const wrappedListener = (data, metadata)=>{
            return listenerRef.current(data, metadata);
        };
        // 订阅事件
        const unsubscribe = eventBus.on(event, wrappedListener, optionsRef.current);
        // 清理函数：取消订阅
        return unsubscribe;
    }, [
        eventBus,
        event
    ]); // 只在 eventBus 或 event 变化时重新订阅
}
/**
 * 一次性事件订阅 Hook
 * 
 * @param eventBus - 事件总线实例
 * @param event - 事件名称
 * @param listener - 事件监听器
 * @param options - 监听器选项
 */ export function useAppEventOnce(eventBus, event, listener, options) {
    const listenerRef = useRef(listener);
    listenerRef.current = listener;
    const optionsRef = useRef(options);
    optionsRef.current = options;
    useEffect(()=>{
        const wrappedListener = (data, metadata)=>{
            return listenerRef.current(data, metadata);
        };
        const unsubscribe = eventBus.once(event, wrappedListener, optionsRef.current);
        return unsubscribe;
    }, [
        eventBus,
        event
    ]);
}
/**
 * 创建事件发射器 Hook
 * 
 * @param eventBus - 事件总线实例
 * @returns 事件发射函数
 * 
 * @example
 * ```tsx
 * function MyComponent() {
 *   const emit = useAppEventEmitter(eventBus);
 *   
 *   const handleClick = () => {
 *     emit('button:click', { buttonId: 'submit' });
 *   };
 *   
 *   return <button onClick={handleClick}>Click</button>;
 * }
 * ```
 */ export function useAppEventEmitter(eventBus) {
    return useCallback((event, data, metadata)=>{
        return eventBus.emit(event, data, metadata);
    }, [
        eventBus
    ]);
}

//# sourceMappingURL=hooks.js.map