2 Commits

Author SHA1 Message Date
bcf3cc08bb added improved error handeling 2025-08-20 18:06:59 +02:00
cd2b0e8e42 deleted unused notes 2025-08-20 18:06:40 +02:00
3 changed files with 69 additions and 3 deletions

View File

@@ -11,7 +11,6 @@ import {
import { authenticate, generateToken } from "../services/tokenService.js"; import { authenticate, generateToken } from "../services/tokenService.js";
const router = express.Router(); const router = express.Router();
// Example endpoint
router.post("/login", async (req, res) => { router.post("/login", async (req, res) => {
const result = await loginFunc(req.body.username, req.body.password); const result = await loginFunc(req.body.username, req.body.password);
if (result.success) { if (result.success) {

View File

@@ -6,7 +6,11 @@ import Form2 from "./components/Form2";
import Form4 from "./components/Form4"; import Form4 from "./components/Form4";
import LoginForm from "./components/LoginForm"; import LoginForm from "./components/LoginForm";
import Cookies from "js-cookie"; 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"; import { myToast } from "./utils/toastify";
function App() { function App() {
@@ -18,10 +22,17 @@ function App() {
setIsLoggedIn(true); setIsLoggedIn(true);
fetchAllData(token); fetchAllData(token);
} }
localStorage.setItem("borrowableItems", JSON.stringify([])); 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 = () => { const handleLogout = () => {
Cookies.remove("token"); Cookies.remove("token");
localStorage.removeItem("allItems"); localStorage.removeItem("allItems");

View File

@@ -4,6 +4,22 @@ import { myToast } from "./toastify";
// Event name used to notify the app when the list of items has been updated // Event name used to notify the app when the list of items has been updated
export const ALL_ITEMS_UPDATED_EVENT = "allItemsUpdated"; export const ALL_ITEMS_UPDATED_EVENT = "allItemsUpdated";
export const BORROWABLE_ITEMS_UPDATED_EVENT = "borrowableItemsUpdated"; 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) => { export const fetchAllData = async (token: string | undefined) => {
if (!token) return; 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) { if (!response.ok) {
myToast("Failed to fetch items", "error"); myToast("Failed to fetch items", "error");
return; 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) { if (!response.ok) {
myToast("Failed to fetch loans!", "error"); myToast("Failed to fetch loans!", "error");
return; 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) { if (!response.ok) {
myToast("Failed to fetch user loans!", "error"); myToast("Failed to fetch user loans!", "error");
return; return;
@@ -122,6 +168,16 @@ export const getBorrowableItems = async () => {
body: JSON.stringify({ startDate, endDate }), 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) { if (!response.ok) {
myToast("Failed to fetch borrowable items", "error"); myToast("Failed to fetch borrowable items", "error");
return; return;