import { useState } from "react"; import { PresidioAnalyzerResult, EntityMapping, } from "@/app/config/entityLabels"; // Interface pour la réponse de l'API process-document interface ProcessDocumentResponse { text?: string; anonymizedText?: string; analyzerResults?: PresidioAnalyzerResult[]; replacementValues?: Record; // Nouvelle propriété error?: string; } // Props du hook interface AnonymizationLogicProps { setOutputText: (text: string) => void; setError: (error: string | null) => void; setEntityMappings: (mappings: EntityMapping[]) => void; } // NOUVEAU: Définir les types pour le paramètre de anonymizeData interface AnonymizeDataParams { file?: File | null; text?: string; } /** * Hook pour la logique d'anonymisation. * Gère l'appel API et la création du tableau de mapping de manière simple et directe. */ export const useAnonymization = ({ setOutputText, setError, setEntityMappings, }: AnonymizationLogicProps) => { const [isProcessing, setIsProcessing] = useState(false); const anonymizeData = async ({ file, text }: AnonymizeDataParams) => { setIsProcessing(true); setError(null); setEntityMappings([]); setOutputText(""); try { // ÉTAPE 1: Construire le FormData ici pour garantir le bon format const formData = new FormData(); if (file) { formData.append("file", file); } else if (text) { // Si c'est du texte, on le transforme en Blob pour l'envoyer comme un fichier const textBlob = new Blob([text], { type: "text/plain" }); formData.append("file", textBlob, "input.txt"); } else { throw new Error("Aucune donnée à anonymiser (ni fichier, ni texte)."); } const response = await fetch("/api/process-document", { method: "POST", body: formData, // Le Content-Type sera automatiquement défini par le navigateur }); const data: ProcessDocumentResponse = await response.json(); if (!response.ok || data.error) { throw new Error( data.error || "Erreur lors de la communication avec l'API." ); } const originalText = data.text || ""; const presidioResults = data.analyzerResults || []; const replacementValues = data.replacementValues || {}; // Récupérer les valeurs de remplacement // 🔍 AJOUT DES CONSOLE.LOG POUR DÉBOGUER console.log("📊 Données reçues de Presidio:", { originalTextLength: originalText.length, presidioResultsCount: presidioResults.length, presidioResults: presidioResults, replacementValues: replacementValues, replacementValuesKeys: Object.keys(replacementValues), replacementValuesEntries: Object.entries(replacementValues) }); // ÉTAPE 2 : Passer le texte ORIGINAL à l'état de sortie. setOutputText(originalText); // ÉTAPE 3 : Créer le tableau de mapping avec la nouvelle structure const sortedResults = [...presidioResults].sort( (a, b) => a.start - b.start ); const mappings: EntityMapping[] = []; // Dans la fonction anonymizeData, section création des mappings : for (const result of sortedResults) { const { entity_type, start, end } = result; const detectedText = originalText.substring(start, end); // 🔍 CONSOLE.LOG POUR CHAQUE ENTITÉ console.log(`🔍 Entité détectée:`, { entity_type, detectedText, replacementFromMap: replacementValues[detectedText], fallback: `[${entity_type}]` }); mappings.push({ entity_type: entity_type, start: start, end: end, text: detectedText, replacementValue: replacementValues[detectedText] || `[${entity_type}]`, displayName: replacementValues[detectedText] || `[${entity_type}]`, // Ajouter cette ligne customColor: undefined, }); } // 🔍 CONSOLE.LOG FINAL DES MAPPINGS console.log("📋 Mappings créés:", mappings); // ÉTAPE 4 : Mettre à jour l'état global avec les mappings créés. setEntityMappings(mappings); } catch (error) { console.error("Erreur dans useAnonymization:", error); setError( error instanceof Error ? error.message : "Une erreur inconnue est survenue." ); } finally { setIsProcessing(false); } }; return { anonymizeData, isProcessing, }; };