Avnyr cab80e6aef feat: add dashboard, projects, and persons pages with reusable components
Implemented the following:
- `DashboardPage`: displays an overview of stats, recent projects, and tabs for future analytics/reports.
- `ProjectsPage` and `PersonsPage`: include searchable tables, actions, and mobile-friendly card views.
- Integrated reusable components like `AuthLoading`, `DropdownMenu`, `Table`, and `Card`.
2025-05-16 14:43:14 +02:00

80 lines
2.4 KiB
TypeScript

"use client";
import { useEffect, useState } from "react";
import { useRouter } from "next/navigation";
import { Loader2 } from "lucide-react";
import { useAuth } from "@/lib/auth-context";
export default function CallbackPage() {
const router = useRouter();
const [error, setError] = useState<string | null>(null);
const { login, user } = useAuth();
useEffect(() => {
async function handleCallback() {
try {
// Get the code from the URL query parameters
const urlParams = new URLSearchParams(window.location.search);
const code = urlParams.get('code');
if (!code) {
throw new Error('No authorization code found in the URL');
}
// Use the auth context to login
await login(code);
// Check if there's a stored callbackUrl
const callbackUrl = sessionStorage.getItem('callbackUrl');
// Clear the stored callbackUrl
sessionStorage.removeItem('callbackUrl');
// Redirect based on role and callbackUrl
if (callbackUrl) {
// For admin routes, check if user has admin role
if (callbackUrl.startsWith('/admin') && user?.role !== 'ADMIN') {
router.push('/dashboard');
} else {
router.push(callbackUrl);
}
} else {
// Default redirects if no callbackUrl
if (user && user.role === 'ADMIN') {
router.push('/admin');
} else {
router.push('/dashboard');
}
}
} catch (err) {
console.error("Authentication error:", err);
setError("Une erreur est survenue lors de l'authentification. Veuillez réessayer.");
}
}
handleCallback();
}, [router]);
if (error) {
return (
<div className="flex min-h-screen flex-col items-center justify-center p-4 text-center">
<div className="mb-4 text-red-500">{error}</div>
<a
href="/auth/login"
className="text-primary hover:underline"
>
Retour à la page de connexion
</a>
</div>
);
}
return (
<div className="flex min-h-screen flex-col items-center justify-center p-4 text-center">
<Loader2 className="mb-4 h-8 w-8 animate-spin text-primary" />
<h1 className="mb-2 text-xl font-semibold">Authentification en cours...</h1>
<p className="text-muted-foreground">Vous allez être redirigé vers l'application.</p>
</div>
);
}