LoginDialog.tsx 5.95 KiB
import React from 'react';
import { useState } from "react";
import { Alert, Form, Modal } from "react-bootstrap";
import { Button } from "react-bootstrap";
import { login } from "../backend/shopperapi";
import { getLoginInfoFromJWT, storeJWT} from "../JWTManager";
import { useLoginContext } from "../LoginContext";
import { registerUser } from "../backend/userapi";
import ReactGA from "react-ga4";
interface LoginDialogProps{
show: boolean,
onHide: () => void;
setUserID?: (userId: string) => void;
}
export default function LoginDialog({show, onHide}: LoginDialogProps){
const [registrieren, setRegistrieren] = useState(false);
const [username, setUsername] = useState("");
const [email, setEmail] = useState("");
const [password, setPassword] = useState("");
const [message, setMessage] = useState("");
const { setLoginInfo} = useLoginContext();
function showRegistration(){
setRegistrieren(true);
}
function hideRegistration(){
onHide();
setRegistrieren(false);
}
const doRegistration = async(e : React.FormEvent) => {
e.preventDefault();
try{
await registerUser(username, email, password);
//doLogin(e);
console.log("Registriert");
setMessage("Registriert");
}catch(err){
setMessage(String(err));
}
}
const doLogin = async(e : React.FormEvent) => {
e.preventDefault();
try{
const loginRessource = await login(email, password);
const jwt = loginRessource.access_token;
localStorage.setItem("jwt", jwt)
console.log("Login: " + jwt);
if(jwt){
ReactGA.event({
category: "User Interaction",
action: "User Login",
label: `User logged in with email: ${email}`,
});
storeJWT(jwt);
const loginInfo = getLoginInfoFromJWT(jwt);
setLoginInfo(loginInfo);
setMessage("");
onHide();
window.location.reload();
/*
if(window.location.pathname === "/"){
window.location.reload();
}else{
navigate("/");
}
*/
}else{
setMessage("Login failed");
}
}catch(err){
setMessage(String(err));
}finally{
setPassword("");
}
}
return(
<Modal id="loginDialog" backdrop="static" show={show} centered onHide={hideRegistration}>
<form>
{registrieren ?
<Modal.Header closeButton>
<Modal.Title>Registrieren</Modal.Title>
</Modal.Header>:
<Modal.Header closeButton>
<Modal.Title>Login</Modal.Title>
</Modal.Header>
}
<Modal.Body>
<Form>
{registrieren ?
<div>
<Form.Group>
<Form.Label>Username</Form.Label>
<Form.Control id="inputUsername" type="text" name="Username" placeholder="Enter Username" onChange={e => setUsername(e.target.value)} />
</Form.Group>
<Form.Group className="mt-3">
<Form.Label>E-Mail</Form.Label>
<Form.Control id="inputEmail" type="text" name="Email" placeholder="Enter Email" onChange={e => setEmail(e.target.value)} />
</Form.Group>
<br />
<Form.Group>
<Form.Label>Passwort</Form.Label>
<Form.Control id="inputPassword" type="password" name="pass" placeholder="Enter password" onChange={e => setPassword(e.target.value)} />
</Form.Group>
<br />
</div>
:
<div>
<Form.Group>
<Form.Label>E-Mail</Form.Label>
<Form.Control id="inputEmail" type="text" name="Email" placeholder="Enter Email" onChange={e => setEmail(e.target.value)} />
</Form.Group>
<br />
<Form.Group>
<Form.Label>Passwort</Form.Label>
<Form.Control id="inputPassword" type="password" name="pass" placeholder="Enter password" onChange={e => setPassword(e.target.value)} />
</Form.Group>
<br />
</div>
}
{
message !== "" &&
<Alert id="errorMessage" variant = "warning">
<Alert.Heading>
{message}
</Alert.Heading>
</Alert>
}
</Form>
</Modal.Body>
<Modal.Footer style={{display: "flex"}}>
{registrieren ?
<div>
<Button variant="success" onClick={doRegistration}>Registrieren</Button>
<Button variant="secondary" onClick={hideRegistration}>Cancel</Button>
</div>
:
<div>
<Button variant="success" onClick={showRegistration}>Noch keinen Account? Hier Registrieren!</Button>
<Button variant="secondary" onClick={hideRegistration}>Cancel</Button>
<Button id="okButton" variant="primary" onClick={doLogin}>OK</Button>
</div>
}
</Modal.Footer>
</form>
</Modal>
);
}