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.0.1-main.fd86f9a to 0.1.0-main.89e6ee8

6

lib/commonjs/createPropagation.d.ts

@@ -1,10 +0,6 @@

import { type ReactNode } from 'react';
type Listener<T> = (value: T) => void;
export default function createPropagation<T>(): {
Provider: ({ children }: Readonly<{
children?: ReactNode | undefined;
}>) => import("react/jsx-runtime").JSX.Element;
useListen: (listener: Listener<T>) => void;
usePropagate: () => Listener<T>;
usePropagate: () => (value: T) => void;
};
export {};

57

lib/commonjs/createPropagation.js

@@ -13,44 +13,19 @@ "use strict";

var _removeInline = _interopRequireDefault(require("./private/removeInline"));
var _jsxRuntime = require("react/jsx-runtime");
function createPropagation() {
var Context = /*#__PURE__*/(0, _react.createContext)(new Proxy({}, {
get: function get() {
throw new Error('This hook can only used under its corresponding <Provider>.');
}
}));
var Provider = function Provider(_ref) {
var children = _ref.children;
var listenersRef = (0, _react.useRef)([]);
var addListener = (0, _react.useCallback)(function (listener) {
listenersRef.current.push(listener);
}, [listenersRef]);
var propagate = (0, _react.useMemo)(function () {
return function (value) {
var _context;
(0, _forEach.default)(_context = listenersRef.current).call(_context, function (listener) {
return listener(value);
});
};
}, [listenersRef]);
var removeListener = (0, _react.useCallback)(function (listener) {
return (0, _removeInline.default)(listenersRef.current, listener);
}, [listenersRef]);
var context = (0, _react.useMemo)(function () {
return {
addListener: addListener,
propagate: propagate,
removeListener: removeListener
};
}, [addListener, propagate, removeListener]);
return /*#__PURE__*/(0, _jsxRuntime.jsx)(Context.Provider, {
value: context,
children: children
});
var listeners = [];
var addListener = function addListener(listener) {
return void listeners.push(listener);
};
var removeListener = function removeListener(listener) {
return (0, _removeInline.default)(listeners, listener);
};
var usePropagate = function usePropagate() {
return function (value) {
return (0, _forEach.default)(listeners).call(listeners, function (listener) {
return listener(value);
});
};
};
return {
Provider: Provider,
useListen: function useListen(listener) {
var _useContext = (0, _react.useContext)(Context),
addListener = _useContext.addListener,
removeListener = _useContext.removeListener;
var listenerRef = (0, _useRefFrom.useRefFrom)(listener);

@@ -65,9 +40,7 @@ (0, _react.useEffect)(function () {

};
}, [addListener, listenerRef, removeListener]);
}, [listenerRef]);
},
usePropagate: function usePropagate() {
return (0, _react.useContext)(Context).propagate;
}
usePropagate: usePropagate
};
}
//# sourceMappingURL=createPropagation.js.map

@@ -1,10 +0,6 @@

import { type ReactNode } from 'react';
type Listener<T> = (value: T) => void;
export default function createPropagation<T>(): {
Provider: ({ children }: Readonly<{
children?: ReactNode | undefined;
}>) => import("react/jsx-runtime").JSX.Element;
useListen: (listener: Listener<T>) => void;
usePropagate: () => Listener<T>;
usePropagate: () => (value: T) => void;
};
export {};
import _forEachInstanceProperty from "@babel/runtime-corejs3/core-js-stable/instance/for-each";
import { createContext, useCallback, useContext, useEffect, useMemo, useRef } from 'react';
import { useEffect } from 'react';
import { useRefFrom } from 'use-ref-from';
import removeInline from './private/removeInline';
import { jsx as _jsx } from "react/jsx-runtime";
export default function createPropagation() {
var Context = /*#__PURE__*/createContext(new Proxy({}, {
get: function get() {
throw new Error('This hook can only used under its corresponding <Provider>.');
}
}));
var Provider = function Provider(_ref) {
var children = _ref.children;
var listenersRef = useRef([]);
var addListener = useCallback(function (listener) {
listenersRef.current.push(listener);
}, [listenersRef]);
var propagate = useMemo(function () {
return function (value) {
var _context;
_forEachInstanceProperty(_context = listenersRef.current).call(_context, function (listener) {
return listener(value);
});
};
}, [listenersRef]);
var removeListener = useCallback(function (listener) {
return removeInline(listenersRef.current, listener);
}, [listenersRef]);
var context = useMemo(function () {
return {
addListener: addListener,
propagate: propagate,
removeListener: removeListener
};
}, [addListener, propagate, removeListener]);
return /*#__PURE__*/_jsx(Context.Provider, {
value: context,
children: children
});
var listeners = [];
var addListener = function addListener(listener) {
return void listeners.push(listener);
};
var removeListener = function removeListener(listener) {
return removeInline(listeners, listener);
};
var usePropagate = function usePropagate() {
return function (value) {
return _forEachInstanceProperty(listeners).call(listeners, function (listener) {
return listener(value);
});
};
};
return {
Provider: Provider,
useListen: function useListen(listener) {
var _useContext = useContext(Context),
addListener = _useContext.addListener,
removeListener = _useContext.removeListener;
var listenerRef = useRefFrom(listener);

@@ -56,9 +31,7 @@ useEffect(function () {

};
}, [addListener, listenerRef, removeListener]);
}, [listenerRef]);
},
usePropagate: function usePropagate() {
return useContext(Context).propagate;
}
usePropagate: usePropagate
};
}
//# sourceMappingURL=createPropagation.js.map
{
"name": "use-propagate",
"version": "0.0.1-main.fd86f9a",
"version": "0.1.0-main.89e6ee8",
"description": "Propagates an event to multiple subscribers using React hooks.",

@@ -41,2 +41,3 @@ "files": [

"prepack": "cp ../../CHANGELOG.md . && cp ../../LICENSE . && cp ../../README.md .",
"switch": "cat package.json | jq --arg SWITCH_NAME $SWITCH_NAME -r '(.[\"switch:\" + $SWITCH_NAME] // {}) as $TEMPLATE | .devDependencies += ($TEMPLATE.devDependencies // {}) | .dependencies += ($TEMPLATE.dependencies // {})' | tee ./package.json.tmp && mv ./package.json.tmp ./package.json",
"test": "jest"

@@ -59,4 +60,29 @@ },

"homepage": "https://github.com/compulim/use-propagate#readme",
"switch:react:16": {
"devDependencies": {
"@testing-library/react": "^12",
"@testing-library/react-hooks": "latest",
"@types/react": "^16",
"react": "16.8.0",
"react-test-renderer": "16.8.0"
}
},
"switch:react:17": {
"devDependencies": {
"@testing-library/react": "^12",
"@testing-library/react-hooks": "latest",
"@types/react": "^17",
"react": "17.0.0",
"react-test-renderer": "17.0.0"
}
},
"switch:react:18": {
"devDependencies": {
"@types/react": "^18",
"react": "18.0.0",
"react-test-renderer": "18.0.0"
}
},
"peerDependencies": {
"react": ">=16.9.0"
"react": ">=16.8.0"
},

@@ -83,5 +109,5 @@ "devDependencies": {

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

@@ -21,3 +21,3 @@ # `use-propagate`

// Creates a namespace for the propagation. This should be placed outside of the component.
const { Provider, useListen, usePropagate } = createPropagation<void>();
const { useListen, usePropagate } = createPropagation<void>();

@@ -50,6 +50,6 @@ const FocusButton = () => {

render(
<Provider>
<Fragment>
<FocusButton />
<TextBox />
</Provider>
</Fragment>
);

@@ -62,3 +62,2 @@ ```

export function createPropagation<T>(): {
Provider: ComponentType<{ children?: ReactNode | undefined }>;
useListen: (callback: (value: T) => void) => void;

@@ -77,16 +76,16 @@ usePropagate: (value: T) => void;

Modifies the passing value by following the [`FetchEvent.respondWith` pattern](https://developer.mozilla.org/en-US/docs/Web/API/FetchEvent/respondWith) or [`ExtendableEvent.waitUntil` pattern](https://developer.mozilla.org/en-US/docs/Web/API/ExtendableEvent/waitUntil).
Modifies the passing value by following the [`FetchEvent.respondWith`](https://developer.mozilla.org/en-US/docs/Web/API/FetchEvent/respondWith) or [`ExtendableEvent.waitUntil`](https://developer.mozilla.org/en-US/docs/Web/API/ExtendableEvent/waitUntil) pattern.
### How to re-render when triggered?
Use the following code snippet to save the value to a state, which will cause a re-render.
Use the following code snippet to save the value to a state, which will re-render the component.
```tsx
const MyComponent = () => {
const [value, setValue] = useState();
const [value, setValue] = useState<number>();
// When triggered, saves the value to state.
useListen(value => setValue(value));
useListen(setValue);
return (<p>The value is {value}</p>.
return <p>The value is {value}.</p>;
};

@@ -93,0 +92,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