'How to invalidate RTK query caches(reset state) globally?
Project uses redux toolkit and rtk query. Data are fetched from one api, but the code is split into smaller chunks to reflect logical parts like
- /vehicles
- /users
- /settings
...etc
After logout rtk query preserves its state, so on next login the data are old. They might not even reflect the current user. How can I invalidate all the caches?
Solution 1:[1]
Actually it is pretty simple, but I had to refactor the code.
I created new api for each logical part. So to invalidate cache I would have to reset each api's state individually.
Fortunately rtk has code splitting capabilities in it.
https://redux-toolkit.js.org/rtk-query/usage/code-splitting
Basically you create baseApi likes this:
export const baseApi = createApi({
baseQuery: fetchBaseQuery({
baseUrl: `${BASE_URL}/api`,
prepareHeaders: (headers, { getState }) => {
const token = (getState() as RootState).auth.token;
if (token) {
headers.set("authorization", `Bearer ${token}`);
}
return headers;
},
}),
tagTypes: ["Vehicle", "CompanySetting", "Associate"],
endpoints: () => ({}),
});
Then you can add api slice to it in a separate file, like so
export const companySettingsApi = baseApi.injectEndpoints({
endpoints: (builder) => ({
getCompanySettings: builder.query<CompanySetting[], void>({
query: () => ({
url: `/companySettings`,
}),
providesTags: (_) => ["CompanySetting"],
}),
setCompanySettings: builder.mutation<void, CompanySetting[]>({
query: (companySettings) => ({
url: `/companySettings`,
method: "PUT",
body: companySettings,
}),
invalidatesTags: (_) => ["CompanySetting"],
}),
}),
});
This gives you ability to reset entire api state with a single dispatch
dispatch(baseApi.util.resetApiState());
Sources
This article follows the attribution requirements of Stack Overflow and is licensed under CC BY-SA 3.0.
Source: Stack Overflow
| Solution | Source |
|---|---|
| Solution 1 | Dharman |
