Skip to content

Commit 8b1bc41

Browse files
committed
feat: add error and loading components for enhanced user experience
1 parent 1b17c86 commit 8b1bc41

File tree

2 files changed

+96
-0
lines changed

2 files changed

+96
-0
lines changed

app/error.tsx

Lines changed: 56 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,56 @@
1+
"use client"
2+
3+
import { Button } from "@/components/ui/button"
4+
import { Card } from "@/components/ui/card"
5+
import { AlertCircle } from "lucide-react"
6+
7+
export default function Error({
8+
error,
9+
reset,
10+
}: {
11+
error: Error & { digest?: string }
12+
reset: () => void
13+
}) {
14+
return (
15+
<div className="min-h-screen w-full flex items-center justify-center bg-gray-50">
16+
<Card className="w-full max-w-md p-6 bg-white shadow-lg">
17+
{/* Icône d'erreur */}
18+
<div className="flex justify-center mb-6">
19+
<AlertCircle className="h-12 w-12 text-red-500 animate-pulse" />
20+
</div>
21+
22+
{/* Titre */}
23+
<h2 className="text-xl font-semibold text-gray-800 mb-4 text-center">
24+
{"Une erreur est survenue"}
25+
</h2>
26+
27+
{/* Message d'erreur */}
28+
<p className="text-gray-600 text-center mb-6">
29+
{"Une erreur est survenue pendant l'analyse."}
30+
{error?.message && (
31+
<span className="block mt-2 text-sm text-gray-500">
32+
Détail: {error.message}
33+
</span>
34+
)}
35+
</p>
36+
37+
{/* Boutons d'action */}
38+
<div className="flex flex-col sm:flex-row gap-4 justify-center">
39+
<Button
40+
onClick={() => reset()}
41+
className="bg-green-600 hover:bg-green-700 text-white"
42+
>
43+
{"Réessayer"}
44+
</Button>
45+
<Button
46+
onClick={() => (window.location.href = "/")}
47+
variant="outline"
48+
className="border-green-600 text-green-600 hover:bg-green-50"
49+
>
50+
{"Retour à l'accueil"}
51+
</Button>
52+
</div>
53+
</Card>
54+
</div>
55+
)
56+
}

app/scan/[url]/loading.tsx

Lines changed: 40 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,40 @@
1+
import { Card } from "@/components/ui/card"
2+
3+
export default function Loading() {
4+
return (
5+
<div className="min-h-screen w-full flex items-center justify-center bg-gray-50">
6+
<Card className="w-full max-w-md p-6 bg-white shadow-lg relative overflow-hidden">
7+
{/* Barre de progression animée */}
8+
<div className="h-1 w-full bg-gray-100 mb-6 overflow-hidden">
9+
<div
10+
className="h-full bg-green-500 w-full animate-[shimmer_2s_infinite]
11+
relative before:absolute before:inset-0
12+
before:translate-x-[-100%] before:bg-gradient-to-r
13+
before:from-transparent before:via-green-500 before:to-transparent
14+
before:animate-[shimmer_2s_infinite]"
15+
/>
16+
</div>
17+
18+
{/* Titre */}
19+
<h2 className="text-xl font-semibold text-gray-800 mb-4">
20+
{"Calcul d'éco-conception en cours"}
21+
</h2>
22+
23+
{/* Indicateur de chargement rotatif */}
24+
<div className="flex justify-center mb-6">
25+
<div className="w-12 h-12 border-4 border-green-200 border-t-green-500 rounded-full animate-spin" />
26+
</div>
27+
28+
{/* Message */}
29+
<p className="text-gray-600 text-center">
30+
{"Cette analyse peut prendre jusqu'à une minute."}
31+
<br />
32+
{"Merci de patienter..."}
33+
</p>
34+
35+
{/* Effet de pulsation */}
36+
<div className="absolute inset-0 bg-green-100 opacity-20 animate-pulse" />
37+
</Card>
38+
</div>
39+
)
40+
}

0 commit comments

Comments
 (0)