{"version":3,"file":"useCrossFrameState.cjs","names":["useEditorStateManager","CrossFrameStateManager"],"sources":["../../src/useCrossFrameState.tsx"],"sourcesContent":["'use client';\n\nimport type { MessageKey } from '@intlayer/editor';\nimport { CrossFrameStateManager } from '@intlayer/editor';\nimport {\n  type Dispatch,\n  type SetStateAction,\n  useEffect,\n  useRef,\n  useState,\n} from 'react';\nimport { useEditorStateManager } from './EditorStateContext';\n\nexport type CrossFrameStateOptions = {\n  emit?: boolean;\n  receive?: boolean;\n};\n\n/**\n * Synchronizes a React state value across frames using CrossFrameStateManager.\n */\nexport const useCrossFrameState = <S,>(\n  key: `${MessageKey}`,\n  initialState?: S | (() => S),\n  options?: CrossFrameStateOptions\n): [S, Dispatch<SetStateAction<S>>, () => void] => {\n  const manager = useEditorStateManager();\n\n  const resolvedInitial =\n    typeof initialState === 'function'\n      ? (initialState as () => S)()\n      : initialState;\n\n  const [value, setValueState] = useState<S>(resolvedInitial as S);\n  const valueRef = useRef<S>(resolvedInitial as S);\n\n  const stateManagerRef = useRef<CrossFrameStateManager<S> | null>(null);\n\n  useEffect(() => {\n    const { emit = true, receive = true } = options ?? {};\n    const stateManager = new CrossFrameStateManager<S>(\n      key,\n      manager?.messenger,\n      {\n        emit,\n        receive,\n        initialValue: resolvedInitial,\n      }\n    );\n    stateManagerRef.current = stateManager;\n\n    const handler = (e: Event) => {\n      const newValue = (e as CustomEvent<S>).detail;\n      valueRef.current = newValue;\n      setValueState(newValue);\n    };\n    stateManager.addEventListener('change', handler);\n    stateManager.start();\n\n    return () => {\n      stateManager.removeEventListener('change', handler);\n      stateManager.stop();\n      stateManagerRef.current = null;\n    };\n  }, [key, manager?.messenger, options?.emit, options?.receive]);\n\n  const setValue: Dispatch<SetStateAction<S>> = (valueOrUpdater) => {\n    setValueState((prev) => {\n      const newValue =\n        typeof valueOrUpdater === 'function'\n          ? (valueOrUpdater as (prev: S) => S)(prev)\n          : valueOrUpdater;\n      valueRef.current = newValue;\n      stateManagerRef.current?.set(newValue);\n      return newValue;\n    });\n  };\n\n  const postState = () => {\n    stateManagerRef.current?.postCurrentValue();\n  };\n\n  return [value, setValue, postState];\n};\n"],"mappings":";;;;;;;;;;;;AAqBA,MAAa,sBACX,KACA,cACA,YACiD;CACjD,MAAM,UAAUA,kDAAuB;CAEvC,MAAM,kBACJ,OAAO,iBAAiB,aACnB,cAA0B,GAC3B;CAEN,MAAM,CAAC,OAAO,qCAA6B,gBAAqB;CAChE,MAAM,6BAAqB,gBAAqB;CAEhD,MAAM,oCAA2D,KAAK;AAEtE,4BAAgB;EACd,MAAM,EAAE,OAAO,MAAM,UAAU,SAAS,WAAW,EAAE;EACrD,MAAM,eAAe,IAAIC,wCACvB,KACA,SAAS,WACT;GACE;GACA;GACA,cAAc;GACf,CACF;AACD,kBAAgB,UAAU;EAE1B,MAAM,WAAW,MAAa;GAC5B,MAAM,WAAY,EAAqB;AACvC,YAAS,UAAU;AACnB,iBAAc,SAAS;;AAEzB,eAAa,iBAAiB,UAAU,QAAQ;AAChD,eAAa,OAAO;AAEpB,eAAa;AACX,gBAAa,oBAAoB,UAAU,QAAQ;AACnD,gBAAa,MAAM;AACnB,mBAAgB,UAAU;;IAE3B;EAAC;EAAK,SAAS;EAAW,SAAS;EAAM,SAAS;EAAQ,CAAC;CAE9D,MAAM,YAAyC,mBAAmB;AAChE,iBAAe,SAAS;GACtB,MAAM,WACJ,OAAO,mBAAmB,aACrB,eAAkC,KAAK,GACxC;AACN,YAAS,UAAU;AACnB,mBAAgB,SAAS,IAAI,SAAS;AACtC,UAAO;IACP;;CAGJ,MAAM,kBAAkB;AACtB,kBAAgB,SAAS,kBAAkB;;AAG7C,QAAO;EAAC;EAAO;EAAU;EAAU"}