UNPKG

fluidstate

Version:

Library for fine-grained reactivity state management

55 lines (54 loc) 2.39 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.createAtom = void 0; var _reactiveLayer = require("./reactive-layer"); var _reactiveRemoteAtoms = require("./reactive-remote-atoms"); var _reactiveTracking = require("./reactive-tracking"); /** * Creates a reactive atom, which is a fundamental unit of reactivity. * This atom does not hold a value itself but can be reported as observed or changed. * It interacts with the underlying reactive layer and manages observations * from any registered reactive remotes. * * The `onBecomeObservedListener` and `onBecomeUnobservedListener` options from * the underlying reactive layer are respected. * * When `reportObserved` is called: * 1. It notifies any reactive remotes that are currently tracking, potentially * creating remote-specific atoms if they don't exist yet. * 2. It reports observation to the underlying reactive layer. * 3. It returns `true` if the atom was observed either by the local layer or by any remote. * * When `reportChanged` is called: * 1. It reports the change to the underlying reactive layer, which in turn * notifies its dependents. * 2. This change will also propagate to remote atoms that were created to mirror this atom. * * @param name - A descriptive name for the atom, useful for debugging. * @param options - Optional configuration for the atom, including listeners * for when the atom becomes observed or unobserved by the local layer. * @returns An `Atom` object with `reportObserved` and `reportChanged` methods. */ const createAtom = (name, options) => { const layerAtom = (0, _reactiveLayer.getReactiveLayer)().createAtom(name, { onBecomeObservedListener: options?.onBecomeObservedListener, onBecomeUnobservedListener: options?.onBecomeUnobservedListener }); const atom = { reportObserved() { const isRemoteObserved = (0, _reactiveRemoteAtoms.observeRemoteAtoms)(atom, layerAtom, name); // We only report observation to the local layer if it's currently // in a tracking context. const layerObserved = (0, _reactiveTracking.isTrackingDerivation)() && !!layerAtom.reportObserved(); return isRemoteObserved || layerObserved; }, reportChanged() { layerAtom.reportChanged(); } }; return atom; }; exports.createAtom = createAtom; //# sourceMappingURL=reactive-atom.js.map