mobx-react-lite
Version:
Lightweight React bindings for MobX based on React 16.8+ and Hooks
73 lines (64 loc) • 2.29 kB
text/typescript
import { Reaction } from "mobx"
export function createTrackingData(reaction: Reaction) {
const trackingData: IReactionTracking = {
reaction,
mounted: false,
changedBeforeMount: false,
cleanAt: Date.now() + CLEANUP_LEAKED_REACTIONS_AFTER_MILLIS
}
return trackingData
}
/**
* Unified api for timers/Finalization registry cleanups
* This abstraction make useObserver much simpler
*/
export interface ReactionCleanupTracking {
/**
*
* @param reaction The reaction to cleanup
* @param objectRetainedByReact This will be in actual use only when FinalizationRegister is in use
*/
addReactionToTrack(
reactionTrackingRef: React.MutableRefObject<IReactionTracking | null>,
reaction: Reaction,
objectRetainedByReact: object
): IReactionTracking
recordReactionAsCommitted(reactionRef: React.MutableRefObject<IReactionTracking | null>): void
forceCleanupTimerToRunNowForTests(): void
resetCleanupScheduleForTests(): void
}
export interface IReactionTracking {
/** The Reaction created during first render, which may be leaked */
reaction: Reaction
/**
* The time (in ticks) at which point we should dispose of the reaction
* if this component hasn't yet been fully mounted.
*/
cleanAt: number
/**
* Whether the component has yet completed mounting (for us, whether
* its useEffect has run)
*/
mounted: boolean
/**
* Whether the observables that the component is tracking changed between
* the first render and the first useEffect.
*/
changedBeforeMount: boolean
/**
* In case we are using finalization registry based cleanup,
* this will hold the cleanup token associated with this reaction
*/
finalizationRegistryCleanupToken?: number
}
/**
* The minimum time before we'll clean up a Reaction created in a render
* for a component that hasn't managed to run its effects. This needs to
* be big enough to ensure that a component won't turn up and have its
* effects run without being re-rendered.
*/
export const CLEANUP_LEAKED_REACTIONS_AFTER_MILLIS = 10_000
/**
* The frequency with which we'll check for leaked reactions.
*/
export const CLEANUP_TIMER_LOOP_MILLIS = 10_000