{"version":3,"file":"useTimelineExternalStore.mjs","names":[],"sources":["../../../src/hooks/core/useTimelineExternalStore.ts"],"sourcesContent":["import { shallowEqual } from '#react/hooks/core/timelineSnapshotEqual';\nimport { useTimelineEngine } from '#react/hooks/core/useTimelineEngine';\nimport type { EngineEventMap, TimelineEngine } from '@techsquidtv/canvas-timeline-core';\nimport { useCallback, useRef, useSyncExternalStore } from 'react';\ntype TimelineExternalStoreEvent = keyof EngineEventMap;\ntype TimelineExternalStoreSnapshot<T> = (engine: TimelineEngine) => T;\n\n/**\n * Subscribes to TimelineEngine events with stable React external-store callbacks.\n */\nexport function useTimelineExternalStore<T>(\n  events: readonly TimelineExternalStoreEvent[],\n  getSnapshotForEngine: TimelineExternalStoreSnapshot<T>,\n  isEqual: (previous: T, next: T) => boolean = shallowEqual\n): T {\n  const engine = useTimelineEngine();\n  const previous = useRef<{ engine: TimelineEngine; value: T } | undefined>(undefined);\n\n  const subscribe = useCallback(\n    (onStoreChange: () => void) => {\n      const unsubscribe = events.map((eventName) => engine.on(eventName, onStoreChange));\n      return () => {\n        for (const unsubscribeEvent of unsubscribe) {\n          unsubscribeEvent();\n        }\n      };\n    },\n    [engine, events]\n  );\n\n  const getSnapshot = useCallback(() => {\n    const next = getSnapshotForEngine(engine);\n    if (previous.current?.engine === engine && isEqual(previous.current.value, next)) {\n      return previous.current.value;\n    }\n    previous.current = { engine, value: next };\n    return next;\n  }, [engine, getSnapshotForEngine, isEqual]);\n\n  return useSyncExternalStore(subscribe, getSnapshot, getSnapshot);\n}\n"],"mappings":";;;;;;;AAUA,SAAgB,yBACd,QACA,sBACA,UAA6C,cAC1C;CACH,MAAM,SAAS,kBAAkB;CACjC,MAAM,WAAW,OAAyD,KAAA,CAAS;CAEnF,MAAM,YAAY,aACf,kBAA8B;EAC7B,MAAM,cAAc,OAAO,KAAK,cAAc,OAAO,GAAG,WAAW,aAAa,CAAC;EACjF,aAAa;GACX,KAAK,MAAM,oBAAoB,aAC7B,iBAAiB;EAErB;CACF,GACA,CAAC,QAAQ,MAAM,CACjB;CAEA,MAAM,cAAc,kBAAkB;EACpC,MAAM,OAAO,qBAAqB,MAAM;EACxC,IAAI,SAAS,SAAS,WAAW,UAAU,QAAQ,SAAS,QAAQ,OAAO,IAAI,GAC7E,OAAO,SAAS,QAAQ;EAE1B,SAAS,UAAU;GAAE;GAAQ,OAAO;EAAK;EACzC,OAAO;CACT,GAAG;EAAC;EAAQ;EAAsB;CAAO,CAAC;CAE1C,OAAO,qBAAqB,WAAW,aAAa,WAAW;AACjE"}