Toolkit for handling async operations in MobX stores
It is required to have mobx
installed.
$ npm install mobx-async-toolkit
With Yarn:
$ yarn add mobx-async-toolkit
First of all, a Toolkit
instance must be created and exported.
// src/lib/toolkit.ts
import { createToolkit } from 'mobx-async-toolkit';
export const toolkit = createToolkit();
Then it can be used to create queries and mutations as following:
import { makeAutoObservable } from 'mobx';
import {
createTodo,
CreateTodoOptions,
getTodo,
GetTodoOptions,
getTodos,
GetTodosOptions,
Todo,
} from '../lib/api';
import { toolkit } from '../lib/toolkit';
export class TodoStore {
constructor() {
makeAutoObservable(this);
}
todoQuery = toolkit.createQuery<Todo, GetTodoOptions>({
fn: getTodo,
key: 'todo',
});
todosQuery = toolkit.createQuery<Todo[], GetTodosOptions>({
fn: getTodos,
key: 'todos',
});
createTodoMutation = toolkit.createMutation<Todo, CreateTodoOptions>({
fn: createTodo,
});
}
Then a query can be consumed as following:
const todoStore = new TodoStore();
todoStore.todosQuery.data;
todoStore.todosQuery.status;
todoStore.todosQuery.error;
todoStore.todosQuery.fetch(options);
todoStore.todosQuery.refetch();
And here is a mutation:
import { toolkit } from '../../lib/toolkit';
const todoStore = new TodoStore();
const handleSubmit = (data: CreateTodoOptions) => {
await todoStore.createTodoMutation.mutate(data);
// refetch data after a mutation:
await this.model.todosQuery.refetch();
};
todoStore.createTodoMutation.status;
todoStore.createTodoMutation.error;
Function that creates and returns a Toolkit
instance.
// src/lib/auth.ts
export const toolkit = createToolkit();
Organizes queries and mutations.
// src/lib/auth.ts
export const toolkit = createToolkit();
A Toolkit
instance will have the following properties and methods:
-
createQuery: (options: QueryOptions & {key: string}) => Query
- creates a new
Query
instance - If
key
is provided, the query will be treated as a singleton.
- creates a new
-
createMutation: (options: MutationOptions) => Mutation
- creates a new
Mutation
instance
- creates a new
Controls and tracks the lifecycle of a query
const todosQuery = toolkit.createQuery<Todo[], GetTodosOptions>({
fn: getTodos,
key: 'todos',
});
-
fn: (options?: Options) => Promise<Data>
-
function that fetches data
-
once resolved, its return value will be set as the
data
property of the query
-
-
onSuccess: (data: Data, options?: Options) => void
- called if the query succeeds
-
onError: (error: Error, options?: Options) => void
- called if the query fails
-
data: Data | null
- state of the data that is being fetched
-
status: Status
- status of a query
-
error: Error
- error of a query
-
fetch: (options?: Options) => Promise<Data | undefined>
- triggers a query to start fetching the data
-
refetch: () => Promise<Data | undefined>
- re-runs latest
fetch
call
- re-runs latest
-
startPolling: (interval: number, options: Options) => Promise<void>
- fetches data on passed
interval
- fetches data on passed
-
stopPolling: () => void)
- stops polling
-
isIdle: boolean
-
isLoading: boolean
-
isSuccess: boolean
-
isError: boolean
Controls and tracks the lifecycle of a mutation
const createTodoMutation = toolkit.createMutation<Todo, CreateTodoOptions>({
fn: createTodo,
});
-
fn: (options?: Options) => Promise<data | undefined>
- function that calls mutation operation
-
onSuccess: (data: Data, options?: Options) => void
- called if the mutation succeeds
-
onError: (error: Error, options?: Options) => void
- called if the mutation fails
-
status: Status
- status of a query
-
error: Error
- error of a query
-
mutate: (options?: Options): Promise<Data | undefined>
- triggers a mutation operation
-
isIdle: boolean
-
isLoading: boolean
-
isSuccess: boolean
-
isError: boolean
- Clone this repo
- Create a branch:
git checkout -b your-feature
- Make some changes
- Test your changes
- Push your branch and open a Pull Request
MIT