@xstate/react 3.0.1 → 3.1.0

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.
@@ -1,4 +1,4 @@
1
- !function(t,e){"object"==typeof exports&&"undefined"!=typeof module?e(exports,require("react"),require("xstate")):"function"==typeof define&&define.amd?define(["exports","react","xstate"],e):e((t="undefined"!=typeof globalThis?globalThis:t||self).XStateReact={},t.React,t.XState)}(this,(function(t,e,n){"use strict";function r(t){return t&&"object"==typeof t&&"default"in t?t:{default:t}}function u(t){if(t&&t.__esModule)return t;var e=Object.create(null);return t&&Object.keys(t).forEach((function(n){if("default"!==n){var r=Object.getOwnPropertyDescriptor(t,n);Object.defineProperty(e,n,r.get?r:{enumerable:!0,get:function(){return t[n]}})}})),e.default=t,Object.freeze(e)}var a=r(e),o=u(e),i=function(){return(i=Object.assign||function(t){for(var e,n=1,r=arguments.length;n<r;n++)for(var u in e=arguments[n])Object.prototype.hasOwnProperty.call(e,u)&&(t[u]=e[u]);return t}).apply(this,arguments)};function c(t,e){var n="function"==typeof Symbol&&t[Symbol.iterator];if(!n)return t;var r,u,a=n.call(t),o=[];try{for(;(void 0===e||e-- >0)&&!(r=a.next()).done;)o.push(r.value)}catch(t){u={error:t}}finally{try{r&&!r.done&&(n=a.return)&&n.call(a)}finally{if(u)throw u.error}}return o}function s(t){var e={exports:{}};return t(e,e.exports),e.exports
1
+ !function(t,e){"object"==typeof exports&&"undefined"!=typeof module?e(exports,require("react"),require("xstate")):"function"==typeof define&&define.amd?define(["exports","react","xstate"],e):e((t="undefined"!=typeof globalThis?globalThis:t||self).XStateReact={},t.React,t.XState)}(this,(function(t,e,n){"use strict";function r(t){return t&&"object"==typeof t&&"default"in t?t:{default:t}}function u(t){if(t&&t.__esModule)return t;var e=Object.create(null);return t&&Object.keys(t).forEach((function(n){if("default"!==n){var r=Object.getOwnPropertyDescriptor(t,n);Object.defineProperty(e,n,r.get?r:{enumerable:!0,get:function(){return t[n]}})}})),e.default=t,Object.freeze(e)}var o=r(e),a=u(e),i=function(){return(i=Object.assign||function(t){for(var e,n=1,r=arguments.length;n<r;n++)for(var u in e=arguments[n])Object.prototype.hasOwnProperty.call(e,u)&&(t[u]=e[u]);return t}).apply(this,arguments)};function c(t,e){var n="function"==typeof Symbol&&t[Symbol.iterator];if(!n)return t;var r,u,o=n.call(t),a=[];try{for(;(void 0===e||e-- >0)&&!(r=o.next()).done;)a.push(r.value)}catch(t){u={error:t}}finally{try{r&&!r.done&&(n=o.return)&&n.call(o)}finally{if(u)throw u.error}}return a}function s(t){var e={exports:{}};return t(e,e.exports),e.exports
2
2
  /**
3
3
  * @license React
4
4
  * use-sync-external-store-shim.production.min.js
@@ -7,7 +7,7 @@
7
7
  *
8
8
  * This source code is licensed under the MIT license found in the
9
9
  * LICENSE file in the root directory of this source tree.
10
- */}var f="function"==typeof Object.is?Object.is:function(t,e){return t===e&&(0!==t||1/t==1/e)||t!=t&&e!=e},l=a.default.useState,v=a.default.useEffect,d=a.default.useLayoutEffect,p=a.default.useDebugValue;function b(t){var e=t.getSnapshot;t=t.value;try{var n=e();return!f(t,n)}catch(t){return!0}}var y="undefined"==typeof window||void 0===window.document||void 0===window.document.createElement?function(t,e){return e()}:function(t,e){var n=e(),r=l({inst:{value:n,getSnapshot:e}}),u=r[0].inst,a=r[1];return d((function(){u.value=n,u.getSnapshot=e,b(u)&&a({inst:u})}),[t,n,e]),v((function(){return b(u)&&a({inst:u}),t((function(){b(u)&&a({inst:u})}))}),[t]),p(n),n},h={useSyncExternalStore:void 0!==a.default.useSyncExternalStore?a.default.useSyncExternalStore:y};
10
+ */}var f="function"==typeof Object.is?Object.is:function(t,e){return t===e&&(0!==t||1/t==1/e)||t!=t&&e!=e},l=o.default.useState,v=o.default.useEffect,d=o.default.useLayoutEffect,p=o.default.useDebugValue;function b(t){var e=t.getSnapshot;t=t.value;try{var n=e();return!f(t,n)}catch(t){return!0}}var y="undefined"==typeof window||void 0===window.document||void 0===window.document.createElement?function(t,e){return e()}:function(t,e){var n=e(),r=l({inst:{value:n,getSnapshot:e}}),u=r[0].inst,o=r[1];return d((function(){u.value=n,u.getSnapshot=e,b(u)&&o({inst:u})}),[t,n,e]),v((function(){return b(u)&&o({inst:u}),t((function(){b(u)&&o({inst:u})}))}),[t]),p(n),n},h={useSyncExternalStore:void 0!==o.default.useSyncExternalStore?o.default.useSyncExternalStore:y};
11
11
  /**
12
12
  * @license React
13
13
  * use-sync-external-store-shim.development.js
@@ -26,7 +26,7 @@ s((function(t,e){}));var S=s((function(t){t.exports=h}));
26
26
  *
27
27
  * This source code is licensed under the MIT license found in the
28
28
  * LICENSE file in the root directory of this source tree.
29
- */var g="function"==typeof Object.is?Object.is:function(t,e){return t===e&&(0!==t||1/t==1/e)||t!=t&&e!=e},O=S.useSyncExternalStore,j=a.default.useRef,x=a.default.useEffect,m=a.default.useMemo,E=a.default.useDebugValue,w={useSyncExternalStoreWithSelector:function(t,e,n,r,u){var a=j(null);if(null===a.current){var o={hasValue:!1,value:null};a.current=o}else o=a.current;a=m((function(){function t(t){if(!c){if(c=!0,a=t,t=r(t),void 0!==u&&o.hasValue){var e=o.value;if(u(e,t))return i=e}return i=t}if(e=i,g(a,t))return e;var n=r(t);return void 0!==u&&u(e,n)?e:(a=t,i=n)}var a,i,c=!1,s=void 0===n?null:n;return[function(){return t(e())},null===s?void 0:function(){return t(s())}]}),[e,n,r,u]);var i=O(t,a[0],a[1]);return x((function(){o.hasValue=!0,o.value=i}),[i]),E(i),i}};
29
+ */var g="function"==typeof Object.is?Object.is:function(t,e){return t===e&&(0!==t||1/t==1/e)||t!=t&&e!=e},O=S.useSyncExternalStore,j=o.default.useRef,x=o.default.useEffect,m=o.default.useMemo,E=o.default.useDebugValue,w={useSyncExternalStoreWithSelector:function(t,e,n,r,u){var o=j(null);if(null===o.current){var a={hasValue:!1,value:null};o.current=a}else a=o.current;o=m((function(){function t(t){if(!c){if(c=!0,o=t,t=r(t),void 0!==u&&a.hasValue){var e=a.value;if(u(e,t))return i=e}return i=t}if(e=i,g(o,t))return e;var n=r(t);return void 0!==u&&u(e,n)?e:(o=t,i=n)}var o,i,c=!1,s=void 0===n?null:n;return[function(){return t(e())},null===s?void 0:function(){return t(s())}]}),[e,n,r,u]);var i=O(t,o[0],o[1]);return x((function(){a.hasValue=!0,a.value=i}),[i]),E(i),i}};
30
30
  /**
31
31
  * @license React
32
32
  * use-sync-external-store-shim/with-selector.development.js
@@ -36,4 +36,4 @@ s((function(t,e){}));var S=s((function(t){t.exports=h}));
36
36
  * This source code is licensed under the MIT license found in the
37
37
  * LICENSE file in the root directory of this source tree.
38
38
  */
39
- s((function(t,e){}));var k=s((function(t){t.exports=w})),C=e.useLayoutEffect;function P(t){var e=o.useRef();return e.current||(e.current={v:t()}),e.current.v}function R(t,e){var r=P((function(){return"function"==typeof t?t():t})),u=e.context,a=e.guards,o=e.actions,c=e.activities,s=e.services,f=e.delays;e.state;var l=function(t,e){var n={};for(var r in t)Object.prototype.hasOwnProperty.call(t,r)&&e.indexOf(r)<0&&(n[r]=t[r]);if(null!=t&&"function"==typeof Object.getOwnPropertySymbols){var u=0;for(r=Object.getOwnPropertySymbols(t);u<r.length;u++)e.indexOf(r[u])<0&&Object.prototype.propertyIsEnumerable.call(t,r[u])&&(n[r[u]]=t[r[u]])}return n}(e,["context","guards","actions","activities","services","delays","state"]),v=P((function(){var t={context:u,guards:a,actions:o,activities:c,services:s,delays:f},e=r.withConfig(t,(function(){return i(i({},r.context),u)}));return n.interpret(e,l)}));return C((function(){Object.assign(v.machine.options.actions,o),Object.assign(v.machine.options.guards,a),Object.assign(v.machine.options.activities,c),Object.assign(v.machine.options.services,s),Object.assign(v.machine.options.delays,f)}),[o,a,c,s,f]),v}function I(t){return t}function V(t){return"state"in t}function M(t){return"deferred"in t}function N(t){return"getSnapshot"in t?t.getSnapshot():V(t)?t.state:void 0}function _(t,e){return t===e?0!==t||0!==e||1/t==1/e:t!=t&&e!=e}var q=function(t,e){return t===e};t.shallowEqual=function(t,e){if(_(t,e))return!0;if("object"!=typeof t||null===t||"object"!=typeof e||null===e)return!1;var n=Object.keys(t),r=Object.keys(e);if(n.length!==r.length)return!1;for(var u=0;u<n.length;u++)if(!Object.prototype.hasOwnProperty.call(e,n[u])||!_(t[n[u]],e[n[u]]))return!1;return!0},t.useActor=function(t,n){void 0===n&&(n=N);var r=e.useRef(t),u=e.useRef([]),a=e.useCallback((function(e){return t.subscribe(e).unsubscribe}),[t]),o=e.useCallback((function(){return n(t)}),[t,n]),i=S.useSyncExternalStore(a,o,o),c=P((function(){return function(){for(var t=[],e=0;e<arguments.length;e++)t[e]=arguments[e];var n=t[0],a=r.current;M(a)&&a.deferred?u.current.push(n):a.send(n)}}));return C((function(){for(r.current=t;u.current.length>0;){var e=u.current.shift();t.send(e)}}),[t]),[i,c]},t.useInterpret=function(t){for(var r=[],u=1;u<arguments.length;u++)r[u-1]=arguments[u];var a=c(r,2),o=a[0],i=void 0===o?{}:o,s=a[1],f=R(t,i);return e.useEffect((function(){if(s){var t=f.subscribe(n.toObserver(s));return function(){t.unsubscribe()}}}),[s]),e.useEffect((function(){var t=i.state;return f.start(t?n.State.create(t):void 0),function(){f.stop(),f.status=n.InterpreterStatus.NotStarted}}),[]),f},t.useMachine=function(t){for(var r=[],u=1;u<arguments.length;u++)r[u-1]=arguments[u];var a=c(r,1),o=a[0],i=void 0===o?{}:o,s=R(t,i),f=e.useCallback((function(){return s.status===n.InterpreterStatus.NotStarted?i.state?n.State.create(i.state):s.machine.initialState:s.state}),[s]),l=e.useCallback((function(t,e){if(s.status===n.InterpreterStatus.NotStarted)return!0;var r=void 0===e.changed&&(Object.keys(e.children).length>0||"boolean"==typeof t.changed);return!(e.changed||r)}),[s]),v=e.useCallback((function(t){return s.subscribe(t).unsubscribe}),[s]),d=k.useSyncExternalStoreWithSelector(v,f,f,I,l);return e.useEffect((function(){var t=i.state;return s.start(t?n.State.create(t):void 0),function(){s.stop(),s.status=n.InterpreterStatus.NotStarted}}),[]),[d,s.send,s]},t.useSelector=function(t,n,r,u){void 0===r&&(r=q);var a=e.useRef(null),o=e.useCallback((function(e){return t.subscribe(e).unsubscribe}),[t]),i=e.useCallback((function(){return u?u(t):function(t,e){if("state"in(u=t)&&"machine"in u){if(0===t.status&&e.current)return e.current;var n=0!==(r=t).status?r.state:r.machine.initialState;return e.current=0===t.status?n:null,n}var r,u;return V(t)?t.state:void 0}(t,a)}),[t,u]);return k.useSyncExternalStoreWithSelector(o,i,i,n,r)},t.useSpawn=function(t){return P((function(){return n.spawnBehavior(t)}))},Object.defineProperty(t,"__esModule",{value:!0})}));
39
+ s((function(t,e){}));var k=s((function(t){t.exports=w})),C=e.useLayoutEffect;function P(t){var e=a.useRef();return e.current||(e.current={v:t()}),e.current.v}function R(t,e){var r=P((function(){return"function"==typeof t?t():t})),u=e.context,o=e.guards,a=e.actions,c=e.activities,s=e.services,f=e.delays;e.state;var l=function(t,e){var n={};for(var r in t)Object.prototype.hasOwnProperty.call(t,r)&&e.indexOf(r)<0&&(n[r]=t[r]);if(null!=t&&"function"==typeof Object.getOwnPropertySymbols){var u=0;for(r=Object.getOwnPropertySymbols(t);u<r.length;u++)e.indexOf(r[u])<0&&Object.prototype.propertyIsEnumerable.call(t,r[u])&&(n[r[u]]=t[r[u]])}return n}(e,["context","guards","actions","activities","services","delays","state"]),v=P((function(){var t={context:u,guards:o,actions:a,activities:c,services:s,delays:f},e=r.withConfig(t,(function(){return i(i({},r.context),u)}));return n.interpret(e,l)}));return C((function(){Object.assign(v.machine.options.actions,a),Object.assign(v.machine.options.guards,o),Object.assign(v.machine.options.activities,c),Object.assign(v.machine.options.services,s),Object.assign(v.machine.options.delays,f)}),[a,o,c,s,f]),v}function N(t){for(var r=[],u=1;u<arguments.length;u++)r[u-1]=arguments[u];var o=c(r,2),a=o[0],i=void 0===a?{}:a,s=o[1],f=R(t,i);return e.useEffect((function(){if(s){var t=f.subscribe(n.toObserver(s));return function(){t.unsubscribe()}}}),[s]),e.useEffect((function(){var t=i.state;return f.start(t?n.State.create(t):void 0),function(){f.stop(),f.status=n.InterpreterStatus.NotStarted}}),[]),f}function I(t){return t}function A(t){return 0!==t.status?t.getSnapshot():t.machine.initialState}function V(t,e){return t===e?0!==t||0!==e||1/t==1/e:t!=t&&e!=e}function M(t){return"state"in t&&"machine"in t}function _(t){return"state"in t}function q(t){return"deferred"in t}function D(t){return"getSnapshot"in t?M(t)?A(t):t.getSnapshot():_(t)?t.state:void 0}function W(t,n){void 0===n&&(n=D);var r=e.useRef(t),u=e.useRef([]),o=e.useCallback((function(e){return t.subscribe(e).unsubscribe}),[t]),a=e.useCallback((function(){return n(t)}),[t,n]),i=S.useSyncExternalStore(o,a,a),c=P((function(){return function(){for(var t=[],e=0;e<arguments.length;e++)t[e]=arguments[e];var n=t[0],o=r.current;q(o)&&o.deferred?u.current.push(n):o.send(n)}}));return C((function(){for(r.current=t;u.current.length>0;){var e=u.current.shift();t.send(e)}}),[t]),[i,c]}var L=function(t,e){return t===e};function T(t,n,r,u){void 0===r&&(r=L);var o=e.useRef(null),a=e.useCallback((function(e){return t.subscribe(e).unsubscribe}),[t]),i=e.useCallback((function(){return u?u(t):function(t,e){if(M(t)){if(0===t.status&&e.current)return e.current;var n=A(t);return e.current=0===t.status?n:null,n}return _(t)?t.state:void 0}(t,o)}),[t,u]);return k.useSyncExternalStoreWithSelector(a,i,i,n,r)}t.createActorContext=function(t){var e=a.createContext(null),n=e.Provider;function r(e){var r=e.children,u=e.machine,o=N(void 0===u?t:u);return a.createElement(n,{value:o},r)}function u(){var t=a.useContext(e);if(!t)throw new Error('You used a hook from "'.concat(r.displayName,"\" but it's not inside a <").concat(r.displayName,"> component."));return t}return r.displayName="ActorProvider(".concat(t.id,")"),{Provider:r,useActorRef:u,useActor:function(){return W(u())},useSelector:function(t,e){return T(u(),t,e)}}},t.shallowEqual=function(t,e){if(V(t,e))return!0;if("object"!=typeof t||null===t||"object"!=typeof e||null===e)return!1;var n=Object.keys(t),r=Object.keys(e);if(n.length!==r.length)return!1;for(var u=0;u<n.length;u++)if(!Object.prototype.hasOwnProperty.call(e,n[u])||!V(t[n[u]],e[n[u]]))return!1;return!0},t.useActor=W,t.useInterpret=N,t.useMachine=function(t){for(var r=[],u=1;u<arguments.length;u++)r[u-1]=arguments[u];var o=c(r,1),a=o[0],i=void 0===a?{}:a,s=R(t,i),f=e.useCallback((function(){return s.status===n.InterpreterStatus.NotStarted?i.state?n.State.create(i.state):s.machine.initialState:s.getSnapshot()}),[s]),l=e.useCallback((function(t,e){if(s.status===n.InterpreterStatus.NotStarted)return!0;var r=void 0===e.changed&&(Object.keys(e.children).length>0||"boolean"==typeof t.changed);return!(e.changed||r)}),[s]),v=e.useCallback((function(t){return s.subscribe(t).unsubscribe}),[s]),d=k.useSyncExternalStoreWithSelector(v,f,f,I,l);return e.useEffect((function(){var t=i.state;return s.start(t?n.State.create(t):void 0),function(){s.stop(),s.status=n.InterpreterStatus.NotStarted}}),[]),[d,s.send,s]},t.useSelector=T,t.useSpawn=function(t){return P((function(){return n.spawnBehavior(t)}))},Object.defineProperty(t,"__esModule",{value:!0})}));
@@ -0,0 +1,13 @@
1
+ import * as React from 'react';
2
+ import { useActor as useActorUnbound } from './useActor';
3
+ import { ActorRefFrom, AnyStateMachine, EmittedFrom } from 'xstate';
4
+ export declare function createActorContext<TMachine extends AnyStateMachine>(machine: TMachine): {
5
+ useActor: () => ReturnType<typeof useActorUnbound<ActorRefFrom<TMachine>>>;
6
+ useSelector: <T>(selector: (snapshot: EmittedFrom<TMachine>) => T, compare?: (a: T, b: T) => boolean) => T;
7
+ useActorRef: () => ActorRefFrom<TMachine>;
8
+ Provider: (props: {
9
+ children: React.ReactNode;
10
+ machine?: TMachine | (() => TMachine);
11
+ }) => React.ReactElement<any, any>;
12
+ };
13
+ //# sourceMappingURL=createActorContext.d.ts.map
@@ -0,0 +1,35 @@
1
+ import * as React from 'react';
2
+ import { useInterpret } from './useInterpret';
3
+ import { useActor as useActorUnbound } from './useActor';
4
+ import { useSelector as useSelectorUnbound } from './useSelector';
5
+ export function createActorContext(machine) {
6
+ var ReactContext = React.createContext(null);
7
+ var OriginalProvider = ReactContext.Provider;
8
+ function Provider(_a) {
9
+ var children = _a.children, _b = _a.machine, providedMachine = _b === void 0 ? machine : _b;
10
+ var actor = useInterpret(providedMachine);
11
+ return React.createElement(OriginalProvider, { value: actor }, children);
12
+ }
13
+ Provider.displayName = "ActorProvider(".concat(machine.id, ")");
14
+ function useContext() {
15
+ var actor = React.useContext(ReactContext);
16
+ if (!actor) {
17
+ throw new Error("You used a hook from \"".concat(Provider.displayName, "\" but it's not inside a <").concat(Provider.displayName, "> component."));
18
+ }
19
+ return actor;
20
+ }
21
+ function useActor() {
22
+ var actor = useContext();
23
+ return useActorUnbound(actor);
24
+ }
25
+ function useSelector(selector, compare) {
26
+ var actor = useContext();
27
+ return useSelectorUnbound(actor, selector, compare);
28
+ }
29
+ return {
30
+ Provider: Provider,
31
+ useActorRef: useContext,
32
+ useActor: useActor,
33
+ useSelector: useSelector
34
+ };
35
+ }
package/es/index.d.ts CHANGED
@@ -4,4 +4,5 @@ export { useInterpret } from './useInterpret';
4
4
  export { useSelector } from './useSelector';
5
5
  export { useSpawn } from './useSpawn';
6
6
  export { shallowEqual } from './utils';
7
+ export { createActorContext } from './createActorContext';
7
8
  //# sourceMappingURL=index.d.ts.map
package/es/index.js CHANGED
@@ -4,3 +4,4 @@ export { useInterpret } from './useInterpret';
4
4
  export { useSelector } from './useSelector';
5
5
  export { useSpawn } from './useSpawn';
6
6
  export { shallowEqual } from './utils';
7
+ export { createActorContext } from './createActorContext';
package/es/useActor.js CHANGED
@@ -2,6 +2,7 @@ import { useRef, useCallback } from 'react';
2
2
  import useIsomorphicLayoutEffect from 'use-isomorphic-layout-effect';
3
3
  import useConstant from './useConstant';
4
4
  import { useSyncExternalStore } from 'use-sync-external-store/shim';
5
+ import { getServiceSnapshot, isService } from './utils';
5
6
  export function isActorWithState(actorRef) {
6
7
  return 'state' in actorRef;
7
8
  }
@@ -10,7 +11,9 @@ function isDeferredActor(actorRef) {
10
11
  }
11
12
  function defaultGetSnapshot(actorRef) {
12
13
  return 'getSnapshot' in actorRef
13
- ? actorRef.getSnapshot()
14
+ ? isService(actorRef)
15
+ ? getServiceSnapshot(actorRef)
16
+ : actorRef.getSnapshot()
14
17
  : isActorWithState(actorRef)
15
18
  ? actorRef.state
16
19
  : undefined;
package/es/useMachine.js CHANGED
@@ -36,7 +36,7 @@ export function useMachine(getMachine) {
36
36
  ? State.create(options.state)
37
37
  : service.machine.initialState);
38
38
  }
39
- return service.state;
39
+ return service.getSnapshot();
40
40
  }, [service]);
41
41
  var isEqual = useCallback(function (prevState, nextState) {
42
42
  if (service.status === InterpreterStatus.NotStarted) {
package/es/useSelector.js CHANGED
@@ -1,10 +1,7 @@
1
1
  import { useCallback, useRef } from 'react';
2
2
  import { useSyncExternalStoreWithSelector } from 'use-sync-external-store/shim/with-selector';
3
3
  import { isActorWithState } from './useActor';
4
- import { getServiceSnapshot } from './utils';
5
- function isService(actor) {
6
- return 'state' in actor && 'machine' in actor;
7
- }
4
+ import { getServiceSnapshot, isService } from './utils';
8
5
  var defaultCompare = function (a, b) { return a === b; };
9
6
  var defaultGetSnapshot = function (a, initialStateCacheRef) {
10
7
  if (isService(a)) {
package/es/utils.d.ts CHANGED
@@ -2,4 +2,5 @@ import { Interpreter } from 'xstate';
2
2
  export declare function partition<T, A extends T, B extends T>(items: T[], predicate: (item: T) => item is A): [A[], B[]];
3
3
  export declare function getServiceSnapshot<TService extends Interpreter<any, any, any, any>>(service: TService): TService['state'];
4
4
  export declare function shallowEqual(objA: any, objB: any): boolean;
5
+ export declare function isService(actor: any): actor is Interpreter<any, any, any, any>;
5
6
  //# sourceMappingURL=utils.d.ts.map
package/es/utils.js CHANGED
@@ -49,7 +49,9 @@ export function partition(items, predicate) {
49
49
  return [truthy, falsy];
50
50
  }
51
51
  export function getServiceSnapshot(service) {
52
- return service.status !== 0 ? service.state : service.machine.initialState;
52
+ return service.status !== 0
53
+ ? service.getSnapshot()
54
+ : service.machine.initialState;
53
55
  }
54
56
  // From https://github.com/reduxjs/react-redux/blob/master/src/utils/shallowEqual.ts
55
57
  function is(x, y) {
@@ -81,3 +83,6 @@ export function shallowEqual(objA, objB) {
81
83
  }
82
84
  return true;
83
85
  }
86
+ export function isService(actor) {
87
+ return 'state' in actor && 'machine' in actor;
88
+ }
@@ -0,0 +1,13 @@
1
+ import * as React from 'react';
2
+ import { useActor as useActorUnbound } from './useActor';
3
+ import { ActorRefFrom, AnyStateMachine, EmittedFrom } from 'xstate';
4
+ export declare function createActorContext<TMachine extends AnyStateMachine>(machine: TMachine): {
5
+ useActor: () => ReturnType<typeof useActorUnbound<ActorRefFrom<TMachine>>>;
6
+ useSelector: <T>(selector: (snapshot: EmittedFrom<TMachine>) => T, compare?: (a: T, b: T) => boolean) => T;
7
+ useActorRef: () => ActorRefFrom<TMachine>;
8
+ Provider: (props: {
9
+ children: React.ReactNode;
10
+ machine?: TMachine | (() => TMachine);
11
+ }) => React.ReactElement<any, any>;
12
+ };
13
+ //# sourceMappingURL=createActorContext.d.ts.map
@@ -0,0 +1,39 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.createActorContext = void 0;
4
+ var React = require("react");
5
+ var useInterpret_1 = require("./useInterpret");
6
+ var useActor_1 = require("./useActor");
7
+ var useSelector_1 = require("./useSelector");
8
+ function createActorContext(machine) {
9
+ var ReactContext = React.createContext(null);
10
+ var OriginalProvider = ReactContext.Provider;
11
+ function Provider(_a) {
12
+ var children = _a.children, _b = _a.machine, providedMachine = _b === void 0 ? machine : _b;
13
+ var actor = (0, useInterpret_1.useInterpret)(providedMachine);
14
+ return React.createElement(OriginalProvider, { value: actor }, children);
15
+ }
16
+ Provider.displayName = "ActorProvider(".concat(machine.id, ")");
17
+ function useContext() {
18
+ var actor = React.useContext(ReactContext);
19
+ if (!actor) {
20
+ throw new Error("You used a hook from \"".concat(Provider.displayName, "\" but it's not inside a <").concat(Provider.displayName, "> component."));
21
+ }
22
+ return actor;
23
+ }
24
+ function useActor() {
25
+ var actor = useContext();
26
+ return (0, useActor_1.useActor)(actor);
27
+ }
28
+ function useSelector(selector, compare) {
29
+ var actor = useContext();
30
+ return (0, useSelector_1.useSelector)(actor, selector, compare);
31
+ }
32
+ return {
33
+ Provider: Provider,
34
+ useActorRef: useContext,
35
+ useActor: useActor,
36
+ useSelector: useSelector
37
+ };
38
+ }
39
+ exports.createActorContext = createActorContext;
package/lib/index.d.ts CHANGED
@@ -4,4 +4,5 @@ export { useInterpret } from './useInterpret';
4
4
  export { useSelector } from './useSelector';
5
5
  export { useSpawn } from './useSpawn';
6
6
  export { shallowEqual } from './utils';
7
+ export { createActorContext } from './createActorContext';
7
8
  //# sourceMappingURL=index.d.ts.map
package/lib/index.js CHANGED
@@ -1,6 +1,6 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.shallowEqual = exports.useSpawn = exports.useSelector = exports.useInterpret = exports.useActor = exports.useMachine = void 0;
3
+ exports.createActorContext = exports.shallowEqual = exports.useSpawn = exports.useSelector = exports.useInterpret = exports.useActor = exports.useMachine = void 0;
4
4
  var useMachine_1 = require("./useMachine");
5
5
  Object.defineProperty(exports, "useMachine", { enumerable: true, get: function () { return useMachine_1.useMachine; } });
6
6
  var useActor_1 = require("./useActor");
@@ -13,3 +13,5 @@ var useSpawn_1 = require("./useSpawn");
13
13
  Object.defineProperty(exports, "useSpawn", { enumerable: true, get: function () { return useSpawn_1.useSpawn; } });
14
14
  var utils_1 = require("./utils");
15
15
  Object.defineProperty(exports, "shallowEqual", { enumerable: true, get: function () { return utils_1.shallowEqual; } });
16
+ var createActorContext_1 = require("./createActorContext");
17
+ Object.defineProperty(exports, "createActorContext", { enumerable: true, get: function () { return createActorContext_1.createActorContext; } });
package/lib/useActor.js CHANGED
@@ -5,6 +5,7 @@ var react_1 = require("react");
5
5
  var use_isomorphic_layout_effect_1 = require("use-isomorphic-layout-effect");
6
6
  var useConstant_1 = require("./useConstant");
7
7
  var shim_1 = require("use-sync-external-store/shim");
8
+ var utils_1 = require("./utils");
8
9
  function isActorWithState(actorRef) {
9
10
  return 'state' in actorRef;
10
11
  }
@@ -14,7 +15,9 @@ function isDeferredActor(actorRef) {
14
15
  }
15
16
  function defaultGetSnapshot(actorRef) {
16
17
  return 'getSnapshot' in actorRef
17
- ? actorRef.getSnapshot()
18
+ ? (0, utils_1.isService)(actorRef)
19
+ ? (0, utils_1.getServiceSnapshot)(actorRef)
20
+ : actorRef.getSnapshot()
18
21
  : isActorWithState(actorRef)
19
22
  ? actorRef.state
20
23
  : undefined;
package/lib/useMachine.js CHANGED
@@ -39,7 +39,7 @@ function useMachine(getMachine) {
39
39
  ? xstate_1.State.create(options.state)
40
40
  : service.machine.initialState);
41
41
  }
42
- return service.state;
42
+ return service.getSnapshot();
43
43
  }, [service]);
44
44
  var isEqual = (0, react_1.useCallback)(function (prevState, nextState) {
45
45
  if (service.status === xstate_1.InterpreterStatus.NotStarted) {
@@ -5,12 +5,9 @@ var react_1 = require("react");
5
5
  var with_selector_1 = require("use-sync-external-store/shim/with-selector");
6
6
  var useActor_1 = require("./useActor");
7
7
  var utils_1 = require("./utils");
8
- function isService(actor) {
9
- return 'state' in actor && 'machine' in actor;
10
- }
11
8
  var defaultCompare = function (a, b) { return a === b; };
12
9
  var defaultGetSnapshot = function (a, initialStateCacheRef) {
13
- if (isService(a)) {
10
+ if ((0, utils_1.isService)(a)) {
14
11
  // A status of 0 = interpreter not started
15
12
  if (a.status === 0 && initialStateCacheRef.current) {
16
13
  return initialStateCacheRef.current;
package/lib/utils.d.ts CHANGED
@@ -2,4 +2,5 @@ import { Interpreter } from 'xstate';
2
2
  export declare function partition<T, A extends T, B extends T>(items: T[], predicate: (item: T) => item is A): [A[], B[]];
3
3
  export declare function getServiceSnapshot<TService extends Interpreter<any, any, any, any>>(service: TService): TService['state'];
4
4
  export declare function shallowEqual(objA: any, objB: any): boolean;
5
+ export declare function isService(actor: any): actor is Interpreter<any, any, any, any>;
5
6
  //# sourceMappingURL=utils.d.ts.map
package/lib/utils.js CHANGED
@@ -27,7 +27,7 @@ var __values = (this && this.__values) || function(o) {
27
27
  throw new TypeError(s ? "Object is not iterable." : "Symbol.iterator is not defined.");
28
28
  };
29
29
  Object.defineProperty(exports, "__esModule", { value: true });
30
- exports.shallowEqual = exports.getServiceSnapshot = exports.partition = void 0;
30
+ exports.isService = exports.shallowEqual = exports.getServiceSnapshot = exports.partition = void 0;
31
31
  function partition(items, predicate) {
32
32
  var e_1, _a;
33
33
  var _b = __read([[], []], 2), truthy = _b[0], falsy = _b[1];
@@ -53,7 +53,9 @@ function partition(items, predicate) {
53
53
  }
54
54
  exports.partition = partition;
55
55
  function getServiceSnapshot(service) {
56
- return service.status !== 0 ? service.state : service.machine.initialState;
56
+ return service.status !== 0
57
+ ? service.getSnapshot()
58
+ : service.machine.initialState;
57
59
  }
58
60
  exports.getServiceSnapshot = getServiceSnapshot;
59
61
  // From https://github.com/reduxjs/react-redux/blob/master/src/utils/shallowEqual.ts
@@ -87,3 +89,7 @@ function shallowEqual(objA, objB) {
87
89
  return true;
88
90
  }
89
91
  exports.shallowEqual = shallowEqual;
92
+ function isService(actor) {
93
+ return 'state' in actor && 'machine' in actor;
94
+ }
95
+ exports.isService = isService;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@xstate/react",
3
- "version": "3.0.1",
3
+ "version": "3.1.0",
4
4
  "description": "XState tools for React",
5
5
  "keywords": [
6
6
  "state",
@@ -54,7 +54,7 @@
54
54
  "peerDependencies": {
55
55
  "@xstate/fsm": "^2.0.0",
56
56
  "react": "^16.8.0 || ^17.0.0 || ^18.0.0",
57
- "xstate": "^4.33.0"
57
+ "xstate": "^4.35.3"
58
58
  },
59
59
  "peerDependenciesMeta": {
60
60
  "@xstate/fsm": {
@@ -88,7 +88,7 @@
88
88
  "rollup-plugin-terser": "^5.1.2",
89
89
  "rollup-plugin-typescript2": "^0.30.0",
90
90
  "ts-jest": "^26.5.6",
91
- "typescript": "^4.5.2",
91
+ "typescript": "^4.8.4",
92
92
  "xstate": "*"
93
93
  }
94
94
  }