'use client'; import { CalendarDays, Copy, Download, Eye, FileText, Plus, } from 'lucide-react'; import { useRouter } from 'next/navigation'; import { useEffect, useRef, useState } from 'react'; import Prism from 'prismjs'; import 'prismjs/components/prism-bash'; import 'prismjs/components/prism-javascript'; import 'prismjs/components/prism-json'; import 'prismjs/components/prism-python'; import 'prismjs/components/prism-typescript'; import 'prismjs/themes/prism-tomorrow.css'; import 'prismjs/plugins/line-numbers/prism-line-numbers.css'; import 'prismjs/plugins/line-numbers/prism-line-numbers.js'; /** ---------- Loader animé (spinner + skeletons) ---------- */ function LoadingPaste() { return (
{/* Zone code (skeleton lignes) */}
Chargement du paste…
{Array.from({ length: 28 }).map((_, i) => (
))}
{/* Sidebar (skeleton cartes + boutons) */}
{Array.from({ length: 4 }).map((_, i) => (
))}
); } /** -------------------------------------------------------- */ export default function PastePage({ params }: { params: { id: string } }) { const [paste, setPaste] = useState(null); const [error, setError] = useState(''); const [loading, setLoading] = useState(true); const [language, setLanguage] = useState('language-javascript'); const [copied, setCopied] = useState(false); const codeRef = useRef(null); const router = useRouter(); const fetchPaste = async (pwd?: string) => { setLoading(true); const res = await fetch(`/api/paste/${params.id}`, { method: 'POST', headers: { 'Content-Type': 'application/json' }, body: JSON.stringify({ password: pwd || '' }), }); if (res.status === 403) { setError('Invalid password.'); setLoading(false); return; } if (res.status === 404) { setError('Paste not found or expired.'); setLoading(false); return; } const data = await res.json(); setPaste(data); if (data.content.includes('function') || data.content.includes('const')) { setLanguage('language-javascript'); } else if (data.content.includes('import') || data.content.includes('export')) { setLanguage('language-typescript'); } else if (data.content.includes('{') && data.content.includes('}')) { setLanguage('language-json'); } else { setLanguage('language-bash'); } setLoading(false); }; useEffect(() => { fetchPaste(); // eslint-disable-next-line react-hooks/exhaustive-deps }, []); useEffect(() => { if (paste?.content) { Prism.highlightAll(); } }, [paste]); // 👉 Remplace l'ancien message "Loading..." par le loader animé if (loading) return ; if (error || (paste?.protected && !paste?.content)) { return (
{ e.preventDefault(); fetchPaste((e.currentTarget as any).password.value); }} className=" w-full max-w-sm rounded-2xl p-6 space-y-4 backdrop-blur-xl shadow-2xl bg-[linear-gradient(to_bottom_right,rgba(20,24,38,0.9),rgba(14,16,24,0.9))] ring-1 ring-white/10 " >

🔒 Protected Paste

{error &&

{error}

}
); } return (
          
            {paste.content}
          
        

AltBin

{paste.title && (

{paste.title}

)}
Views
{paste.views}
Created
{new Date(paste.createdAt).toLocaleDateString()}
Copied!
); }