mobx-keystone
Version:
A MobX powered state management solution based on data trees with first class support for TypeScript, snapshots, patches and much more
36 lines (35 loc) • 1.23 kB
TypeScript
import { ActionMiddlewareDisposer } from '../action/middleware';
/**
* Return type for readonly middleware.
*/
export interface ReadonlyMiddlewareReturn {
allowWrite: <R>(fn: () => R) => R;
dispose: ActionMiddlewareDisposer;
}
/**
* Attaches an action middleware that will throw when any action is started
* over the node or any of the child nodes, thus effectively making the subtree
* readonly.
*
* It will return an object with a `dispose` function to remove the middleware and a `allowWrite` function
* that will allow actions to be started inside the provided code block.
*
* Example:
* ```ts
* // given a model instance named todo
* const { dispose, allowWrite } = readonlyMiddleware(todo)
*
* // this will throw
* todo.setDone(false)
* await todo.setDoneAsync(false)
*
* // this will work
* allowWrite(() => todo.setDone(false))
* // note: for async always use one action invocation per allowWrite!
* await allowWrite(() => todo.setDoneAsync(false))
* ```
*
* @param subtreeRoot Subtree root target object.
* @returns An object with the middleware disposer (`dispose`) and a `allowWrite` function.
*/
export declare function readonlyMiddleware(subtreeRoot: object): ReadonlyMiddlewareReturn;