import React, { useState, useCallback } from "react"; import { useDropzone } from "react-dropzone"; import { apiClient, SpectrumData, PredictionResult } from "../apiClient"; import SpectrumChart from "./SpectrumChart"; import ResultsDisplay from "./ResultsDisplay"; import "../static/style.css"; interface StandardAnalysisProps { selectedModel: string; modality: "raman" | "ftir"; onSpectrumChange: (data: SpectrumData | null) => void; } const StandardAnalysis: React.FC = ({ selectedModel, modality, onSpectrumChange, }) => { const [spectrum, setSpectrum] = useState(null); const [result, setResult] = useState(null); const [loading, setLoading] = useState(false); const [error, setError] = useState(null); const onDrop = useCallback( async (acceptedFiles: File[]) => { if (acceptedFiles.length === 0) return; const file = acceptedFiles[0]; setResult(null); setError(null); setLoading(true); try { const uploadedSpectrum = await apiClient.uploadSpectrum(file); setSpectrum(uploadedSpectrum); onSpectrumChange(uploadedSpectrum); } catch (err) { setError(err instanceof Error ? err.message : "Failed to upload file"); } finally { setLoading(false); } }, [onSpectrumChange] ); const { getRootProps, getInputProps, isDragActive } = useDropzone({ onDrop, accept: { "text/plain": [".txt", ".csv"], "application/json": [".json"] }, multiple: false, }); const handleAnalyze = async () => { if (!spectrum) return; setError(null); setLoading(true); try { const analysisResult = await apiClient.analyzeSpectrum({ spectrum, model_name: selectedModel, modality, include_provenance: true, }); setResult(analysisResult); } catch (err) { setError(err instanceof Error ? err.message : "Analysis failed"); } finally { setLoading(false); } }; const handleReset = () => { setSpectrum(null); onSpectrumChange(null); setResult(null); setError(null); }; return (
{/* --- LEFT COLUMN --- */}

Upload Spectrum

{/* Updated Dropzone Text */}

{isDragActive ? "Drop file to upload" : "Drag & drop, or click to select"}

Supports .txt, .csv, and .json files

Upload a spectrum file for analysis. You can drag and drop or click to select. Supported formats: .txt, .csv, .json
{/* New Sample Data Link Section */}
New to PolymerOS? Try a Sample Dataset
{error &&
{error}
} {loading && (
Processing...
)} {spectrum && !loading && (

Loaded: {spectrum.filename || "Unknown"}

)}
{/* --- RIGHT COLUMN --- */}

Analysis Results

{spectrum && (
)} {result ? ( ) : (

Upload a spectrum to view analysis results

)}
); }; export default StandardAnalysis;