import { useState, useEffect, useRef } from 'react'; import { X, Send, Loader2 } from 'lucide-react'; import { useDriverMessages, useSendMessage, useMarkMessagesAsRead } from '../hooks/useSignalMessages'; import { useFormattedDate } from '@/hooks/useFormattedDate'; interface Driver { id: string; name: string; phone: string; } interface DriverChatModalProps { driver: Driver | null; isOpen: boolean; onClose: () => void; } export function DriverChatModal({ driver, isOpen, onClose }: DriverChatModalProps) { const [message, setMessage] = useState(''); const messagesEndRef = useRef(null); const inputRef = useRef(null); const { formatDateTime } = useFormattedDate(); const { data: messages, isLoading } = useDriverMessages(driver?.id || null, isOpen); const sendMessage = useSendMessage(); const markAsRead = useMarkMessagesAsRead(); // Scroll to bottom when messages change useEffect(() => { messagesEndRef.current?.scrollIntoView({ behavior: 'smooth' }); }, [messages]); // Focus input when modal opens useEffect(() => { if (isOpen && inputRef.current) { setTimeout(() => inputRef.current?.focus(), 100); } }, [isOpen]); // Mark messages as read when opening chat useEffect(() => { if (isOpen && driver?.id) { markAsRead.mutate(driver.id); } }, [isOpen, driver?.id]); if (!isOpen || !driver) return null; const handleSend = async () => { const trimmedMessage = message.trim(); if (!trimmedMessage || sendMessage.isPending) return; try { await sendMessage.mutateAsync({ driverId: driver.id, content: trimmedMessage, }); setMessage(''); } catch (error) { console.error('Failed to send message:', error); } }; const handleKeyDown = (e: React.KeyboardEvent) => { if (e.key === 'Enter' && !e.shiftKey) { e.preventDefault(); handleSend(); } }; return (
{/* Header */}

{driver.name}

{driver.phone}
{/* Messages */}
{isLoading ? (
) : messages && messages.length > 0 ? ( <> {messages.map((msg) => (

{msg.content}

{formatDateTime(msg.timestamp)}

))}
) : (

No messages yet. Send a message to start the conversation.

)}
{/* Input */}