For asynchronous token setting, you can use the auth exchange
import { createClient, dedupExchange, cacheExchange, fetchExchange } from 'urql';
import { authExchange } from '@urql/exchange-auth';
const getAuth = async ({ authState, mutate }) => {
if (!authState) {
const token = await getToken();
const refreshToken = await getRefreshToken();
if (token && refreshToken) {
return { token, refreshToken };
}
return null;
}
return null;
};
const addAuthToOperation = ({ authState, operation }) => {
if (!authState || !authState.token) {
return operation;
}
const fetchOptions =
typeof operation.context.fetchOptions === 'function'
? operation.context.fetchOptions()
: operation.context.fetchOptions || {};
return makeOperation(operation.kind, operation, {
...operation.context,
fetchOptions: {
...fetchOptions,
headers: {
...fetchOptions.headers,
Authorization: authState.token,
},
},
});
};
const client = createClient({
url: '/graphql',
exchanges: [
dedupExchange,
cacheExchange,
authExchange({
getAuthToken,
addAuthToOperation,
}),
fetchExchange,
],
});