@mui/x-charts
Version:
The community edition of MUI X Charts components.
77 lines (74 loc) • 2.25 kB
JavaScript
'use client';
/* eslint-disable react-compiler/react-compiler */
var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault").default;
var _interopRequireWildcard = require("@babel/runtime/helpers/interopRequireWildcard").default;
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.useLazySelectorEffect = useLazySelectorEffect;
var React = _interopRequireWildcard(require("react"));
var _useLazyRef = _interopRequireDefault(require("@mui/utils/useLazyRef"));
const noop = () => {};
function useLazySelectorEffect(store, selector, effect,
/**
* If true, the selector will be ignored.
*/
skip) {
const instance = (0, _useLazyRef.default)(initialize, {
store,
selector,
skip
}).current;
instance.effect = effect;
// eslint-disable-next-line react-hooks/exhaustive-deps
React.useEffect(instance.onMount(skip), [skip]);
}
// `useLazyRef` typings are incorrect, `params` should not be optional
function initialize(params) {
const {
store,
selector,
skip: initialSkip
} = params;
let isRunning = false;
let previousState;
// We want a single subscription done right away and cleared on unmount only,
// but React triggers `useOnMount` multiple times in dev, so we need to manage
// the subscription anyway.
const subscribe = () => {
// eslint-disable-next-line @typescript-eslint/no-use-before-define
instance.dispose ?? (instance.dispose = store.subscribe(state => {
const nextState = selector(state);
// eslint-disable-next-line @typescript-eslint/no-use-before-define
instance.effect(previousState, nextState);
previousState = nextState;
}));
};
const instance = {
effect: noop,
dispose: null,
onMount: skip => () => {
if (skip) {
return undefined;
}
if (!isRunning) {
// Initialize values
isRunning = true;
previousState = selector(store.value);
}
subscribe();
return () => {
instance.dispose?.();
instance.dispose = null;
};
}
};
if (!initialSkip) {
// Initialize values
isRunning = true;
previousState = selector(store.value);
subscribe();
}
return instance;
}
;