Update frontend/src/components/ocr/ExtractionOutput.jsx
Browse files
frontend/src/components/ocr/ExtractionOutput.jsx
CHANGED
|
@@ -1,4 +1,4 @@
|
|
| 1 |
-
import React, { useState, useEffect } from "react";
|
| 2 |
import { motion, AnimatePresence } from "framer-motion";
|
| 3 |
import {
|
| 4 |
Code2,
|
|
@@ -317,12 +317,48 @@ function fieldsToText(fields) {
|
|
| 317 |
export default function ExtractionOutput({ hasFile, isProcessing, isComplete, extractionResult }) {
|
| 318 |
const [activeTab, setActiveTab] = useState("json");
|
| 319 |
const [copied, setCopied] = useState(false);
|
|
|
|
| 320 |
|
| 321 |
// Get fields from extraction result, default to empty object
|
| 322 |
const fields = extractionResult?.fields || {};
|
| 323 |
const confidence = extractionResult?.confidence || 0;
|
| 324 |
const fieldsExtracted = extractionResult?.fieldsExtracted || 0;
|
| 325 |
const totalTime = extractionResult?.totalTime || 0;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 326 |
|
| 327 |
// Initialize expanded sections based on available fields
|
| 328 |
const [expandedSections, setExpandedSections] = useState(() =>
|
|
@@ -523,7 +559,7 @@ export default function ExtractionOutput({ hasFile, isProcessing, isComplete, ex
|
|
| 523 |
<Sparkles className="h-8 w-8 text-indigo-500" />
|
| 524 |
</motion.div>
|
| 525 |
<p className="text-slate-700 font-medium mb-1">Extracting data...</p>
|
| 526 |
-
<p className="text-slate-400 text-sm">
|
| 527 |
|
| 528 |
<div className="mt-6 flex items-center justify-center gap-1">
|
| 529 |
{[0, 1, 2].map((i) => (
|
|
|
|
| 1 |
+
import React, { useState, useEffect, useRef } from "react";
|
| 2 |
import { motion, AnimatePresence } from "framer-motion";
|
| 3 |
import {
|
| 4 |
Code2,
|
|
|
|
| 317 |
export default function ExtractionOutput({ hasFile, isProcessing, isComplete, extractionResult }) {
|
| 318 |
const [activeTab, setActiveTab] = useState("json");
|
| 319 |
const [copied, setCopied] = useState(false);
|
| 320 |
+
const [statusMessage, setStatusMessage] = useState("Preparing document...");
|
| 321 |
|
| 322 |
// Get fields from extraction result, default to empty object
|
| 323 |
const fields = extractionResult?.fields || {};
|
| 324 |
const confidence = extractionResult?.confidence || 0;
|
| 325 |
const fieldsExtracted = extractionResult?.fieldsExtracted || 0;
|
| 326 |
const totalTime = extractionResult?.totalTime || 0;
|
| 327 |
+
|
| 328 |
+
// Dynamic status messages that rotate during processing
|
| 329 |
+
const statusMessages = [
|
| 330 |
+
"Preparing document...",
|
| 331 |
+
"Converting pages to images...",
|
| 332 |
+
"Sending to AI model...",
|
| 333 |
+
"Reading text from document...",
|
| 334 |
+
"Identifying document structure...",
|
| 335 |
+
"Extracting tables and data...",
|
| 336 |
+
"Analyzing content...",
|
| 337 |
+
"Processing pages...",
|
| 338 |
+
"Organizing extracted information...",
|
| 339 |
+
"Finalizing results...",
|
| 340 |
+
];
|
| 341 |
+
|
| 342 |
+
// Rotate status messages during processing
|
| 343 |
+
const messageIndexRef = useRef(0);
|
| 344 |
+
|
| 345 |
+
useEffect(() => {
|
| 346 |
+
if (!isProcessing) {
|
| 347 |
+
setStatusMessage("Analyzing document structure");
|
| 348 |
+
messageIndexRef.current = 0;
|
| 349 |
+
return;
|
| 350 |
+
}
|
| 351 |
+
|
| 352 |
+
setStatusMessage(statusMessages[0]);
|
| 353 |
+
messageIndexRef.current = 0;
|
| 354 |
+
|
| 355 |
+
const interval = setInterval(() => {
|
| 356 |
+
messageIndexRef.current = (messageIndexRef.current + 1) % statusMessages.length;
|
| 357 |
+
setStatusMessage(statusMessages[messageIndexRef.current]);
|
| 358 |
+
}, 2500); // Change message every 2.5 seconds
|
| 359 |
+
|
| 360 |
+
return () => clearInterval(interval);
|
| 361 |
+
}, [isProcessing]);
|
| 362 |
|
| 363 |
// Initialize expanded sections based on available fields
|
| 364 |
const [expandedSections, setExpandedSections] = useState(() =>
|
|
|
|
| 559 |
<Sparkles className="h-8 w-8 text-indigo-500" />
|
| 560 |
</motion.div>
|
| 561 |
<p className="text-slate-700 font-medium mb-1">Extracting data...</p>
|
| 562 |
+
<p className="text-slate-400 text-sm">{statusMessage}</p>
|
| 563 |
|
| 564 |
<div className="mt-6 flex items-center justify-center gap-1">
|
| 565 |
{[0, 1, 2].map((i) => (
|