import React, { useEffect, useState } from "react"; import { Spinner, Text, VStack, Table, Heading, HStack, Card, SimpleGrid, Button, } from "@chakra-ui/react"; import { Lock, LockOpen } from "lucide-react"; import MyAlert from "@/components/myChakra/MyAlert"; import { useTranslation } from "react-i18next"; export const formatDateTime = (value: string | null | undefined) => { if (!value) return "N/A"; const m = value.match(/^(\d{4})-(\d{2})-(\d{2})T(\d{2}):(\d{2})/); if (!m) return "N/A"; const [, y, M, d, h, min] = m; return `${d}.${M}.${y} ${h}:${min} Uhr`; }; const API_BASE = (import.meta as any).env?.VITE_BACKEND_URL || import.meta.env.VITE_BACKEND_URL || "http://localhost:8002"; type Loan = { id: number; username: string; start_date: string; end_date: string; returned_date: string | null; take_date: string | null; loaned_items_name: string[] | string; }; type Device = { id: number; item_name: string; can_borrow_role: string; inSafe: number; entry_created_at: string; }; const Landingpage: React.FC = () => { const { t } = useTranslation(); const [isLoading, setIsLoading] = useState(false); const [loans, setLoans] = useState([]); const [devices, setDevices] = useState([]); const [isError, setIsError] = useState(false); const [errorStatus, setErrorStatus] = useState<"error" | "success">("error"); const [errorMessage, setErrorMessage] = useState(""); const [errorDsc, setErrorDsc] = useState(""); const setError = ( status: "error" | "success", message: string, description: string ) => { setIsError(false); setErrorStatus(status); setErrorMessage(message); setErrorDsc(description); setIsError(true); }; useEffect(() => { const fetchData = async () => { setIsLoading(true); try { const loanRes = await fetch(`${API_BASE}/apiV2/allLoans`); const loanData = await loanRes.json(); if (Array.isArray(loanData)) { setLoans(loanData); } else { setError( "error", t("error-by-loading"), t("unexpected-date-format_loan") ); } const deviceRes = await fetch(`${API_BASE}/apiV2/allItems`); const deviceData = await deviceRes.json(); if (Array.isArray(deviceData)) { setDevices(deviceData); } else { setError( "error", t("error-by-loading"), t("unexpected-date-format_device") ); } } catch (e) { setError("error", t("error-by-loading"), t("error-fetching-loans")); } finally { setIsLoading(false); } }; fetchData(); }, []); return ( <> Matthias-Claudius-Schule Technik {t("all-loans")} {isError && ( )} {isLoading && ( {t("loading")} )} {!isLoading && ( # {t("username")} {t("start-date")} {t("end-date")} {t("rented-items")} {t("return-date")} {t("take-date")} {loans.map((loan) => ( {loan.id} {loan.username} {formatDateTime(loan.start_date)} {formatDateTime(loan.end_date)} {Array.isArray(loan.loaned_items_name) ? loan.loaned_items_name.join(", ") : loan.loaned_items_name} {formatDateTime(loan.returned_date)} {formatDateTime(loan.take_date)} ))} )} {!isLoading && loans.length === 0 && !isError && ( {t("no-loans-found")} )} {t("all-devices")} {/* Responsive Grid mit gleich hohen Karten */} {devices.map((device) => ( {device.inSafe ? : } {device.item_name} {t("rent-role")}: {device.can_borrow_role} ))} {t("legend")}: ); }; export default Landingpage;