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