{"version":3,"file":"useModule.mjs","sources":["../../../../src/lib/vdom/hooks/useModule.ts"],"sourcesContent":["/**\n * @file useModule Hook\n * @module vdom/hooks/useModule\n * @description Primary hook for accessing module context, state, and\n * cross-module communication capabilities within a module boundary.\n *\n * @author Agent 5 - PhD Virtual DOM Expert\n * @version 1.0.0\n */\n\nimport { useMemo, useCallback } from 'react';\nimport {\n  type ModuleId,\n  type UseModuleReturn,\n  type EventHandler,\n  type EventSubscription,\n  type EventSubscriptionOptions,\n  type ModuleBoundaryConfig,\n  type ModulePerformanceMetrics,\n  ModuleLifecycleState,\n} from '../types';\nimport { useModuleContext } from '../ModuleBoundary';\nimport { useEventBus } from '../ModuleProviderExports';\n\n/**\n * Primary hook for accessing module context and capabilities.\n * Provides module identification, state, metrics, and event communication.\n *\n * @returns Module context and utilities\n * @throws Error if used outside a ModuleBoundary\n *\n * @example\n * ```tsx\n * function MyComponent() {\n *   const {\n *     moduleId,\n *     config,\n *     isMounted,\n *     emit,\n *     on,\n *   } = useModule();\n *\n *   // Subscribe to events\n *   useEffect(() => {\n *     const subscription = on('user:action', (message) => {\n *       console.log('Action received:', message.payload);\n *     });\n *\n *     return () => subscription.unsubscribe();\n *   }, [on]);\n *\n *   // Emit events\n *   const handleClick = () => {\n *     emit('button:clicked', { buttonId: 'submit' });\n *   };\n *\n *   return (\n *     <div>\n *       <span>Module: {config.name}</span>\n *       <button onClick={handleClick}>Submit</button>\n *     </div>\n *   );\n * }\n * ```\n */\nexport function useModule(): UseModuleReturn {\n  const context = useModuleContext();\n  const eventBus = useEventBus();\n\n  const { moduleId, config, state } = context;\n\n  // Derived state - use destructuring\n  const { lifecycleState, isVisible, error, metrics } = state;\n  const isMounted = lifecycleState === ModuleLifecycleState.MOUNTED;\n  const hasError = error !== null;\n\n  // Event emission\n  const emit = useCallback(\n    <T>(name: string, payload: T): void => {\n      eventBus.publish(name, payload, moduleId);\n    },\n    [eventBus, moduleId]\n  );\n\n  // Event subscription\n  const on = useCallback(\n    <T>(\n      name: string,\n      handler: EventHandler<T>,\n      _options?: EventSubscriptionOptions\n    ): EventSubscription => {\n      const subscriptionId = `${moduleId}-${name}-${Date.now()}`;\n      let isActive = true;\n      // EventHandler from types.ts and ModuleEventHandler are compatible - both take ModuleEventMessage<T>\n      const unsubscribeFn = eventBus.subscribe<T>(\n        name,\n        handler as unknown as Parameters<typeof eventBus.subscribe<T>>[1],\n        moduleId\n      );\n\n      const unsubscribe = (): void => {\n        if (isActive) {\n          isActive = false;\n          unsubscribeFn();\n        }\n      };\n\n      return {\n        id: subscriptionId,\n        eventName: name,\n        unsubscribe,\n        get isActive() {\n          return isActive;\n        },\n      };\n    },\n    [eventBus, moduleId]\n  );\n\n  // Memoize return value\n  return useMemo<UseModuleReturn>(\n    () => ({\n      moduleId,\n      config,\n      lifecycleState,\n      isMounted,\n      isVisible,\n      hasError,\n      error,\n      metrics,\n      emit,\n      on,\n    }),\n    [moduleId, config, lifecycleState, isMounted, isVisible, hasError, error, metrics, emit, on]\n  );\n}\n\n/**\n * Hook to get the current module ID.\n * @returns Module ID\n * @throws Error if used outside a ModuleBoundary\n */\nexport function useModuleId(): ModuleId {\n  const { moduleId } = useModule();\n  return moduleId;\n}\n\n/**\n * Hook to get the current module configuration.\n * @returns Module configuration\n * @throws Error if used outside a ModuleBoundary\n */\nexport function useModuleConfig(): ModuleBoundaryConfig {\n  const { config } = useModule();\n  return config;\n}\n\n/**\n * Hook to check if the module is mounted.\n * @returns Whether module is mounted\n * @throws Error if used outside a ModuleBoundary\n */\nexport function useIsModuleMounted(): boolean {\n  const { isMounted } = useModule();\n  return isMounted;\n}\n\n/**\n * Hook to get the module's performance metrics.\n * @returns Performance metrics\n * @throws Error if used outside a ModuleBoundary\n */\nexport function useModuleMetrics(): ModulePerformanceMetrics {\n  const { metrics } = useModule();\n  return metrics;\n}\n\n/**\n * Hook to emit events from the current module.\n * @returns Event emitter function\n * @throws Error if used outside a ModuleBoundary\n *\n * @example\n * ```tsx\n * const emit = useModuleEmit();\n *\n * const handleSave = () => {\n *   emit('data:saved', { id: '123', timestamp: Date.now() });\n * };\n * ```\n */\nexport function useModuleEmit(): <T>(name: string, payload: T) => void {\n  const { emit } = useModule();\n  return emit;\n}\n\n/**\n * Hook to subscribe to events in the current module.\n * @returns Event subscription function\n * @throws Error if used outside a ModuleBoundary\n *\n * @example\n * ```tsx\n * const on = useModuleSubscribe();\n *\n * useEffect(() => {\n *   const sub = on('notification:received', (msg) => {\n *     showNotification(msg.payload);\n *   });\n *\n *   return () => sub.unsubscribe();\n * }, [on]);\n * ```\n */\nexport function useModuleSubscribe(): <T>(\n  name: string,\n  handler: EventHandler<T>,\n  options?: EventSubscriptionOptions\n) => EventSubscription {\n  const { on } = useModule();\n  return on;\n}\n"],"names":["useModule","context","useModuleContext","eventBus","useEventBus","moduleId","config","state","lifecycleState","isVisible","error","metrics","isMounted","ModuleLifecycleState","hasError","emit","useCallback","name","payload","on","handler","_options","subscriptionId","isActive","unsubscribeFn","useMemo","useModuleId","useModuleConfig","useIsModuleMounted","useModuleMetrics","useModuleEmit","useModuleSubscribe"],"mappings":";;;;AAiEO,SAASA,IAA6B;AAC3C,QAAMC,IAAUC,EAAA,GACVC,IAAWC,EAAA,GAEX,EAAE,UAAAC,GAAU,QAAAC,GAAQ,OAAAC,EAAA,IAAUN,GAG9B,EAAE,gBAAAO,GAAgB,WAAAC,GAAW,OAAAC,GAAO,SAAAC,MAAYJ,GAChDK,IAAYJ,MAAmBK,EAAqB,SACpDC,IAAWJ,MAAU,MAGrBK,IAAOC;AAAA,IACX,CAAIC,GAAcC,MAAqB;AACrC,MAAAf,EAAS,QAAQc,GAAMC,GAASb,CAAQ;AAAA,IAC1C;AAAA,IACA,CAACF,GAAUE,CAAQ;AAAA,EAAA,GAIfc,IAAKH;AAAA,IACT,CACEC,GACAG,GACAC,MACsB;AACtB,YAAMC,IAAiB,GAAGjB,CAAQ,IAAIY,CAAI,IAAI,KAAK,KAAK;AACxD,UAAIM,IAAW;AAEf,YAAMC,IAAgBrB,EAAS;AAAA,QAC7Bc;AAAA,QACAG;AAAA,QACAf;AAAA,MAAA;AAUF,aAAO;AAAA,QACL,IAAIiB;AAAA,QACJ,WAAWL;AAAA,QACX,aAVkB,MAAY;AAC9B,UAAIM,MACFA,IAAW,IACXC,EAAA;AAAA,QAEJ;AAAA,QAME,IAAI,WAAW;AACb,iBAAOD;AAAA,QACT;AAAA,MAAA;AAAA,IAEJ;AAAA,IACA,CAACpB,GAAUE,CAAQ;AAAA,EAAA;AAIrB,SAAOoB;AAAA,IACL,OAAO;AAAA,MACL,UAAApB;AAAA,MACA,QAAAC;AAAA,MACA,gBAAAE;AAAA,MACA,WAAAI;AAAA,MACA,WAAAH;AAAA,MACA,UAAAK;AAAA,MACA,OAAAJ;AAAA,MACA,SAAAC;AAAA,MACA,MAAAI;AAAA,MACA,IAAAI;AAAA,IAAA;AAAA,IAEF,CAACd,GAAUC,GAAQE,GAAgBI,GAAWH,GAAWK,GAAUJ,GAAOC,GAASI,GAAMI,CAAE;AAAA,EAAA;AAE/F;AAOO,SAASO,IAAwB;AACtC,QAAM,EAAE,UAAArB,EAAA,IAAaL,EAAA;AACrB,SAAOK;AACT;AAOO,SAASsB,IAAwC;AACtD,QAAM,EAAE,QAAArB,EAAA,IAAWN,EAAA;AACnB,SAAOM;AACT;AAOO,SAASsB,IAA8B;AAC5C,QAAM,EAAE,WAAAhB,EAAA,IAAcZ,EAAA;AACtB,SAAOY;AACT;AAOO,SAASiB,IAA6C;AAC3D,QAAM,EAAE,SAAAlB,EAAA,IAAYX,EAAA;AACpB,SAAOW;AACT;AAgBO,SAASmB,IAAuD;AACrE,QAAM,EAAE,MAAAf,EAAA,IAASf,EAAA;AACjB,SAAOe;AACT;AAoBO,SAASgB,IAIO;AACrB,QAAM,EAAE,IAAAZ,EAAA,IAAOnB,EAAA;AACf,SAAOmB;AACT;"}