Skip to content

Commit 21b6c4b

Browse files
committed
fix(refresh-token): refactor token refresh logic into a separate function
1 parent 33f3523 commit 21b6c4b

1 file changed

Lines changed: 39 additions & 16 deletions

File tree

src/services/api/use-fetch.ts

Lines changed: 39 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,41 @@ import { FetchInputType, FetchInitType } from "./types/fetch-params";
66
import useLanguage from "../i18n/use-language";
77
import { getTokensInfo, setTokensInfo } from "../auth/auth-tokens-info";
88

9+
let refreshPromise: Promise<void> | null = null;
10+
11+
async function refreshTokens(): Promise<void> {
12+
if (refreshPromise) return refreshPromise;
13+
14+
refreshPromise = (async () => {
15+
try {
16+
const tokens = getTokensInfo();
17+
const response = await fetch(AUTH_REFRESH_URL, {
18+
method: "POST",
19+
headers: {
20+
"Content-Type": "application/json",
21+
Authorization: `Bearer ${tokens?.refreshToken}`,
22+
},
23+
});
24+
25+
const newTokens = await response.json();
26+
27+
if (newTokens.token) {
28+
setTokensInfo({
29+
token: newTokens.token,
30+
refreshToken: newTokens.refreshToken,
31+
tokenExpires: newTokens.tokenExpires,
32+
});
33+
}
34+
} catch {
35+
// Refresh failed — callers will proceed with current token
36+
} finally {
37+
refreshPromise = null;
38+
}
39+
})();
40+
41+
return refreshPromise;
42+
}
43+
944
function useFetch() {
1045
const language = useLanguage();
1146

@@ -32,24 +67,12 @@ function useFetch() {
3267
}
3368

3469
if (tokens?.tokenExpires && tokens.tokenExpires - 60000 <= Date.now()) {
35-
const newTokens = await fetch(AUTH_REFRESH_URL, {
36-
method: "POST",
37-
headers: {
38-
"Content-Type": "application/json",
39-
Authorization: `Bearer ${tokens.refreshToken}`,
40-
},
41-
}).then((res) => res.json());
42-
43-
if (newTokens.token) {
44-
setTokensInfo({
45-
token: newTokens.token,
46-
refreshToken: newTokens.refreshToken,
47-
tokenExpires: newTokens.tokenExpires,
48-
});
49-
70+
await refreshTokens();
71+
const refreshedTokens = getTokensInfo();
72+
if (refreshedTokens?.token) {
5073
headers = {
5174
...headers,
52-
Authorization: `Bearer ${newTokens.token}`,
75+
Authorization: `Bearer ${refreshedTokens.token}`,
5376
};
5477
}
5578
}

0 commit comments

Comments
 (0)