|
|
import React, { useState } from 'react'; |
|
|
import { useNavigate, Link } from 'react-router-dom'; |
|
|
import { useAuth } from '../services/AuthContext'; |
|
|
import loginBg from '../../public/images/salesbuddy_logo.jpg'; |
|
|
|
|
|
const Register = () => { |
|
|
const [username, setUsername] = useState(''); |
|
|
const [email, setEmail] = useState(''); |
|
|
const [password, setPassword] = useState(''); |
|
|
const [error, setError] = useState(''); |
|
|
const navigate = useNavigate(); |
|
|
const { login } = useAuth(); |
|
|
|
|
|
const handleSubmit = async (e) => { |
|
|
e.preventDefault(); |
|
|
setError(''); |
|
|
|
|
|
try { |
|
|
const response = await fetch('http://localhost:8000/register', { |
|
|
method: 'POST', |
|
|
headers: { |
|
|
'Content-Type': 'application/json', |
|
|
}, |
|
|
body: JSON.stringify({ |
|
|
username, |
|
|
email, |
|
|
password, |
|
|
}), |
|
|
}); |
|
|
|
|
|
const data = await response.json(); |
|
|
|
|
|
if (!response.ok) { |
|
|
throw new Error(data.detail || 'Registration failed'); |
|
|
} |
|
|
|
|
|
login(data.access_token); |
|
|
navigate('/'); |
|
|
} catch (err) { |
|
|
setError(err.message); |
|
|
} |
|
|
}; |
|
|
|
|
|
return ( |
|
|
<> |
|
|
<div className="grid-container"> |
|
|
<div className="column-a" style={{ backgroundImage: `url(${loginBg})` }}> |
|
|
</div> |
|
|
<div className="column-b"> |
|
|
<div className="login-panel"> |
|
|
<form onSubmit={handleSubmit} className="space-y-4"> |
|
|
<div> |
|
|
<label className="block text-sm font-medium text-gray-700"> |
|
|
Username |
|
|
</label> |
|
|
<input |
|
|
type="text" |
|
|
value={username} |
|
|
onChange={(e) => setUsername(e.target.value)} |
|
|
className="mt-1 block w-full rounded-md border-gray-300 shadow-sm p-2" |
|
|
required |
|
|
/> |
|
|
</div> |
|
|
<div> |
|
|
<label className="block text-sm font-medium text-gray-700"> |
|
|
Email |
|
|
</label> |
|
|
<input |
|
|
type="email" |
|
|
value={email} |
|
|
onChange={(e) => setEmail(e.target.value)} |
|
|
className="mt-1 block w-full rounded-md border-gray-300 shadow-sm p-2" |
|
|
required |
|
|
/> |
|
|
</div> |
|
|
<div> |
|
|
<label className="block text-sm font-medium text-gray-700"> |
|
|
Password |
|
|
</label> |
|
|
<input |
|
|
type="password" |
|
|
value={password} |
|
|
onChange={(e) => setPassword(e.target.value)} |
|
|
className="mt-1 block w-full rounded-md border-gray-300 shadow-sm p-2" |
|
|
required |
|
|
/> |
|
|
</div> |
|
|
<button |
|
|
type="submit" |
|
|
className="w-full py-2 px-4 border border-transparent rounded-md shadow-sm text-sm font-medium text-white bg-blue-600 hover:bg-blue-700" |
|
|
> |
|
|
Register |
|
|
</button> |
|
|
</form> |
|
|
|
|
|
<div className="mt-4 text-center"> |
|
|
<Link to="/login" className="text-blue-600 hover:text-blue-500"> |
|
|
Already have an account? Login |
|
|
</Link> |
|
|
</div> |
|
|
</div> |
|
|
</div> |
|
|
</div> |
|
|
</> |
|
|
); |
|
|
}; |
|
|
|
|
|
export default Register; |