import React, { useEffect } from 'react'; export default function IncomingCallModal({ incomingCall, onAccept, onDecline }) { useEffect(() => { const audioCtx = new (window.AudioContext || window.webkitAudioContext)(); let interval; const beep = (freq, startTime, duration) => { const osc = audioCtx.createOscillator(); const gain = audioCtx.createGain(); osc.type = 'sine'; osc.frequency.setValueAtTime(freq, startTime); gain.gain.setValueAtTime(0, startTime); gain.gain.linearRampToValueAtTime(0.1, startTime + 0.05); gain.gain.linearRampToValueAtTime(0, startTime + duration); osc.connect(gain); gain.connect(audioCtx.destination); osc.start(startTime); osc.stop(startTime + duration); }; const playRing = () => { if (audioCtx.state === 'suspended') audioCtx.resume(); const now = audioCtx.currentTime; beep(440, now, 0.4); beep(523.25, now + 0.2, 0.4); }; playRing(); interval = setInterval(playRing, 2000); return () => { clearInterval(interval); audioCtx.close().catch(() => {}); }; },[]); const isGroup = incomingCall.isGroup; const isVideo = incomingCall.callType === 'video'; const title = isGroup ? incomingCall.gcName : incomingCall.profile.displayName; const subtitle = isGroup ? `Group Whisper started by ${incomingCall.callerName}` : (isVideo ? 'INCOMING VIDEO CALL' : 'INCOMING VOICE CALL'); const avatar = isGroup ? null : incomingCall.profile.avatar; const fallback = isGroup ? '👥' : (incomingCall.profile.displayName?.substring(0, 2).toUpperCase() || '?'); return (
{avatar ? ( avatar ) : ( fallback )}

{title}

{subtitle}
); }