useActor.js 3.1 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374
  1. "use strict";
  2. Object.defineProperty(exports, "__esModule", { value: true });
  3. exports.useActor = exports.isActorWithState = void 0;
  4. var react_1 = require("react");
  5. var use_isomorphic_layout_effect_1 = require("use-isomorphic-layout-effect");
  6. var useConstant_1 = require("./useConstant");
  7. var with_selector_1 = require("use-sync-external-store/shim/with-selector");
  8. var utils_1 = require("./utils");
  9. function identity(a) {
  10. return a;
  11. }
  12. function isActorWithState(actorRef) {
  13. return 'state' in actorRef;
  14. }
  15. exports.isActorWithState = isActorWithState;
  16. function isDeferredActor(actorRef) {
  17. return 'deferred' in actorRef;
  18. }
  19. function defaultGetSnapshot(actorRef) {
  20. return 'getSnapshot' in actorRef
  21. ? (0, utils_1.isService)(actorRef)
  22. ? (0, utils_1.getServiceSnapshot)(actorRef)
  23. : actorRef.getSnapshot()
  24. : isActorWithState(actorRef)
  25. ? actorRef.state
  26. : undefined;
  27. }
  28. function useActor(actorRef, getSnapshot) {
  29. if (getSnapshot === void 0) { getSnapshot = defaultGetSnapshot; }
  30. var actorRefRef = (0, react_1.useRef)(actorRef);
  31. var deferredEventsRef = (0, react_1.useRef)([]);
  32. var subscribe = (0, react_1.useCallback)(function (handleStoreChange) {
  33. var unsubscribe = actorRef.subscribe(handleStoreChange).unsubscribe;
  34. return unsubscribe;
  35. }, [actorRef]);
  36. var boundGetSnapshot = (0, react_1.useCallback)(function () { return getSnapshot(actorRef); }, [actorRef, getSnapshot]);
  37. var isEqual = (0, react_1.useCallback)(function (prevState, nextState) {
  38. if ((0, utils_1.isService)(actorRef)) {
  39. return (0, utils_1.isInterpreterStateEqual)(actorRef, prevState, nextState);
  40. }
  41. return prevState === nextState;
  42. }, [actorRef]);
  43. var storeSnapshot = (0, with_selector_1.useSyncExternalStoreWithSelector)(subscribe, boundGetSnapshot, boundGetSnapshot, identity, isEqual);
  44. var send = (0, useConstant_1.default)(function () { return function () {
  45. var args = [];
  46. for (var _i = 0; _i < arguments.length; _i++) {
  47. args[_i] = arguments[_i];
  48. }
  49. var event = args[0];
  50. if (process.env.NODE_ENV !== 'production' && args.length > 1) {
  51. console.warn("Unexpected payload: ".concat(JSON.stringify(args[1]), ". Only a single event object can be sent to actor send() functions."));
  52. }
  53. var currentActorRef = actorRefRef.current;
  54. // If the previous actor is a deferred actor,
  55. // queue the events so that they can be replayed
  56. // on the non-deferred actor.
  57. if (isDeferredActor(currentActorRef) && currentActorRef.deferred) {
  58. deferredEventsRef.current.push(event);
  59. }
  60. else {
  61. currentActorRef.send(event);
  62. }
  63. }; });
  64. (0, use_isomorphic_layout_effect_1.default)(function () {
  65. actorRefRef.current = actorRef;
  66. // Dequeue deferred events from the previous deferred actorRef
  67. while (deferredEventsRef.current.length > 0) {
  68. var deferredEvent = deferredEventsRef.current.shift();
  69. actorRef.send(deferredEvent);
  70. }
  71. }, [actorRef]);
  72. return [storeSnapshot, send];
  73. }
  74. exports.useActor = useActor;