'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) */}
{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 (
);
}
return (
AltBin
{paste.title && (
{paste.title}
)}
Created
{new Date(paste.createdAt).toLocaleDateString()}
Copied!
);
}