@xstate/react 4.0.0-alpha.1 → 4.0.0-alpha.2

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.
@@ -5,7 +5,7 @@ Object.defineProperty(exports, '__esModule', { value: true });
5
5
  var React = require('react');
6
6
  var useIsomorphicLayoutEffect = require('use-isomorphic-layout-effect');
7
7
  var withSelector = require('use-sync-external-store/shim/with-selector');
8
- var useConstant = require('./useConstant-eeb49d3f.cjs.prod.js');
8
+ var useConstant = require('./useConstant-c09b427a.cjs.prod.js');
9
9
  var xstate = require('xstate');
10
10
  var shim = require('use-sync-external-store/shim');
11
11
 
@@ -18,13 +18,11 @@ function _objectWithoutPropertiesLoose(source, excluded) {
18
18
  var target = {};
19
19
  var sourceKeys = Object.keys(source);
20
20
  var key, i;
21
-
22
21
  for (i = 0; i < sourceKeys.length; i++) {
23
22
  key = sourceKeys[i];
24
23
  if (excluded.indexOf(key) >= 0) continue;
25
24
  target[key] = source[key];
26
25
  }
27
-
28
26
  return target;
29
27
  }
30
28
 
@@ -32,10 +30,8 @@ function _objectWithoutProperties(source, excluded) {
32
30
  if (source == null) return {};
33
31
  var target = _objectWithoutPropertiesLoose(source, excluded);
34
32
  var key, i;
35
-
36
33
  if (Object.getOwnPropertySymbols) {
37
34
  var sourceSymbolKeys = Object.getOwnPropertySymbols(source);
38
-
39
35
  for (i = 0; i < sourceSymbolKeys.length; i++) {
40
36
  key = sourceSymbolKeys[i];
41
37
  if (excluded.indexOf(key) >= 0) continue;
@@ -43,27 +39,21 @@ function _objectWithoutProperties(source, excluded) {
43
39
  target[key] = source[key];
44
40
  }
45
41
  }
46
-
47
42
  return target;
48
43
  }
49
44
 
50
- var _excluded = ["context", "actors", "guards", "actions", "delays", "state"];
45
+ var _excluded = ["actors", "guards", "actions", "delays"];
51
46
  function useIdleInterpreter(getMachine, options) {
52
47
  var machine = useConstant.useConstant(function () {
53
48
  return typeof getMachine === 'function' ? getMachine() : getMachine;
54
49
  });
55
-
56
- var context = options.context,
57
- actors = options.actors,
58
- guards = options.guards,
59
- actions = options.actions,
60
- delays = options.delays,
61
- rehydratedState = options.state,
62
- interpreterOptions = _objectWithoutProperties(options, _excluded);
63
-
50
+ var actors = options.actors,
51
+ guards = options.guards,
52
+ actions = options.actions,
53
+ delays = options.delays,
54
+ interpreterOptions = _objectWithoutProperties(options, _excluded);
64
55
  var service = useConstant.useConstant(function () {
65
56
  var machineConfig = {
66
- context: context,
67
57
  guards: guards,
68
58
  actions: actions,
69
59
  actors: actors,
@@ -71,10 +61,11 @@ function useIdleInterpreter(getMachine, options) {
71
61
  };
72
62
  var machineWithConfig = machine.provide(machineConfig);
73
63
  return xstate.interpret(machineWithConfig, interpreterOptions);
74
- }); // Make sure options are kept updated when they change.
64
+ });
65
+
66
+ // Make sure options are kept updated when they change.
75
67
  // This mutation assignment is safe because the service instance is only used
76
68
  // in one place -- this hook's caller.
77
-
78
69
  useIsomorphicLayoutEffect__default['default'](function () {
79
70
  Object.assign(service.behavior.options.actions, actions);
80
71
  Object.assign(service.behavior.options.guards, guards);
@@ -87,27 +78,25 @@ function useInterpret(getMachine) {
87
78
  for (var _len = arguments.length, _ref = new Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) {
88
79
  _ref[_key - 1] = arguments[_key];
89
80
  }
90
-
91
81
  var _ref$ = _ref[0],
92
- options = _ref$ === void 0 ? {} : _ref$,
93
- observerOrListener = _ref[1];
82
+ options = _ref$ === void 0 ? {} : _ref$,
83
+ observerOrListener = _ref[1];
94
84
  var service = useIdleInterpreter(getMachine, options);
95
85
  React.useEffect(function () {
96
86
  if (!observerOrListener) {
97
87
  return;
98
88
  }
99
-
100
89
  var sub = service.subscribe(xstate.toObserver(observerOrListener));
101
90
  return function () {
102
91
  sub.unsubscribe();
103
92
  };
104
93
  }, [observerOrListener]);
105
94
  React.useEffect(function () {
106
- var rehydratedState = options.state;
107
- service.start(rehydratedState ? service.behavior.createState(rehydratedState) : undefined);
95
+ service.start();
108
96
  return function () {
109
97
  service.stop();
110
98
  service.status = xstate.InterpreterStatus.NotStarted;
99
+ service._initState();
111
100
  };
112
101
  }, []);
113
102
  return service;
@@ -116,51 +105,33 @@ function useInterpret(getMachine) {
116
105
  function identity(a) {
117
106
  return a;
118
107
  }
119
-
120
108
  var isEqual = function isEqual(prevState, nextState) {
121
109
  return prevState === nextState || nextState.changed === false;
122
110
  };
123
-
124
- // TODO: rethink how we can do this better
125
- var cachedRehydratedStates = new WeakMap();
126
111
  function useMachine(getMachine) {
127
112
  for (var _len = arguments.length, _ref = new Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) {
128
113
  _ref[_key - 1] = arguments[_key];
129
114
  }
130
-
131
115
  var _ref$ = _ref[0],
132
- options = _ref$ === void 0 ? {} : _ref$;
116
+ options = _ref$ === void 0 ? {} : _ref$;
133
117
  // using `useIdleInterpreter` allows us to subscribe to the service *before* we start it
134
118
  // so we don't miss any notifications
135
119
  var service = useIdleInterpreter(getMachine, options);
136
120
  var getSnapshot = React.useCallback(function () {
137
- if (service.status === xstate.InterpreterStatus.NotStarted && options.state) {
138
- var cached = cachedRehydratedStates.get(options.state);
139
-
140
- if (cached) {
141
- return cached;
142
- }
143
-
144
- var created = service.behavior.createState(options.state);
145
- cachedRehydratedStates.set(options.state, created);
146
- return created;
147
- }
148
-
149
121
  return service.getSnapshot();
150
122
  }, [service]);
151
123
  var subscribe = React.useCallback(function (handleStoreChange) {
152
124
  var _service$subscribe = service.subscribe(handleStoreChange),
153
- unsubscribe = _service$subscribe.unsubscribe;
154
-
125
+ unsubscribe = _service$subscribe.unsubscribe;
155
126
  return unsubscribe;
156
127
  }, [service]);
157
128
  var storeSnapshot = withSelector.useSyncExternalStoreWithSelector(subscribe, getSnapshot, getSnapshot, identity, isEqual);
158
129
  React.useEffect(function () {
159
- var rehydratedState = options.state;
160
- service.start(rehydratedState ? service.behavior.createState(rehydratedState) : undefined);
130
+ service.start();
161
131
  return function () {
162
132
  service.stop();
163
133
  service.status = xstate.InterpreterStatus.NotStarted;
134
+ service._initState();
164
135
  };
165
136
  }, []);
166
137
  return [storeSnapshot, service.send, service];
@@ -169,8 +140,7 @@ function useMachine(getMachine) {
169
140
  function useActor(actorRef) {
170
141
  var subscribe = React.useCallback(function (handleStoreChange) {
171
142
  var _actorRef$subscribe = actorRef.subscribe(handleStoreChange),
172
- unsubscribe = _actorRef$subscribe.unsubscribe;
173
-
143
+ unsubscribe = _actorRef$subscribe.unsubscribe;
174
144
  return unsubscribe;
175
145
  }, [actorRef]);
176
146
  var boundGetSnapshot = React.useCallback(function () {
@@ -186,13 +156,11 @@ function useActor(actorRef) {
186
156
  function defaultCompare(a, b) {
187
157
  return a === b;
188
158
  }
189
-
190
159
  function useSelector(actor, selector) {
191
160
  var compare = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : defaultCompare;
192
161
  var subscribe = React.useCallback(function (handleStoreChange) {
193
162
  var _actor$subscribe = actor.subscribe(handleStoreChange),
194
- unsubscribe = _actor$subscribe.unsubscribe;
195
-
163
+ unsubscribe = _actor$subscribe.unsubscribe;
196
164
  return unsubscribe;
197
165
  }, [actor]);
198
166
  var boundGetSnapshot = React.useCallback(function () {
@@ -209,7 +177,6 @@ function useSelector(actor, selector) {
209
177
  * @param behavior The actor behavior to spawn
210
178
  * @returns An ActorRef with the specified `behavior`
211
179
  */
212
-
213
180
  function useSpawn(behavior) {
214
181
  var actorRef = useConstant.useConstant(function () {
215
182
  // TODO: figure out what to do about the name argument
@@ -217,11 +184,9 @@ function useSpawn(behavior) {
217
184
  });
218
185
  React.useEffect(function () {
219
186
  var _actorRef$start;
220
-
221
187
  (_actorRef$start = actorRef.start) === null || _actorRef$start === void 0 ? void 0 : _actorRef$start.call(actorRef);
222
188
  return function () {
223
189
  var _stop, _ref;
224
-
225
190
  (_stop = (_ref = actorRef).stop) === null || _stop === void 0 ? void 0 : _stop.call(_ref);
226
191
  };
227
192
  }, []);
@@ -231,17 +196,11 @@ function useSpawn(behavior) {
231
196
  function _typeof(obj) {
232
197
  "@babel/helpers - typeof";
233
198
 
234
- if (typeof Symbol === "function" && typeof Symbol.iterator === "symbol") {
235
- _typeof = function (obj) {
236
- return typeof obj;
237
- };
238
- } else {
239
- _typeof = function (obj) {
240
- return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj;
241
- };
242
- }
243
-
244
- return _typeof(obj);
199
+ return _typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (obj) {
200
+ return typeof obj;
201
+ } : function (obj) {
202
+ return obj && "function" == typeof Symbol && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj;
203
+ }, _typeof(obj);
245
204
  }
246
205
 
247
206
  // From https://github.com/reduxjs/react-redux/blob/720f0ba79236cdc3e1115f4ef9a7760a21784b48/src/utils/shallowEqual.ts
@@ -252,27 +211,114 @@ function is(x, y) {
252
211
  return x !== x && y !== y;
253
212
  }
254
213
  }
255
-
256
214
  function shallowEqual(objA, objB) {
257
215
  if (is(objA, objB)) return true;
258
-
259
216
  if (_typeof(objA) !== 'object' || objA === null || _typeof(objB) !== 'object' || objB === null) {
260
217
  return false;
261
218
  }
262
-
263
219
  var keysA = Object.keys(objA);
264
220
  var keysB = Object.keys(objB);
265
221
  if (keysA.length !== keysB.length) return false;
266
-
267
222
  for (var i = 0; i < keysA.length; i++) {
268
223
  if (!Object.prototype.hasOwnProperty.call(objB, keysA[i]) || !is(objA[keysA[i]], objB[keysA[i]])) {
269
224
  return false;
270
225
  }
271
226
  }
272
-
273
227
  return true;
274
228
  }
275
229
 
230
+ function _toPrimitive(input, hint) {
231
+ if (typeof input !== "object" || input === null) return input;
232
+ var prim = input[Symbol.toPrimitive];
233
+ if (prim !== undefined) {
234
+ var res = prim.call(input, hint || "default");
235
+ if (typeof res !== "object") return res;
236
+ throw new TypeError("@@toPrimitive must return a primitive value.");
237
+ }
238
+ return (hint === "string" ? String : Number)(input);
239
+ }
240
+
241
+ function _toPropertyKey(arg) {
242
+ var key = _toPrimitive(arg, "string");
243
+ return typeof key === "symbol" ? key : String(key);
244
+ }
245
+
246
+ function _defineProperty(obj, key, value) {
247
+ key = _toPropertyKey(key);
248
+ if (key in obj) {
249
+ Object.defineProperty(obj, key, {
250
+ value: value,
251
+ enumerable: true,
252
+ configurable: true,
253
+ writable: true
254
+ });
255
+ } else {
256
+ obj[key] = value;
257
+ }
258
+ return obj;
259
+ }
260
+
261
+ function ownKeys(object, enumerableOnly) {
262
+ var keys = Object.keys(object);
263
+ if (Object.getOwnPropertySymbols) {
264
+ var symbols = Object.getOwnPropertySymbols(object);
265
+ enumerableOnly && (symbols = symbols.filter(function (sym) {
266
+ return Object.getOwnPropertyDescriptor(object, sym).enumerable;
267
+ })), keys.push.apply(keys, symbols);
268
+ }
269
+ return keys;
270
+ }
271
+ function _objectSpread2(target) {
272
+ for (var i = 1; i < arguments.length; i++) {
273
+ var source = null != arguments[i] ? arguments[i] : {};
274
+ i % 2 ? ownKeys(Object(source), !0).forEach(function (key) {
275
+ _defineProperty(target, key, source[key]);
276
+ }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)) : ownKeys(Object(source)).forEach(function (key) {
277
+ Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key));
278
+ });
279
+ }
280
+ return target;
281
+ }
282
+
283
+ function createActorContext(machine, interpreterOptions, observerOrListener) {
284
+ var ReactContext = /*#__PURE__*/React.createContext(null);
285
+ var OriginalProvider = ReactContext.Provider;
286
+ function Provider(_ref) {
287
+ var children = _ref.children,
288
+ _ref$machine = _ref.machine,
289
+ providedMachine = _ref$machine === void 0 ? machine : _ref$machine,
290
+ options = _ref.options;
291
+ var actor = useInterpret(providedMachine, _objectSpread2(_objectSpread2({}, interpreterOptions), options), observerOrListener);
292
+ return /*#__PURE__*/React.createElement(OriginalProvider, {
293
+ value: actor,
294
+ children: children
295
+ });
296
+ }
297
+ Provider.displayName = "ActorProvider(".concat(machine.id, ")");
298
+ function useContext() {
299
+ var actor = React.useContext(ReactContext);
300
+ if (!actor) {
301
+ throw new Error("You used a hook from \"".concat(Provider.displayName, "\" but it's not inside a <").concat(Provider.displayName, "> component."));
302
+ }
303
+ return actor;
304
+ }
305
+ function useActor$1() {
306
+ var actor = useContext();
307
+ return useActor(actor);
308
+ }
309
+ function useSelector$1(selector, compare) {
310
+ var actor = useContext();
311
+ return useSelector(actor, selector, compare);
312
+ }
313
+ return {
314
+ Provider: Provider,
315
+ useActorRef: useContext,
316
+ useActor: useActor$1,
317
+ useSelector: useSelector$1
318
+ };
319
+ }
320
+
321
+ exports.createActorContext = createActorContext;
276
322
  exports.shallowEqual = shallowEqual;
277
323
  exports.useActor = useActor;
278
324
  exports.useInterpret = useInterpret;