From 9baef204c5ea540c7169f059a2f7de4a013eddb3 Mon Sep 17 00:00:00 2001 From: Vahdet Parlak Date: Sun, 21 Jul 2024 13:14:56 +0300 Subject: [PATCH] fixed-401 --- authservice/src/views.py | 2 +- .../media/images/avatar7_1ERBFAb.png | Bin 0 -> 74256 bytes frontend/src/routes/ai/Ai.js | 41 ++--------- .../routes/changepassword/Changepassword.js | 6 ++ frontend/src/routes/edit/Edit.js | 64 +++++++++++++----- .../routes/friendrequests/Friendrequests.js | 32 ++++++--- frontend/src/routes/friends/Friends.js | 43 +++++++----- frontend/src/routes/game/Game.js | 16 ++++- frontend/src/routes/join/Join.js | 39 ++++++----- frontend/src/routes/localgame/Localgame.js | 18 ++--- .../src/routes/otherprofile/Otherprofile.js | 26 ++++--- frontend/src/routes/profile/Profile.js | 21 ++++-- frontend/src/routes/quickplay/Quickplay.js | 12 ++-- frontend/src/routes/twofa/TwoFA.js | 3 +- frontend/src/routes/users/Users.js | 43 +++++++++--- frontend/src/utils/utils.js | 31 +++++---- 16 files changed, 247 insertions(+), 150 deletions(-) create mode 100644 bucketservice/media/images/avatar7_1ERBFAb.png diff --git a/authservice/src/views.py b/authservice/src/views.py index 88edb97..1d9bf6e 100644 --- a/authservice/src/views.py +++ b/authservice/src/views.py @@ -14,7 +14,7 @@ def generate_access_token(user_id, jti): payload = { 'user_id': user_id, 'jti': jti, # unique identifier for the token pair. - 'exp': datetime.now(tz=timezone.utc) + timedelta(minutes=45), + 'exp': datetime.now(tz=timezone.utc) + timedelta(seconds=5), 'iat': datetime.now(tz=timezone.utc) } access_token = jwt.encode(payload, settings.SECRET_KEY, algorithm='HS256') diff --git a/bucketservice/media/images/avatar7_1ERBFAb.png b/bucketservice/media/images/avatar7_1ERBFAb.png new file mode 100644 index 0000000000000000000000000000000000000000..90b1019d839c88b9bf74e16e0204992723149376 GIT binary patch literal 74256 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

a5l?id+|6l;?{2?s)B2=MYNi~b#hq!f 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�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 z canvas.height) { ballSpeedY = -ballSpeedY * 1.05; } - // Ball collision with paddles if ( (ballX - ballSize < paddleWidth && ballY > leftPaddleY && ballY < leftPaddleY + paddleHeight) || @@ -75,7 +63,6 @@ export async function fetchAi() { ) { ballSpeedX = -ballSpeedX * 1.05; } - // Score points if (ballX < 0) { rightScore++; @@ -84,10 +71,8 @@ export async function fetchAi() { leftScore++; resetBall(); } - // Update score display scoreBoard.textContent = `Player 1: ${leftScore} | AI: ${rightScore}`; - // Check for game over if (leftScore === 5 || rightScore === 5) { const winner = leftScore === 5 ? "Player 1" : "AI"; @@ -99,15 +84,12 @@ export async function fetchAi() { navigateTo("/ai"); } } - function resetBall() { ballX = canvas.width / 2; ballY = canvas.height / 2; ballSpeedX = -ballSpeedX; ballSpeedY = Math.random() > 0.5 ? 5 : -5; } - - function gameLoop() { if (gameRunning) { handleInput(); @@ -116,18 +98,14 @@ export async function fetchAi() { requestAnimationFrame(gameLoop); } } - // Keyboard controls const keys = {}; - document.addEventListener('keydown', (e) => { keys[e.key] = true; }); - document.addEventListener('keyup', (e) => { keys[e.key] = false; }); - function handleInput() { // Left paddle if (keys['w'] && leftPaddleY > 0) { @@ -136,7 +114,6 @@ export async function fetchAi() { if (keys['s'] && leftPaddleY < canvas.height - paddleHeight) { leftPaddleY += 5; } - // AI controlled right paddle const aiSpeed = 5 + Math.random() * 2; // AI speed varies between 3 and 5 if (rightPaddleY + paddleHeight / 2 < ballY) { @@ -144,7 +121,6 @@ export async function fetchAi() { } else if (rightPaddleY + paddleHeight / 2 > ballY) { rightPaddleY -= aiSpeed; } - // Ensure AI paddle stays within canvas bounds if (rightPaddleY < 0) { rightPaddleY = 0; @@ -152,7 +128,6 @@ export async function fetchAi() { rightPaddleY = canvas.height - paddleHeight; } } - startButton.addEventListener('click', () => { if (!gameRunning) { gameRunning = true; @@ -164,45 +139,37 @@ export async function fetchAi() { gameLoop(); } }); - function finishGame() { gameRunning = false; startButton.style.display = 'block'; alert("VS AI is aborted!"); } - // Listen for navigation events const originalPushState = history.pushState; const originalReplaceState = history.replaceState; - history.pushState = function () { if (gameRunning) { finishGame(); } return originalPushState.apply(history, arguments); }; - history.replaceState = function () { if (gameRunning) { finishGame(); } return originalReplaceState.apply(history, arguments); }; - window.addEventListener('popstate', () => { if (gameRunning) { finishGame(); } }); - function navigateTo(url) { if (gameRunning) { finishGame(); } originalNavigateTo(url); } - draw(); } } - diff --git a/frontend/src/routes/changepassword/Changepassword.js b/frontend/src/routes/changepassword/Changepassword.js index a0d75ac..bb5bde2 100644 --- a/frontend/src/routes/changepassword/Changepassword.js +++ b/frontend/src/routes/changepassword/Changepassword.js @@ -50,6 +50,8 @@ export async function fetchChangepassword() { return RefreshToken().then(() => { return postChangePasswordRequest().then(handleResponse); }); + } else if (response.status === 401 && errorData.error) { + document.getElementById("logout-button").click(); } else { throw errorData; } @@ -61,6 +63,10 @@ export async function fetchChangepassword() { postChangePasswordRequest() .then(handleResponse) .then(data => { + if (data.error) { + insertIntoElement('fields-warning', "Error: " + data.error); + return; + } setTimeout(() => { alert("Password changed successfully"); navigateTo("/"); diff --git a/frontend/src/routes/edit/Edit.js b/frontend/src/routes/edit/Edit.js index 5e3a327..4e25f62 100644 --- a/frontend/src/routes/edit/Edit.js +++ b/frontend/src/routes/edit/Edit.js @@ -19,6 +19,20 @@ export async function fetchEdit() { if (!response.ok) { const errorData = await response.json(); + if (response.status === 401) { + if (errorData.error === "Token has expired") { + await RefreshToken(); + return fetchEdit(); + } + document.getElementById("logout-button").click(); + return; + } + if (response.status === 500) { + let message = "error: " + errorData.error; + alert(message); + navigateTo("/"); // redirect to home page + return; + } throw new Error(errorData.error); } @@ -62,16 +76,21 @@ export async function fetchEdit() { const handleResponse = response => { if (!response.ok) { return response.json().then(errorData => { - if (response.status === 401 && errorData.error === "Token has expired") { - return RefreshToken().then(() => { - return postUpdateUserRequest().then(handleResponse); - }); + if (response.status === 401) { + if (errorData.error === "Token has expired") { + return RefreshToken().then(() => { + return postUpdateUserRequest().then(handleResponse); + }); + } + document.getElementById("logout-button").click(); + return; } else if (response.status === 207) { alert("Email updated successfully, please verify your email"); document.getElementById("logout-button").click(); return; - } - else { + } else if (response.status === 500) { + throw errorData; + } else { throw errorData; } }); @@ -81,9 +100,12 @@ export async function fetchEdit() { postUpdateUserRequest() .then(handleResponse) - .then(() => { - alert("Profile updated successfully"); - navigateTo("/profile"); + .then((data) => { + if (!data.error) { + alert("Profile updated successfully"); + navigateTo("/profile"); + return; + } }) .catch(err => { if (err.error) { @@ -133,12 +155,16 @@ export async function fetchEdit() { const handleResponse = response => { if (!response.ok) { return response.json().then(errorData => { - if (response.status === 401 && errorData.error === "Token has expired") { - return RefreshToken().then(() => { - return postAvatarUpdate().then(handleResponse); - }); + if (response.status === 401) { + if (errorData.error === "Token has expired") { + return RefreshToken().then(() => { + return postAvatarUpdate().then(handleResponse); + }); + } + document.getElementById("logout-button").click(); + return; } else { - throw new Error("Couldn't update avatar"); + throw errorData; } }); } @@ -147,11 +173,15 @@ export async function fetchEdit() { postAvatarUpdate() .then(handleResponse) .then(data => { - alert("Avatar updated successfully"); - navigateTo("/profile"); + if (!data.error) { + alert("Avatar updated successfully"); + navigateTo("/profile"); + } }) .catch(error => { - console.error(error); + if (error.error) { + insertIntoElement('fields-warning', "Error: " + error.error); + } }); }); diff --git a/frontend/src/routes/friendrequests/Friendrequests.js b/frontend/src/routes/friendrequests/Friendrequests.js index 9242f71..60a91d6 100644 --- a/frontend/src/routes/friendrequests/Friendrequests.js +++ b/frontend/src/routes/friendrequests/Friendrequests.js @@ -20,16 +20,26 @@ export async function fetchFriendrequests() { }); if (!response_user.ok) { const errorData = await response_user.json(); - if (errorData.error === 'Token has expired') { - await RefreshToken(); - return fetchFriendrequests(); // Retry fetching after token refresh - } else { - throw new Error(errorData.error); + if (response_user.status === 401) { + if (errorData.error === "Token has expired") { + await RefreshToken(); + return fetchFriendrequests(); + } + document.getElementById("logout-button").click(); + return; + } + if (response_user.status === 500) { + let message = "error: " + errorData.error; + alert(message); + navigateTo("/"); // redirect to home page + return; } + throw new Error(errorData.error); } const data = await response_user.json(); const user = data.data[0]; + const response = await fetch(requestsList + "?page=" + currentPage + "&limit=5", { method: "GET", headers: { @@ -39,14 +49,20 @@ export async function fetchFriendrequests() { }); if (!response.ok) { const errorData = await response.json(); - if (errorData.error === 'Token has expired') { - await RefreshToken(); - return fetchFriendrequests(); // Retry fetching after token refresh + if (response.status === 401) { + if (errorData.error === "Token has expired") { + await RefreshToken(); + return fetchFriendrequests(); + } + document.getElementById("logout-button").click(); + return; } else { throw new Error(errorData.error); } } + + const requests_res = await response.json(); const requests = requests_res.data; let paginate_data = requests_res.pagination; diff --git a/frontend/src/routes/friends/Friends.js b/frontend/src/routes/friends/Friends.js index 69c503b..a232660 100644 --- a/frontend/src/routes/friends/Friends.js +++ b/frontend/src/routes/friends/Friends.js @@ -7,7 +7,6 @@ let total_pages = 1; export async function fetchFriends() { if (!localStorage.getItem("access_token")) { - navigateTo("/login"); return; } @@ -23,9 +22,13 @@ export async function fetchFriends() { if (!response.ok) { const errorData = await response.json(); - if (errorData.error === 'Token has expired') { - await RefreshToken(); - return fetchFriends(); // Retry fetching after token refresh + if (response.status === 401) { + if (errorData.error === 'Token has expired') { + await RefreshToken(); + return fetchFriends(); // Retry fetching after token refresh + } + document.getElementById("logout-button").click(); + return; } else { throw new Error(errorData.error); } @@ -51,7 +54,13 @@ export async function fetchFriends() { } }).then(response => { if (!response.ok) { - throw new Error("Failed to fetch user details"); + if (response.status === 401) { + if (errorData.error === 'Token has expired') { + throw new Error('Token has expired'); + } + throw new Error('Unauthorized'); + } + throw new Error('Failed to fetch user details'); } return response.json(); }).then(data => { @@ -98,11 +107,13 @@ export async function fetchFriends() { }).catch((error) => { console.error(error); if (error.message === 'Token has expired') { - RefreshToken().then(() => { - fetchFriends(); - }); + return fetchFriends(); // Retry fetching after token refresh + } else if (error.message === 'Unauthorized') { + document.getElementById("logout-button").click(); + return; } else { alert(error.message); + return; } }); }); @@ -138,14 +149,17 @@ async function deleteUser(userId) { if (!response.ok) { const errorData = await response.json(); - if (errorData.error === 'Token has expired') { - await RefreshToken(); - return deleteUser(userId); // Retry deleting after token refresh + if (response.status === 401) { + if (errorData.error === 'Token has expired') { + await RefreshToken(); + return deleteUser(userId); // Retry deleting after token refresh + } + document.getElementById("logout-button").click(); + return; } else { throw new Error(errorData.error); } } - await response.json(); navigateTo("/friends"); } catch (error) { @@ -153,8 +167,3 @@ async function deleteUser(userId) { alert(error.message); } } - - - - - diff --git a/frontend/src/routes/game/Game.js b/frontend/src/routes/game/Game.js index 4c5a6cc..7e9c959 100644 --- a/frontend/src/routes/game/Game.js +++ b/frontend/src/routes/game/Game.js @@ -18,11 +18,23 @@ export async function fetchGame() { }); if (!response.ok) { const errorData = await response.json(); + if (response.status === 401) { + if (errorData.error === "Token has expired") { + await RefreshToken(); + return fetchGame(); + } + document.getElementById("logout-button").click(); + return; + } + if (response.status === 500) { + let message = "error: " + errorData.error; + alert(message); + navigateTo("/"); + return; + } throw new Error(errorData.error); } - const data = await response.json(); - const user = data[0]; if (!game_id) { diff --git a/frontend/src/routes/join/Join.js b/frontend/src/routes/join/Join.js index 525134b..5bf1e24 100644 --- a/frontend/src/routes/join/Join.js +++ b/frontend/src/routes/join/Join.js @@ -22,12 +22,15 @@ export async function fetchJoin() { if (!response.ok) { const errorData = await response.json(); - if (errorData.error === 'Token has expired') { - await RefreshToken(); - return fetchJoin(); // Retry fetching invites after token refresh - } else { - throw new Error(errorData.error); + if (response.status === 401) { + if (errorData.error === 'Token has expired') { + await RefreshToken(); + return fetchJoin(); // Retry fetching invites after token refresh + } + document.getElementById("logout-button").click(); + return; } + throw new Error(errorData.error); } const invites_res = await response.json(); @@ -80,24 +83,28 @@ export async function fetchJoin() { const handleResponse = response => { if (!response.ok) { return response.json().then(data => { - if (response.status === 401 && data.error === "Token has expired") { - return RefreshToken().then(() => { - return postJoinRequest().then(handleResponse); - }); - } else { - throw new Error(data.error); + if (response.status === 401) { + if (data.error === 'Token has expired') { + return RefreshToken().then(() => { + return postJoinRequest().then(handleResponse); + }); + } + document.getElementById("logout-button").click(); + return; } + throw new Error(data.error); }); } return response.json(); }; - postJoinRequest() .then(handleResponse) - .then(data => { - alert("Joined game successfully"); - localStorage.setItem("game_id", data.data.game_id); - navigateTo("/game"); + .then((data) => { + if (!data.error) { + alert("Joined game successfully"); + localStorage.setItem("game_id", data.data.game_id); + navigateTo("/game"); + } }) .catch(error => { alert(error.message); diff --git a/frontend/src/routes/localgame/Localgame.js b/frontend/src/routes/localgame/Localgame.js index 28cb7ab..a61d2bb 100644 --- a/frontend/src/routes/localgame/Localgame.js +++ b/frontend/src/routes/localgame/Localgame.js @@ -1,17 +1,9 @@ import { navigateTo as originalNavigateTo } from "../../utils/navTo.js"; -// Override navigateTo function to detect navigation changes -function navigateTo(url) { - if (gameRunning) { - finishGame(); - } - originalNavigateTo(url); -} - export async function fetchLocalgame() { const access_token = localStorage.getItem("access_token"); if (!access_token) { - + console.log("No access token found"); navigateTo("/login"); } else { const canvas = document.getElementById('gameCanvas'); @@ -197,6 +189,14 @@ export async function fetchLocalgame() { } }); + // Override navigateTo function to detect navigation changes + function navigateTo(url) { + if (gameRunning) { + finishGame(); + } + originalNavigateTo(url); + } + draw(); } } diff --git a/frontend/src/routes/otherprofile/Otherprofile.js b/frontend/src/routes/otherprofile/Otherprofile.js index 41a0de9..f1a8016 100644 --- a/frontend/src/routes/otherprofile/Otherprofile.js +++ b/frontend/src/routes/otherprofile/Otherprofile.js @@ -25,12 +25,15 @@ export async function fetchOtherprofile() { }); if (!response.ok) { const errorData = await response.json(); - if (errorData.error === 'Token has expired') { - await RefreshToken(); - return fetchUserDetails(); // Retry fetching user details after token refresh - } else { - throw new Error(errorData.error); + if (response.status === 401) { + if (errorData.error === 'Token has expired') { + await RefreshToken(); + return fetchUserDetails(); // Retry fetching user details after token refresh + } + document.getElementById("logout-button").click(); + return; } + throw new Error(errorData.error); } return response.json(); }; @@ -58,12 +61,15 @@ export async function fetchOtherprofile() { }); if (!response.ok) { const errorData = await response.json(); - if (errorData.error === 'Token has expired') { - await RefreshToken(); - return fetchMatchHistory(); - } else { - throw new Error(errorData.error); + if (response.status === 401) { + if (errorData.error === 'Token has expired') { + await RefreshToken(); + return fetchMatchHistory(); + } + document.getElementById("logout-button").click(); + return; } + throw new Error(errorData.error); } return response.json(); }; diff --git a/frontend/src/routes/profile/Profile.js b/frontend/src/routes/profile/Profile.js index c020fd1..ee38dbf 100644 --- a/frontend/src/routes/profile/Profile.js +++ b/frontend/src/routes/profile/Profile.js @@ -20,6 +20,14 @@ export async function fetchProfile() { }); if (!response_user.ok) { const errorData = await response_user.json(); + if (response_user.status === 401) { + if (errorData.error === 'Token has expired') { + await RefreshToken(); + return fetchProfile(); // Retry fetching user details after token refresh + } + document.getElementById("logout-button").click(); + return; + } throw new Error(errorData.error); } @@ -45,12 +53,15 @@ export async function fetchProfile() { if (!matchResponse.ok) { const errorData = await matchResponse.json(); - if (errorData.error === 'Token has expired') { - await RefreshToken(); - return fetchMatches(); // Retry fetching matches after token refresh - } else { - throw new Error(errorData.error); + if (matchResponse.status === 401) { + if (errorData.error === 'Token has expired') { + await RefreshToken(); + return fetchMatches(); // Retry fetching matches after token refresh + } + document.getElementById("logout-button").click(); + return; } + throw new Error(errorData.error); } const matchData = await matchResponse.json(); diff --git a/frontend/src/routes/quickplay/Quickplay.js b/frontend/src/routes/quickplay/Quickplay.js index 82e4e64..8769822 100644 --- a/frontend/src/routes/quickplay/Quickplay.js +++ b/frontend/src/routes/quickplay/Quickplay.js @@ -45,9 +45,11 @@ export async function fetchQuickplay() { return RefreshToken().then(() => { return postGameCreate().then(handleResponse); }); - } else { - throw errorData; + } else if (response.status === 401 && errorData.error) { + document.getElementById("logout-button").click(); + return; } + throw errorData; }); } return response.json(); @@ -104,9 +106,11 @@ export async function fetchQuickplay() { return RefreshToken().then(() => { return postGameCreate().then(handleResponse); }); - } else { - throw errorData; + } else if (response.status === 401 && errorData.error) { + document.getElementById("logout-button").click(); + return; } + throw errorData; }); } return response.json(); diff --git a/frontend/src/routes/twofa/TwoFA.js b/frontend/src/routes/twofa/TwoFA.js index 3946a81..f382253 100644 --- a/frontend/src/routes/twofa/TwoFA.js +++ b/frontend/src/routes/twofa/TwoFA.js @@ -32,7 +32,8 @@ form.addEventListener("submit", (e) => { }) .then(res => { if (!res.ok) { - fields_warning.innerText = "invalid code"; + errorData = res.json(); + fields_warning.innerText = errorData.error; throw new Error("couldn't log in"); } document.getElementById('nav-bar').style.display = 'flex'; diff --git a/frontend/src/routes/users/Users.js b/frontend/src/routes/users/Users.js index a9c0319..dc1190a 100644 --- a/frontend/src/routes/users/Users.js +++ b/frontend/src/routes/users/Users.js @@ -35,16 +35,24 @@ export async function fetchUsers() { if (!response.ok) { const errorData = await response.json(); - if (errorData.error === 'Token has expired') { - await RefreshToken(); - return fetchUserSearch(searchValue); // Retry fetching after token refresh - } else { - throw new Error(errorData.error); + if (response.status === 401) { + if (errorData.error === 'Token has expired') { + await RefreshToken(); + return fetchUserSearch(searchValue); // Retry fetching after token refresh + } else { + document.getElementById("logout-button").click(); + return; + } } + throw new Error(errorData.error); } const data = await response.json(); const users = data.data; + if (!users) { + alert("No users found"); + return; + } let paginate_data = data.pagination; if (paginate_data) { @@ -65,7 +73,16 @@ export async function fetchUsers() { }); if (!resp.ok) { - console.log("error!"); + if (resp.status === 401) { + if (errorData.error === 'Token has expired') { + await RefreshToken(); + return fetchUserSearch(searchValue); // Retry fetching after token refresh + } else { + document.getElementById("logout-button").click(); + return; + } + } + throw new Error(errorData.error); } const userRelations = await resp.json(); @@ -168,15 +185,19 @@ export async function fetchUsers() { if (!response.ok) { const errorData = await response.json(); - if (errorData.error === 'Token has expired') { - await RefreshToken(); - return addUser(userId); // Retry adding after token refresh - } else { - throw new Error(errorData.error); + if (response.status === 401) { + if (errorData.error === 'Token has expired') { + await RefreshToken(); + return addUser(userId); // Retry adding after token refresh + } + document.getElementById("logout-button").click(); + return; } + throw new Error(errorData.error); } await response.json(); + alert("Friend request sent successfully"); navigateTo("/users"); } catch (error) { console.error(error); diff --git a/frontend/src/utils/utils.js b/frontend/src/utils/utils.js index d035c35..c2ca762 100644 --- a/frontend/src/utils/utils.js +++ b/frontend/src/utils/utils.js @@ -28,12 +28,15 @@ export const toggleHidden = (elementId) => { } + + + export let socket = null; export let userStatuses = []; let userId; export async function onlineStatus() { - if (!localStorage.getItem("access_token")) { + if (!localStorage.getItem('access_token')) { return; } try { @@ -44,28 +47,34 @@ export async function onlineStatus() { "Authorization": `Bearer ${localStorage.getItem("access_token")}`, } }); - if (!response.ok) { const errorData = await response.json(); - if (errorData.error === 'Token has expired') { - await RefreshToken(); - return onlineStatus(); // Retry after token refresh + if (response.status === 401) { + if (errorData.error === 'Token has expired') { + await RefreshToken(); + return onlineStatus(); + } + document.getElementById("logout-button").click(); + return; } else { throw new Error(errorData.error); } } - const data = await response.json(); const user = data.data[0]; userId = user.id; - // Eğer mevcut bir WebSocket bağlantısı varsa yeni bir bağlantı kurmayın + // Eğer mevcut bir WebSocket bağlantısı varsa yeni bir bağlantı kurmayın if (socket && socket.readyState === WebSocket.OPEN) { // Server'dan online_users listesini iste socket.send(JSON.stringify({ type: 'getOnlineUsers' })); return; } socket = new WebSocket(StatusServiceSocketUrl + "?user_id=" + userId); + socket.onopen = function (event) { + localStorage.setItem('status', 'Online'); + + }; socket.onmessage = function (event) { const data = JSON.parse(event.data); userStatuses = data.online_users; @@ -74,6 +83,7 @@ export async function onlineStatus() { console.error('WebSocket error: ', error); }; window.addEventListener('beforeunload', function () { + localStorage.setItem('status', 'Offline'); socket.close(); }); window.addEventListener('online', function () { @@ -82,17 +92,14 @@ export async function onlineStatus() { } }); window.addEventListener('offline', function () { + localStorage.setItem('status', 'Offline'); socket.close(); }); } catch (error) { console.error('Error: ', error); if (error.message === 'Token has expired') { - await RefreshToken().then((is_valid) => { - if (!is_valid) { - navigateTo("/login"); - } - }); + await RefreshToken(); return onlineStatus(); // Retry after token refresh } }