diff --git a/src/App.jsx b/src/App.jsx index 6791642..1f2f16e 100644 --- a/src/App.jsx +++ b/src/App.jsx @@ -5,6 +5,7 @@ import { Navigate, } from 'react-router-dom'; import Register from './components/Register'; +import Login from './components/Login'; import './App.css'; function App() { @@ -13,6 +14,7 @@ function App() { } /> } /> + } /> {/* Add other routes as needed */} { + const [formData, setFormData] = useState({ + username: '', + password: '', + }); + const [errors, setErrors] = useState({}); + const [isSubmitting, setIsSubmitting] = useState(false); + const [submitError, setSubmitError] = useState(''); + + const handleChange = (e) => { + const { name, value } = e.target; + setFormData((prev) => ({ + ...prev, + [name]: value, + })); + // Clear error for this field when user starts typing + if (errors[name]) { + setErrors((prev) => ({ + ...prev, + [name]: '', + })); + } + }; + + const validateForm = () => { + const newErrors = {}; + + if (!formData.username.trim()) { + newErrors.username = 'Username is required'; + } + + if (!formData.password) { + newErrors.password = 'Password is required'; + } else if (formData.password.length < 6) { + newErrors.password = 'Password must be at least 6 characters'; + } + + return newErrors; + }; + + const handleSubmit = async (e) => { + e.preventDefault(); + setSubmitError(''); + + const formErrors = validateForm(); + if (Object.keys(formErrors).length > 0) { + setErrors(formErrors); + return; + } + + setIsSubmitting(true); + + try { + // Simulate API call + await new Promise((resolve) => setTimeout(resolve, 1000)); + + const reqBod = { + username: formData.username, + password: formData.password, + }; + const reponse = await fetch(`${AUTH_API_BASE_URL}/api/v1/login`, { + method: 'POST', + headers: { 'Content-Type': 'application/json' }, + body: JSON.stringify(reqBod), + }); + + if (reponse.ok) { + const response = await reponse.json(); + console.log(`Result: ${response.message}`); + const loginResult = response.data[0]; + const token = loginResult.access_token; + console.log(token); + localStorage.setItem(DATA_KEY_ACCESS_TOKEN, token); + alert(`Login successful! Welcome, ${formData.username}`); + } else { + console.error('Error logging in'); + } + + // Reset form + setFormData({ username: '', password: '' }); + setErrors({}); + } catch (error) { + setSubmitError('Login failed. Please try again.'); + console.error('Login error:', error); + } finally { + setIsSubmitting(false); + } + }; + + return ( +
+
+

Login

+ + {submitError &&
{submitError}
} + +
+
+ + + {errors.username && ( + {errors.username} + )} +
+ +
+ + + {errors.password && ( + {errors.password} + )} + Must be at least 6 characters +
+ + +
+ +
+

+ Don't have an account?{' '} + + Register here + +

+
+
+
+ ); +}; + +export default Login; diff --git a/src/components/Register.jsx b/src/components/Register.jsx index 218cd65..32bdb90 100644 --- a/src/components/Register.jsx +++ b/src/components/Register.jsx @@ -1,6 +1,8 @@ import { useState } from 'react'; import { Link, useNavigate } from 'react-router-dom'; import './Register.css'; +import { AUTH_API_BASE_URL } from '../constants/api'; +import { DATA_KEY_REGISTERED_USER_ID } from '../constants/app'; const Register = () => { const navigate = useNavigate(); @@ -80,18 +82,13 @@ const Register = () => { // Prepare data for API call (remove confirmPassword) const { confirmPassword, ...userData } = formData; - // Simulate API call - console.log('Submitting registration data:', userData); - - // Mock API call delay - await new Promise((resolve) => setTimeout(resolve, 1500)); const reqBod = { phone_number: userData.phoneNumber, username: userData.username, password: userData.password, }; - const response = await fetch('http://localhost:9080/api/v1/register', { + const response = await fetch(`${AUTH_API_BASE_URL}/api/v1/register`, { method: 'POST', headers: { 'Content-Type': 'application/json' }, body: JSON.stringify(reqBod), @@ -100,7 +97,8 @@ const Register = () => { if (response.ok) { alert('Registration successful! Redirecting to login...'); const res = await response.json(); - console.log(res.message); + console.log(`Result: ${res.message}`); + localStorage.setItem(DATA_KEY_REGISTERED_USER_ID, res.data[0].id); navigate('/login'); } else { console.error('Error registering'); diff --git a/src/constants/api.js b/src/constants/api.js new file mode 100644 index 0000000..739c0e4 --- /dev/null +++ b/src/constants/api.js @@ -0,0 +1 @@ +export const AUTH_API_BASE_URL = 'http://localhost:9080'; diff --git a/src/constants/app.js b/src/constants/app.js new file mode 100644 index 0000000..51a207e --- /dev/null +++ b/src/constants/app.js @@ -0,0 +1,2 @@ +export const DATA_KEY_ACCESS_TOKEN = 'access_token'; +export const DATA_KEY_REGISTERED_USER_ID = 'registered_user_id';