import React, { useState, useEffect, useRef } from 'react'; import { Head, Link, router } from '@inertiajs/react'; import EmployerLayout from '../../../Layouts/EmployerLayout'; import { Send, ArrowLeft, CheckCircle2, Globe2, DollarSign, Sparkles, MoreVertical, Phone, Video, Paperclip, Search, Info, Calendar, Briefcase, ShieldCheck, ChevronRight, MapPin, Smile, X, MessageSquare, Eye, UploadCloud, FileText } from 'lucide-react'; import { toast } from 'sonner'; export default function Show({ conversation, initialMessages, conversations = [] }) { const [messages, setMessages] = useState(initialMessages || []); const [input, setInput] = useState(''); const [isTyping, setIsTyping] = useState(false); const [searchTerm, setSearchTerm] = useState(''); const [showProfile, setShowProfile] = useState(true); const [showAttachmentModal, setShowAttachmentModal] = useState(false); const [uploadedFiles, setUploadedFiles] = useState([]); const messagesEndRef = useRef(null); const scrollToBottom = () => { messagesEndRef.current?.scrollIntoView({ behavior: "smooth" }); }; useEffect(() => { scrollToBottom(); }, [messages, isTyping]); useEffect(() => { setMessages(initialMessages || []); }, [initialMessages]); // Simulate typing indicator when conversation opens useEffect(() => { setIsTyping(true); const timer = setTimeout(() => setIsTyping(false), 2500); return () => clearTimeout(timer); }, [conversation.id]); const filteredConversations = (conversations || []).filter(c => c.worker_name.toLowerCase().includes(searchTerm.toLowerCase()) ); const sendMsg = (text) => { if (!text.trim()) return; // Optimistically update message feed const newMsg = { id: Date.now(), sender: 'employer', text: text, time: 'Just Now', read: false }; setMessages(prev => [...prev, newMsg]); setInput(''); router.post(`/employer/messages/${conversation.id}/send`, { text: text }, { preserveScroll: true, onSuccess: () => { // Show immediate confirmation of the push alert popping up on worker mobile app toast.success(`🔔 Direct Mobile Push Notification sent!`, { description: `Popped up instantly on ${conversation.worker_name}'s mobile device.`, duration: 4500, }); // Simulate worker typing response shortly after setTimeout(() => { setIsTyping(true); setTimeout(() => { setIsTyping(false); const autoReply = { id: Date.now() + 1, sender: 'worker', text: "Thank you for your response! I have reviewed your offer proposal and am looking forward to our video interview.", time: 'Just Now' }; setMessages(prev => [...prev, autoReply]); // Pop up a clear message received notification for the sponsor toast.info(`✉️ New message from ${conversation.worker_name}!`, { description: autoReply.text, duration: 5000 }); }, 2000); }, 1500); } }); }; const handleFormSubmit = (e) => { e.preventDefault(); sendMsg(input); }; const handleFileUpload = (e) => { const file = e.target.files[0]; if (!file) return; const newFile = { name: file.name, size: (file.size / 1024).toFixed(1) + ' KB', date: 'Today' }; setUploadedFiles([...uploadedFiles, newFile]); toast.success("📎 Document attached successfully!"); setShowAttachmentModal(false); // Optimistically insert attachment message sendMsg(`[Document Attached: ${file.name}]`); }; const chips = [ "Are you available for a video interview today?", "What is your final expected salary?", "Can you transfer your visa immediately?" ]; return (
{/* Conversation List Sidebar (Desktop) */} {/* Main Chat Interface */}
{/* Header */}
setShowProfile(!showProfile)}>
{conversation.worker_name.charAt(0)}

{conversation.worker_name}

Active Now
{/* WhatsApp Bridge Widget & Dossier Button */}
WhatsApp Bridge
{/* Chat Messages Log */}
Today • Realtime Chat Logs
{messages.map((msg, idx) => { const isEmp = msg.sender === 'employer'; return (
{msg.text}
{msg.time} {isEmp && ( Read )}
); })} {isTyping && (
)}
{/* Quick replies & typing input */}
{chips.map((chip, idx) => ( ))}
setInput(e.target.value)} placeholder="Type a compliant secure message..." className="flex-1 px-5 py-3.5 bg-slate-50 rounded-xl text-xs font-semibold outline-none border border-transparent focus:border-slate-200 transition-all" />
{/* Candidate Context Sidebar (Right) */} {showProfile && ( )}
{/* Interactive File Attachment Modal Placeholder */} {showAttachmentModal && (

Attach Verified Sponsor Documents

Upload sponsor papers, employment agreements, or work descriptions to review securely.

Select files or drag here
PDF, JPG, PNG (Max 5MB)
)} ); }