diff --git a/tools/mobx.ts b/tools/mobx.ts new file mode 100644 index 0000000..a36643f --- /dev/null +++ b/tools/mobx.ts @@ -0,0 +1,23 @@ +/* eslint-disable import/prefer-default-export */ +import type { IReactionDisposer } from 'mobx'; +import { autorun } from 'mobx'; + +export function makeDisposable( + createReaction: () => IReactionDisposer, + mustBeDisposed: () => boolean +) { + let disposer: IReactionDisposer | undefined; + + function cleanDisposer() { + disposer = undefined; + } + + autorun(() => { + if (mustBeDisposed()) { + if (disposer !== undefined) disposer(); + cleanDisposer(); + } else { + disposer = createReaction(); + } + }); +}