Acrool React Fetcher is a solution for API integration and Auth state management in React projects. It helps you easily manage tokens, make API requests, perform GraphQL queries, and handle authentication flows.
A solution for API integration and token management in React projects
- Token state management and custom refresh mechanism
- GraphQL query support and custom fetcher
- Seamless integration with Redux Toolkit Query
- Flexible provider composition
- Easy to test and simulate login/logout/token invalidation scenarios
yarn add @acrool/react-fetcherAdd the following to your entry file (e.g. index.tsx):
import "@acrool/react-fetcher/dist/index.css";Wrap your app with AuthStateProvider and AxiosClientProvider. It is recommended to use AppFetcherProvider to automatically wrap all necessary providers:
import AppFetcherProvider from '@/library/react-fetcher';
ReactDOM.createRoot(document.getElementById('root') as HTMLElement).render(
<AppFetcherProvider>
<App />
</AppFetcherProvider>
);For Redux Toolkit Query, create baseApi.ts:
import { createGraphQLFetcher } from '@acrool/react-fetcher';
import { createApi } from '@reduxjs/toolkit/query/react';
import { axiosInstance } from '@/library/react-fetcher';
export const baseApi = createApi({
reducerPath: 'api',
baseQuery: async (query, api, extraOptions) => {
// Token handling and refresh are managed automatically
const data = await createGraphQLFetcher(axiosInstance, query.document)(query.args);
return { data };
},
endpoints: () => ({}),
});import { useAuthState } from '@acrool/react-fetcher';
const { getTokens, updateTokens } = useAuthState();const { data, refetch } = useGetBookmarkQuery({ variables: { bookmarkId: '1' } });const handleMockTokenInvalid = () => {
updateTokens(curr => ({
...curr,
accessToken: 'mock-invalid-token',
}));
refetch();
};const login = useLogin();
const logout = useLogout();
await login({ variables: { input: { account, password } } });
logout();- The Dashboard page demonstrates how to operate token, API, and locale switching
- The Login page demonstrates login and error handling
(.net not support)
default: ?statusIds[]=1&statusIds[]=2
change to: ?statusIds=1&statusIds=2
export const baseQueryWithAxios: BaseQueryFn<IQuery> = async (query, BaseQueryApi, extraOptions) => {
await mutex.waitForUnlock();
try {
const {url, method, fetchOptions, ...args} = query;
const data = await createRestFulFetcher(axiosInstance, {url, method}, getContentTypeWithMethod)({
...args,
fetchOptions: {
...fetchOptions,
paramsSerializer: (params) => {
return qs.stringify(params, {indices: false});
}
}
});
return {
data,
meta: {}
};
} catch (error: any) {
dialog.error(error.message, {code: error.code});
return {
error: {
code: error.code || 500,
message: error.message
},
};
}
};