{"version":3,"sources":["../src/private/createPropagation.tsx","../src/private/createPropagateContextValue.tsx"],"sourcesContent":["import React, {\n  createContext,\n  memo,\n  useCallback,\n  useContext,\n  useEffect,\n  useLayoutEffect,\n  useMemo,\n  type ReactNode\n} from 'react';\nimport { useRefFrom } from 'use-ref-from';\nimport createPropagationContextValue, {\n  type Listener,\n  type PropagationContext\n} from './createPropagateContextValue.tsx';\n\ntype Init = {\n  /**\n   * `true` to allows calling propagate callback function during render-time, otherwise, `false` (default).\n   *\n   * Propagation during render-time is normally discouraged. If listeners save the value into a state, multiple re-render could occur.\n   * This option prevents render deadlock by disallowing propagation during render-time.\n   */\n  allowPropagateDuringRender?: boolean | undefined;\n};\n\nexport default function createPropagation<T>(init: Init = {}) {\n  type Fn = Listener<T>;\n\n  const { allowPropagateDuringRender } = init;\n  const context = createContext<PropagationContext<T>>(createPropagationContextValue());\n\n  let rendering: boolean = false;\n\n  function PropagationScope({ children }: Readonly<{ children?: ReactNode | undefined }>) {\n    // First argument is intentionally not an arrow function but a reference to a function.\n    // eslint-disable-next-line react-hooks/use-memo\n    const value = useMemo<PropagationContext<T>>(createPropagationContextValue, []);\n    return <context.Provider value={value}>{children}</context.Provider>;\n  }\n\n  return {\n    PropagationScope: memo(PropagationScope),\n    useListen: (listener: Fn) => {\n      const listenerRef = useRefFrom(listener);\n      const { addListener, removeListener } = useContext(context);\n\n      const wrappingListener = useMemo(() => {\n        const wrappingListener: Fn = value => listenerRef.current(value);\n\n        addListener(wrappingListener);\n\n        return wrappingListener;\n      }, [addListener, listenerRef]);\n\n      useEffect(() => () => removeListener(wrappingListener), [removeListener, wrappingListener]);\n    },\n    usePropagate: () => {\n      rendering = true;\n      const { runListeners } = useContext(context);\n\n      useLayoutEffect(() => {\n        rendering = false;\n      });\n\n      return useCallback(\n        (value: T) => {\n          if (rendering && !allowPropagateDuringRender) {\n            return console.warn(\n              'use-propagate: The propagate callback function should not be called while rendering, ignoring the call.'\n            );\n          }\n\n          runListeners(value);\n        },\n        [runListeners]\n      );\n    }\n  };\n}\n","export type Listener<T> = (value: T) => void;\n\nexport type PropagationContext<T> = Readonly<{\n  addListener(listener: Listener<T>): void;\n  removeListener(listener: Listener<T>): void;\n  runListeners(value: T): void;\n}>;\n\nexport default function createPropagationContextValue<T>(): PropagationContext<T> {\n  type Fn = Listener<T>;\n  const listeners = new Set<Fn>();\n  return {\n    addListener(listener: Fn) {\n      listeners.add(listener);\n    },\n    removeListener(listener: Fn) {\n      listeners.delete(listener);\n    },\n    runListeners(value: T) {\n      listeners.forEach(listener => listener(value));\n    }\n  };\n}\n"],"mappings":";AAAA,OAAO;AAAA,EACL;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,OAEK;AACP,SAAS,kBAAkB;;;ACFZ,SAAR,gCAA2E;AAEhF,QAAM,YAAY,oBAAI,IAAQ;AAC9B,SAAO;AAAA,IACL,YAAY,UAAc;AACxB,gBAAU,IAAI,QAAQ;AAAA,IACxB;AAAA,IACA,eAAe,UAAc;AAC3B,gBAAU,OAAO,QAAQ;AAAA,IAC3B;AAAA,IACA,aAAa,OAAU;AACrB,gBAAU,QAAQ,cAAY,SAAS,KAAK,CAAC;AAAA,IAC/C;AAAA,EACF;AACF;;;ADIe,SAAR,kBAAsC,OAAa,CAAC,GAAG;AAG5D,QAAM,EAAE,2BAA2B,IAAI;AACvC,QAAM,UAAU,cAAqC,8BAA8B,CAAC;AAEpF,MAAI,YAAqB;AAEzB,WAAS,iBAAiB,EAAE,SAAS,GAAmD;AAGtF,UAAM,QAAQ,QAA+B,+BAA+B,CAAC,CAAC;AAC9E,WAAO,oCAAC,QAAQ,UAAR,EAAiB,SAAe,QAAS;AAAA,EACnD;AAEA,SAAO;AAAA,IACL,kBAAkB,KAAK,gBAAgB;AAAA,IACvC,WAAW,CAAC,aAAiB;AAC3B,YAAM,cAAc,WAAW,QAAQ;AACvC,YAAM,EAAE,aAAa,eAAe,IAAI,WAAW,OAAO;AAE1D,YAAM,mBAAmB,QAAQ,MAAM;AACrC,cAAMA,oBAAuB,WAAS,YAAY,QAAQ,KAAK;AAE/D,oBAAYA,iBAAgB;AAE5B,eAAOA;AAAA,MACT,GAAG,CAAC,aAAa,WAAW,CAAC;AAE7B,gBAAU,MAAM,MAAM,eAAe,gBAAgB,GAAG,CAAC,gBAAgB,gBAAgB,CAAC;AAAA,IAC5F;AAAA,IACA,cAAc,MAAM;AAClB,kBAAY;AACZ,YAAM,EAAE,aAAa,IAAI,WAAW,OAAO;AAE3C,sBAAgB,MAAM;AACpB,oBAAY;AAAA,MACd,CAAC;AAED,aAAO;AAAA,QACL,CAAC,UAAa;AACZ,cAAI,aAAa,CAAC,4BAA4B;AAC5C,mBAAO,QAAQ;AAAA,cACb;AAAA,YACF;AAAA,UACF;AAEA,uBAAa,KAAK;AAAA,QACpB;AAAA,QACA,CAAC,YAAY;AAAA,MACf;AAAA,IACF;AAAA,EACF;AACF;","names":["wrappingListener"]}