Socket
Socket
Sign inDemoInstall

use-propagate

Package Overview
Dependencies
Maintainers
1
Versions
22
Alerts
File Explorer

Advanced tools

Socket logo

Install Socket

Detect and block malicious and high-risk dependencies

Install

use-propagate - npm Package Compare versions

Comparing version 0.1.0-main.89e6ee8 to 0.1.0-main.c135359

11

lib/commonjs/createPropagation.d.ts
type Listener<T> = (value: T) => void;
export default function createPropagation<T>(): {
type Init = {
/**
* `true` to allows calling propagate callback function during render-time, otherwise, `false` (default).
*
* Propagation during render-time is normally discouraged. If listeners save the value into a state, multiple re-render could occur.
* This option prevents render deadlock by disallowing propagation during render-time.
*/
allowPropagateDuringRender?: boolean | undefined;
};
export default function createPropagation<T>(init?: Init): {
useListen: (listener: Listener<T>) => void;

@@ -4,0 +13,0 @@ usePropagate: () => (value: T) => void;

32

lib/commonjs/createPropagation.js

@@ -9,17 +9,27 @@ "use strict";

exports.default = createPropagation;
var _set = _interopRequireDefault(require("@babel/runtime-corejs3/core-js-stable/set"));
var _forEach = _interopRequireDefault(require("@babel/runtime-corejs3/core-js-stable/instance/for-each"));
var _react = require("react");
var _useRefFrom = require("use-ref-from");
var _removeInline = _interopRequireDefault(require("./private/removeInline"));
function createPropagation() {
var listeners = [];
var init = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
var rendering = false;
var allowPropagateDuringRender = init.allowPropagateDuringRender;
var listeners = new _set.default();
var addListener = function addListener(listener) {
return void listeners.push(listener);
return void listeners.add(listener);
};
var removeListener = function removeListener(listener) {
return (0, _removeInline.default)(listeners, listener);
return void listeners.delete(listener);
};
var usePropagate = function usePropagate() {
rendering = true;
(0, _react.useLayoutEffect)(function () {
rendering = false;
});
return function (value) {
return (0, _forEach.default)(listeners).call(listeners, function (listener) {
if (rendering && !allowPropagateDuringRender) {
return console.warn('use-propagate: The propagate callback function should not be called while rendering, ignoring the call.');
}
(0, _forEach.default)(listeners).call(listeners, function (listener) {
return listener(value);

@@ -32,11 +42,13 @@ });

var listenerRef = (0, _useRefFrom.useRefFrom)(listener);
var wrappingListener = (0, _react.useCallback)(function (value) {
return listenerRef.current(value);
}, [listenerRef]);
(0, _react.useMemo)(function () {
return addListener(wrappingListener);
}, [wrappingListener]);
(0, _react.useEffect)(function () {
var wrappingListener = function wrappingListener(value) {
return listenerRef.current(value);
};
addListener(wrappingListener);
return function () {
return removeListener(wrappingListener);
};
}, [listenerRef]);
}, [wrappingListener]);
},

@@ -43,0 +55,0 @@ usePropagate: usePropagate

type Listener<T> = (value: T) => void;
export default function createPropagation<T>(): {
type Init = {
/**
* `true` to allows calling propagate callback function during render-time, otherwise, `false` (default).
*
* Propagation during render-time is normally discouraged. If listeners save the value into a state, multiple re-render could occur.
* This option prevents render deadlock by disallowing propagation during render-time.
*/
allowPropagateDuringRender?: boolean | undefined;
};
export default function createPropagation<T>(init?: Init): {
useListen: (listener: Listener<T>) => void;

@@ -4,0 +13,0 @@ usePropagate: () => (value: T) => void;

@@ -0,16 +1,26 @@

import _Set from "@babel/runtime-corejs3/core-js-stable/set";
import _forEachInstanceProperty from "@babel/runtime-corejs3/core-js-stable/instance/for-each";
import { useEffect } from 'react';
import { useCallback, useEffect, useLayoutEffect, useMemo } from 'react';
import { useRefFrom } from 'use-ref-from';
import removeInline from './private/removeInline';
export default function createPropagation() {
var listeners = [];
var init = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
var rendering = false;
var allowPropagateDuringRender = init.allowPropagateDuringRender;
var listeners = new _Set();
var addListener = function addListener(listener) {
return void listeners.push(listener);
return void listeners.add(listener);
};
var removeListener = function removeListener(listener) {
return removeInline(listeners, listener);
return void listeners.delete(listener);
};
var usePropagate = function usePropagate() {
rendering = true;
useLayoutEffect(function () {
rendering = false;
});
return function (value) {
return _forEachInstanceProperty(listeners).call(listeners, function (listener) {
if (rendering && !allowPropagateDuringRender) {
return console.warn('use-propagate: The propagate callback function should not be called while rendering, ignoring the call.');
}
_forEachInstanceProperty(listeners).call(listeners, function (listener) {
return listener(value);

@@ -23,11 +33,13 @@ });

var listenerRef = useRefFrom(listener);
var wrappingListener = useCallback(function (value) {
return listenerRef.current(value);
}, [listenerRef]);
useMemo(function () {
return addListener(wrappingListener);
}, [wrappingListener]);
useEffect(function () {
var wrappingListener = function wrappingListener(value) {
return listenerRef.current(value);
};
addListener(wrappingListener);
return function () {
return removeListener(wrappingListener);
};
}, [listenerRef]);
}, [wrappingListener]);
},

@@ -34,0 +46,0 @@ usePropagate: usePropagate

{
"name": "use-propagate",
"version": "0.1.0-main.89e6ee8",
"version": "0.1.0-main.c135359",
"description": "Propagates an event to multiple subscribers using React hooks.",

@@ -107,5 +107,5 @@ "files": [

"@babel/runtime-corejs3": "^7.24.1",
"use-propagate": "^0.1.0-main.89e6ee8",
"use-propagate": "^0.1.0-main.c135359",
"use-ref-from": "^0.0.3"
}
}

@@ -71,2 +71,10 @@ # `use-propagate`

### Why I should not call propagate callback function during render-time?
When the propagate callback function is called during rendering, a warning message will be printed and propagation will be stopped.
This is a safety measure to prevent multiple re-render and potential deadlock situation if listeners save the value to a state and trigger another re-render.
If listeners are controlled and would never trigger re-render, you can pass `allowPropagateDuringRender: true` option to ignore this safety measure.
### How to get response from the listener or wait for the listener to complete?

@@ -91,2 +99,4 @@

Please make sure the propagate callback function is not called during render as it could cause multiple re-render and potential deadlock situation.
## Contributions

@@ -93,0 +103,0 @@

Sorry, the diff of this file is not supported yet

Sorry, the diff of this file is not supported yet

SocketSocket SOC 2 Logo

Product

  • Package Alerts
  • Integrations
  • Docs
  • Pricing
  • FAQ
  • Roadmap
  • Changelog

Packages

npm

Stay in touch

Get open source security insights delivered straight into your inbox.


  • Terms
  • Privacy
  • Security

Made with ⚡️ by Socket Inc