@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.
- package/dist/declarations/src/createActorContext.d.ts +15 -0
- package/dist/declarations/src/fsm.d.ts +3 -3
- package/dist/declarations/src/index.d.ts +7 -5
- package/dist/declarations/src/shallowEqual.d.ts +1 -0
- package/dist/declarations/src/types.d.ts +15 -15
- package/dist/declarations/src/useActor.d.ts +3 -3
- package/dist/declarations/src/useConstant.d.ts +1 -1
- package/dist/declarations/src/useInterpret.d.ts +12 -13
- package/dist/declarations/src/useMachine.d.ts +10 -21
- package/dist/declarations/src/useSelector.d.ts +2 -2
- package/dist/declarations/src/useSpawn.d.ts +9 -9
- 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 +159 -65
- package/dist/xstate-react.cjs.prod.js +157 -61
- package/dist/xstate-react.esm.js +160 -68
- package/fsm/dist/xstate-react-fsm.cjs.dev.js +24 -35
- package/fsm/dist/xstate-react-fsm.cjs.prod.js +43 -53
- package/fsm/dist/xstate-react-fsm.esm.js +23 -34
- package/package.json +17 -6
- package/CHANGELOG.md +0 -481
|
@@ -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 = ["
|
|
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
|
-
|
|
59
|
-
|
|
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
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
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
|
-
});
|
|
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.
|
|
90
|
-
Object.assign(service.
|
|
91
|
-
Object.assign(service.
|
|
92
|
-
Object.assign(service.
|
|
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
|
-
|
|
103
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
|
191
|
+
return xstate.interpret(behavior);
|
|
227
192
|
});
|
|
228
193
|
React.useEffect(function () {
|
|
229
|
-
|
|
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
|
-
|
|
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;
|