import { useState, useEffect, useRef } from 'react'; import { Play, Pause, RotateCcw, AlertTriangle, Clock, Info } from 'lucide-react'; import { Button } from '@/components/ui/button'; import Badge from '@/components/shared/Badge'; const RCPTimer = () => { const [isRunning, setIsRunning] = useState(false); const [elapsedTime, setElapsedTime] = useState(0); // en segundos const [cycles, setCycles] = useState(0); const [lastCycleTime, setLastCycleTime] = useState(0); const intervalRef = useRef(null); const audioRef = useRef(null); // Ciclo de RCP: 2 minutos = 120 segundos const CYCLE_DURATION = 120; useEffect(() => { if (isRunning) { intervalRef.current = setInterval(() => { setElapsedTime((prev) => { const newTime = prev + 1; const cycleTime = newTime - lastCycleTime; // Alerta cada 2 minutos (cambio de reanimador) if (cycleTime >= CYCLE_DURATION) { setCycles((prev) => prev + 1); setLastCycleTime(newTime); playAlert(); } return newTime; }); }, 1000); } else { if (intervalRef.current) { clearInterval(intervalRef.current); } } return () => { if (intervalRef.current) { clearInterval(intervalRef.current); } }; }, [isRunning, lastCycleTime]); const playAlert = () => { // Crear audio para alerta (usando Web Audio API) if (typeof Audio !== 'undefined') { const audioContext = new (window.AudioContext || (window as any).webkitAudioContext)(); const oscillator = audioContext.createOscillator(); const gainNode = audioContext.createGain(); oscillator.connect(gainNode); gainNode.connect(audioContext.destination); oscillator.frequency.value = 800; oscillator.type = 'sine'; gainNode.gain.setValueAtTime(0.3, audioContext.currentTime); gainNode.gain.exponentialRampToValueAtTime(0.01, audioContext.currentTime + 0.5); oscillator.start(audioContext.currentTime); oscillator.stop(audioContext.currentTime + 0.5); } }; const handleStart = () => { setIsRunning(true); if (elapsedTime === 0) { setLastCycleTime(0); } }; const handlePause = () => { setIsRunning(false); }; const handleReset = () => { setIsRunning(false); setElapsedTime(0); setCycles(0); setLastCycleTime(0); }; const formatTime = (seconds: number): string => { const mins = Math.floor(seconds / 60); const secs = seconds % 60; return `${mins.toString().padStart(2, '0')}:${secs.toString().padStart(2, '0')}`; }; const cycleTime = elapsedTime - lastCycleTime; const timeUntilNextCycle = CYCLE_DURATION - cycleTime; const progress = (cycleTime / CYCLE_DURATION) * 100; return (

⏱️ Temporizador de RCP

{/* Información */}

Ciclos de RCP:

Cada 2 minutos (120 segundos) se debe cambiar de reanimador para mantener calidad de compresiones.

{/* Tiempo principal */}

Tiempo Total

{formatTime(elapsedTime)}

Ciclos completados: {cycles}
{/* Progreso del ciclo actual */} {isRunning && (
Tiempo hasta cambio de reanimador {formatTime(timeUntilNextCycle)}
{timeUntilNextCycle <= 10 && timeUntilNextCycle > 0 && (

¡Cambio de reanimador en {timeUntilNextCycle} segundos!

)}
)} {/* Controles */}
{!isRunning ? ( ) : ( )}
{/* Instrucciones */}

Uso: Iniciar cuando comience RCP. El temporizador alertará cada 2 minutos para cambio de reanimador. Pausar durante desfibrilación si es necesario.

); }; export default RCPTimer;