import { Badge, Button, Flex, Heading, Stack, Text, CloseButton, Dialog, Portal, HStack, IconButton, Menu, Box, } from "@chakra-ui/react"; import { PasswordInput } from "@/components/ui/password-input"; import Cookies from "js-cookie"; import { useAtom } from "jotai"; import { setIsLoggedInAtom, triggerLogoutAtom } from "@/states/Atoms"; import { useNavigate } from "react-router-dom"; import { CircleUserRound, RotateCcwKey, Code, LifeBuoy, LogOut, CalendarPlus, MoreVertical, } from "lucide-react"; import { useUserContext } from "@/states/Context"; import { useState } from "react"; import MyAlert from "./myChakra/MyAlert"; const API_BASE = (import.meta as any).env?.VITE_BACKEND_URL || import.meta.env.VITE_BACKEND_URL || "http://localhost:8002"; export const Header = () => { const navigate = useNavigate(); const userData = useUserContext(); // Error handling states const [isMsg, setIsMsg] = useState(false); const [msgStatus, setMsgStatus] = useState<"error" | "success">("error"); const [msgTitle, setMsgTitle] = useState(""); const [msgDescription, setMsgDescription] = useState(""); const [oldPassword, setOldPassword] = useState(""); const [newPassword, setNewPassword] = useState(""); const [confirmPassword, setConfirmPassword] = useState(""); const [, setTriggerLogout] = useAtom(triggerLogoutAtom); const [, setIsLoggedIn] = useAtom(setIsLoggedInAtom); // Dialog control const [isPwOpen, setPwOpen] = useState(false); const changePassword = async () => { if (newPassword !== confirmPassword) { setMsgTitle("Passwortänderung fehlgeschlagen"); setMsgDescription("Passwörter stimmen nicht überein"); setMsgStatus("error"); setIsMsg(true); return; } const response = await fetch(`${API_BASE}/api/changePassword`, { method: "POST", headers: { "Content-Type": "application/json", Authorization: `Bearer ${Cookies.get("token")}`, }, body: JSON.stringify({ oldPassword, newPassword }), }); if (!response.ok) { setMsgTitle("Passwortänderung fehlgeschlagen"); setMsgDescription("Bitte überprüfen Sie Ihre Eingaben"); setMsgStatus("error"); setIsMsg(true); return; } setMsgTitle("Passwort erfolgreich geändert"); setMsgDescription("Ihr Passwort wurde erfolgreich geändert"); setMsgStatus("success"); setIsMsg(true); setOldPassword(""); setNewPassword(""); setConfirmPassword(""); }; const username = userData?.username ? userData.username[0].toUpperCase() + userData.username.slice(1) : "User"; const logout = () => { Cookies.remove("token"); setIsLoggedIn(false); setTriggerLogout(true); }; return ( {/* Mobile: Drei-Punkte-Button, vertikal zentriert im Header */} navigate("/", { replace: true })} children={ Ausleihe erstellen } /> navigate("/my-loans", { replace: true })} children={ Meine Ausleihen } /> setPwOpen(true)} children={ Passwort ändern } /> window.open( "https://git.the1s.de/Matthias-Claudius-Schule/borrow-system/wiki", "_blank", "noopener,noreferrer" ) } children={ Hilfe } /> window.open( "https://git.the1s.de/Matthias-Claudius-Schule/borrow-system", "_blank", "noopener,noreferrer" ) } children={ Source Code } /> Logout } /> {/* Left: Title + user info */} {/* Titelzeile ohne Mobile-Menu (wurde nach oben verlegt) */} Home Willkommen zurück, {username}! Rolle: {userData?.role ?? "—"} {/* Right: Actions */} {/* Desktop actions */} {/* Passwort-Dialog (kontrolliert) */} setPwOpen(e.open)}> Passwort ändern
{ e.preventDefault(); changePassword(); }} > setOldPassword(e.target.value)} placeholder="Altes Passwort" /> setNewPassword(e.target.value)} placeholder="Neues Passwort" /> setConfirmPassword(e.target.value)} placeholder="Neues Passwort wiederholen" /> {isMsg && ( )}
); };