{"ast":null,"code":"var _jsxFileName = \"C:\\\\Users\\\\User\\\\Downloads\\\\medora5\\\\frontend\\\\src\\\\pages\\\\Login.js\",\n _s = $RefreshSig$();\nimport React, { useState } from 'react';\nimport { useNavigate } from 'react-router-dom';\nimport ErrorAlert from '../components/ErrorAlert';\nimport SuccessAlert from '../components/SuccessAlert';\nimport { jsxDEV as _jsxDEV } from \"react/jsx-dev-runtime\";\nfunction Login() {\n _s();\n const [username, setUsername] = useState('');\n const [password, setPassword] = useState('');\n const [loading, setLoading] = useState(false);\n const [error, setError] = useState(null);\n const [success, setSuccess] = useState(null);\n const navigate = useNavigate();\n const handleLogin = async e => {\n e.preventDefault();\n if (!username.trim()) {\n setError('Username is required');\n return;\n }\n if (!password.trim()) {\n setError('Password is required');\n return;\n }\n try {\n setLoading(true);\n setError(null);\n const response = await fetch('/api/auth/login', {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json'\n },\n body: JSON.stringify({\n username,\n password\n })\n });\n if (!response.ok) {\n const errorData = await response.json();\n throw new Error(errorData.error || 'Login failed');\n }\n const data = await response.json();\n localStorage.setItem('token', data.token);\n const userData = {\n userId: data.userId,\n patientId: data.patientId,\n doctorId: data.doctorId,\n username: data.username,\n role: data.role,\n firstName: data.firstName,\n lastName: data.lastName\n };\n localStorage.setItem('user', JSON.stringify(userData));\n\n // Dispatch custom event to notify components on the same tab\n window.dispatchEvent(new CustomEvent('userStorageChange', {\n detail: {\n userData\n }\n }));\n setSuccess('Login successful! Redirecting...');\n setTimeout(() => {\n navigate('/');\n }, 500);\n } catch (err) {\n setError(err.message || 'Login failed');\n } finally {\n setLoading(false);\n }\n };\n return /*#__PURE__*/_jsxDEV(\"div\", {\n className: \"min-h-screen bg-blue-200 flex items-center justify-center p-4\",\n children: /*#__PURE__*/_jsxDEV(\"div\", {\n className: \"bg-white rounded-lg shadow-2xl p-8 w-full max-w-md\",\n children: [/*#__PURE__*/_jsxDEV(\"div\", {\n className: \"text-center mb-8\",\n children: [/*#__PURE__*/_jsxDEV(\"h1\", {\n className: \"text-5xl font-bold text-purple-600 mb-2\",\n children: \"Medora\"\n }, void 0, false, {\n fileName: _jsxFileName,\n lineNumber: 80,\n columnNumber: 11\n }, this), /*#__PURE__*/_jsxDEV(\"p\", {\n className: \"text-gray-600\",\n children: \"Hospital Management System\"\n }, void 0, false, {\n fileName: _jsxFileName,\n lineNumber: 81,\n columnNumber: 11\n }, this)]\n }, void 0, true, {\n fileName: _jsxFileName,\n lineNumber: 79,\n columnNumber: 9\n }, this), error && /*#__PURE__*/_jsxDEV(ErrorAlert, {\n message: error,\n onClose: () => setError(null)\n }, void 0, false, {\n fileName: _jsxFileName,\n lineNumber: 84,\n columnNumber: 19\n }, this), success && /*#__PURE__*/_jsxDEV(SuccessAlert, {\n message: success,\n onClose: () => setSuccess(null)\n }, void 0, false, {\n fileName: _jsxFileName,\n lineNumber: 85,\n columnNumber: 21\n }, this), /*#__PURE__*/_jsxDEV(\"form\", {\n onSubmit: handleLogin,\n className: \"space-y-6\",\n children: [/*#__PURE__*/_jsxDEV(\"div\", {\n children: [/*#__PURE__*/_jsxDEV(\"label\", {\n className: \"block text-sm font-normal text-gray-700 mb-2\",\n children: \"Username (EMBG for Patients)\"\n }, void 0, false, {\n fileName: _jsxFileName,\n lineNumber: 89,\n columnNumber: 13\n }, this), /*#__PURE__*/_jsxDEV(\"input\", {\n type: \"text\",\n value: username,\n onChange: e => setUsername(e.target.value),\n placeholder: \"Enter your username or EMBG\",\n className: \"w-full px-4 py-3 border-2 border-gray-300 rounded-lg focus:outline-none focus:border-purple-500 transition\",\n disabled: loading\n }, void 0, false, {\n fileName: _jsxFileName,\n lineNumber: 92,\n columnNumber: 13\n }, this)]\n }, void 0, true, {\n fileName: _jsxFileName,\n lineNumber: 88,\n columnNumber: 11\n }, this), /*#__PURE__*/_jsxDEV(\"div\", {\n children: [/*#__PURE__*/_jsxDEV(\"label\", {\n className: \"block text-sm font-normal text-gray-700 mb-2\",\n children: \"Password\"\n }, void 0, false, {\n fileName: _jsxFileName,\n lineNumber: 103,\n columnNumber: 13\n }, this), /*#__PURE__*/_jsxDEV(\"input\", {\n type: \"password\",\n value: password,\n onChange: e => setPassword(e.target.value),\n placeholder: \"Enter your password\",\n className: \"w-full px-4 py-3 border-2 border-gray-300 rounded-lg focus:outline-none focus:border-purple-500 transition\",\n disabled: loading\n }, void 0, false, {\n fileName: _jsxFileName,\n lineNumber: 106,\n columnNumber: 13\n }, this)]\n }, void 0, true, {\n fileName: _jsxFileName,\n lineNumber: 102,\n columnNumber: 11\n }, this), /*#__PURE__*/_jsxDEV(\"button\", {\n type: \"submit\",\n disabled: loading,\n 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\",\n children: loading ? 'Logging in...' : 'Login'\n }, void 0, false, {\n fileName: _jsxFileName,\n lineNumber: 116,\n columnNumber: 11\n }, this)]\n }, void 0, true, {\n fileName: _jsxFileName,\n lineNumber: 87,\n columnNumber: 9\n }, this), /*#__PURE__*/_jsxDEV(\"div\", {\n className: \"mt-8 p-4 bg-purple-50 rounded-lg border border-purple-200\",\n children: [/*#__PURE__*/_jsxDEV(\"p\", {\n className: \"text-sm text-gray-700 font-normal mb-2\",\n children: \"Demo Credentials:\"\n }, void 0, false, {\n fileName: _jsxFileName,\n lineNumber: 126,\n columnNumber: 11\n }, this), /*#__PURE__*/_jsxDEV(\"p\", {\n className: \"text-sm text-gray-600 mb-2\",\n children: [/*#__PURE__*/_jsxDEV(\"strong\", {\n children: \"Admin:\"\n }, void 0, false, {\n fileName: _jsxFileName,\n lineNumber: 128,\n columnNumber: 13\n }, this), \" username: admin | password: admin123\"]\n }, void 0, true, {\n fileName: _jsxFileName,\n lineNumber: 127,\n columnNumber: 11\n }, this), /*#__PURE__*/_jsxDEV(\"p\", {\n className: \"text-sm text-gray-600 mb-2\",\n children: [/*#__PURE__*/_jsxDEV(\"strong\", {\n children: \"Doctor:\"\n }, void 0, false, {\n fileName: _jsxFileName,\n lineNumber: 131,\n columnNumber: 13\n }, this), \" username: ivan.stojanov@medora.com | password: doctor123\"]\n }, void 0, true, {\n fileName: _jsxFileName,\n lineNumber: 130,\n columnNumber: 11\n }, this), /*#__PURE__*/_jsxDEV(\"p\", {\n className: \"text-sm text-gray-600\",\n children: [/*#__PURE__*/_jsxDEV(\"strong\", {\n children: \"Patient:\"\n }, void 0, false, {\n fileName: _jsxFileName,\n lineNumber: 134,\n columnNumber: 13\n }, this), \" username: [EMBG] | password: password123\"]\n }, void 0, true, {\n fileName: _jsxFileName,\n lineNumber: 133,\n columnNumber: 11\n }, this)]\n }, void 0, true, {\n fileName: _jsxFileName,\n lineNumber: 125,\n columnNumber: 9\n }, this)]\n }, void 0, true, {\n fileName: _jsxFileName,\n lineNumber: 78,\n columnNumber: 7\n }, this)\n }, void 0, false, {\n fileName: _jsxFileName,\n lineNumber: 77,\n columnNumber: 5\n }, this);\n}\n_s(Login, \"tQ3TTgQtV0ZLjp20cLaV6L5q03o=\", false, function () {\n return [useNavigate];\n});\n_c = Login;\nexport default Login;\nvar _c;\n$RefreshReg$(_c, \"Login\");","map":{"version":3,"names":["React","useState","useNavigate","ErrorAlert","SuccessAlert","jsxDEV","_jsxDEV","Login","_s","username","setUsername","password","setPassword","loading","setLoading","error","setError","success","setSuccess","navigate","handleLogin","e","preventDefault","trim","response","fetch","method","headers","body","JSON","stringify","ok","errorData","json","Error","data","localStorage","setItem","token","userData","userId","patientId","doctorId","role","firstName","lastName","window","dispatchEvent","CustomEvent","detail","setTimeout","err","message","className","children","fileName","_jsxFileName","lineNumber","columnNumber","onClose","onSubmit","type","value","onChange","target","placeholder","disabled","_c","$RefreshReg$"],"sources":["C:/Users/User/Downloads/medora5/frontend/src/pages/Login.js"],"sourcesContent":["import React, { useState } from 'react';\nimport { useNavigate } from 'react-router-dom';\nimport ErrorAlert from '../components/ErrorAlert';\nimport SuccessAlert from '../components/SuccessAlert';\n\nfunction Login() {\n const [username, setUsername] = useState('');\n const [password, setPassword] = useState('');\n const [loading, setLoading] = useState(false);\n const [error, setError] = useState(null);\n const [success, setSuccess] = useState(null);\n const navigate = useNavigate();\n\n const handleLogin = async (e) => {\n e.preventDefault();\n\n if (!username.trim()) {\n setError('Username is required');\n return;\n }\n if (!password.trim()) {\n setError('Password is required');\n return;\n }\n\n try {\n setLoading(true);\n setError(null);\n\n const response = await fetch('/api/auth/login', {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n },\n body: JSON.stringify({\n username,\n password,\n }),\n });\n\n if (!response.ok) {\n const errorData = await response.json();\n throw new Error(errorData.error || 'Login failed');\n }\n\n const data = await response.json();\n\n localStorage.setItem('token', data.token);\n const userData = {\n userId: data.userId,\n patientId: data.patientId,\n doctorId: data.doctorId,\n username: data.username,\n role: data.role,\n firstName: data.firstName,\n lastName: data.lastName,\n };\n localStorage.setItem('user', JSON.stringify(userData));\n\n // Dispatch custom event to notify components on the same tab\n window.dispatchEvent(new CustomEvent('userStorageChange', {\n detail: { userData }\n }));\n\n setSuccess('Login successful! Redirecting...');\n setTimeout(() => {\n navigate('/');\n }, 500);\n } catch (err) {\n setError(err.message || 'Login failed');\n } finally {\n setLoading(false);\n }\n };\n\n return (\n
Hospital Management System
\nDemo Credentials:
\n\n Admin: username: admin | password: admin123\n
\n\n Doctor: username: ivan.stojanov@medora.com | password: doctor123\n
\n\n Patient: username: [EMBG] | password: password123\n
\n