useSelector.js 1.6 KB

12345678910111213141516171819202122232425262728293031323334353637
  1. "use strict";
  2. Object.defineProperty(exports, "__esModule", { value: true });
  3. exports.useSelector = void 0;
  4. var react_1 = require("react");
  5. var with_selector_1 = require("use-sync-external-store/shim/with-selector");
  6. var useActor_1 = require("./useActor");
  7. var utils_1 = require("./utils");
  8. var defaultCompare = function (a, b) { return a === b; };
  9. var defaultGetSnapshot = function (a, initialStateCacheRef) {
  10. if ((0, utils_1.isService)(a)) {
  11. // A status of 0 = interpreter not started
  12. if (a.status === 0 && initialStateCacheRef.current) {
  13. return initialStateCacheRef.current;
  14. }
  15. var snapshot = (0, utils_1.getServiceSnapshot)(a);
  16. initialStateCacheRef.current = a.status === 0 ? snapshot : null;
  17. return snapshot;
  18. }
  19. return (0, useActor_1.isActorWithState)(a) ? a.state : undefined;
  20. };
  21. function useSelector(actor, selector, compare, getSnapshot) {
  22. if (compare === void 0) { compare = defaultCompare; }
  23. var initialStateCacheRef = (0, react_1.useRef)(null);
  24. var subscribe = (0, react_1.useCallback)(function (handleStoreChange) {
  25. var unsubscribe = actor.subscribe(handleStoreChange).unsubscribe;
  26. return unsubscribe;
  27. }, [actor]);
  28. var boundGetSnapshot = (0, react_1.useCallback)(function () {
  29. if (getSnapshot) {
  30. return getSnapshot(actor);
  31. }
  32. return defaultGetSnapshot(actor, initialStateCacheRef);
  33. }, [actor, getSnapshot]);
  34. var selectedSnapshot = (0, with_selector_1.useSyncExternalStoreWithSelector)(subscribe, boundGetSnapshot, boundGetSnapshot, selector, compare);
  35. return selectedSnapshot;
  36. }
  37. exports.useSelector = useSelector;