From bcf3cc08bb0480464771913a8a6d7aa09c69d3b2 Mon Sep 17 00:00:00 2001 From: "theis.gaedigk" Date: Wed, 20 Aug 2025 18:06:59 +0200 Subject: [PATCH] added improved error handeling --- frontend/src/App.tsx | 15 +++++++-- frontend/src/utils/fetchData.ts | 56 +++++++++++++++++++++++++++++++++ 2 files changed, 69 insertions(+), 2 deletions(-) diff --git a/frontend/src/App.tsx b/frontend/src/App.tsx index ae29d81..a4c847d 100644 --- a/frontend/src/App.tsx +++ b/frontend/src/App.tsx @@ -6,7 +6,11 @@ import Form2 from "./components/Form2"; import Form4 from "./components/Form4"; import LoginForm from "./components/LoginForm"; import Cookies from "js-cookie"; -import { fetchAllData, ALL_ITEMS_UPDATED_EVENT } from "./utils/fetchData"; +import { + fetchAllData, + ALL_ITEMS_UPDATED_EVENT, + AUTH_LOGOUT_EVENT, +} from "./utils/fetchData"; import { myToast } from "./utils/toastify"; function App() { @@ -18,10 +22,17 @@ function App() { setIsLoggedIn(true); fetchAllData(token); } - localStorage.setItem("borrowableItems", JSON.stringify([])); }, []); + useEffect(() => { + const onAuthLogout = () => { + setIsLoggedIn(false); + }; + window.addEventListener(AUTH_LOGOUT_EVENT, onAuthLogout); + return () => window.removeEventListener(AUTH_LOGOUT_EVENT, onAuthLogout); + }, []); + const handleLogout = () => { Cookies.remove("token"); localStorage.removeItem("allItems"); diff --git a/frontend/src/utils/fetchData.ts b/frontend/src/utils/fetchData.ts index db3584d..72f1da7 100644 --- a/frontend/src/utils/fetchData.ts +++ b/frontend/src/utils/fetchData.ts @@ -4,6 +4,22 @@ import { myToast } from "./toastify"; // Event name used to notify the app when the list of items has been updated export const ALL_ITEMS_UPDATED_EVENT = "allItemsUpdated"; export const BORROWABLE_ITEMS_UPDATED_EVENT = "borrowableItemsUpdated"; +export const AUTH_LOGOUT_EVENT = "authLogout"; + +let sendError = false; + +function logout() { + Cookies.remove("token"); + Cookies.remove("startDate"); + Cookies.remove("endDate"); + localStorage.removeItem("allItems"); + localStorage.removeItem("allLoans"); + localStorage.removeItem("userLoans"); + localStorage.removeItem("borrowableItems"); + window.dispatchEvent(new Event(ALL_ITEMS_UPDATED_EVENT)); + window.dispatchEvent(new Event(BORROWABLE_ITEMS_UPDATED_EVENT)); + window.dispatchEvent(new Event(AUTH_LOGOUT_EVENT)); +} export const fetchAllData = async (token: string | undefined) => { if (!token) return; @@ -16,6 +32,16 @@ export const fetchAllData = async (token: string | undefined) => { }, }); + if (response.status === 401) { + if (!sendError) { + sendError = true; + myToast("Session expired. Please log in again.", "error"); + logout(); + return; + } + return; + } + if (!response.ok) { myToast("Failed to fetch items", "error"); return; @@ -38,6 +64,16 @@ export const fetchAllData = async (token: string | undefined) => { }, }); + if (response.status === 401) { + if (!sendError) { + sendError = true; + myToast("Session expired. Please log in again.", "error"); + logout(); + return; + } + return; + } + if (!response.ok) { myToast("Failed to fetch loans!", "error"); return; @@ -60,6 +96,16 @@ export const fetchAllData = async (token: string | undefined) => { }, }); + if (response.status === 401) { + if (!sendError) { + sendError = true; + myToast("Session expired. Please log in again.", "error"); + logout(); + return; + } + return; + } + if (!response.ok) { myToast("Failed to fetch user loans!", "error"); return; @@ -122,6 +168,16 @@ export const getBorrowableItems = async () => { body: JSON.stringify({ startDate, endDate }), }); + if (response.status === 401) { + if (!sendError) { + sendError = true; + myToast("Session expired. Please log in again.", "error"); + logout(); + return; + } + return; + } + if (!response.ok) { myToast("Failed to fetch borrowable items", "error"); return;