import React, { useEffect, useState } from 'react'; import { SamplesService } from '../../openapi'; interface Event { event_type: string; } interface Sample { id: number; sample_name: string; position: number; puck_id: number; crystalname?: string; positioninpuck?: number; events: Event[]; mount_count: number; // Add this unmount_count: number; // Add this } interface Puck { id: number; puck_name: string; puck_type: string; puck_location_in_dewar: number; dewar_id: number; samples: Sample[]; } interface SampleTrackerProps { activePgroup: string; } const SampleTracker: React.FC = ({ activePgroup }) => { const [pucks, setPucks] = useState([]); const [hoveredSample, setHoveredSample] = useState<{ name: string; status: string } | null>(null); // Fetch latest sample data const fetchPucks = async () => { try { const data: Puck[] = await SamplesService.getAllPucksWithSamplesAndEventsSamplesPucksSamplesGet(activePgroup); console.log('Fetched Pucks:', data); setPucks(data); } catch (error) { console.error('Error fetching pucks', error); } }; // Polling logic using a 1-second interval useEffect(() => { fetchPucks(); const interval = setInterval(() => { fetchPucks(); }, 1000); return () => clearInterval(interval); }, [activePgroup]); const getSampleColor = (events: Event[] = []) => { const hasMounted = events.some((e) => e.event_type === 'Mounted'); const hasUnmounted = events.some((e) => e.event_type === 'Unmounted'); const hasLost = events.some((e) => e.event_type === 'Lost'); const hasFailed = events.some((e) => e.event_type === 'Failed'); // Logic for status colors if (hasFailed) return 'red'; // Failed samples: red if (hasLost) return 'orange'; // Lost samples: orange if (hasMounted && hasUnmounted) return 'green'; // Completed samples: green if (hasMounted && !hasUnmounted) return 'blue'; // Currently mounted (Pending): blue return 'gray'; // Default: gray }; const getSampleStatus = (events: Event[] = []) => { const hasMounted = events.some((e) => e.event_type === 'Mounted'); const hasUnmounted = events.some((e) => e.event_type === 'Unmounted'); const hasLost = events.some((e) => e.event_type === 'Lost'); const hasFailed = events.some((e) => e.event_type === 'Failed'); if (hasFailed) return 'Failed'; if (hasLost) return 'Lost'; if (hasMounted && !hasUnmounted) return 'In Progress'; if (hasMounted && hasUnmounted) return 'Completed'; return 'Pending'; }; return (

Sample Tracker

{pucks.map((puck) => (
{puck.puck_name.split('').map((char, i) => ( {char} ))}
{Array.from({ length: 16 }).map((_, index) => { const sample = puck.samples.find((s) => s.position === index + 1); const status = sample ? getSampleStatus(sample.events) : ''; return (
e.event_type === 'Lost') ? '1px solid red' : '1px solid lightgray', position: 'relative', // Add for overlay positioning }} onMouseEnter={() => sample && setHoveredSample({ name: sample.sample_name, status }) } onMouseLeave={() => setHoveredSample(null)} > {sample && sample.mount_count > 0 && ( // Render only if mount_count > 0 {sample.mount_count} )}
); })}
))}
{hoveredSample && (

Name: {hoveredSample.name}

Status: {hoveredSample.status}

)}
); }; export default SampleTracker;