Ajouter SSR prerending, espace employe, formulaire inscription employee depuis admin
This commit is contained in:
@@ -1,4 +1,4 @@
|
||||
import { useEffect, useRef, useState } from 'react'
|
||||
import { useEffect, useRef } from 'react'
|
||||
import { useNavigate, useSearchParams, Link } from 'react-router-dom'
|
||||
import { useAuth } from '../context/AuthContext'
|
||||
|
||||
@@ -8,39 +8,40 @@ export default function AuthCallback() {
|
||||
const navigate = useNavigate()
|
||||
const [searchParams] = useSearchParams()
|
||||
const { login } = useAuth()
|
||||
const [error, setError] = useState('')
|
||||
// StrictMode monte deux fois en dev : on ne traite le token qu'une seule fois.
|
||||
const handled = useRef(false)
|
||||
|
||||
// L'erreur (s'il y en a une) est entièrement dérivée de l'URL : pas besoin
|
||||
// d'un state ni d'un effet pour la calculer, juste pour l'action à usage
|
||||
// unique (login + redirection) une fois l'utilisateur décodé avec succès.
|
||||
const errorParam = searchParams.get('error')
|
||||
const token = searchParams.get('token')
|
||||
const encodedUser = searchParams.get('user')
|
||||
|
||||
let error = ''
|
||||
let user = null
|
||||
if (errorParam) {
|
||||
error = errorParam
|
||||
} else if (!token || !encodedUser) {
|
||||
error = 'Réponse de connexion incomplète.'
|
||||
} else {
|
||||
try {
|
||||
user = JSON.parse(atob(encodedUser))
|
||||
} catch {
|
||||
error = 'Réponse de connexion illisible.'
|
||||
}
|
||||
}
|
||||
|
||||
useEffect(() => {
|
||||
if (handled.current) return
|
||||
if (handled.current || !user) return
|
||||
handled.current = true
|
||||
|
||||
const errorParam = searchParams.get('error')
|
||||
if (errorParam) {
|
||||
setError(errorParam)
|
||||
return
|
||||
}
|
||||
login(user, token)
|
||||
|
||||
const token = searchParams.get('token')
|
||||
const encodedUser = searchParams.get('user')
|
||||
|
||||
if (!token || !encodedUser) {
|
||||
setError('Réponse de connexion incomplète.')
|
||||
return
|
||||
}
|
||||
|
||||
try {
|
||||
const user = JSON.parse(atob(encodedUser))
|
||||
login(user, token)
|
||||
|
||||
if (user.role === 'ADMIN') navigate('/admin', { replace: true })
|
||||
else if (user.role === 'EMPLOYEE') navigate('/employe', { replace: true })
|
||||
else navigate('/mes-gains', { replace: true })
|
||||
} catch {
|
||||
setError('Réponse de connexion illisible.')
|
||||
}
|
||||
}, [searchParams, login, navigate])
|
||||
if (user.role === 'ADMIN') navigate('/admin', { replace: true })
|
||||
else if (user.role === 'EMPLOYEE') navigate('/employe', { replace: true })
|
||||
else navigate('/mes-gains', { replace: true })
|
||||
}, [user, token, login, navigate])
|
||||
|
||||
if (error) {
|
||||
return (
|
||||
|
||||
Reference in New Issue
Block a user