Adds a case reducer to handle a single exact action type.
Either a plain action type string, or an action creator generated by createAction
that can be used to determine the action type.
The actual case reducer function.
Adds a case reducer to handle a single exact action type.
The actual case reducer function.
Adds a "default case" reducer that is executed if no case reducer and no matcher reducer was executed for this action.
The fallback "default case" reducer function.
Allows you to match your incoming actions against your own filter function instead of only the action.type
property.
A matcher function. In TypeScript, this should be a type predicate function
The actual case reducer function.
If multiple matcher reducers match, all of them will be executed in the order
they were defined in - even if a case reducer already matched.
All calls to builder.addMatcher
must come after any calls to builder.addCase
and before any calls to builder.addDefaultCase
.
import {
createAction,
createReducer,
AsyncThunk,
UnknownAction,
} from "@reduxjs/toolkit";
type GenericAsyncThunk = AsyncThunk<unknown, unknown, any>;
type PendingAction = ReturnType<GenericAsyncThunk["pending"]>;
type RejectedAction = ReturnType<GenericAsyncThunk["rejected"]>;
type FulfilledAction = ReturnType<GenericAsyncThunk["fulfilled"]>;
const initialState: Record<string, string> = {};
const resetAction = createAction("reset-tracked-loading-state");
function isPendingAction(action: UnknownAction): action is PendingAction {
return typeof action.type === "string" && action.type.endsWith("/pending");
}
const reducer = createReducer(initialState, (builder) => {
builder
.addCase(resetAction, () => initialState)
// matcher can be defined outside as a type predicate function
.addMatcher(isPendingAction, (state, action) => {
state[action.meta.requestId] = "pending";
})
.addMatcher(
// matcher can be defined inline as a type predicate function
(action): action is RejectedAction => action.type.endsWith("/rejected"),
(state, action) => {
state[action.meta.requestId] = "rejected";
}
)
// matcher can just return boolean and the matcher can receive a generic argument
.addMatcher<FulfilledAction>(
(action) => action.type.endsWith("/fulfilled"),
(state, action) => {
state[action.meta.requestId] = "fulfilled";
}
);
});
A builder for an action <-> reducer map.