{"version":3,"file":"use-effect-event.cjs","names":["React"],"sources":["../../src/hooks/use-effect-event.ts"],"sourcesContent":["\"use client\";\n\nimport * as React from \"react\";\n\ntype UseEffectEvent = <F extends (...params: never[]) => unknown>(\n  callback: F\n) => F;\n\n/** --------------------------------------------------------------------------\n * * ***Stable event callback hook (React 19 `useEffectEvent` polyfill).***\n * --------------------------------------------------------------------------\n *\n * - ***Primary purpose:***\n *    - Provides a **stable function reference** whose implementation\n *      always reflects the **latest callback**.\n *    - Prevents stale-closure issues in effects, subscriptions,\n *      event listeners, and external APIs.\n *\n * - ***Behavior guarantees:***\n *    - The returned function identity is **stable** across renders.\n *    - The callback logic is **always up-to-date**.\n *    - Does **not** cause re-subscriptions or effect re-runs.\n *\n * ---\n *\n * - ***React version support:***\n *    - **React ≥ 19.2.x**\n *        ➔ Delegates directly to `React.useEffectEvent`.\n *    - **React < 19**\n *        ➔ Uses a safe fallback implementation based on:\n *          - `useRef` for mutable callback storage\n *          - `useCallback` for stable identity\n *\n * ---\n *\n * - ⚠️ ***Important behavior:***\n *    - This hook is **client-only**.\n *    - The returned function **must not** be used during render\n *      for reading reactive values.\n *    - Intended for **event handlers**, not render logic.\n *\n * ---\n *\n * - ***Designed for:***\n *    - Event listeners (`addEventListener`)\n *    - Subscriptions (WebSocket, observers, stores)\n *    - Imperative APIs requiring stable callbacks\n *    - Avoiding dependency explosion in `useEffect`\n *\n * - ❌ ***Not intended for:***\n *    - Rendering-time computations\n *    - Derived state\n *    - Server Components\n *\n * @template F - Any function type with arbitrary parameters and return value.\n *\n * @param callback - The callback whose latest version should always be invoked.\n *\n * @returns\n * A **stable function reference** that always calls the latest callback.\n *\n * @example\n * **Event listener without re-subscription.**\n * ```tsx\n * const onResize = useEffectEvent(() => {\n *   console.log(window.innerWidth);\n * });\n *\n * useEffect(() => {\n *   window.addEventListener(\"resize\", onResize);\n *   return () => window.removeEventListener(\"resize\", onResize);\n * }, []);\n * ```\n *\n * @example\n * **Safe usage inside effects.**\n * ```tsx\n * const onMessage = useEffectEvent((msg: Message) => {\n *   setMessages(m => [...m, msg]);\n * });\n *\n * useEffect(() => {\n *   socket.subscribe(onMessage);\n *   return () => socket.unsubscribe(onMessage);\n * }, []);\n * ```\n */\nexport const useEffectEvent: UseEffectEvent =\n  \"useEffectEvent\" in React\n    ? { ...React }.useEffectEvent\n    : <F extends (...params: never[]) => unknown>(callback: F) => {\n        const ref = React.useRef(callback);\n        ref.current = callback;\n\n        return React.useCallback(\n          ((...params) => ref.current(...params)) as F,\n          []\n        );\n      };\n\n/** --------------------------------------------------------------------------\n * * ***Legacy fallback for `useEffectEvent` (DEPRECATED).***\n * --------------------------------------------------------------------------\n *\n * ⚠️ **Deprecated**\n * - Use `useEffectEvent` from `@rzl-zone/core-react/hooks` instead.\n *\n * ---\n *\n * - ***Why this exists:***\n *    - Supports older React versions where `useEffectEvent`\n *      is not available.\n *    - Uses `useEffect` to sync the callback reference.\n *\n * ---\n *\n * - ***Key differences from React's implementation:***\n *    - Callback updates happen **after render**.\n *    - Slightly higher overhead due to `useEffect`.\n *    - Still guarantees a **stable function identity**.\n *\n * ---\n *\n * - ***Behavior guarantees:***\n *    - Returned function identity is stable.\n *    - Always invokes the latest callback.\n *    - Safe for effects and event handlers.\n *\n * ---\n *\n * - ❌ ***Limitations:***\n *    - Not concurrent-safe like the native hook.\n *    - Not recommended for new code.\n *\n * @template F - Function type to stabilize.\n *\n * @param callback - Callback whose latest version should be invoked.\n *\n * @returns\n * A stable function reference invoking the latest callback.\n *\n * @deprecated Use `useEffectEvent` from `@rzl-zone/core-react/hooks` instead.\n */\nexport function useEffectEventCustom<F extends (...args: never[]) => unknown>(\n  callback: F\n): F {\n  // const ref = useRef(callback);\n  // ref.current = callback;\n\n  // return useCallback(((...params) => ref.current(...params)) as F, []);\n\n  const ref = React.useRef(callback);\n\n  React.useEffect(() => {\n    ref.current = callback;\n  }, [callback]);\n\n  const fn = React.useCallback((...args: never[]) => {\n    return ref.current(...args) as F;\n  }, []);\n\n  return fn as F;\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAuFA,MAAa,iBACX,oBAAoBA,QAChB,EAAE,GAAGA,MAAM,EAAE,kBAC+B,aAAgB;CAC1D,MAAM,MAAMA,MAAM,OAAO,QAAQ;CACjC,IAAI,UAAU;CAEd,OAAOA,MAAM,cACT,GAAG,WAAW,IAAI,QAAQ,GAAG,MAAM,IACrC,CAAC,CACH;AACF;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AA6CN,SAAgB,qBACd,UACG;CAMH,MAAM,MAAMA,MAAM,OAAO,QAAQ;CAEjC,MAAM,gBAAgB;EACpB,IAAI,UAAU;CAChB,GAAG,CAAC,QAAQ,CAAC;CAMb,OAJWA,MAAM,aAAa,GAAG,SAAkB;EACjD,OAAO,IAAI,QAAQ,GAAG,IAAI;CAC5B,GAAG,CAAC,CAEI;AACV"}
