From 3926a8c7d80b81628c83c3c35405c3aa5620a0f9 Mon Sep 17 00:00:00 2001 From: aaniya22 Date: Fri, 5 Jun 2026 20:34:27 +0530 Subject: [PATCH 1/5] fix(login): show specific error messages for 500, 401, and network failures --- frontend/src/pages/Login.tsx | 24 +++++++++++++++++------- 1 file changed, 17 insertions(+), 7 deletions(-) diff --git a/frontend/src/pages/Login.tsx b/frontend/src/pages/Login.tsx index 926d8b72..0669a129 100644 --- a/frontend/src/pages/Login.tsx +++ b/frontend/src/pages/Login.tsx @@ -24,13 +24,23 @@ export default function Login() { const user = await authApi.getMe() setAuth(tokenData.access_token, user) navigate('/') - } catch (err) { - if (axios.isAxiosError(err) && err.response?.data?.detail) { - setError(err.response.data.detail) - } else { - setError('Unable to sign in. Please check your credentials and try again.') - } - } finally { + } // ✅ Fix +} catch (err) { + if (axios.isAxiosError(err)) { + const status = err.response?.status + if (status === 401 || status === 403) { + setError('Invalid email or password.') + } else if (status && status >= 500) { + setError('Server error, please try again later.') + } else if (!err.response) { + setError('Unable to connect to server.') + } else { + setError(err.response.data?.detail ?? 'Something went wrong. Please try again.') + } + } else { + setError('Something went wrong. Please try again.') + } +}finally { setLoading(false) } } From d81d7ce3294c46fb91329059d342db63b23a7a4c Mon Sep 17 00:00:00 2001 From: aaniya22 Date: Fri, 5 Jun 2026 20:39:05 +0530 Subject: [PATCH 2/5] fix: show correct error messages for login API failures (#783) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 401/403 → 'Invalid email or password.' - 500+ → 'Server error, please try again later.' - No response → 'Unable to connect to server.' - Other → falls back to response detail message Root cause: misplaced closing brace made catch/finally unreachable dead code. --- frontend/src/pages/Login.tsx | 41 ++++++++++++++++++------------------ 1 file changed, 20 insertions(+), 21 deletions(-) diff --git a/frontend/src/pages/Login.tsx b/frontend/src/pages/Login.tsx index 0669a129..7bfe9f30 100644 --- a/frontend/src/pages/Login.tsx +++ b/frontend/src/pages/Login.tsx @@ -20,27 +20,26 @@ export default function Login() { try { const tokenData = await authApi.login(email, password) - setAuth(tokenData.access_token, null) - const user = await authApi.getMe() - setAuth(tokenData.access_token, user) + setAuth(tokenData.access_token, null) + const user = await authApi.getMe() + setAuth(tokenData.access_token, user) navigate('/') - } // ✅ Fix -} catch (err) { - if (axios.isAxiosError(err)) { - const status = err.response?.status - if (status === 401 || status === 403) { - setError('Invalid email or password.') - } else if (status && status >= 500) { - setError('Server error, please try again later.') - } else if (!err.response) { - setError('Unable to connect to server.') - } else { - setError(err.response.data?.detail ?? 'Something went wrong. Please try again.') - } - } else { - setError('Something went wrong. Please try again.') - } -}finally { + } catch (err) { + if (axios.isAxiosError(err)) { + const status = err.response?.status + if (status === 401 || status === 403) { + setError('Invalid email or password.') + } else if (status && status >= 500) { + setError('Server error, please try again later.') + } else if (!err.response) { + setError('Unable to connect to server.') + } else { + setError(err.response.data?.detail ?? 'Something went wrong. Please try again.') + } + } else { + setError('Something went wrong. Please try again.') + } + } finally { setLoading(false) } } @@ -111,4 +110,4 @@ export default function Login() { ) -} +} \ No newline at end of file From d416dea75d1d3e6e38dfb244d4095183f26d2ed2 Mon Sep 17 00:00:00 2001 From: aaniya22 Date: Sat, 6 Jun 2026 01:11:15 +0530 Subject: [PATCH 3/5] fix(auth): show specific error messages for 500 and network failures --- frontend/src/pages/Register.tsx | 1 - 1 file changed, 1 deletion(-) diff --git a/frontend/src/pages/Register.tsx b/frontend/src/pages/Register.tsx index a4af9c58..c930f7ae 100644 --- a/frontend/src/pages/Register.tsx +++ b/frontend/src/pages/Register.tsx @@ -138,7 +138,6 @@ export default function Register() { setLoading(false) } } - return (
From 5b57975ff48c30c1a60641939de698460f783f17 Mon Sep 17 00:00:00 2001 From: aaniya22 Date: Sat, 6 Jun 2026 01:18:43 +0530 Subject: [PATCH 4/5] fix(login): remove any types and unused PydanticValidationError interface --- frontend/src/pages/Login.tsx | 27 +++++++++++++-------------- 1 file changed, 13 insertions(+), 14 deletions(-) diff --git a/frontend/src/pages/Login.tsx b/frontend/src/pages/Login.tsx index 15f55145..fe7eaf11 100644 --- a/frontend/src/pages/Login.tsx +++ b/frontend/src/pages/Login.tsx @@ -10,11 +10,6 @@ interface ValidationError { message: string } -interface PydanticValidationError { - loc?: Array - msg?: string -} - export default function Login() { const navigate = useNavigate() const { setAuth } = useAuthStore() @@ -24,6 +19,10 @@ export default function Login() { const [errors, setErrors] = useState([]) const [loading, setLoading] = useState(false) + const setError = (message: string) => { + setErrors([{ field: 'general', message }]) + } + const handleSubmit = async (e: React.FormEvent) => { e.preventDefault() setErrors([]) @@ -86,11 +85,11 @@ export default function Login() {
- {errors.some((e: any) => e.field === 'general') && ( + {errors.some((e: ValidationError) => e.field === 'general') && (
- {errors.find((e: any) => e.field === 'general')?.message} + {errors.find((e: ValidationError) => e.field === 'general')?.message}
)} @@ -105,15 +104,15 @@ export default function Login() { required value={email} onChange={(e) => setEmail(e.target.value)} - className={`mt-1 block w-full px-3 py-2 border rounded-lg shadow-sm focus:ring-primary-500 focus:border-primary-500 ${ - errors.some((e: any) => e.field === 'email') + className={`mt-1 block w-full px-3 py-2 border rounded-lg shadow-sm focus:ring-primary-500 focus:border-primary-500${ + errors.some((e: ValidationError) => e.field === 'email') ? 'border-red-300 bg-red-50' : 'border-gray-300' }`} /> - {errors.some((e: any) => e.field === 'email') && ( + {errors.some((e: ValidationError) => e.field === 'email') && (

- {errors.find((e: any) => e.field === 'email')?.message} + {errors.find((e: ValidationError) => e.field === 'email')?.message}

)}
@@ -130,7 +129,7 @@ export default function Login() { value={password} onChange={(e) => setPassword(e.target.value)} className={`block w-full pl-3 pr-10 py-2 border rounded-lg shadow-sm focus:ring-primary-500 focus:border-primary-500 ${ - errors.some((e: any) => e.field === 'password') + errors.some((e: ValidationError) => e.field === 'password') ? 'border-red-300 bg-red-50' : 'border-gray-300' }`} @@ -143,9 +142,9 @@ export default function Login() { {showPassword ? : } - {errors.some((e: any) => e.field === 'password') && ( + {errors.some((e: ValidationError) => e.field === 'password') && (

- {errors.find((e: any) => e.field === 'password')?.message} + {errors.find((e: ValidationError) => e.field === 'password')?.message}

)} From 6f126862f29e32b93f924c3e2e79d8c911336ced Mon Sep 17 00:00:00 2001 From: aaniya22 Date: Sat, 6 Jun 2026 01:23:22 +0530 Subject: [PATCH 5/5] fix(register): replace any types with ValidationError interface --- frontend/src/pages/Register.tsx | 28 ++++++++++++++-------------- 1 file changed, 14 insertions(+), 14 deletions(-) diff --git a/frontend/src/pages/Register.tsx b/frontend/src/pages/Register.tsx index c930f7ae..93d4a688 100644 --- a/frontend/src/pages/Register.tsx +++ b/frontend/src/pages/Register.tsx @@ -152,11 +152,11 @@ export default function Register() { - {errors.some((e: any) => e.field === 'general') && ( + {errors.some((e: ValidationError) => e.field === 'general') && (
- {errors.find((e: any) => e.field === 'general')?.message} + {errors.find((e: ValidationError) => e.field === 'general')?.message}
)} @@ -172,14 +172,14 @@ export default function Register() { value={formData.email} onChange={(e: React.ChangeEvent) => setFormData({ ...formData, email: e.target.value })} className={`mt-1 block w-full px-3 py-2 border rounded-lg shadow-sm focus:ring-primary-500 focus:border-primary-500 ${ - errors.some((e: any) => e.field === 'email') + errors.some((e: ValidationError) => e.field === 'email') ? 'border-red-300 bg-red-50' : 'border-gray-300' }`} /> - {errors.some((e: any) => e.field === 'email') && ( + {errors.some((e: ValidationError) => e.field === 'email') && (

- {errors.find((e: any) => e.field === 'email')?.message} + {errors.find((e: ValidationError) => e.field === 'email')?.message}

)} @@ -198,7 +198,7 @@ export default function Register() { onFocus={() => setShowPasswordRequirements(true)} onBlur={() => setShowPasswordRequirements(false)} className={`block w-full pl-3 pr-10 py-2 border rounded-lg shadow-sm focus:ring-primary-500 focus:border-primary-500 ${ - errors.some((e: any) => e.field === 'password') + errors.some((e: ValidationError) => e.field === 'password') ? 'border-red-300 bg-red-50' : 'border-gray-300' }`} @@ -240,9 +240,9 @@ export default function Register() { )} - {errors.some((e: any) => e.field === 'password') && ( + {errors.some((e: ValidationError) => e.field === 'password') && (

- {errors.find((e: any) => e.field === 'password')?.message} + {errors.find((e: ValidationError) => e.field === 'password')?.message}

)} @@ -258,14 +258,14 @@ export default function Register() { value={formData.full_name} onChange={(e: React.ChangeEvent) => setFormData({ ...formData, full_name: e.target.value })} className={`mt-1 block w-full px-3 py-2 border rounded-lg shadow-sm focus:ring-primary-500 focus:border-primary-500 ${ - errors.some((e: any) => e.field === 'full_name') + errors.some((e: ValidationError) => e.field === 'full_name') ? 'border-red-300 bg-red-50' : 'border-gray-300' }`} /> - {errors.some((e: any) => e.field === 'full_name') && ( + {errors.some((e: ValidationError) => e.field === 'full_name') && (

- {errors.find((e: any) => e.field === 'full_name')?.message} + {errors.find((e: ValidationError) => e.field === 'full_name')?.message}

)} @@ -281,14 +281,14 @@ export default function Register() { value={formData.company_name} onChange={(e: React.ChangeEvent) => setFormData({ ...formData, company_name: e.target.value })} className={`mt-1 block w-full px-3 py-2 border rounded-lg shadow-sm focus:ring-primary-500 focus:border-primary-500 ${ - errors.some((e: any) => e.field === 'company_name') + errors.some((e: ValidationError) => e.field === 'company_name') ? 'border-red-300 bg-red-50' : 'border-gray-300' }`} /> - {errors.some((e: any) => e.field === 'company_name') && ( + {errors.some((e: ValidationError) => e.field === 'company_name') && (

- {errors.find((e: any) => e.field === 'company_name')?.message} + {errors.find((e: ValidationError) => e.field === 'company_name')?.message}

)}