import { Upload, FileText, AlertTriangle, Shield, Copy, Download, } from "lucide-react"; import { SampleTextComponent } from "./SampleTextComponent"; import { SupportedDataTypes } from "./SupportedDataTypes"; import { AnonymizationInterface } from "./AnonymizationInterface"; import { highlightEntities } from "../utils/highlightEntities"; interface EntityMapping { originalValue: string; anonymizedValue: string; entityType: string; startIndex: number; endIndex: number; } interface FileUploadComponentProps { uploadedFile: File | null; handleFileChange: (e: React.ChangeEvent) => void; sourceText: string; setSourceText: (text: string) => void; setUploadedFile: (file: File | null) => void; setFileContent: (content: string) => void; onAnonymize?: () => void; isProcessing?: boolean; canAnonymize?: boolean; isLoadingFile?: boolean; onRestart?: () => void; outputText?: string; copyToClipboard?: () => void; downloadText?: () => void; isExampleLoaded?: boolean; setIsExampleLoaded?: (loaded: boolean) => void; entityMappings?: EntityMapping[]; // Ajouter cette prop } export const FileUploadComponent = ({ uploadedFile, handleFileChange, sourceText, setSourceText, setUploadedFile, setFileContent, onAnonymize, isProcessing = false, canAnonymize = false, isLoadingFile = false, onRestart, outputText, copyToClipboard, downloadText, setIsExampleLoaded, entityMappings, // Ajouter cette prop ici }: FileUploadComponentProps) => { // On passe en preview seulement si : // 1. Un fichier est uploadé OU // 2. On a un résultat d'anonymisation // (On retire isExampleLoaded pour permettre l'édition du texte d'exemple) if (uploadedFile || outputText) { return (
{/* Si on a un résultat, afficher 2 blocs côte à côte */} {outputText ? (
{/* Preview du document original */}
{uploadedFile ? (

{uploadedFile.name} •{" "} {(uploadedFile.size / 1024).toFixed(1)} KB

) : (

Demo - Exemple de texte

)}
                    {sourceText || "Aucun contenu à afficher"}
                  
{/* Bloc résultat anonymisé */}

Document anonymisé

{/* Boutons d'action */}
{copyToClipboard && ( )} {downloadText && ( )}
{highlightEntities( outputText || "Aucun contenu à afficher", entityMappings // Ajouter les mappings ici )}
) : ( /* Preview normal quand pas de résultat */
{uploadedFile ? (

{uploadedFile.name} •{" "} {(uploadedFile.size / 1024).toFixed(1)} KB

) : (

Demo - Exemple de texte

)}
{/* Zone de texte avec limite de hauteur et scroll */}
{isLoadingFile ? (
Chargement du fichier en cours...
) : (
                    {sourceText || "Aucun contenu à afficher"}
                  
)}
{/* Disclaimer déplacé en dessous du texte */}

Cet outil IA peut ne pas détecter toutes les informations sensibles. Vérifiez le résultat avant de le partager.

)} {/* Boutons d'action - Responsive mobile */} {canAnonymize && !isLoadingFile && (
{/* Bouton Anonymiser en premier */} {onAnonymize && ( )} {/* Bouton Recommencer */} {onRestart && ( )}
)} {/* Affichage conditionnel : Interface d'anonymisation OU Types de données supportées */} {isProcessing || outputText ? ( ) : ( )}
); } return (
{/* Deux colonnes côte à côte */}
{/* Colonne gauche - Zone de texte */}
{/* Header avec icône */}
{/* Titre */}

Saisissez votre texte

Tapez ou collez votre texte ici

{/* Zone de texte éditable */}
{/* Zone pour le texte - SANS overflow */}
{" "} {/* Ajout de pb-6 pour le compteur */} {/* Placeholder personnalisé avec lien cliquable */} {!sourceText && (
Commencez à taper du texte, ou 
)}