You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
56 lines
1.8 KiB
56 lines
1.8 KiB
import { useEffect, useRef } from 'react';
|
|
import { useNavigate, useSearchParams } from 'react-router-dom';
|
|
import { useAuth } from '../contexts/AuthContext';
|
|
|
|
export default function LoginSuccess() {
|
|
const navigate = useNavigate();
|
|
const [searchParams] = useSearchParams();
|
|
const { loginWithOAuth } = useAuth();
|
|
const hasProcessed = useRef(false);
|
|
|
|
useEffect(() => {
|
|
if (hasProcessed.current) return;
|
|
|
|
const token = searchParams.get('token');
|
|
const userParam = searchParams.get('user');
|
|
|
|
|
|
|
|
if (token && userParam) {
|
|
try {
|
|
hasProcessed.current = true;
|
|
|
|
const userData = JSON.parse(decodeURIComponent(userParam));
|
|
|
|
|
|
loginWithOAuth(userData, token);
|
|
|
|
setTimeout(() => {
|
|
navigate('/', { replace: true });
|
|
}, 100);
|
|
|
|
} catch (error) {
|
|
console.error('Error processing OAuth login:', error);
|
|
hasProcessed.current = true;
|
|
setTimeout(() => {
|
|
navigate('/login?error=invalid_data', { replace: true });
|
|
}, 100);
|
|
}
|
|
} else {
|
|
|
|
hasProcessed.current = true;
|
|
setTimeout(() => {
|
|
navigate('/login?error=missing_data', { replace: true });
|
|
}, 100);
|
|
}
|
|
}, []);
|
|
|
|
return (
|
|
<div className="min-h-screen flex items-center justify-center bg-gray-50">
|
|
<div className="text-center">
|
|
<div className="animate-spin rounded-full h-32 w-32 border-b-2 border-blue-500 mx-auto"></div>
|
|
<p className="mt-4 text-gray-600">Finalisation de la connexion...</p>
|
|
</div>
|
|
</div>
|
|
);
|
|
}
|
|
|