@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
|
@@ -3,10 +3,10 @@
|
|
|
3
3
|
Object.defineProperty(exports, '__esModule', { value: true });
|
|
4
4
|
|
|
5
5
|
var React = require('react');
|
|
6
|
+
var useIsomorphicLayoutEffect = require('use-isomorphic-layout-effect');
|
|
6
7
|
var withSelector = require('use-sync-external-store/shim/with-selector');
|
|
8
|
+
var useConstant = require('./useConstant-c09b427a.cjs.prod.js');
|
|
7
9
|
var xstate = require('xstate');
|
|
8
|
-
var useIsomorphicLayoutEffect = require('use-isomorphic-layout-effect');
|
|
9
|
-
var useConstant = require('./useConstant-eeb49d3f.cjs.prod.js');
|
|
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,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,15 +61,16 @@ 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
|
-
Object.assign(service.
|
|
80
|
-
Object.assign(service.
|
|
81
|
-
Object.assign(service.
|
|
82
|
-
Object.assign(service.
|
|
70
|
+
Object.assign(service.behavior.options.actions, actions);
|
|
71
|
+
Object.assign(service.behavior.options.guards, guards);
|
|
72
|
+
Object.assign(service.behavior.options.actors, actors);
|
|
73
|
+
Object.assign(service.behavior.options.delays, delays);
|
|
83
74
|
}, [actions, guards, actors, delays]);
|
|
84
75
|
return service;
|
|
85
76
|
}
|
|
@@ -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 ? xstate.State.create(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 = xstate.State.create(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 ? xstate.State.create(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,21 +177,149 @@ 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
|
|
216
|
-
return
|
|
183
|
+
return xstate.interpret(behavior);
|
|
217
184
|
});
|
|
218
185
|
React.useEffect(function () {
|
|
219
|
-
|
|
186
|
+
var _actorRef$start;
|
|
187
|
+
(_actorRef$start = actorRef.start) === null || _actorRef$start === void 0 ? void 0 : _actorRef$start.call(actorRef);
|
|
220
188
|
return function () {
|
|
221
|
-
|
|
189
|
+
var _stop, _ref;
|
|
190
|
+
(_stop = (_ref = actorRef).stop) === null || _stop === void 0 ? void 0 : _stop.call(_ref);
|
|
222
191
|
};
|
|
223
192
|
}, []);
|
|
224
193
|
return actorRef;
|
|
225
194
|
}
|
|
226
195
|
|
|
196
|
+
function _typeof(obj) {
|
|
197
|
+
"@babel/helpers - typeof";
|
|
198
|
+
|
|
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);
|
|
204
|
+
}
|
|
205
|
+
|
|
206
|
+
// From https://github.com/reduxjs/react-redux/blob/720f0ba79236cdc3e1115f4ef9a7760a21784b48/src/utils/shallowEqual.ts
|
|
207
|
+
function is(x, y) {
|
|
208
|
+
if (x === y) {
|
|
209
|
+
return x !== 0 || y !== 0 || 1 / x === 1 / y;
|
|
210
|
+
} else {
|
|
211
|
+
return x !== x && y !== y;
|
|
212
|
+
}
|
|
213
|
+
}
|
|
214
|
+
function shallowEqual(objA, objB) {
|
|
215
|
+
if (is(objA, objB)) return true;
|
|
216
|
+
if (_typeof(objA) !== 'object' || objA === null || _typeof(objB) !== 'object' || objB === null) {
|
|
217
|
+
return false;
|
|
218
|
+
}
|
|
219
|
+
var keysA = Object.keys(objA);
|
|
220
|
+
var keysB = Object.keys(objB);
|
|
221
|
+
if (keysA.length !== keysB.length) return false;
|
|
222
|
+
for (var i = 0; i < keysA.length; i++) {
|
|
223
|
+
if (!Object.prototype.hasOwnProperty.call(objB, keysA[i]) || !is(objA[keysA[i]], objB[keysA[i]])) {
|
|
224
|
+
return false;
|
|
225
|
+
}
|
|
226
|
+
}
|
|
227
|
+
return true;
|
|
228
|
+
}
|
|
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;
|
|
322
|
+
exports.shallowEqual = shallowEqual;
|
|
227
323
|
exports.useActor = useActor;
|
|
228
324
|
exports.useInterpret = useInterpret;
|
|
229
325
|
exports.useMachine = useMachine;
|