@civet/events 1.0.2 → 1.1.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/LICENSE CHANGED
@@ -1,6 +1,6 @@
1
- The MIT License (MIT)
1
+ MIT License
2
2
 
3
- Copyright (c) 2019 Aaron Burmeister
3
+ Copyright (c) 2024 Civet
4
4
 
5
5
  Permission is hereby granted, free of charge, to any person obtaining a copy
6
6
  of this software and associated documentation files (the "Software"), to deal
@@ -5,22 +5,22 @@ Object.defineProperty(exports, "__esModule", {
5
5
  });
6
6
  exports["default"] = void 0;
7
7
  var _propTypes = _interopRequireDefault(require("prop-types"));
8
- var _react = _interopRequireDefault(require("react"));
9
- var _context = require("./context");
10
8
  var _EventReceiver = require("./EventReceiver");
9
+ var _context = require("./context");
10
+ var _jsxRuntime = require("react/jsx-runtime");
11
11
  function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { "default": obj }; }
12
12
  var ConfigProvider = function ConfigProvider(_ref) {
13
13
  var eventReceiver = _ref.eventReceiver,
14
14
  children = _ref.children;
15
- return /*#__PURE__*/_react["default"].createElement(_context.ConfigContext.Provider, {
15
+ return /*#__PURE__*/(0, _jsxRuntime.jsx)(_context.ConfigContext.Provider, {
16
16
  value: {
17
17
  eventReceiver: eventReceiver
18
- }
19
- }, children);
18
+ },
19
+ children: children
20
+ });
20
21
  };
21
22
  ConfigProvider.propTypes = {
22
23
  eventReceiver: _EventReceiver.eventReceiverPropType,
23
24
  children: _propTypes["default"].node
24
25
  };
25
- var _default = ConfigProvider;
26
- exports["default"] = _default;
26
+ var _default = exports["default"] = ConfigProvider;
@@ -5,27 +5,43 @@ Object.defineProperty(exports, "__esModule", {
5
5
  });
6
6
  exports["default"] = void 0;
7
7
  var _propTypes = _interopRequireDefault(require("prop-types"));
8
- var _react = _interopRequireDefault(require("react"));
9
8
  var _EventReceiver = require("./EventReceiver");
10
9
  var _useEventHandler = _interopRequireDefault(require("./useEventHandler"));
10
+ var _jsxRuntime = require("react/jsx-runtime");
11
11
  var _excluded = ["children"];
12
12
  function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { "default": obj }; }
13
13
  function _objectWithoutProperties(source, excluded) { if (source == null) return {}; var target = _objectWithoutPropertiesLoose(source, excluded); var key, i; if (Object.getOwnPropertySymbols) { var sourceSymbolKeys = Object.getOwnPropertySymbols(source); for (i = 0; i < sourceSymbolKeys.length; i++) { key = sourceSymbolKeys[i]; if (excluded.indexOf(key) >= 0) continue; if (!Object.prototype.propertyIsEnumerable.call(source, key)) continue; target[key] = source[key]; } } return target; }
14
14
  function _objectWithoutPropertiesLoose(source, excluded) { if (source == null) return {}; var target = {}; var sourceKeys = Object.keys(source); var key, i; for (i = 0; i < sourceKeys.length; i++) { key = sourceKeys[i]; if (excluded.indexOf(key) >= 0) continue; target[key] = source[key]; } return target; }
15
- function EventHandler(_ref) {
16
- var children = _ref.children,
17
- props = _objectWithoutProperties(_ref, _excluded);
18
- (0, _useEventHandler["default"])(props);
19
- return /*#__PURE__*/_react["default"].createElement(_react["default"].Fragment, null, children);
20
- }
21
- EventHandler.propTypes = {
15
+ var propTypes = {
16
+ /** EventReceiver to be used */
22
17
  eventReceiver: _EventReceiver.eventReceiverPropType,
18
+ /** ResourceContext to be used */
23
19
  resource: _propTypes["default"].object,
20
+ /** Disables the event handler */
24
21
  disabled: _propTypes["default"].bool,
22
+ /** Options for the EventReceiver */
25
23
  options: _propTypes["default"].object,
24
+ /** Callback to filter events and handle your own event logic - if true is returned, the event does not cause the resource to update */
26
25
  onEvent: _propTypes["default"].func,
26
+ /** Provides information on when the resource has been requested to update - events contains the events that lead to the update */
27
27
  onNotify: _propTypes["default"].func,
28
28
  children: _propTypes["default"].node
29
29
  };
30
- var _default = EventHandler;
31
- exports["default"] = _default;
30
+
31
+ /**
32
+ * Enables automatic updating for a Resource component or useResource hook by subscribing to an EventReceiver.
33
+ *
34
+ * Necessary configuration that is not directly specified is taken from the ConfigContext and ResourceContext.
35
+ *
36
+ * onEvent can be used to directly access events allowing you to add custom event logic to your components.
37
+ */
38
+ function EventHandler(_ref) {
39
+ var children = _ref.children,
40
+ props = _objectWithoutProperties(_ref, _excluded);
41
+ (0, _useEventHandler["default"])(props);
42
+ return /*#__PURE__*/(0, _jsxRuntime.jsx)(_jsxRuntime.Fragment, {
43
+ children: children
44
+ });
45
+ }
46
+ EventHandler.propTypes = propTypes;
47
+ var _default = exports["default"] = EventHandler;
@@ -6,35 +6,30 @@ Object.defineProperty(exports, "__esModule", {
6
6
  exports.isEventReceiver = exports.eventReceiverPropType = exports["default"] = void 0;
7
7
  var _propTypes = _interopRequireDefault(require("prop-types"));
8
8
  function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { "default": obj }; }
9
- function _typeof(obj) { "@babel/helpers - typeof"; return _typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (obj) { return typeof obj; } : function (obj) { return obj && "function" == typeof Symbol && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }, _typeof(obj); }
9
+ function _typeof(o) { "@babel/helpers - typeof"; return _typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (o) { return typeof o; } : function (o) { return o && "function" == typeof Symbol && o.constructor === Symbol && o !== Symbol.prototype ? "symbol" : typeof o; }, _typeof(o); }
10
10
  function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
11
11
  function _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, _toPropertyKey(descriptor.key), descriptor); } }
12
12
  function _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); Object.defineProperty(Constructor, "prototype", { writable: false }); return Constructor; }
13
- function _toPropertyKey(arg) { var key = _toPrimitive(arg, "string"); return _typeof(key) === "symbol" ? key : String(key); }
14
- function _toPrimitive(input, hint) { if (_typeof(input) !== "object" || input === null) return input; var prim = input[Symbol.toPrimitive]; if (prim !== undefined) { var res = prim.call(input, hint || "default"); if (_typeof(res) !== "object") return res; throw new TypeError("@@toPrimitive must return a primitive value."); } return (hint === "string" ? String : Number)(input); }
13
+ function _toPropertyKey(t) { var i = _toPrimitive(t, "string"); return "symbol" == _typeof(i) ? i : i + ""; }
14
+ function _toPrimitive(t, r) { if ("object" != _typeof(t) || !t) return t; var e = t[Symbol.toPrimitive]; if (void 0 !== e) { var i = e.call(t, r || "default"); if ("object" != _typeof(i)) return i; throw new TypeError("@@toPrimitive must return a primitive value."); } return ("string" === r ? String : Number)(t); }
15
15
  var EventReceiver = /*#__PURE__*/function () {
16
16
  function EventReceiver() {
17
17
  _classCallCheck(this, EventReceiver);
18
18
  }
19
- _createClass(EventReceiver, [{
19
+ return _createClass(EventReceiver, [{
20
20
  key: "subscribe",
21
21
  value: function subscribe(resource, options, handler) {
22
22
  if (typeof handler !== 'function') throw new Error('Handler must be a function');
23
23
  var unsubscribe = this.handleSubscribe(resource, options, handler);
24
24
  if (typeof unsubscribe !== 'function') {
25
- // eslint-disable-next-line no-console
26
25
  console.warn('EventReceiver.handleSubscribe should return a callback to cancel the subscription. Ignoring this warning may result in the execution of obsolete handlers and potential memory leaks.');
27
26
  }
28
27
  return unsubscribe;
29
28
  }
30
29
  }]);
31
- return EventReceiver;
32
30
  }();
33
- var isEventReceiver = function isEventReceiver(eventReceiver) {
31
+ var isEventReceiver = exports.isEventReceiver = function isEventReceiver(eventReceiver) {
34
32
  return eventReceiver instanceof EventReceiver;
35
33
  };
36
- exports.isEventReceiver = isEventReceiver;
37
- var eventReceiverPropType = _propTypes["default"].instanceOf(EventReceiver);
38
- exports.eventReceiverPropType = eventReceiverPropType;
39
- var _default = EventReceiver;
40
- exports["default"] = _default;
34
+ var eventReceiverPropType = exports.eventReceiverPropType = _propTypes["default"].instanceOf(EventReceiver);
35
+ var _default = exports["default"] = EventReceiver;
@@ -17,5 +17,4 @@ var composeHandlers = function composeHandlers() {
17
17
  }, false);
18
18
  };
19
19
  };
20
- var _default = composeHandlers;
21
- exports["default"] = _default;
20
+ var _default = exports["default"] = composeHandlers;
package/lib/context.js CHANGED
@@ -4,12 +4,9 @@ Object.defineProperty(exports, "__esModule", {
4
4
  value: true
5
5
  });
6
6
  exports.useConfigContext = exports.ConfigContext = void 0;
7
- var _react = _interopRequireDefault(require("react"));
8
- function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { "default": obj }; }
9
- var ConfigContext = /*#__PURE__*/_react["default"].createContext({});
10
- exports.ConfigContext = ConfigContext;
7
+ var _react = require("react");
8
+ var ConfigContext = exports.ConfigContext = /*#__PURE__*/(0, _react.createContext)({});
11
9
  ConfigContext.displayName = 'Events.ConfigContext';
12
- var useConfigContext = function useConfigContext() {
13
- return _react["default"].useContext(ConfigContext);
14
- };
15
- exports.useConfigContext = useConfigContext;
10
+ var useConfigContext = exports.useConfigContext = function useConfigContext() {
11
+ return (0, _react.useContext)(ConfigContext);
12
+ };
package/lib/index.js CHANGED
@@ -1,6 +1,6 @@
1
1
  "use strict";
2
2
 
3
- function _typeof(obj) { "@babel/helpers - typeof"; return _typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (obj) { return typeof obj; } : function (obj) { return obj && "function" == typeof Symbol && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }, _typeof(obj); }
3
+ function _typeof(o) { "@babel/helpers - typeof"; return _typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (o) { return typeof o; } : function (o) { return o && "function" == typeof Symbol && o.constructor === Symbol && o !== Symbol.prototype ? "symbol" : typeof o; }, _typeof(o); }
4
4
  Object.defineProperty(exports, "__esModule", {
5
5
  value: true
6
6
  });
@@ -54,13 +54,12 @@ Object.defineProperty(exports, "useEventHandler", {
54
54
  }
55
55
  });
56
56
  var _context = require("./context");
57
- var _composeHandlers = _interopRequireDefault(require("./composeHandlers"));
58
57
  var _ConfigProvider = _interopRequireDefault(require("./ConfigProvider"));
59
58
  var _EventHandler = _interopRequireDefault(require("./EventHandler"));
60
59
  var _EventReceiver = _interopRequireWildcard(require("./EventReceiver"));
60
+ var _composeHandlers = _interopRequireDefault(require("./composeHandlers"));
61
61
  var _useEventHandler = _interopRequireDefault(require("./useEventHandler"));
62
- function _getRequireWildcardCache(nodeInterop) { if (typeof WeakMap !== "function") return null; var cacheBabelInterop = new WeakMap(); var cacheNodeInterop = new WeakMap(); return (_getRequireWildcardCache = function _getRequireWildcardCache(nodeInterop) { return nodeInterop ? cacheNodeInterop : cacheBabelInterop; })(nodeInterop); }
63
- function _interopRequireWildcard(obj, nodeInterop) { if (!nodeInterop && obj && obj.__esModule) { return obj; } if (obj === null || _typeof(obj) !== "object" && typeof obj !== "function") { return { "default": obj }; } var cache = _getRequireWildcardCache(nodeInterop); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (key !== "default" && Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj["default"] = obj; if (cache) { cache.set(obj, newObj); } return newObj; }
62
+ function _getRequireWildcardCache(e) { if ("function" != typeof WeakMap) return null; var r = new WeakMap(), t = new WeakMap(); return (_getRequireWildcardCache = function _getRequireWildcardCache(e) { return e ? t : r; })(e); }
63
+ function _interopRequireWildcard(e, r) { if (!r && e && e.__esModule) return e; if (null === e || "object" != _typeof(e) && "function" != typeof e) return { "default": e }; var t = _getRequireWildcardCache(r); if (t && t.has(e)) return t.get(e); var n = { __proto__: null }, a = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var u in e) if ("default" !== u && {}.hasOwnProperty.call(e, u)) { var i = a ? Object.getOwnPropertyDescriptor(e, u) : null; i && (i.get || i.set) ? Object.defineProperty(n, u, i) : n[u] = e[u]; } return n["default"] = e, t && t.set(e, n), n; }
64
64
  function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { "default": obj }; }
65
- var ConfigConsumer = _context.ConfigContext.Consumer;
66
- exports.ConfigConsumer = ConfigConsumer;
65
+ var ConfigConsumer = exports.ConfigConsumer = _context.ConfigContext.Consumer;
@@ -6,15 +6,22 @@ Object.defineProperty(exports, "__esModule", {
6
6
  exports["default"] = void 0;
7
7
  var _core = require("@civet/core");
8
8
  var _fastDeepEqual = _interopRequireDefault(require("fast-deep-equal"));
9
- var _react = _interopRequireDefault(require("react"));
9
+ var _react = require("react");
10
10
  var _context = require("./context");
11
11
  function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { "default": obj }; }
12
12
  function _slicedToArray(arr, i) { return _arrayWithHoles(arr) || _iterableToArrayLimit(arr, i) || _unsupportedIterableToArray(arr, i) || _nonIterableRest(); }
13
13
  function _nonIterableRest() { throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); }
14
14
  function _unsupportedIterableToArray(o, minLen) { if (!o) return; if (typeof o === "string") return _arrayLikeToArray(o, minLen); var n = Object.prototype.toString.call(o).slice(8, -1); if (n === "Object" && o.constructor) n = o.constructor.name; if (n === "Map" || n === "Set") return Array.from(o); if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen); }
15
15
  function _arrayLikeToArray(arr, len) { if (len == null || len > arr.length) len = arr.length; for (var i = 0, arr2 = new Array(len); i < len; i++) arr2[i] = arr[i]; return arr2; }
16
- function _iterableToArrayLimit(arr, i) { var _i = null == arr ? null : "undefined" != typeof Symbol && arr[Symbol.iterator] || arr["@@iterator"]; if (null != _i) { var _s, _e, _x, _r, _arr = [], _n = !0, _d = !1; try { if (_x = (_i = _i.call(arr)).next, 0 === i) { if (Object(_i) !== _i) return; _n = !1; } else for (; !(_n = (_s = _x.call(_i)).done) && (_arr.push(_s.value), _arr.length !== i); _n = !0); } catch (err) { _d = !0, _e = err; } finally { try { if (!_n && null != _i["return"] && (_r = _i["return"](), Object(_r) !== _r)) return; } finally { if (_d) throw _e; } } return _arr; } }
16
+ function _iterableToArrayLimit(r, l) { var t = null == r ? null : "undefined" != typeof Symbol && r[Symbol.iterator] || r["@@iterator"]; if (null != t) { var e, n, i, u, a = [], f = !0, o = !1; try { if (i = (t = t.call(r)).next, 0 === l) { if (Object(t) !== t) return; f = !1; } else for (; !(f = (e = i.call(t)).done) && (a.push(e.value), a.length !== l); f = !0); } catch (r) { o = !0, n = r; } finally { try { if (!f && null != t["return"] && (u = t["return"](), Object(u) !== u)) return; } finally { if (o) throw n; } } return a; } }
17
17
  function _arrayWithHoles(arr) { if (Array.isArray(arr)) return arr; }
18
+ /**
19
+ * Enables automatic updating for a Resource component or useResource hook by subscribing to an EventReceiver.
20
+ *
21
+ * Necessary configuration that is not directly specified is taken from the ConfigContext and ResourceContext.
22
+ *
23
+ * onEvent can be used to directly access events allowing you to add custom event logic to your components.
24
+ */
18
25
  function useEventHandler(_ref) {
19
26
  var eventReceiverProp = _ref.eventReceiver,
20
27
  resourceProp = _ref.resource,
@@ -25,16 +32,24 @@ function useEventHandler(_ref) {
25
32
  var configContext = (0, _context.useConfigContext)();
26
33
  var eventReceiver = eventReceiverProp || configContext.eventReceiver;
27
34
  var resourceContext = (0, _core.useResourceContext)();
28
- var resource = resourceProp || resourceContext;
29
- var _React$useState = _react["default"].useState(optionsProp),
30
- _React$useState2 = _slicedToArray(_React$useState, 2),
31
- options = _React$useState2[0],
32
- setOptions = _React$useState2[1];
35
+ var currentResource = resourceProp || resourceContext;
36
+ var _useState = (0, _react.useState)(currentResource),
37
+ _useState2 = _slicedToArray(_useState, 2),
38
+ resource = _useState2[0],
39
+ setResource = _useState2[1];
40
+ if ((currentResource === null || currentResource === void 0 ? void 0 : currentResource.request) !== (resource === null || resource === void 0 ? void 0 : resource.request)) {
41
+ setResource(currentResource);
42
+ }
43
+ var _useState3 = (0, _react.useState)(optionsProp),
44
+ _useState4 = _slicedToArray(_useState3, 2),
45
+ options = _useState4[0],
46
+ setOptions = _useState4[1];
33
47
  if (!(0, _fastDeepEqual["default"])(options, optionsProp)) {
34
48
  setOptions(optionsProp);
35
49
  }
36
- _react["default"].useEffect(function () {
37
- if (eventReceiver == null || disabled) return undefined;
50
+ var isDisabled = !!disabled;
51
+ (0, _react.useEffect)(function () {
52
+ if (eventReceiver == null || isDisabled) return undefined;
38
53
  var unsubscribe = eventReceiver.subscribe(resource, options, function (data) {
39
54
  if (((data === null || data === void 0 ? void 0 : data.length) || 0) === 0) return;
40
55
  var unhandledEvents;
@@ -54,7 +69,6 @@ function useEventHandler(_ref) {
54
69
  }
55
70
  });
56
71
  return unsubscribe;
57
- }, [eventReceiver, !disabled, resource === null || resource === void 0 ? void 0 : resource.request, options, onEvent, onNotify]);
72
+ }, [eventReceiver, isDisabled, resource, options, onEvent, onNotify]);
58
73
  }
59
- var _default = useEventHandler;
60
- exports["default"] = _default;
74
+ var _default = exports["default"] = useEventHandler;
package/package.json CHANGED
@@ -1,22 +1,29 @@
1
1
  {
2
2
  "name": "@civet/events",
3
- "version": "1.0.2",
3
+ "version": "1.1.1",
4
4
  "description": "Civet",
5
5
  "main": "./lib/index.js",
6
+ "exports": {
7
+ ".": {
8
+ "import": "./src/index.js",
9
+ "require": "./lib/index.js",
10
+ "default": "./lib/index.js"
11
+ }
12
+ },
13
+ "files": [
14
+ "lib",
15
+ "src"
16
+ ],
6
17
  "scripts": {
7
18
  "build:clean": "rimraf ./lib",
8
19
  "prebuild": "npm run build:clean",
9
- "build": "cross-env BABEL_ENV=commonjs babel src --out-dir lib",
10
- "lint": "eslint src",
20
+ "build": "babel src -d lib",
21
+ "lint": "eslint src --report-unused-disable-directives",
11
22
  "prepare": "npm run lint && npm run build",
12
23
  "preversion": "git diff HEAD --name-only --exit-code || (echo -\\> unclean working directory && exit 1)",
13
24
  "postversion": "cross-env git commit -am$npm_package_version",
14
25
  "prettify": "prettier --write src/**"
15
26
  },
16
- "files": [
17
- "lib",
18
- "src"
19
- ],
20
27
  "repository": {
21
28
  "type": "git",
22
29
  "url": "git+https://github.com/civet-org/events.git"
@@ -34,32 +41,29 @@
34
41
  },
35
42
  "homepage": "https://civet.js.org/",
36
43
  "devDependencies": {
37
- "@babel/cli": "^7.20.7",
38
- "@babel/core": "^7.20.7",
39
- "@babel/plugin-proposal-class-properties": "^7.18.6",
40
- "@babel/preset-env": "^7.20.2",
44
+ "@babel/cli": "^7.22.15",
45
+ "@babel/core": "^7.24.4",
46
+ "@babel/eslint-parser": "^7.22.15",
47
+ "@babel/preset-env": "^7.24.4",
41
48
  "@babel/preset-react": "^7.18.6",
42
- "@civet/core": "^1.2.2",
43
- "babel-eslint": "^10.1.0",
49
+ "@civet/core": "^1.3.0",
44
50
  "cross-env": "^7.0.3",
45
- "eslint": "^7.32.0",
46
- "eslint-config-airbnb": "^18.2.1",
47
- "eslint-config-airbnb-base": "^14.2.1",
48
- "eslint-config-prettier": "^8.5.0",
49
- "eslint-plugin-import": "^2.24.1",
50
- "eslint-plugin-jsx-a11y": "^6.6.1",
51
- "eslint-plugin-prettier": "^4.2.1",
52
- "eslint-plugin-react": "^7.31.11",
51
+ "eslint": "^8.53.0",
52
+ "eslint-config-prettier": "^9.0.0",
53
+ "eslint-plugin-import": "^2.29.0",
54
+ "eslint-plugin-prettier": "^5.0.1",
55
+ "eslint-plugin-react": "^7.33.2",
53
56
  "eslint-plugin-react-hooks": "^4.6.0",
54
- "prettier": "^2.8.1",
57
+ "eslint-plugin-unused-imports": "^3.0.0",
58
+ "prettier": "^3.2.5",
55
59
  "react": "^18.2.0",
56
60
  "react-dom": "^18.2.0",
57
- "rimraf": "^3.0.2"
61
+ "rimraf": "^5.0.5"
58
62
  },
59
63
  "peerDependencies": {
60
- "@civet/core": ">= 1.0.0",
61
- "react": ">= 16.8",
62
- "react-dom": ">= 16.8"
64
+ "@civet/core": ">=1.3.0",
65
+ "react": ">=18.0",
66
+ "react-dom": ">=18.0"
63
67
  },
64
68
  "dependencies": {
65
69
  "fast-deep-equal": "^3.1.3",
@@ -1,8 +1,6 @@
1
1
  import PropTypes from 'prop-types';
2
- import React from 'react';
3
-
4
- import { ConfigContext } from './context';
5
2
  import { eventReceiverPropType } from './EventReceiver';
3
+ import { ConfigContext } from './context';
6
4
 
7
5
  const ConfigProvider = ({ eventReceiver, children }) => (
8
6
  <ConfigContext.Provider value={{ eventReceiver }}>{children}</ConfigContext.Provider>
@@ -0,0 +1,36 @@
1
+ import PropTypes from 'prop-types';
2
+ import { eventReceiverPropType } from './EventReceiver';
3
+ import useEventHandler from './useEventHandler';
4
+
5
+ const propTypes = {
6
+ /** EventReceiver to be used */
7
+ eventReceiver: eventReceiverPropType,
8
+ /** ResourceContext to be used */
9
+ resource: PropTypes.object,
10
+ /** Disables the event handler */
11
+ disabled: PropTypes.bool,
12
+ /** Options for the EventReceiver */
13
+ options: PropTypes.object,
14
+ /** Callback to filter events and handle your own event logic - if true is returned, the event does not cause the resource to update */
15
+ onEvent: PropTypes.func,
16
+ /** Provides information on when the resource has been requested to update - events contains the events that lead to the update */
17
+ onNotify: PropTypes.func,
18
+ children: PropTypes.node,
19
+ };
20
+
21
+ /**
22
+ * Enables automatic updating for a Resource component or useResource hook by subscribing to an EventReceiver.
23
+ *
24
+ * Necessary configuration that is not directly specified is taken from the ConfigContext and ResourceContext.
25
+ *
26
+ * onEvent can be used to directly access events allowing you to add custom event logic to your components.
27
+ */
28
+ function EventHandler({ children, ...props }) {
29
+ useEventHandler(props);
30
+
31
+ return <>{children}</>;
32
+ }
33
+
34
+ EventHandler.propTypes = propTypes;
35
+
36
+ export default EventHandler;
@@ -5,7 +5,6 @@ class EventReceiver {
5
5
  if (typeof handler !== 'function') throw new Error('Handler must be a function');
6
6
  const unsubscribe = this.handleSubscribe(resource, options, handler);
7
7
  if (typeof unsubscribe !== 'function') {
8
- // eslint-disable-next-line no-console
9
8
  console.warn(
10
9
  'EventReceiver.handleSubscribe should return a callback to cancel the subscription. Ignoring this warning may result in the execution of obsolete handlers and potential memory leaks.',
11
10
  );
package/src/context.js CHANGED
@@ -1,5 +1,5 @@
1
- import React from 'react';
1
+ import { createContext, useContext } from 'react';
2
2
 
3
- export const ConfigContext = React.createContext({});
3
+ export const ConfigContext = createContext({});
4
4
  ConfigContext.displayName = 'Events.ConfigContext';
5
- export const useConfigContext = () => React.useContext(ConfigContext);
5
+ export const useConfigContext = () => useContext(ConfigContext);
package/src/index.js CHANGED
@@ -1,9 +1,9 @@
1
1
  import { ConfigContext, useConfigContext } from './context';
2
2
 
3
3
  export const { Consumer: ConfigConsumer } = ConfigContext;
4
- export { default as composeHandlers } from './composeHandlers';
5
4
  export { default as ConfigProvider } from './ConfigProvider';
6
5
  export { default as EventHandler } from './EventHandler';
7
6
  export { default as EventReceiver, eventReceiverPropType, isEventReceiver } from './EventReceiver';
7
+ export { default as composeHandlers } from './composeHandlers';
8
8
  export { default as useEventHandler } from './useEventHandler';
9
9
  export { useConfigContext };
@@ -1,30 +1,49 @@
1
1
  import { useResourceContext } from '@civet/core';
2
2
  import deepEquals from 'fast-deep-equal';
3
- import React from 'react';
4
-
3
+ import { useEffect, useState } from 'react';
5
4
  import { useConfigContext } from './context';
6
5
 
6
+ /**
7
+ * Enables automatic updating for a Resource component or useResource hook by subscribing to an EventReceiver.
8
+ *
9
+ * Necessary configuration that is not directly specified is taken from the ConfigContext and ResourceContext.
10
+ *
11
+ * onEvent can be used to directly access events allowing you to add custom event logic to your components.
12
+ */
7
13
  function useEventHandler({
14
+ /** EventReceiver to be used */
8
15
  eventReceiver: eventReceiverProp,
16
+ /** ResourceContext to be used */
9
17
  resource: resourceProp,
18
+ /** Disables the event handler */
10
19
  disabled,
20
+ /** Options for the EventReceiver */
11
21
  options: optionsProp,
22
+ /** Callback to filter events and handle your own event logic - if true is returned, the event does not cause the resource to update */
12
23
  onEvent,
24
+ /** Provides information on when the resource has been requested to update - events contains the events that lead to the update */
13
25
  onNotify,
14
26
  }) {
15
27
  const configContext = useConfigContext();
16
28
  const eventReceiver = eventReceiverProp || configContext.eventReceiver;
17
29
 
18
30
  const resourceContext = useResourceContext();
19
- const resource = resourceProp || resourceContext;
31
+ const currentResource = resourceProp || resourceContext;
32
+
33
+ const [resource, setResource] = useState(currentResource);
34
+ if (currentResource?.request !== resource?.request) {
35
+ setResource(currentResource);
36
+ }
20
37
 
21
- const [options, setOptions] = React.useState(optionsProp);
38
+ const [options, setOptions] = useState(optionsProp);
22
39
  if (!deepEquals(options, optionsProp)) {
23
40
  setOptions(optionsProp);
24
41
  }
25
42
 
26
- React.useEffect(() => {
27
- if (eventReceiver == null || disabled) return undefined;
43
+ const isDisabled = !!disabled;
44
+
45
+ useEffect(() => {
46
+ if (eventReceiver == null || isDisabled) return undefined;
28
47
  const unsubscribe = eventReceiver.subscribe(resource, options, (data) => {
29
48
  if ((data?.length || 0) === 0) return;
30
49
  let unhandledEvents;
@@ -40,7 +59,7 @@ function useEventHandler({
40
59
  }
41
60
  });
42
61
  return unsubscribe;
43
- }, [eventReceiver, !disabled, resource?.request, options, onEvent, onNotify]);
62
+ }, [eventReceiver, isDisabled, resource, options, onEvent, onNotify]);
44
63
  }
45
64
 
46
65
  export default useEventHandler;
@@ -1,23 +0,0 @@
1
- import PropTypes from 'prop-types';
2
- import React from 'react';
3
-
4
- import { eventReceiverPropType } from './EventReceiver';
5
- import useEventHandler from './useEventHandler';
6
-
7
- function EventHandler({ children, ...props }) {
8
- useEventHandler(props);
9
-
10
- return <>{children}</>;
11
- }
12
-
13
- EventHandler.propTypes = {
14
- eventReceiver: eventReceiverPropType,
15
- resource: PropTypes.object,
16
- disabled: PropTypes.bool,
17
- options: PropTypes.object,
18
- onEvent: PropTypes.func,
19
- onNotify: PropTypes.func,
20
- children: PropTypes.node,
21
- };
22
-
23
- export default EventHandler;