199 lines
5.3 KiB
TypeScript
199 lines
5.3 KiB
TypeScript
import Cookies from "js-cookie";
|
|
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";
|
|
|
|
const API_BASE =
|
|
(import.meta as any).env?.VITE_BACKEND_URL ||
|
|
import.meta.env.VITE_BACKEND_URL ||
|
|
"http://localhost:8002";
|
|
|
|
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;
|
|
// First we fetch all items that are potentially available for borrowing
|
|
try {
|
|
const response = await fetch(`${API_BASE}/api/items`, {
|
|
method: "GET",
|
|
headers: {
|
|
Authorization: `Bearer ${token}`,
|
|
},
|
|
});
|
|
|
|
if (response.status === 500) {
|
|
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;
|
|
}
|
|
|
|
const data = await response.json();
|
|
localStorage.setItem("allItems", JSON.stringify(data));
|
|
// Notify listeners (e.g., Sidebar) that items have been updated
|
|
window.dispatchEvent(new Event(ALL_ITEMS_UPDATED_EVENT));
|
|
} catch (error) {
|
|
myToast("An error occurred", "error");
|
|
}
|
|
|
|
// get all loans
|
|
try {
|
|
const response = await fetch(`${API_BASE}/api/loans`, {
|
|
method: "GET",
|
|
headers: {
|
|
Authorization: `Bearer ${token}`,
|
|
},
|
|
});
|
|
|
|
if (response.status === 500) {
|
|
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;
|
|
}
|
|
|
|
const data = await response.json();
|
|
localStorage.setItem("allLoans", JSON.stringify(data));
|
|
// Notify listeners (e.g., Sidebar) that loans have been updated
|
|
window.dispatchEvent(new Event(ALL_ITEMS_UPDATED_EVENT));
|
|
} catch (error) {
|
|
myToast("An error occurred", "error");
|
|
}
|
|
|
|
// get user loans
|
|
try {
|
|
const response = await fetch(`${API_BASE}/api/userLoans`, {
|
|
method: "GET",
|
|
headers: {
|
|
Authorization: `Bearer ${token}`,
|
|
},
|
|
});
|
|
|
|
if (response.status === 500) {
|
|
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;
|
|
}
|
|
|
|
const data = await response.json();
|
|
localStorage.setItem("userLoans", JSON.stringify(data));
|
|
// Notify listeners (e.g., Sidebar) that loans have been updated
|
|
window.dispatchEvent(new Event(ALL_ITEMS_UPDATED_EVENT));
|
|
} catch (error) {
|
|
myToast("An error occurred", "error");
|
|
}
|
|
};
|
|
|
|
export const loginUser = async (username: string, password: string) => {
|
|
try {
|
|
const response = await fetch(`${API_BASE}/api/login`, {
|
|
method: "POST",
|
|
headers: {
|
|
"Content-Type": "application/json",
|
|
},
|
|
body: JSON.stringify({ username, password }),
|
|
});
|
|
|
|
if (!response.ok) {
|
|
return { success: false } as const;
|
|
}
|
|
|
|
const data = await response.json();
|
|
if (data?.token) {
|
|
Cookies.set("token", data.token);
|
|
myToast("Login successful!", "success");
|
|
fetchAllData(Cookies.get("token"));
|
|
return { success: true, token: data.token } as const;
|
|
}
|
|
|
|
return { success: false } as const;
|
|
} catch (e) {
|
|
return { success: false } as const;
|
|
}
|
|
};
|
|
|
|
export const getBorrowableItems = async () => {
|
|
const startDate = Cookies.get("startDate");
|
|
const endDate = Cookies.get("endDate");
|
|
|
|
if (!startDate || !endDate) {
|
|
myToast("Bitte wähle einen Zeitraum aus.", "error");
|
|
return;
|
|
}
|
|
|
|
try {
|
|
const response = await fetch(`${API_BASE}/api/borrowableItems`, {
|
|
method: "POST",
|
|
headers: {
|
|
Authorization: `Bearer ${Cookies.get("token") || ""}`,
|
|
"Content-Type": "application/json",
|
|
Accept: "application/json",
|
|
},
|
|
body: JSON.stringify({ startDate, endDate }),
|
|
});
|
|
|
|
if (response.status === 500) {
|
|
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;
|
|
}
|
|
|
|
const data = await response.json();
|
|
localStorage.setItem("borrowableItems", JSON.stringify(data));
|
|
window.dispatchEvent(new Event(BORROWABLE_ITEMS_UPDATED_EVENT)); // notify same-tab listeners
|
|
console.log("Borrowable items fetched successfully");
|
|
} catch (error) {
|
|
myToast("An error occurred", "error");
|
|
}
|
|
};
|