2024-09-26 16:37:18 +02:00
|
|
|
import React, { useState, useEffect } from 'react';
|
2024-09-30 10:47:38 +02:00
|
|
|
import {
|
|
|
|
createAccount,
|
|
|
|
checkCredentials,
|
|
|
|
} from '../backend/database';
|
2024-09-20 10:00:54 +02:00
|
|
|
import Settings from './Settings'; // Import the Settings component
|
|
|
|
|
|
|
|
const Login: React.FC = () => {
|
|
|
|
// State to handle popup visibility
|
2024-09-23 16:53:29 +02:00
|
|
|
const [showLoginPopup, setShowLoginPopup] = useState(false);
|
|
|
|
const [showSignUpPopup, setShowSignUpPopup] = useState(false);
|
2024-09-20 10:00:54 +02:00
|
|
|
const [isLoggedIn, setIsLoggedIn] = useState(false);
|
|
|
|
const [showSettingsPopup, setShowSettingsPopup] = useState(false);
|
|
|
|
|
|
|
|
// Credentials state
|
|
|
|
const [email, setEmail] = useState('');
|
|
|
|
const [password, setPassword] = useState('');
|
2024-09-26 14:57:31 +02:00
|
|
|
const [accountName, setAccountName] = useState('');
|
2024-09-23 16:53:29 +02:00
|
|
|
const [newAccountEmail, setNewAccountEmail] = useState('');
|
|
|
|
const [newAccountPassword, setNewAccountPassword] = useState('');
|
2024-09-25 11:33:21 +02:00
|
|
|
const [newAccountName, setNewAccountName] = useState('');
|
2024-09-20 10:00:54 +02:00
|
|
|
|
2024-09-26 16:37:18 +02:00
|
|
|
// On component mount, check if there are credentials in localStorage
|
|
|
|
useEffect(() => {
|
|
|
|
const savedAccountName = localStorage.getItem('accountName');
|
|
|
|
const savedAccountEmail = localStorage.getItem('accountEmail');
|
|
|
|
const savedAccountPassword = localStorage.getItem('accountPassword');
|
|
|
|
|
|
|
|
// If credentials are found in localStorage, log the user in
|
|
|
|
if (savedAccountName && savedAccountEmail && savedAccountPassword) {
|
|
|
|
setAccountName(savedAccountName);
|
|
|
|
setEmail(savedAccountEmail);
|
|
|
|
setPassword(savedAccountPassword);
|
2024-09-30 10:47:38 +02:00
|
|
|
const check = async () => {
|
|
|
|
const success = await checkCredentials(savedAccountName, savedAccountPassword);
|
|
|
|
setIsLoggedIn(success); // Automatically log in
|
|
|
|
};
|
|
|
|
check();
|
2024-09-26 16:37:18 +02:00
|
|
|
}
|
|
|
|
}, []);
|
2024-09-20 10:00:54 +02:00
|
|
|
|
2024-09-23 16:53:29 +02:00
|
|
|
// Function to toggle the login popup
|
|
|
|
const toggleLoginPopup = () => setShowLoginPopup(!showLoginPopup);
|
|
|
|
|
|
|
|
// Function to toggle the sign-up popup
|
|
|
|
const toggleSignUpPopup = () => {
|
|
|
|
setShowSignUpPopup(!showSignUpPopup);
|
2024-09-26 14:57:31 +02:00
|
|
|
setShowLoginPopup(false);
|
2024-09-20 10:00:54 +02:00
|
|
|
};
|
|
|
|
|
|
|
|
// Function to handle login
|
2024-09-30 10:47:38 +02:00
|
|
|
const handleLogin = async () => {
|
2024-09-26 16:37:18 +02:00
|
|
|
const savedAccountEmail = localStorage.getItem('accountEmail');
|
|
|
|
const savedAccountPassword = localStorage.getItem('accountPassword');
|
|
|
|
const savedAccountName = localStorage.getItem('accountName');
|
|
|
|
|
2024-09-30 10:47:38 +02:00
|
|
|
// Check if savedAccountName or savedAccountEmail is not null before passing to checkCredentials
|
|
|
|
const accountIdentifier = savedAccountName || savedAccountEmail;
|
|
|
|
|
|
|
|
if (accountIdentifier && password === savedAccountPassword) {
|
|
|
|
const success = await checkCredentials(accountIdentifier, password);
|
|
|
|
if (success) {
|
|
|
|
setIsLoggedIn(true); // Successful login
|
|
|
|
setShowLoginPopup(false); // Close the login popup
|
|
|
|
// Save credentials to localStorage (optional in case of changes)
|
|
|
|
localStorage.setItem('accountName', savedAccountName || accountName);
|
|
|
|
localStorage.setItem('accountEmail', savedAccountEmail || email);
|
|
|
|
localStorage.setItem('accountPassword', savedAccountPassword || password);
|
|
|
|
} else {
|
|
|
|
alert('Incorrect credentials');
|
|
|
|
}
|
2024-09-20 10:00:54 +02:00
|
|
|
} else {
|
|
|
|
alert('Incorrect credentials');
|
|
|
|
}
|
|
|
|
};
|
|
|
|
|
2024-09-23 16:53:29 +02:00
|
|
|
// Function to handle account creation
|
2024-09-30 10:47:38 +02:00
|
|
|
const handleCreateAccount = async () => {
|
|
|
|
const success = await createAccount(newAccountName, newAccountEmail, newAccountPassword);
|
|
|
|
if (success) {
|
|
|
|
alert('Account created successfully! You can now log in.');
|
|
|
|
toggleSignUpPopup(); // Close sign-up popup
|
|
|
|
} else {
|
|
|
|
alert('Account creation failed. Please try again.');
|
|
|
|
}
|
2024-09-23 16:53:29 +02:00
|
|
|
};
|
|
|
|
|
2024-09-20 10:00:54 +02:00
|
|
|
// Function to toggle the settings popup
|
|
|
|
const toggleSettingsPopup = () => setShowSettingsPopup(!showSettingsPopup);
|
|
|
|
|
|
|
|
return (
|
|
|
|
<div>
|
|
|
|
{/* Login or Settings Button */}
|
2024-09-25 11:40:17 +02:00
|
|
|
<button className='header-login-button' onClick={isLoggedIn ? toggleSettingsPopup : toggleLoginPopup}>
|
2024-09-27 09:54:38 +02:00
|
|
|
{isLoggedIn ? <img src="" alt="Settings" /> : 'Log In'}
|
2024-09-25 11:22:59 +02:00
|
|
|
</button>
|
2024-09-20 10:00:54 +02:00
|
|
|
|
2024-09-23 16:53:29 +02:00
|
|
|
{/* Conditional rendering of the Login Popup */}
|
|
|
|
{showLoginPopup && (
|
2024-09-20 10:00:54 +02:00
|
|
|
<div className="popup-overlay">
|
|
|
|
<div className="popup-content">
|
2024-09-23 16:53:29 +02:00
|
|
|
<h2>Log In</h2>
|
|
|
|
|
|
|
|
{/* Close Button */}
|
|
|
|
<button className="close-popup" onClick={toggleLoginPopup} aria-label="Close popup">
|
|
|
|
Close
|
|
|
|
</button>
|
2024-09-20 10:00:54 +02:00
|
|
|
|
|
|
|
{/* Name or Email Input */}
|
|
|
|
<div>
|
|
|
|
<input
|
|
|
|
type="text"
|
|
|
|
placeholder="Name or Email"
|
2024-09-27 09:54:38 +02:00
|
|
|
value={email || accountName} // Display whichever is set
|
|
|
|
onChange={(e) => {
|
|
|
|
const input = e.target.value;
|
|
|
|
setEmail(input); // Update both email and accountName states
|
|
|
|
setAccountName(input);
|
|
|
|
}}
|
2024-09-20 10:00:54 +02:00
|
|
|
/>
|
|
|
|
</div>
|
|
|
|
|
2024-09-23 16:53:29 +02:00
|
|
|
{/* Password Input */}
|
2024-09-20 10:00:54 +02:00
|
|
|
<div>
|
|
|
|
<input
|
|
|
|
type="password"
|
|
|
|
placeholder="Password"
|
2024-09-23 16:53:29 +02:00
|
|
|
value={password}
|
2024-09-20 10:00:54 +02:00
|
|
|
onChange={(e) => setPassword(e.target.value)}
|
|
|
|
/>
|
|
|
|
</div>
|
|
|
|
|
2024-09-23 16:53:29 +02:00
|
|
|
{/* Log In Button */}
|
|
|
|
<div>
|
|
|
|
<button className="log-into-account" onClick={handleLogin}>Log In</button>
|
2024-09-20 10:00:54 +02:00
|
|
|
</div>
|
|
|
|
|
2024-09-23 16:53:29 +02:00
|
|
|
{/* Text for creating an account */}
|
|
|
|
<p>
|
2024-09-26 16:37:18 +02:00
|
|
|
Don't have an account yet? Create one{' '}
|
2024-09-23 16:53:29 +02:00
|
|
|
<span
|
|
|
|
style={{ color: 'blue', cursor: 'pointer' }}
|
|
|
|
onClick={toggleSignUpPopup}
|
|
|
|
>
|
|
|
|
here
|
|
|
|
</span>
|
|
|
|
</p>
|
2024-09-20 10:00:54 +02:00
|
|
|
</div>
|
|
|
|
</div>
|
|
|
|
)}
|
|
|
|
|
2024-09-23 16:53:29 +02:00
|
|
|
{/* Conditional rendering of the Sign-Up Popup */}
|
|
|
|
{showSignUpPopup && (
|
2024-09-20 10:00:54 +02:00
|
|
|
<div className="popup-overlay">
|
|
|
|
<div className="popup-content">
|
2024-09-23 16:53:29 +02:00
|
|
|
<h2>Create Account</h2>
|
2024-09-20 10:00:54 +02:00
|
|
|
|
2024-09-23 16:53:29 +02:00
|
|
|
{/* New Account Email Input */}
|
2024-09-20 10:00:54 +02:00
|
|
|
<div>
|
|
|
|
<input
|
|
|
|
type="text"
|
2024-09-23 16:53:29 +02:00
|
|
|
placeholder="Email"
|
|
|
|
value={newAccountEmail}
|
|
|
|
onChange={(e) => setNewAccountEmail(e.target.value)}
|
2024-09-20 10:00:54 +02:00
|
|
|
/>
|
|
|
|
</div>
|
|
|
|
|
2024-09-26 14:57:31 +02:00
|
|
|
{/* New Account Name Input */}
|
|
|
|
<div>
|
2024-09-25 11:33:21 +02:00
|
|
|
<input
|
|
|
|
type="text"
|
|
|
|
placeholder="Name"
|
|
|
|
value={newAccountName}
|
2024-09-26 14:57:31 +02:00
|
|
|
onChange={(e) => setNewAccountName(e.target.value)}
|
2024-09-25 11:33:21 +02:00
|
|
|
/>
|
|
|
|
</div>
|
|
|
|
|
2024-09-23 16:53:29 +02:00
|
|
|
{/* New Account Password Input */}
|
2024-09-20 10:00:54 +02:00
|
|
|
<div>
|
|
|
|
<input
|
|
|
|
type="password"
|
|
|
|
placeholder="Password"
|
2024-09-23 16:53:29 +02:00
|
|
|
value={newAccountPassword}
|
|
|
|
onChange={(e) => setNewAccountPassword(e.target.value)}
|
2024-09-20 10:00:54 +02:00
|
|
|
/>
|
|
|
|
</div>
|
|
|
|
|
2024-09-23 16:53:29 +02:00
|
|
|
{/* Create Account Button */}
|
2024-09-20 10:00:54 +02:00
|
|
|
<div>
|
2024-09-23 16:53:29 +02:00
|
|
|
<button className="create-account" onClick={handleCreateAccount}>Create Account</button>
|
2024-09-20 10:00:54 +02:00
|
|
|
</div>
|
|
|
|
|
|
|
|
{/* Close Button */}
|
2024-09-23 16:53:29 +02:00
|
|
|
<button className="close-popup" onClick={toggleSignUpPopup} aria-label="Close popup">
|
2024-09-20 10:00:54 +02:00
|
|
|
Close
|
|
|
|
</button>
|
2024-09-26 14:57:31 +02:00
|
|
|
</div>
|
2024-09-20 10:00:54 +02:00
|
|
|
</div>
|
|
|
|
)}
|
|
|
|
|
|
|
|
{/* Conditional rendering of the Settings Popup */}
|
2024-09-27 09:54:38 +02:00
|
|
|
{showSettingsPopup && <Settings closeSettings={toggleSettingsPopup} accountName={accountName} />}
|
2024-09-20 10:00:54 +02:00
|
|
|
</div>
|
|
|
|
);
|
|
|
|
};
|
|
|
|
|
|
|
|
export default Login;
|