1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374 |
- "use strict";
- Object.defineProperty(exports, "__esModule", { value: true });
- exports.useActor = exports.isActorWithState = void 0;
- var react_1 = require("react");
- var use_isomorphic_layout_effect_1 = require("use-isomorphic-layout-effect");
- var useConstant_1 = require("./useConstant");
- var with_selector_1 = require("use-sync-external-store/shim/with-selector");
- var utils_1 = require("./utils");
- function identity(a) {
- return a;
- }
- function isActorWithState(actorRef) {
- return 'state' in actorRef;
- }
- exports.isActorWithState = isActorWithState;
- function isDeferredActor(actorRef) {
- return 'deferred' in actorRef;
- }
- function defaultGetSnapshot(actorRef) {
- return 'getSnapshot' in actorRef
- ? (0, utils_1.isService)(actorRef)
- ? (0, utils_1.getServiceSnapshot)(actorRef)
- : actorRef.getSnapshot()
- : isActorWithState(actorRef)
- ? actorRef.state
- : undefined;
- }
- function useActor(actorRef, getSnapshot) {
- if (getSnapshot === void 0) { getSnapshot = defaultGetSnapshot; }
- var actorRefRef = (0, react_1.useRef)(actorRef);
- var deferredEventsRef = (0, react_1.useRef)([]);
- var subscribe = (0, react_1.useCallback)(function (handleStoreChange) {
- var unsubscribe = actorRef.subscribe(handleStoreChange).unsubscribe;
- return unsubscribe;
- }, [actorRef]);
- var boundGetSnapshot = (0, react_1.useCallback)(function () { return getSnapshot(actorRef); }, [actorRef, getSnapshot]);
- var isEqual = (0, react_1.useCallback)(function (prevState, nextState) {
- if ((0, utils_1.isService)(actorRef)) {
- return (0, utils_1.isInterpreterStateEqual)(actorRef, prevState, nextState);
- }
- return prevState === nextState;
- }, [actorRef]);
- var storeSnapshot = (0, with_selector_1.useSyncExternalStoreWithSelector)(subscribe, boundGetSnapshot, boundGetSnapshot, identity, isEqual);
- var send = (0, useConstant_1.default)(function () { return function () {
- var args = [];
- for (var _i = 0; _i < arguments.length; _i++) {
- args[_i] = arguments[_i];
- }
- var event = args[0];
- if (process.env.NODE_ENV !== 'production' && args.length > 1) {
- console.warn("Unexpected payload: ".concat(JSON.stringify(args[1]), ". Only a single event object can be sent to actor send() functions."));
- }
- var currentActorRef = actorRefRef.current;
- // If the previous actor is a deferred actor,
- // queue the events so that they can be replayed
- // on the non-deferred actor.
- if (isDeferredActor(currentActorRef) && currentActorRef.deferred) {
- deferredEventsRef.current.push(event);
- }
- else {
- currentActorRef.send(event);
- }
- }; });
- (0, use_isomorphic_layout_effect_1.default)(function () {
- actorRefRef.current = actorRef;
- // Dequeue deferred events from the previous deferred actorRef
- while (deferredEventsRef.current.length > 0) {
- var deferredEvent = deferredEventsRef.current.shift();
- actorRef.send(deferredEvent);
- }
- }, [actorRef]);
- return [storeSnapshot, send];
- }
- exports.useActor = useActor;
|