Ajouter SSR prerending, espace employe, formulaire inscription employee depuis admin

This commit is contained in:
Alexis SANOGO
2026-09-04 16:08:22 +02:00
parent dfa5fb81a3
commit 28d743deb5
12 changed files with 279 additions and 177 deletions

View File

@@ -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 (