import { useEffect, useState, useRef } from "react"; import { api } from "../api/client"; import { useAuth } from "../contexts/AuthContext"; import { saveGuestInterview } from "@/lib/guestStorage"; import "./Processing.css"; const STEPS = [ { id: "scoring", label: "Scoring all answers" }, { id: "fluency", label: "Detecting filler words" }, { id: "posture", label: "Analysing posture" }, { id: "report", label: "Building action plan" } ]; export default function Processing({ sessionId, onDone }) { const { isGuest } = useAuth(); const [currentStep, setCurrentStep] = useState(0); const [error, setError] = useState(null); const [completedSteps, setCompletedSteps] = useState([]); const hasStarted = useRef(false); useEffect(() => { if (hasStarted.current || !sessionId) return; hasStarted.current = true; const runAnalysis = async () => { try { // Step 1: Aggregate (Scoring & Posture) setCurrentStep(0); await api.aggregate(sessionId); setCompletedSteps(prev => [...prev, "scoring"]); // Step 2: Analytics (Filler words & patterns) setCurrentStep(1); await api.analytics(sessionId); setCompletedSteps(prev => [...prev, "fluency"]); // Step 3: Decision (Final recommendation) setCurrentStep(2); await api.decision(sessionId); setCompletedSteps(prev => [...prev, "posture"]); // Step 4: Build Report (Fetch final data) setCurrentStep(3); const report = await api.getReport(sessionId); setCompletedSteps(prev => [...prev, "report"]); // Save to guest storage for guest users if (isGuest && report) { try { await saveGuestInterview(sessionId, report); } catch (e) { console.warn("Failed to save guest interview:", e); } } // Small delay for UX so user sees the last step complete setTimeout(() => onDone(report), 800); } catch (err) { console.error("Analysis pipeline failed:", err); setError(err.message || "The analysis engine encountered an error. Please try again."); } }; runAnalysis(); }, [sessionId, onDone, isGuest]); const handleRetry = () => { setError(null); setCompletedSteps([]); hasStarted.current = false; // The effect will re-run }; return (
{error}
Generating your personalised scorecard and action plan.