useInterpret.js 4.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110
  1. "use strict";
  2. var __assign = (this && this.__assign) || function () {
  3. __assign = Object.assign || function(t) {
  4. for (var s, i = 1, n = arguments.length; i < n; i++) {
  5. s = arguments[i];
  6. for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p))
  7. t[p] = s[p];
  8. }
  9. return t;
  10. };
  11. return __assign.apply(this, arguments);
  12. };
  13. var __rest = (this && this.__rest) || function (s, e) {
  14. var t = {};
  15. for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0)
  16. t[p] = s[p];
  17. if (s != null && typeof Object.getOwnPropertySymbols === "function")
  18. for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) {
  19. if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i]))
  20. t[p[i]] = s[p[i]];
  21. }
  22. return t;
  23. };
  24. var __read = (this && this.__read) || function (o, n) {
  25. var m = typeof Symbol === "function" && o[Symbol.iterator];
  26. if (!m) return o;
  27. var i = m.call(o), r, ar = [], e;
  28. try {
  29. while ((n === void 0 || n-- > 0) && !(r = i.next()).done) ar.push(r.value);
  30. }
  31. catch (error) { e = { error: error }; }
  32. finally {
  33. try {
  34. if (r && !r.done && (m = i["return"])) m.call(i);
  35. }
  36. finally { if (e) throw e.error; }
  37. }
  38. return ar;
  39. };
  40. Object.defineProperty(exports, "__esModule", { value: true });
  41. exports.useInterpret = exports.useIdleInterpreter = void 0;
  42. var react_1 = require("react");
  43. var use_isomorphic_layout_effect_1 = require("use-isomorphic-layout-effect");
  44. var xstate_1 = require("xstate");
  45. var useConstant_1 = require("./useConstant");
  46. function useIdleInterpreter(getMachine, options) {
  47. var machine = (0, useConstant_1.default)(function () {
  48. return typeof getMachine === 'function' ? getMachine() : getMachine;
  49. });
  50. if (process.env.NODE_ENV !== 'production' &&
  51. typeof getMachine !== 'function') {
  52. var _a = __read((0, react_1.useState)(machine), 1), initialMachine = _a[0];
  53. if (getMachine !== initialMachine) {
  54. console.warn('Machine given to `useMachine` has changed between renders. This is not supported and might lead to unexpected results.\n' +
  55. 'Please make sure that you pass the same Machine as argument each time.');
  56. }
  57. }
  58. var context = options.context, guards = options.guards, actions = options.actions, activities = options.activities, services = options.services, delays = options.delays, rehydratedState = options.state, interpreterOptions = __rest(options, ["context", "guards", "actions", "activities", "services", "delays", "state"]);
  59. var service = (0, useConstant_1.default)(function () {
  60. var machineConfig = {
  61. context: context,
  62. guards: guards,
  63. actions: actions,
  64. activities: activities,
  65. services: services,
  66. delays: delays
  67. };
  68. var machineWithConfig = machine.withConfig(machineConfig, function () { return (__assign(__assign({}, machine.context), context)); });
  69. return (0, xstate_1.interpret)(machineWithConfig, interpreterOptions);
  70. });
  71. // Make sure options are kept updated when they change.
  72. // This mutation assignment is safe because the service instance is only used
  73. // in one place -- this hook's caller.
  74. (0, use_isomorphic_layout_effect_1.default)(function () {
  75. Object.assign(service.machine.options.actions, actions);
  76. Object.assign(service.machine.options.guards, guards);
  77. Object.assign(service.machine.options.activities, activities);
  78. Object.assign(service.machine.options.services, services);
  79. Object.assign(service.machine.options.delays, delays);
  80. }, [actions, guards, activities, services, delays]);
  81. return service;
  82. }
  83. exports.useIdleInterpreter = useIdleInterpreter;
  84. function useInterpret(getMachine) {
  85. var _a = [];
  86. for (var _i = 1; _i < arguments.length; _i++) {
  87. _a[_i - 1] = arguments[_i];
  88. }
  89. var _b = __read(_a, 2), _c = _b[0], options = _c === void 0 ? {} : _c, observerOrListener = _b[1];
  90. var service = useIdleInterpreter(getMachine, options);
  91. (0, react_1.useEffect)(function () {
  92. if (!observerOrListener) {
  93. return;
  94. }
  95. var sub = service.subscribe((0, xstate_1.toObserver)(observerOrListener));
  96. return function () {
  97. sub.unsubscribe();
  98. };
  99. }, [observerOrListener]);
  100. (0, react_1.useEffect)(function () {
  101. var rehydratedState = options.state;
  102. service.start(rehydratedState ? xstate_1.State.create(rehydratedState) : undefined);
  103. return function () {
  104. service.stop();
  105. service.status = xstate_1.InterpreterStatus.NotStarted;
  106. };
  107. }, []);
  108. return service;
  109. }
  110. exports.useInterpret = useInterpret;