import React, { useState, useEffect, useCallback } from 'react'; import { Experiment, ExperimentCreateInput, ExperimentType, ExperimentStatus, ExperimentMetric } from '../types'; import { getExperiment, updateExperiment, deleteExperiment, calculateExperimentPerformance } from '../services/experiments'; import { ExperimentStatusBadge, ExperimentTypeBadge } from './ExperimentBadge'; interface ExperimentDetailProps { experimentId: string | null; onClose: () => void; salesData?: any[]; } const ExperimentDetail: React.FC = ({ experimentId, onClose, salesData = [] }) => { const [experiment, setExperiment] = useState(null); const [loading, setLoading] = useState(false); const [editing, setEditing] = useState(false); const [formData, setFormData] = useState>({}); const loadExperiment = useCallback(async () => { if (!experimentId) return; setLoading(true); try { const data = await getExperiment(experimentId); setExperiment(data); setFormData(data || {}); } catch (e: any) { console.error('Failed to load experiment:', e); } finally { setLoading(false); } }, [experimentId]); useEffect(() => { if (experimentId) { loadExperiment(); } }, [experimentId, loadExperiment]); const handleSave = async () => { if (!experimentId) return; setLoading(true); try { const updated = await updateExperiment(experimentId, formData); setExperiment(updated); setEditing(false); } catch (e: any) { alert(`Error saving: ${e.message}`); } finally { setLoading(false); } }; const handleCalculateResults = async () => { if (!experiment || !salesData.length) return; setLoading(true); try { const perf = await calculateExperimentPerformance(experiment, salesData); const updated = await updateExperiment(experiment.id, perf); setExperiment(updated); } catch (e: any) { alert(`Error calculating results: ${e.message}`); } finally { setLoading(false); } }; if (!experimentId) return null; return (
{/* Header */}
{editing ? ( setFormData({ ...formData, name: e.target.value })} className="text-xl font-bold bg-slate-800 border border-slate-600 rounded-lg px-3 py-1 text-white" /> ) : (

{experiment?.name || 'Loading...'}

)} {experiment && (
)}
{editing ? ( <> ) : ( <> )}
{/* Content */}
{loading && !experiment ? (
) : experiment ? (
{/* Performance Cards */} {(experiment.experiment_units !== undefined || experiment.baseline_units !== undefined) && (
= 0 ? '+' : ''}${experiment.actual_lift_percent}%` : '—'} color={experiment.actual_lift_percent && experiment.actual_lift_percent >= 0 ? 'emerald' : 'red'} />
)} {/* Calculate Results Button */} {experiment.status === 'completed' && experiment.experiment_units === undefined && salesData.length > 0 && ( )} {/* Details Grid */}
{/* Left Column */}
{editing ? ( <>