hh
Browse files
backend/services/auth_service.py
CHANGED
|
@@ -42,7 +42,7 @@ def register_user(email: str, password: str) -> dict:
|
|
| 42 |
# Email confirmation is required
|
| 43 |
return {
|
| 44 |
'success': True,
|
| 45 |
-
'message': '
|
| 46 |
'user': user.to_dict(),
|
| 47 |
'email_confirmed': False,
|
| 48 |
'requires_confirmation': True
|
|
@@ -97,7 +97,7 @@ def login_user(email: str, password: str, remember_me: bool = False) -> dict:
|
|
| 97 |
if not response.user.email_confirmed_at:
|
| 98 |
return {
|
| 99 |
'success': False,
|
| 100 |
-
'message': '
|
| 101 |
'requires_confirmation': True
|
| 102 |
}
|
| 103 |
|
|
@@ -151,12 +151,12 @@ def login_user(email: str, password: str, remember_me: bool = False) -> dict:
|
|
| 151 |
if 'invalid credentials' in error_str or 'unauthorized' in error_str:
|
| 152 |
return {
|
| 153 |
'success': False,
|
| 154 |
-
'message': '
|
| 155 |
}
|
| 156 |
elif 'email not confirmed' in error_str or 'email not verified' in error_str:
|
| 157 |
return {
|
| 158 |
'success': False,
|
| 159 |
-
'message': '
|
| 160 |
'requires_confirmation': True
|
| 161 |
}
|
| 162 |
elif 'user not found' in error_str:
|
|
|
|
| 42 |
# Email confirmation is required
|
| 43 |
return {
|
| 44 |
'success': True,
|
| 45 |
+
'message': 'Check your mail to confirm your account',
|
| 46 |
'user': user.to_dict(),
|
| 47 |
'email_confirmed': False,
|
| 48 |
'requires_confirmation': True
|
|
|
|
| 97 |
if not response.user.email_confirmed_at:
|
| 98 |
return {
|
| 99 |
'success': False,
|
| 100 |
+
'message': 'Check your mail to confirm your account',
|
| 101 |
'requires_confirmation': True
|
| 102 |
}
|
| 103 |
|
|
|
|
| 151 |
if 'invalid credentials' in error_str or 'unauthorized' in error_str:
|
| 152 |
return {
|
| 153 |
'success': False,
|
| 154 |
+
'message': 'Password/email Incorrect'
|
| 155 |
}
|
| 156 |
elif 'email not confirmed' in error_str or 'email not verified' in error_str:
|
| 157 |
return {
|
| 158 |
'success': False,
|
| 159 |
+
'message': 'Check your mail to confirm your account',
|
| 160 |
'requires_confirmation': True
|
| 161 |
}
|
| 162 |
elif 'user not found' in error_str:
|
frontend/src/App.jsx
CHANGED
|
@@ -197,17 +197,10 @@ function App() {
|
|
| 197 |
}
|
| 198 |
}, []); // Empty dependency array to run only once
|
| 199 |
|
| 200 |
-
// Show
|
| 201 |
-
|
| 202 |
-
|
| 203 |
-
|
| 204 |
-
<div className="auth-loading">
|
| 205 |
-
<div className="spinner"></div>
|
| 206 |
-
<p>Checking authentication...</p>
|
| 207 |
-
</div>
|
| 208 |
-
</div>
|
| 209 |
-
);
|
| 210 |
-
}
|
| 211 |
|
| 212 |
return (
|
| 213 |
<ErrorBoundary>
|
|
@@ -244,18 +237,28 @@ function App() {
|
|
| 244 |
)}
|
| 245 |
|
| 246 |
{/* Full-width layout without header/sidebar for Home/Auth/Callback */}
|
| 247 |
-
{(!isAuthenticated || isAuthRoute || isCallbackRoute || location.pathname === '/') ? (
|
| 248 |
<div className="content" id="main-content" tabIndex={-1}>
|
| 249 |
-
|
| 250 |
-
|
| 251 |
-
|
| 252 |
-
|
| 253 |
-
|
| 254 |
-
|
| 255 |
-
|
| 256 |
-
|
| 257 |
-
|
| 258 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 259 |
</div>
|
| 260 |
) : (
|
| 261 |
<>
|
|
|
|
| 197 |
}
|
| 198 |
}, []); // Empty dependency array to run only once
|
| 199 |
|
| 200 |
+
// Show a subtle auth checking indicator for protected routes while auth is being verified
|
| 201 |
+
// But don't block access to public routes
|
| 202 |
+
const isProtectedRoute = !isAuthRoute && !isCallbackRoute && location.pathname !== '/';
|
| 203 |
+
const showAuthChecking = isCheckingAuth && isProtectedRoute;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 204 |
|
| 205 |
return (
|
| 206 |
<ErrorBoundary>
|
|
|
|
| 237 |
)}
|
| 238 |
|
| 239 |
{/* Full-width layout without header/sidebar for Home/Auth/Callback */}
|
| 240 |
+
{(showAuthChecking || !isAuthenticated || isAuthRoute || isCallbackRoute || location.pathname === '/') ? (
|
| 241 |
<div className="content" id="main-content" tabIndex={-1}>
|
| 242 |
+
{showAuthChecking ? (
|
| 243 |
+
// Subtle auth checking indicator for protected routes
|
| 244 |
+
<div className="flex items-center justify-center min-h-screen">
|
| 245 |
+
<div className="text-center">
|
| 246 |
+
<div className="inline-block animate-spin rounded-full h-8 w-8 border-t-2 border-b-2 border-primary-500 mb-2"></div>
|
| 247 |
+
<p className="text-gray-600 text-sm">Checking authentication...</p>
|
| 248 |
+
</div>
|
| 249 |
+
</div>
|
| 250 |
+
) : (
|
| 251 |
+
<Routes>
|
| 252 |
+
<Route path="/" element={
|
| 253 |
+
<Suspense fallback={<div className="mobile-loading-optimized">Loading...</div>}>
|
| 254 |
+
<Home />
|
| 255 |
+
</Suspense>
|
| 256 |
+
} />
|
| 257 |
+
<Route path="/login" element={<Login />} />
|
| 258 |
+
<Route path="/register" element={<Register />} />
|
| 259 |
+
<Route path="/linkedin/callback" element={<LinkedInCallbackHandler />} />
|
| 260 |
+
</Routes>
|
| 261 |
+
)}
|
| 262 |
</div>
|
| 263 |
) : (
|
| 264 |
<>
|
frontend/src/pages/Login.jsx
CHANGED
|
@@ -146,7 +146,13 @@ const Login = () => {
|
|
| 146 |
<svg className="w-4 h-4 sm:w-5 sm:h-5 text-red-500 flex-shrink-0 mt-0.5" fill="currentColor" viewBox="0 0 20 20">
|
| 147 |
<path fillRule="evenodd" d="M10 18a8 8 0 100-16 8 8 0 000 16zM8.707 7.293a1 1 0 00-1.414 1.414L8.586 10l-1.293 1.293a1 1 0 101.414 1.414L10 11.414l1.293 1.293a1 1 0 001.414-1.414L11.414 10l1.293-1.293a1 1 0 00-1.414-1.414L10 8.586 8.707 7.293z" clipRule="evenodd" />
|
| 148 |
</svg>
|
| 149 |
-
<span className="text-red-700 text-xs sm:text-sm font-medium">
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 150 |
</div>
|
| 151 |
</div>
|
| 152 |
)}
|
|
|
|
| 146 |
<svg className="w-4 h-4 sm:w-5 sm:h-5 text-red-500 flex-shrink-0 mt-0.5" fill="currentColor" viewBox="0 0 20 20">
|
| 147 |
<path fillRule="evenodd" d="M10 18a8 8 0 100-16 8 8 0 000 16zM8.707 7.293a1 1 0 00-1.414 1.414L8.586 10l-1.293 1.293a1 1 0 101.414 1.414L10 11.414l1.293 1.293a1 1 0 001.414-1.414L11.414 10l1.293-1.293a1 1 0 00-1.414-1.414L10 8.586 8.707 7.293z" clipRule="evenodd" />
|
| 148 |
</svg>
|
| 149 |
+
<span className="text-red-700 text-xs sm:text-sm font-medium">
|
| 150 |
+
{error.includes('Email or password is incorrect')
|
| 151 |
+
? 'Password/email Incorrect'
|
| 152 |
+
: error.includes('verify your email')
|
| 153 |
+
? 'Check your mail to confirm your account'
|
| 154 |
+
: error}
|
| 155 |
+
</span>
|
| 156 |
</div>
|
| 157 |
</div>
|
| 158 |
)}
|
frontend/src/pages/Register.jsx
CHANGED
|
@@ -144,7 +144,7 @@ const Register = () => {
|
|
| 144 |
<path fillRule="evenodd" d="M10 18a8 8 0 100-16 8 8 0 000 16zm3.707-9.293a1 1 0 00-1.414-1.414L9 10.586 7.707 9.293a1 1 0 00-1.414 1.414l2 2a1 1 0 001.414 0l4-4z" clipRule="evenodd" />
|
| 145 |
</svg>
|
| 146 |
<span className="text-green-700 text-xs sm:text-sm font-medium">
|
| 147 |
-
|
| 148 |
</span>
|
| 149 |
</div>
|
| 150 |
</div>
|
|
@@ -362,6 +362,13 @@ const Register = () => {
|
|
| 362 |
<span className="text-xs sm:text-sm">Create Account</span>
|
| 363 |
)}
|
| 364 |
</button>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 365 |
</form>
|
| 366 |
|
| 367 |
|
|
|
|
| 144 |
<path fillRule="evenodd" d="M10 18a8 8 0 100-16 8 8 0 000 16zm3.707-9.293a1 1 0 00-1.414-1.414L9 10.586 7.707 9.293a1 1 0 00-1.414 1.414l2 2a1 1 0 001.414 0l4-4z" clipRule="evenodd" />
|
| 145 |
</svg>
|
| 146 |
<span className="text-green-700 text-xs sm:text-sm font-medium">
|
| 147 |
+
Check your mail to confirm your account
|
| 148 |
</span>
|
| 149 |
</div>
|
| 150 |
</div>
|
|
|
|
| 362 |
<span className="text-xs sm:text-sm">Create Account</span>
|
| 363 |
)}
|
| 364 |
</button>
|
| 365 |
+
|
| 366 |
+
{/* Confirmation Message */}
|
| 367 |
+
{!error && !showSuccess && (
|
| 368 |
+
<div className="text-center text-xs sm:text-sm text-gray-600">
|
| 369 |
+
After registration, please check your email to confirm your account.
|
| 370 |
+
</div>
|
| 371 |
+
)}
|
| 372 |
</form>
|
| 373 |
|
| 374 |
|
frontend/src/store/reducers/authSlice.js
CHANGED
|
@@ -465,9 +465,9 @@ const authSlice = createSlice({
|
|
| 465 |
// Check for specific error types
|
| 466 |
const errorMsg = errorPayload.message.toLowerCase();
|
| 467 |
if (errorMsg.includes('email not confirmed') || errorMsg.includes('email not verified') || errorPayload.requires_confirmation) {
|
| 468 |
-
errorMessage = '
|
| 469 |
} else if (errorMsg.includes('invalid credentials') || errorMsg.includes('invalid email') || errorMsg.includes('invalid password')) {
|
| 470 |
-
errorMessage = '
|
| 471 |
} else if (errorMsg.includes('user not found')) {
|
| 472 |
errorMessage = 'No account found with this email. Please check your email or register for a new account.';
|
| 473 |
} else {
|
|
|
|
| 465 |
// Check for specific error types
|
| 466 |
const errorMsg = errorPayload.message.toLowerCase();
|
| 467 |
if (errorMsg.includes('email not confirmed') || errorMsg.includes('email not verified') || errorPayload.requires_confirmation) {
|
| 468 |
+
errorMessage = 'Check your mail to confirm your account';
|
| 469 |
} else if (errorMsg.includes('invalid credentials') || errorMsg.includes('invalid email') || errorMsg.includes('invalid password')) {
|
| 470 |
+
errorMessage = 'Password/email Incorrect';
|
| 471 |
} else if (errorMsg.includes('user not found')) {
|
| 472 |
errorMessage = 'No account found with this email. Please check your email or register for a new account.';
|
| 473 |
} else {
|