fix
All checks were successful
/ upload (release) Successful in 21s

This commit is contained in:
pavel 2026-02-24 21:58:25 +01:00
commit 1ec1ba0028
4 changed files with 192 additions and 30 deletions

View file

@ -148,11 +148,44 @@ async function api(path, options = {}) {
headers["Authorization"] = `Bearer ${token}`;
}
const res = await fetch(fullUrl, {
let res = await fetch(fullUrl, {
...options,
headers,
});
// Handle 401 Unauthorized via Refresh Token
if (res.status === 401 && !path.includes('/auth/refresh')) {
const refreshToken = localStorage.getItem("chattz_refresh_token");
if (refreshToken) {
try {
const refreshUrl = API_BASE_URL ? `${API_BASE_URL}/auth/refresh` : '/auth/refresh';
const refreshRes = await fetch(refreshUrl, {
method: 'POST',
headers: { 'content-type': 'application/json' },
body: JSON.stringify({ refresh_token: refreshToken })
});
if (refreshRes.ok) {
const newTokens = await refreshRes.json();
localStorage.setItem("chattz_token", newTokens.access_token);
localStorage.setItem("chattz_refresh_token", newTokens.refresh_token);
// Retry original request with new token
headers["Authorization"] = `Bearer ${newTokens.access_token}`;
res = await fetch(fullUrl, { ...options, headers });
} else {
// Both tokens invalid/expired, wipe out to force clear state
throw new Error("Refresh token expired or invalid");
}
} catch (err) {
localStorage.removeItem("chattz_token");
localStorage.removeItem("chattz_refresh_token");
location.href = API_BASE_URL ? `${API_BASE_URL}/auth/login` : "/auth/login";
throw new Error("Session expired, please log in again");
}
}
}
if (!res.ok) {
let detail = "request failed";
try {
@ -1191,9 +1224,14 @@ async function init() {
try {
const searchParams = new URLSearchParams(location.search);
const jwtToken = searchParams.get("token");
if (jwtToken) {
localStorage.setItem("chattz_token", jwtToken);
const refreshToken = searchParams.get("refresh_token");
if (jwtToken || refreshToken) {
if (jwtToken) localStorage.setItem("chattz_token", jwtToken);
if (refreshToken) localStorage.setItem("chattz_refresh_token", refreshToken);
searchParams.delete("token");
searchParams.delete("refresh_token");
const nextQuery = searchParams.toString();
const nextUrl = `${location.pathname}${nextQuery ? `?${nextQuery}` : ""}`;
history.replaceState(null, "", nextUrl);
@ -1210,6 +1248,7 @@ async function init() {
el.logoutBtn.onclick = async () => {
await leaveVoice();
localStorage.removeItem("chattz_token");
localStorage.removeItem("chattz_refresh_token");
try { await api("/auth/logout", { method: "POST" }); } catch (e) { }
location.reload();
};