"use client"; import { useState } from "react"; import { Upload, Download, Copy, AlertTriangle } from "lucide-react"; export type PageObject = { pageNumber: number; htmlContent: string; }; export default function Home() { const [sourceText, setSourceText] = useState(""); const [outputText, setOutputText] = useState(""); const [activeTab, setActiveTab] = useState<"text" | "url">("text"); const [urlInput, setUrlInput] = useState(""); const [isProcessing, setIsProcessing] = useState(false); const [error, setError] = useState(null); const [uploadedFile, setUploadedFile] = useState(null); // Nouveau state pour le fichier const [fileContent, setFileContent] = useState(""); // Nouveau state pour le contenu const handleFileChange = async (e: React.ChangeEvent) => { if (e.target.files?.length) { const selectedFile = e.target.files[0]; setUploadedFile(selectedFile); // Stocker le fichier setSourceText(""); // EFFACER le texte existant quand on upload un fichier setError(null); try { // Traitement des fichiers texte - juste lire le contenu if ( selectedFile.type === "text/plain" || selectedFile.name.endsWith(".txt") ) { const reader = new FileReader(); reader.onload = (e) => { const content = e.target?.result as string; setFileContent(content); // Stocker le contenu sans l'afficher }; reader.readAsText(selectedFile); } // Pour les PDF - juste stocker le fichier, pas de traitement automatique else if ( selectedFile.type === "application/pdf" || selectedFile.name.endsWith(".pdf") ) { setFileContent(""); // Pas de contenu texte pour les PDF } // Traitement des fichiers Word (optionnel) else if ( selectedFile.name.endsWith(".docx") || selectedFile.name.endsWith(".doc") ) { setError( "Les fichiers Word ne sont pas encore supportés. Veuillez convertir en PDF ou texte." ); setUploadedFile(null); return; } else { setError( "Format de fichier non supporté. Veuillez utiliser un fichier PDF ou texte." ); setUploadedFile(null); return; } } catch (error) { setError( error instanceof Error ? error.message : "Erreur lors du traitement du fichier" ); setUploadedFile(null); } } }; const loadSampleText = () => { const sampleText = `Bonjour, Je suis Jean Dupont, né le 15 mars 1985. Mon numéro de téléphone est le 06 12 34 56 78 et mon email est jean.dupont@email.com. Mon adresse est 123 rue de la Paix, 75001 Paris. Mon numéro de sécurité sociale est 1 85 03 75 123 456 78. Cordialement, Jean Dupont`; setSourceText(sampleText); }; const anonymizeData = async () => { // Si un fichier est uploadé, traiter le fichier if (uploadedFile) { if ( uploadedFile.type === "application/pdf" || uploadedFile.name.endsWith(".pdf") ) { setIsProcessing(true); setError(null); setOutputText(""); try { const formData = new FormData(); formData.append("file", uploadedFile); const response = await fetch("/api/process-document", { method: "POST", body: formData, }); if (!response.ok) { throw new Error("Erreur lors du traitement du PDF"); } const result = await response.json(); if (result.anonymizedText) { setOutputText(result.anonymizedText); } else { throw new Error(result.error || "Erreur lors de l'anonymisation"); } } catch (error) { setError( error instanceof Error ? error.message : "Erreur lors du traitement du fichier" ); } finally { setIsProcessing(false); } return; } else { // Pour les fichiers texte, utiliser le contenu lu if (!fileContent.trim()) { setError("Le fichier ne contient pas de texte"); return; } // Utiliser fileContent au lieu de sourceText pour l'anonymisation const textToAnonymize = fileContent; setIsProcessing(true); setError(null); setOutputText(""); try { await new Promise((resolve) => setTimeout(resolve, 1500)); const anonymized = textToAnonymize .replace(/\b[A-Z][a-z]+ [A-Z][a-z]+\b/g, "[Nom1]") .replace(/\b0[1-9](?:[\s.-]?\d{2}){4}\b/g, "[Téléphone1]") .replace( /\b[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\.[A-Z|a-z]{2,}\b/g, "[Email1]" ) .replace( /\b\d{1,3}\s+[a-zA-Z\s]+,\s*\d{5}\s+[a-zA-Z\s]+\b/g, "[Adresse1]" ) .replace( /\b\d\s\d{2}\s\d{2}\s\d{2}\s\d{3}\s\d{3}\s\d{2}\b/g, "[NuméroSS1]" ); setOutputText(anonymized); } catch { setError("Erreur lors de l'anonymisation"); } finally { setIsProcessing(false); } return; } } // Si pas de fichier, traiter le texte saisi manuellement if (!sourceText.trim()) { setError( "Veuillez saisir du texte à anonymiser ou télécharger un fichier" ); return; } setIsProcessing(true); setError(null); setOutputText(""); try { await new Promise((resolve) => setTimeout(resolve, 1500)); const anonymized = sourceText .replace(/\b[A-Z][a-z]+ [A-Z][a-z]+\b/g, "[Nom1]") .replace(/\b0[1-9](?:[\s.-]?\d{2}){4}\b/g, "[Téléphone1]") .replace( /\b[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\.[A-Z|a-z]{2,}\b/g, "[Email1]" ) .replace( /\b\d{1,3}\s+[a-zA-Z\s]+,\s*\d{5}\s+[a-zA-Z\s]+\b/g, "[Adresse1]" ) .replace( /\b\d\s\d{2}\s\d{2}\s\d{2}\s\d{3}\s\d{3}\s\d{2}\b/g, "[NuméroSS1]" ); setOutputText(anonymized); } catch { setError("Erreur lors de l'anonymisation"); } finally { setIsProcessing(false); } }; const copyToClipboard = () => { navigator.clipboard.writeText(outputText); }; const downloadText = () => { const blob = new Blob([outputText], { type: "text/plain" }); const url = URL.createObjectURL(blob); const a = document.createElement("a"); a.href = url; a.download = "texte-anonymise.txt"; document.body.appendChild(a); a.click(); document.body.removeChild(a); URL.revokeObjectURL(url); }; return (
{" "} {/* Fond vert foncé */} {/* Header */}
{" "} {/* Header vert foncé avec bordure blanche */}

{" "} {/* Titre en blanc */} OUTIL D'ANONYMISATION DE DONNÉES

{/* Main Content */}
{/* Left Panel - Source */}
{/* Tabs */}
{/* Content Area - même taille que droite */}
{/* Zone de contenu - prend tout l'espace disponible */}
{activeTab === "text" ? (
{/* Zone de texte - prend TOUT l'espace */}
{/* Placeholder conditionnel : affiché seulement si pas de texte ET pas de fichier uploadé */} {sourceText === "" && !uploadedFile && (
Tapez votre texte ici ou{" "} essayez un texte d'exemple
)} {/* Affichage du fichier uploadé dans la zone de texte */} {uploadedFile && (
{uploadedFile.name} ({(uploadedFile.size / 1024).toFixed(1)} KB)
)}