Files
dps-webshop/01-frontend/src/helper/navbar/LoginDialog.tsx
2025-06-16 15:27:41 +02:00

248 lines
10 KiB
TypeScript

import { Box, Button, Dialog, DialogActions, DialogContent, DialogTitle, Link, TextField } from "@mui/material";
import { useQuery } from "@tanstack/react-query";
import i18next from "i18next";
import React, { useEffect, useState } from "react";
import AccountType, { User } from "../../components/Account";
import { useAccount } from "../AccountProvider";
import { fetchAccount, submitLogin, submitRegister } from "../query/Queries"; // Importiere die Funktion für die Registrierung
import { useTranslation } from "react-i18next";
type LoginDialogProps = {
open: boolean;
onClose: () => void;
onSubmit: () => void; // Funktion, die aufgerufen wird, wenn der Login erfolgreich ist
loginData: { email: string; password: string };
setLoginData: React.Dispatch<React.SetStateAction<{ email: string; password: string, customerId: number }>>;
};
const LoginDialog: React.FC<LoginDialogProps> = ({ open, onClose, loginData, setLoginData, onSubmit }) => {
const { t } = useTranslation();
const { login } = useAccount();
const [showRegister, setShowRegister] = useState(false);
const [registerData, setRegisterData] = useState<AccountType>({ email: "", password: "", id: 0, customer: { id: 0, name: "", surname: "", address: "", country: "", zip: "" }, langI18n: i18next.language, admin: false });
const [showErrorRegister, setShowErrorRegister] = useState(false); // Neuer Zustand für die Anzeige der Fehlermeldung
const [showErrorLogin, setShowErrorLogin] = useState(false); // Neuer Zustand für die Anzeige der Login-Fehlermeldung
useEffect(() => {
if (open) {
const active = document.activeElement as HTMLElement | null;
if (active && typeof active.blur === "function") {
active.blur();
}
}
}, [open]);
// useQuery für Login
const { refetch: refetchLogin, isLoading: isLoadingLogin, error: errorLogin } = useQuery({
queryKey: ["submitLogin", loginData],
queryFn: () => submitLogin(loginData),
retry: 0,
retryDelay: 1000,
enabled: false,
});
const { refetch: refetchAccount } = useQuery({
queryKey: ["fetchAccount", loginData],
queryFn: () => fetchAccount(loginData),
retry: 0,
retryDelay: 1000,
enabled: false,
});
// useQuery für Registrierung
const { refetch: refetchRegister, isLoading: isLoadingRegister, error: errorRegister } = useQuery({
queryKey: ["submitRegister", registerData],
queryFn: () => submitRegister(registerData),
retry: 0,
retryDelay: 1000,
enabled: false,
});
const handleLogin = async () => {
try {
setShowErrorLogin(false); // Fehlermeldung zurücksetzen
const response = await refetchLogin(); // Anfrage auslösen
if (response.status === "success") {
const session = response.data.uuid; // Session-Daten aus der Antwort extrahieren
const customerData = (await refetchAccount()).data;
const user: User = {
email: customerData.email,
password: customerData.password,
customerId: customerData.customer.id, // Setze die customerId aus den Account-Daten
session: session, // Setze die Session aus der Login-Antwort
isAdmin: customerData.admin
};
login(user);
setShowRegister(false); // Zurück zum Login wechseln
onSubmit(); // Dialog schließen
} else {
setShowErrorLogin(true); // Fehlermeldung anzeigen
}
// eslint-disable-next-line @typescript-eslint/no-unused-vars
} catch (error) {
setShowErrorLogin(true); // Fehlermeldung anzeigen
}
};
const handleRegister = async () => {
try {
setShowErrorRegister(false); // Fehlermeldung zurücksetzen
await refetchRegister(); // Beispiel für den Refetch-Aufruf
// Erfolgslogik hier
// eslint-disable-next-line @typescript-eslint/no-unused-vars
} catch (error) {
setShowErrorRegister(true); // Fehlermeldung anzeigen
}
};
return (
<Dialog open={open} onClose={onClose} disableEnforceFocus>
<DialogTitle>{showRegister ? t("register") : t("login")}</DialogTitle>
<DialogContent>
{showRegister ? (
<>
<TextField
margin="dense"
label={t("email")}
type="email"
fullWidth
value={registerData.email}
onChange={e => setRegisterData(prev => ({ ...prev, email: e.target.value }))}
/>
<TextField
margin="dense"
label={t("password")}
type="password"
fullWidth
value={registerData.password}
onChange={e => setRegisterData(prev => ({ ...prev, password: e.target.value }))}
/>
<TextField
margin="dense"
label={t("firstName")}
type="text"
fullWidth
value={registerData.customer.name}
onChange={e => setRegisterData(prev => ({
...prev,
customer: { ...prev.customer, name: e.target.value },
}))}
/>
<TextField
margin="dense"
label={t("lastName")}
type="text"
fullWidth
value={registerData.customer.surname}
onChange={e => setRegisterData(prev => ({
...prev,
customer: { ...prev.customer, surname: e.target.value },
}))}
/>
<TextField
margin="dense"
label={t("address")}
type="text"
fullWidth
value={registerData.customer.address}
onChange={e => setRegisterData(prev => ({
...prev,
customer: { ...prev.customer, address: e.target.value },
}))}
/>
<TextField
margin="dense"
label={t("country")}
type="text"
fullWidth
value={registerData.customer.country}
onChange={e => setRegisterData(prev => ({
...prev,
customer: { ...prev.customer, country: e.target.value },
}))}
/>
<TextField
margin="dense"
label={t("zip")}
type="text"
fullWidth
value={registerData.customer.zip}
onChange={e => setRegisterData(prev => ({
...prev,
customer: { ...prev.customer, zip: e.target.value },
}))}
/>
</>
) : (
<>
<TextField
margin="dense"
label={t("email")}
type="email"
fullWidth
value={loginData.email}
onChange={e => setLoginData(prev => ({ ...prev, email: e.target.value }))}
/>
<TextField
margin="dense"
label={t("password")}
type="password"
fullWidth
value={loginData.password}
onChange={e => setLoginData(prev => ({ ...prev, password: e.target.value }))}
/>
</>
)}
</DialogContent>
<DialogActions>
<Button onClick={onClose}>{t("cancel")}</Button>
{showRegister ? (
<Button onClick={handleRegister} disabled={isLoadingRegister}>
{isLoadingRegister ? t("loading") : t("register")}
</Button>
) : (
<Button onClick={handleLogin} disabled={isLoadingLogin}>
{isLoadingLogin ? t("loading") : t("login")}
</Button>
)}
</DialogActions>
{showErrorLogin && errorLogin && (
<Box color="error.main">{t("loginFailed")}</Box>
)}
{showErrorRegister && errorRegister !== null && (
<Box color="error.main">{t("registerFailed")}</Box>
)}
{showRegister ? (
<Box sx={{ width: '100%', textAlign: 'center', pb: 2 }}>
<Link
component="button"
variant="body2"
onClick={() => setShowRegister(false)}
color="primary"
underline="hover"
>
{t("backToLogin")}
</Link>
</Box>
) : (
<Box sx={{ width: '100%', textAlign: 'center', pb: 2 }}>
<Link
component="button"
variant="body2"
onClick={() => setShowRegister(true)}
color="primary"
underline="hover"
>
{t("noAccountRegister")}
</Link>
</Box>
)}
</Dialog>
);
};
export default LoginDialog;