{"version":3,"file":"useMediator.cjs","names":["useRef","noop"],"sources":["../../src/useMediator/useMediator.ts"],"sourcesContent":["import { useState } from 'react';\nimport { createMediatorContextUtils, noop, effect, reactive, update, isHMREnabled, getFunctionSignature } from '@pastweb/tools';\nimport { getContext, setContext } from '../GlobalContext';\nimport { useBeforeMount } from '../useBeforeMount';\nimport { useRef } from '../useRef';\nimport type { ContextUtils, Mediator, MediatorFunction, Props, Extras } from './types';\n\n/**\n * Creates and renders a tools mediator inside React.\n *\n * Props and extras are wrapped in tools reactive objects, and mediator state is\n * bridged into React rendering.\n *\n * @typeParam T - Mediator return type.\n * @param mediator - Tools mediator factory.\n * @param props - Reactive mediator props. `children` is ignored.\n * @param extras - Reactive mediator extras.\n * @returns Mediator return value with React-rendered state.\n *\n * @example\n * ```tsx\n * const counter = useMediator(createCounterMediator, { initial: 0 });\n *\n * return <button onClick={counter.increment}>{counter.state.count}</button>;\n * ```\n */\nexport const useMediator = <T>(mediator: MediatorFunction<T>, props: Props = {}, extras: Extras = {}): T => {\n  const { children, ...restProps } = props;\n  const isInit = useRef(true);\n  const storedMediator = useRef<MediatorFunction<T> | null>(null);\n  const storedMediatorSignature = useRef<string>('');\n  const storedProps = useRef<Props>({});\n  const storedExtras = useRef<Props>({});\n  const m = useRef<Mediator>({});\n  const updateState = useRef<(state: Record<string, any>) => void>(noop);\n  const onStateChange = useRef((state: Record<string, any>) => updateState.value({ ...state || {}, ...m.value.state || {} }));\n  const hmr = isHMREnabled();\n\n  function init() {\n    storedMediator.value = mediator;\n    storedMediatorSignature.value = getFunctionSignature(mediator);\n    storedProps.value = reactive({ ...restProps });\n    storedExtras.value = reactive({ ...extras });\n\n    const ctxUtils: ContextUtils = { getContext, setContext };\n    m.value = createMediatorContextUtils(storedMediator.value, storedProps.value, storedExtras.value, ctxUtils);\n\n    if (m.value.state) effect(onStateChange.value, m.value.state);\n  }\n\n  useBeforeMount(async () => {\n    init();\n    isInit.value = false;\n  });\n\n  if (!isInit.value) {\n    if (hmr && storedMediatorSignature.value !== getFunctionSignature(mediator)) {\n      init();\n      updateState.value({ ...(m.value.state || {}) });\n    } else {\n      update(storedProps.value, restProps);\n      update(storedExtras.value, extras);\n    }\n  }\n\n  const [state, setState] = useState<Record<string, any>>({ ...m.value.state || {} });\n  updateState.value = setState;\n\n  return { ...m.value, state } as T;\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AA0BA,MAAa,eAAkB,UAA+B,QAAe,CAAC,GAAG,SAAiB,CAAC,MAAS;CAC1G,MAAM,EAAE,UAAU,GAAG,cAAc;CACnC,MAAM,SAASA,sBAAAA,OAAO,IAAI;CAC1B,MAAM,iBAAiBA,sBAAAA,OAAmC,IAAI;CAC9D,MAAM,0BAA0BA,sBAAAA,OAAe,EAAE;CACjD,MAAM,cAAcA,sBAAAA,OAAc,CAAC,CAAC;CACpC,MAAM,eAAeA,sBAAAA,OAAc,CAAC,CAAC;CACrC,MAAM,IAAIA,sBAAAA,OAAiB,CAAC,CAAC;CAC7B,MAAM,cAAcA,sBAAAA,OAA6CC,eAAAA,IAAI;CACrE,MAAM,gBAAgBD,sBAAAA,QAAQ,UAA+B,YAAY,MAAM;EAAE,GAAG,SAAS,CAAC;EAAG,GAAG,EAAE,MAAM,SAAS,CAAC;CAAE,CAAC,CAAC;CAC1H,MAAM,OAAA,GAAA,eAAA,aAAA,CAAmB;CAEzB,SAAS,OAAO;EACd,eAAe,QAAQ;EACvB,wBAAwB,SAAA,GAAA,eAAA,qBAAA,CAA6B,QAAQ;EAC7D,YAAY,SAAA,GAAA,eAAA,SAAA,CAAiB,EAAE,GAAG,UAAU,CAAC;EAC7C,aAAa,SAAA,GAAA,eAAA,SAAA,CAAiB,EAAE,GAAG,OAAO,CAAC;EAE3C,MAAM,WAAyB;GAAE,YAAA,iCAAA;GAAY,YAAA,iCAAA;EAAW;EACxD,EAAE,SAAA,GAAA,eAAA,2BAAA,CAAmC,eAAe,OAAO,YAAY,OAAO,aAAa,OAAO,QAAQ;EAE1G,IAAI,EAAE,MAAM,OAAO,CAAA,GAAA,eAAA,OAAA,CAAO,cAAc,OAAO,EAAE,MAAM,KAAK;CAC9D;CAEA,sCAAA,eAAe,YAAY;EACzB,KAAK;EACL,OAAO,QAAQ;CACjB,CAAC;CAED,IAAI,CAAC,OAAO,OACV,IAAI,OAAO,wBAAwB,WAAA,GAAA,eAAA,qBAAA,CAA+B,QAAQ,GAAG;EAC3E,KAAK;EACL,YAAY,MAAM,EAAE,GAAI,EAAE,MAAM,SAAS,CAAC,EAAG,CAAC;CAChD,OAAO;EACL,CAAA,GAAA,eAAA,OAAA,CAAO,YAAY,OAAO,SAAS;EACnC,CAAA,GAAA,eAAA,OAAA,CAAO,aAAa,OAAO,MAAM;CACnC;CAGF,MAAM,CAAC,OAAO,aAAA,GAAA,MAAA,SAAA,CAA0C,EAAE,GAAG,EAAE,MAAM,SAAS,CAAC,EAAE,CAAC;CAClF,YAAY,QAAQ;CAEpB,OAAO;EAAE,GAAG,EAAE;EAAO;CAAM;AAC7B"}