use-propagate
Advanced tools
Comparing version 0.0.1-main.fd86f9a to 0.1.0-main.89e6ee8
@@ -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 {}; |
@@ -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
License Policy Violation
LicenseThis package is not allowed per your license policy. Review the package's license to ensure compliance.
Found 1 instance in 1 package
License Policy Violation
LicenseThis package is not allowed per your license policy. Review the package's license to ensure compliance.
Found 1 instance in 1 package
22686
145
97