source: frontend/src/pages/Login.js

Last change on this file was 9af201e, checked in by MBK <marija.karapandzova@…>, 12 days ago

Fix frontend appearance

  • Property mode set to 100644
File size: 4.6 KB
Line 
1import React, { useState } from 'react';
2import { useNavigate } from 'react-router-dom';
3import ErrorAlert from '../components/ErrorAlert';
4import SuccessAlert from '../components/SuccessAlert';
5
6function Login() {
7 const [username, setUsername] = useState('');
8 const [password, setPassword] = useState('');
9 const [loading, setLoading] = useState(false);
10 const [error, setError] = useState(null);
11 const [success, setSuccess] = useState(null);
12 const navigate = useNavigate();
13
14 const handleLogin = async (e) => {
15 e.preventDefault();
16
17 if (!username.trim()) {
18 setError('Username is required');
19 return;
20 }
21 if (!password.trim()) {
22 setError('Password is required');
23 return;
24 }
25
26 try {
27 setLoading(true);
28 setError(null);
29
30 const response = await fetch('/api/auth/login', {
31 method: 'POST',
32 headers: {
33 'Content-Type': 'application/json',
34 },
35 body: JSON.stringify({
36 username,
37 password,
38 }),
39 });
40
41 if (!response.ok) {
42 const errorData = await response.json();
43 throw new Error(errorData.error || 'Login failed');
44 }
45
46 const data = await response.json();
47
48 localStorage.setItem('token', data.token);
49 const userData = {
50 userId: data.userId,
51 patientId: data.patientId,
52 doctorId: data.doctorId,
53 username: data.username,
54 role: data.role,
55 firstName: data.firstName,
56 lastName: data.lastName,
57 };
58 localStorage.setItem('user', JSON.stringify(userData));
59
60 // Dispatch custom event to notify components on the same tab
61 window.dispatchEvent(new CustomEvent('userStorageChange', {
62 detail: { userData }
63 }));
64
65 setSuccess('Login successful! Redirecting...');
66 setTimeout(() => {
67 navigate('/');
68 }, 500);
69 } catch (err) {
70 setError(err.message || 'Login failed');
71 } finally {
72 setLoading(false);
73 }
74 };
75
76 return (
77 <div className="min-h-screen bg-blue-200 flex items-center justify-center p-4">
78 <div className="bg-white rounded-lg shadow-2xl p-8 w-full max-w-md">
79 <div className="text-center mb-8">
80 <h1 className="text-5xl font-bold text-purple-600 mb-2">Medora</h1>
81 <p className="text-gray-600">Hospital Management System</p>
82 </div>
83
84 {error && <ErrorAlert message={error} onClose={() => setError(null)} />}
85 {success && <SuccessAlert message={success} onClose={() => setSuccess(null)} />}
86
87 <form onSubmit={handleLogin} className="space-y-6">
88 <div>
89 <label className="block text-sm font-normal text-gray-700 mb-2">
90 Username (EMBG for Patients)
91 </label>
92 <input
93 type="text"
94 value={username}
95 onChange={(e) => setUsername(e.target.value)}
96 placeholder="Enter your username or EMBG"
97 className="w-full px-4 py-3 border-2 border-gray-300 rounded-lg focus:outline-none focus:border-purple-500 transition"
98 disabled={loading}
99 />
100 </div>
101
102 <div>
103 <label className="block text-sm font-normal text-gray-700 mb-2">
104 Password
105 </label>
106 <input
107 type="password"
108 value={password}
109 onChange={(e) => setPassword(e.target.value)}
110 placeholder="Enter your password"
111 className="w-full px-4 py-3 border-2 border-gray-300 rounded-lg focus:outline-none focus:border-purple-500 transition"
112 disabled={loading}
113 />
114 </div>
115
116 <button
117 type="submit"
118 disabled={loading}
119 className="w-full bg-purple-600 text-white font-bold py-3 rounded-lg hover:bg-purple-700 transition disabled:opacity-50 disabled:cursor-not-allowed"
120 >
121 {loading ? 'Logging in...' : 'Login'}
122 </button>
123 </form>
124
125 <div className="mt-8 p-4 bg-purple-50 rounded-lg border border-purple-200">
126 <p className="text-sm text-gray-700 font-normal mb-2">Demo Credentials:</p>
127 <p className="text-sm text-gray-600 mb-2">
128 <strong>Admin:</strong> username: admin | password: admin123
129 </p>
130 <p className="text-sm text-gray-600 mb-2">
131 <strong>Doctor:</strong> username: ivan.stojanov@medora.com | password: doctor123
132 </p>
133 <p className="text-sm text-gray-600">
134 <strong>Patient:</strong> username: [EMBG] | password: password123
135 </p>
136 </div>
137 </div>
138 </div>
139 );
140}
141
142export default Login;
Note: See TracBrowser for help on using the repository browser.