@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.
- package/dist/declarations/src/createActorContext.d.ts +15 -0
- package/dist/declarations/src/index.d.ts +7 -6
- package/dist/declarations/src/types.d.ts +3 -3
- package/dist/declarations/src/useInterpret.d.ts +5 -6
- package/dist/declarations/src/useMachine.d.ts +6 -17
- package/dist/declarations/src/useSpawn.d.ts +2 -2
- package/dist/{useConstant-94bfdbb5.esm.js → useConstant-0013a606.esm.js} +21 -24
- package/dist/{useConstant-eeb49d3f.cjs.prod.js → useConstant-c09b427a.cjs.prod.js} +0 -2
- package/dist/{useConstant-644f0e11.cjs.dev.js → useConstant-ff65b597.cjs.dev.js} +21 -24
- package/dist/xstate-react.cjs.dev.js +119 -75
- package/dist/xstate-react.cjs.prod.js +117 -71
- package/dist/xstate-react.esm.js +120 -77
- package/fsm/dist/xstate-react-fsm.cjs.dev.js +22 -33
- package/fsm/dist/xstate-react-fsm.cjs.prod.js +41 -51
- package/fsm/dist/xstate-react-fsm.esm.js +21 -32
- package/package.json +4 -4
|
@@ -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-
|
|
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 = ["
|
|
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
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
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
|
-
});
|
|
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
|
-
|
|
93
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
235
|
-
|
|
236
|
-
|
|
237
|
-
|
|
238
|
-
}
|
|
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;
|