{"version":3,"file":"use-on-events.cjs","sources":["../../../src/hooks/use-on-events.ts"],"sourcesContent":["import { useLayoutEffect } from 'react';\nimport type { mvc } from '@joint/core';\nimport { useLatestRef } from './use-latest-ref';\n\n// NUL never appears in event names (keys may contain spaces — mvc supports\n// space-delimited multi-event keys like 'render:done render:idle'), so the\n// joined signature cannot collide.\nconst KEY_SIGNATURE_SEPARATOR = '\\u0000';\n\n/**\n * Builds the sorted, joined signature of the **active** event names (keys whose\n * handler is currently defined). The subscription re-runs only when this string\n * changes, handler identity never does.\n * @param handlers - Handler map; entries with an `undefined` value are inactive.\n * @returns Stable signature string for the active event-name set.\n */\nfunction getActiveEventSignature(handlers: Partial<mvc.EventMap>): string {\n  return Object.keys(handlers)\n    .filter((eventName) => handlers[eventName] != null)\n    .toSorted((a, b) => a.localeCompare(b))\n    .join(KEY_SIGNATURE_SEPARATOR);\n}\n\n/**\n * Base of the `useOn*Events` hook family ({@link useOnPaperEvents},\n * {@link useOnGraphEvents}, plugin hooks like `useOnKeyboardEvents`).\n *\n * Subscribes `handlers` on `target` with **always-latest** handler semantics\n * (the `useEffectEvent` pattern): the subscription is established once and\n * dispatch reads the current handler from a ref at event time. Consumers can\n * pass inline handler maps, no `useCallback`/`useMemo` needed, no stale\n * closures, no re-subscription churn when a handler's identity changes.\n *\n * Re-subscribes only when `target` changes or the **set of active event names**\n * changes, i.e. a handler is added or removed (toggled to/from `undefined`),\n * mirroring how `onClick={undefined}` binds no listener. A handler swapped for\n * another function under the same key is picked up live, without re-subscribing.\n * @param target - Object to subscribe on; `null`/`undefined` skips subscription.\n * @param handlers - Map of event names to handlers; may be a fresh object every render.\n * @param subscribe - Stable adapter wiring the map onto the target; returns a cleanup callback.\n * @group Hooks\n * @internal\n */\nexport function useOnEvents<Target, HandlerMap extends Partial<mvc.EventMap>>(\n  target: Target | null | undefined,\n  handlers: HandlerMap,\n  subscribe: (target: Target, handlers: HandlerMap) => () => void\n): void {\n  const handlersRef = useLatestRef(handlers);\n\n  const activeEventSignature = getActiveEventSignature(handlers);\n\n  useLayoutEffect(() => {\n    if (!target) return;\n    const liveHandlers: Partial<mvc.EventMap> = {};\n    for (const eventName of Object.keys(handlersRef.current)) {\n      if (handlersRef.current[eventName] == null) continue;\n      liveHandlers[eventName] = (...args: Parameters<mvc.EventHandler>) => {\n        handlersRef.current[eventName]?.(...args);\n      };\n    }\n    return subscribe(target, liveHandlers as HandlerMap);\n    // `activeEventSignature` stands in for `handlers`: handler identity must NOT\n    // re-subscribe — only the active event-name set (and target) does.\n    // eslint-disable-next-line react-hooks/exhaustive-deps\n  }, [target, subscribe, activeEventSignature]);\n}\n"],"names":["useLatestRef","useLayoutEffect"],"mappings":"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"}