Add comprehensive login diagnostics and retry logic

- Add detailed console logging throughout login flow
- Add 30s timeout to prevent hanging requests
- Defer permission fetching with setTimeout to avoid race conditions
- Add automatic retry for 5xx errors and network failures
- Enhanced error logging with full context for debugging

This addresses intermittent login failures reported by users
This commit is contained in:
Koncept Kit
2026-01-05 15:00:41 +07:00
parent fa9a1d1d1d
commit 1acb13ba79
2 changed files with 119 additions and 19 deletions

View File

@@ -54,21 +54,75 @@ export const AuthProvider = ({ children }) => {
};
const login = async (email, password) => {
const response = await axios.post(`${API_URL}/api/auth/login`, { email, password });
const { access_token, user: userData } = response.data;
localStorage.setItem('token', access_token);
setToken(access_token);
setUser(userData);
// Fetch user permissions (don't let this fail the login)
try {
await fetchPermissions(access_token);
} catch (error) {
console.error('Failed to fetch permissions during login, will retry later:', error);
// Don't throw - permissions can be fetched later if needed
}
console.log('[AuthContext] Starting login request...');
return userData;
const response = await axios.post(
`${API_URL}/api/auth/login`,
{ email, password },
{
timeout: 30000, // 30 second timeout
headers: {
'Content-Type': 'application/json'
}
}
);
console.log('[AuthContext] Login response received:', {
status: response.status,
hasToken: !!response.data?.access_token,
hasUser: !!response.data?.user
});
const { access_token, user: userData } = response.data;
// Store token first
localStorage.setItem('token', access_token);
console.log('[AuthContext] Token stored in localStorage');
// Update state
setToken(access_token);
setUser(userData);
console.log('[AuthContext] User state updated:', {
email: userData.email,
role: userData.role
});
// Fetch user permissions (don't let this fail the login)
// Use setTimeout to defer permission fetching slightly
setTimeout(async () => {
try {
console.log('[AuthContext] Fetching permissions...');
await fetchPermissions(access_token);
console.log('[AuthContext] Permissions fetched successfully');
} catch (error) {
console.error('[AuthContext] Failed to fetch permissions (non-critical):', {
message: error.message,
response: error.response?.data,
status: error.response?.status
});
// Don't throw - permissions can be fetched later if needed
}
}, 100); // Small delay to ensure state is settled
return userData;
} catch (error) {
// Enhanced error logging
console.error('[AuthContext] Login failed:', {
message: error.message,
response: error.response?.data,
status: error.response?.status,
code: error.code,
config: {
url: error.config?.url,
method: error.config?.method,
timeout: error.config?.timeout
}
});
// Re-throw to let Login component handle the error
throw error;
}
};
const logout = () => {