diff --git a/FrontendV2/src/pages/HomePage.tsx b/FrontendV2/src/pages/HomePage.tsx index bf1eb72..a227e79 100644 --- a/FrontendV2/src/pages/HomePage.tsx +++ b/FrontendV2/src/pages/HomePage.tsx @@ -19,6 +19,7 @@ import { getBorrowableItems } from "@/utils/Fetcher"; import { useState } from "react"; import MyAlert from "@/components/myChakra/MyAlert"; import { borrowAbleItemsAtom } from "@/states/Atoms"; +import { createLoan } from "@/utils/Fetcher"; export interface User { username: string; @@ -33,11 +34,21 @@ export const HomePage = () => { const [startDate, setStartDate] = useState(""); const [endDate, setEndDate] = useState(""); const [isLoadingA, setIsLoadingA] = useState(false); + const [selectedItems, setSelectedItems] = useState([]); // Error handling states - const [isError, setIsError] = useState(false); - const [errorTitle, setErrorTitle] = useState(""); - const [errorDescription, setErrorDescription] = useState(""); + const [isMsg, setIsMsg] = useState(false); + const [msgStatus, setMsgStatus] = useState<"error" | "success">("error"); + const [msgTitle, setMsgTitle] = useState(""); + const [msgDescription, setMsgDescription] = useState(""); + + const handleCheckboxChange = (itemId: number) => { + setSelectedItems((prevSelected) => + prevSelected.includes(itemId) + ? prevSelected.filter((id) => id !== itemId) + : [...prevSelected, itemId] + ); + }; return ( @@ -91,11 +102,11 @@ export const HomePage = () => { - {isError && ( + {isMsg && ( )} @@ -123,23 +134,26 @@ export const HomePage = () => { onClick={async () => { setIsLoadingA(true); if (!startDate || !endDate) { - setErrorTitle("Fehlende Eingaben"); - setErrorDescription("Bitte Start- und Enddatum angeben."); - setIsError(true); + setMsgStatus("error"); + setMsgTitle("Fehlende Eingaben"); + setMsgDescription("Bitte Start- und Enddatum angeben."); + setIsMsg(true); setIsLoadingA(false); return; } await getBorrowableItems(startDate, endDate).then((response) => { setIsLoadingA(false); if (response && response.status === "error") { - setErrorTitle(response.title || "Fehler"); - setErrorDescription( + setMsgStatus("error"); + setMsgTitle(response.title || "Fehler"); + setMsgDescription( response.description || "Unbekannter Frontend Fehler" ); - setIsError(true); + setIsMsg(true); return; } setBorrowableItems(response.data); + setIsMsg(false); console.log(borrowableItems); }); }} @@ -166,7 +180,12 @@ export const HomePage = () => { {borrowableItems.map((item) => ( - + handleCheckboxChange(item.id)} + type="checkbox" + name={item.id} + id={item.id} + /> {item.item_name} @@ -175,6 +194,29 @@ export const HomePage = () => { )} + {selectedItems.length >= 1 && ( + + )} ); diff --git a/FrontendV2/src/utils/Fetcher.ts b/FrontendV2/src/utils/Fetcher.ts index 72e6f11..bb71687 100644 --- a/FrontendV2/src/utils/Fetcher.ts +++ b/FrontendV2/src/utils/Fetcher.ts @@ -47,3 +47,36 @@ export const getBorrowableItems = async ( }; } }; + +export const createLoan = async ( + itemIds: number[], + startDate: string, + endDate: string +) => { + const response = await fetch(`${API_BASE}/api/createLoan`, { + method: "POST", + headers: { + "Content-Type": "application/json", + Authorization: `Bearer ${Cookies.get("token") || ""}`, + }, + body: JSON.stringify({ items: itemIds, startDate, endDate }), + }); + + if (!response.ok) { + return { + data: null, + status: "error", + title: "Server error", + description: + "Ein Fehler ist auf dem Server aufgetreten. Manchmal hilft es, die Seite neu zu laden.", + }; + } + + const data = await response.json(); + return { + data: data, + status: "success", + title: null, + description: null, + }; +};