import React, { useEffect, useRef } from 'react'; import { useVoiceStore } from '../../stores/voiceStore'; import { wsSend } from '../../hooks/useWebSocket'; export function IncomingCallModal() { const incomingCall = useVoiceStore((s) => s.incomingCall); const setIncomingCall = useVoiceStore((s) => s.setIncomingCall); const timerRef = useRef | null>(null); // Auto-dismiss after 30 seconds useEffect(() => { if (incomingCall) { timerRef.current = setTimeout(() => { // Auto-reject after timeout wsSend({ type: 'dm_call_reject', dmChannelId: incomingCall.dmChannelId }); setIncomingCall(null); }, 30000); } return () => { if (timerRef.current) { clearTimeout(timerRef.current); timerRef.current = null; } }; }, [incomingCall, setIncomingCall]); if (!incomingCall) return null; const handleAccept = () => { if (timerRef.current) clearTimeout(timerRef.current); wsSend({ type: 'dm_call_accept', dmChannelId: incomingCall.dmChannelId }); }; const handleDecline = () => { if (timerRef.current) clearTimeout(timerRef.current); wsSend({ type: 'dm_call_reject', dmChannelId: incomingCall.dmChannelId }); setIncomingCall(null); }; return (
{/* Backdrop */}
{/* Call card */}
{/* Ring animation background */}
{/* Content */}
{/* Caller avatar */}
{incomingCall.callerName.charAt(0).toUpperCase()}
{/* Ringing phone icon */}
{/* Caller info */}

{incomingCall.callerName}

Incoming Voice Call...

{/* Action buttons */}
{/* Decline */} {/* Accept */}
); }