import { useSocket } from '@/hooks/useSocket'; import { Mic, Paperclip, Send, Smile } from 'lucide-react'; import { useEffect, useRef, useState, type FC, type FormEvent } from 'react'; import { toast } from 'sonner'; import { Button } from './ui/button'; import { Input } from './ui/input'; type MessageInputProps = { roomId: string; }; export const MessageInput: FC = ({ roomId }) => { const [message, setMessage] = useState(''); const [isRateLimited, setIsRateLimited] = useState(false); const [showEmojiPicker, setShowEmojiPicker] = useState(false); const [isFocused, setIsFocused] = useState(false); const inputRef = useRef(null); const { socket } = useSocket(); useEffect(() => { if (!socket) return; const handleRateLimitExceeded = (data: { message: string; remainingTime?: number; }) => { setIsRateLimited(true); toast.error(data.message); const resetTime = data.remainingTime ?? 60000; setTimeout(() => { setIsRateLimited(false); }, resetTime); }; socket.on('rate_limit_exceeded', handleRateLimitExceeded); return () => { socket.off('rate_limit_exceeded', handleRateLimitExceeded); }; }, [socket, toast]); const handleSubmit = (e: FormEvent) => { e.preventDefault(); if (!message.trim() || !socket || isRateLimited) return; socket.emit('send_message', { roomId, content: message.trim(), }); setMessage(''); }; // Function to handle emoji selection (placeholder for now) const handleEmojiClick = (emoji: string) => { setMessage((prev) => prev + emoji); inputRef.current?.focus(); setShowEmojiPicker(false); }; return (
setMessage(e.target.value)} onFocus={() => setIsFocused(true)} onBlur={() => setIsFocused(false)} placeholder={ isRateLimited ? 'Rate limited - please wait...' : 'Type your message...' } disabled={isRateLimited} className="flex-1 border-0 focus-visible:ring-0 focus-visible:ring-offset-0 bg-transparent py-2 px-3" /> {message.trim() ? ( ) : ( )}
{/* Emoji picker placeholder - you'd need to implement or use a library like emoji-mart */} {showEmojiPicker && (
{['😀', '😂', '❤️', '👍', '🎉', '🔥', '👏', '😢'].map( (emoji) => ( ) )}
)}
{isFocused && !isRateLimited && (
Press Enter to send {message.length} / 2000
)}
); };