import React, { useState, useEffect, useRef } from 'react'; import { StorageService } from '../services/storageService'; import { RewardService } from '../services/rewardService'; import { CommunityMessage, UserProfile, ChatGroup, DirectMessage } from '../types'; import { Button } from '../components/ui/Button'; import { Send, MessageCircle, Loader2, Image as ImageIcon, Smile, Plus, Hash, Users, X, Search, ChevronLeft, Gift, Coins, Cpu, Bot, UserPlus, Check, UserCheck, Upload } from 'lucide-react'; import { useLanguage } from '../contexts/LanguageContext'; import { useNavigate } from 'react-router-dom'; const EMOJIS = ['👍', '❤️', '😂', '😮', '😢', '🔥', '🎉', '🙏', '🇳🇵', '👋', '😊', '🤔']; const CommunityChat: React.FC = () => { const { t } = useLanguage(); const navigate = useNavigate(); const [activeTab, setActiveTab] = useState<'community' | 'dm'>('community'); const [messages, setMessages] = useState([]); const [directMessages, setDirectMessages] = useState([]); const [groups, setGroups] = useState([]); const [availableUsers, setAvailableUsers] = useState([]); const [friendRequests, setFriendRequests] = useState([]); const [activeGroup, setActiveGroup] = useState(null); const [activeDmUser, setActiveDmUser] = useState(null); const [input, setInput] = useState(''); const [profile, setProfile] = useState(null); const [loading, setLoading] = useState(true); const messagesEndRef = useRef(null); const [showEmojiPicker, setShowEmojiPicker] = useState(false); const [isSidebarOpen, setIsSidebarOpen] = useState(false); const [showCreateGroup, setShowCreateGroup] = useState(false); const [showGiftModal, setShowGiftModal] = useState(false); const [giftAmount, setGiftAmount] = useState(10); const [newGroupName, setNewGroupName] = useState(''); const [searchUserQuery, setSearchUserQuery] = useState(''); const [searchResults, setSearchResults] = useState([]); const [selectedMembers, setSelectedMembers] = useState([]); // Image Preview State const [previewImage, setPreviewImage] = useState(null); useEffect(() => { loadInitialData(); const interval = setInterval(refreshData, 3000); return () => clearInterval(interval); }, [activeGroup, activeDmUser, activeTab]); useEffect(() => { messagesEndRef.current?.scrollIntoView({ behavior: 'smooth' }); }, [messages, directMessages, activeTab]); useEffect(() => { if (searchUserQuery.trim().length > 1) { StorageService.searchUsers(searchUserQuery).then(setSearchResults); } else { setSearchResults([]); } }, [searchUserQuery]); const loadInitialData = async () => { setLoading(true); await refreshData(); const p = await StorageService.getProfile(); setProfile(p); setLoading(false); }; const isDemoUser = (email?: string) => { return email === 'admin@gmail.com' || email?.endsWith('@demo.com'); }; const refreshData = async () => { const p = await StorageService.getProfile(); if (!p) return; setProfile(p); if (activeTab === 'community') { const msgs = await StorageService.getCommunityMessages(activeGroup?.id); const grps = await StorageService.getGroups(); setMessages(msgs); setGroups(grps); } else { // Fetch all users to filter friends const allUsers = await StorageService.getAvailableUsers(); const currentUserIsDemo = isDemoUser(p.email); // Filter Friends & Rudra for DM List // Also allow demo accounts to see each other const friendsList = allUsers.filter(u => { if (u.id === 'rudra-ai-system') return true; if (p.friends && p.friends.includes(u.id)) return true; if (currentUserIsDemo && isDemoUser(u.email)) return true; return false; }); setAvailableUsers(friendsList); // Get Friend Requests if (p.friendRequests && p.friendRequests.length > 0) { const requests = allUsers.filter(u => p.friendRequests!.includes(u.id)); setFriendRequests(requests); } else { setFriendRequests([]); } if (activeDmUser) { const dms = await StorageService.getDirectMessages(activeDmUser.id); setDirectMessages(dms); } } }; const handleSend = async (e: React.FormEvent) => { e.preventDefault(); if (!input.trim() || !profile) return; if (activeTab === 'community') { await StorageService.sendCommunityMessage(input.trim(), 'text', undefined, activeGroup?.id); const msgs = await StorageService.getCommunityMessages(activeGroup?.id); setMessages(msgs); } else { if (activeDmUser) { await StorageService.sendDirectMessage(activeDmUser.id, input.trim()); const dms = await StorageService.getDirectMessages(activeDmUser.id); setDirectMessages(dms); } } setInput(''); setShowEmojiPicker(false); }; const handleImageUpload = (e: React.ChangeEvent) => { const file = e.target.files?.[0]; if (file) { const reader = new FileReader(); reader.onloadend = async () => { const base64 = reader.result as string; if (activeTab === 'community') { await StorageService.sendCommunityMessage('', 'image', base64, activeGroup?.id); refreshData(); } else if (activeDmUser) { await StorageService.sendDirectMessage(activeDmUser.id, '', 'image', { imageUrl: base64 }); refreshData(); } }; reader.readAsDataURL(file); } }; const handleGiftKarma = async () => { if (!activeDmUser || !profile) return; const result = await RewardService.transferKarma(profile.id, activeDmUser.id, giftAmount); if (result.success) { await StorageService.sendDirectMessage(activeDmUser.id, `Sent ${giftAmount} Karma Points`, 'karma', { amount: giftAmount }); const dms = await StorageService.getDirectMessages(activeDmUser.id); setDirectMessages(dms); const updatedProfile = await StorageService.getProfile(); setProfile(updatedProfile); setShowGiftModal(false); } else { alert(result.message); } }; const handleCreateGroup = async () => { if (!newGroupName.trim()) return; const res = await StorageService.createGroup(newGroupName, selectedMembers); if (res.success && res.groupId) { setShowCreateGroup(false); setNewGroupName(''); setSelectedMembers([]); setSearchUserQuery(''); const grps = await StorageService.getGroups(); setGroups(grps); const newGrp = grps.find(g => g.id === res.groupId); if (newGrp) setActiveGroup(newGrp); } }; const toggleMember = (username: string) => { if (selectedMembers.includes(username)) setSelectedMembers(prev => prev.filter(u => u !== username)); else setSelectedMembers(prev => [...prev, username]); }; const handleAcceptRequest = async (userId: string) => { await StorageService.acceptFriendRequest(userId); refreshData(); }; const handleRejectRequest = async (userId: string) => { await StorageService.rejectFriendRequest(userId); refreshData(); }; if (loading) return (
); return (
{/* Sidebar */}
{activeTab === 'community' ? ( <>
Your Groups
{groups.map(group => ( ))} ) : ( <> {friendRequests.length > 0 && (

Friend Requests

{friendRequests.map(req => (

{req.name}

))}
)}

Direct Messages

{availableUsers.map(user => { const isAI = user.id === 'rudra-ai-system'; return ( ); })} {availableUsers.length === 0 && (

No friends yet.

Connect with people in Community Chat to DM them.

)}
)}
{/* Main Chat Area */}
{activeTab === 'community' ? ( <>
{activeGroup ? : }

{activeGroup ? activeGroup.name : "Global Chat"}

{activeGroup ? `${activeGroup.members.length} MEMBERS` : t("LIVE PUBLIC FEED", "LIVE PUBLIC FEED")}

) : activeDmUser ? ( <>
navigate(`/profile/${activeDmUser.id}`)}>

navigate(`/profile/${activeDmUser.id}`)}>{activeDmUser.name}

@{activeDmUser.username || 'user'} • {activeDmUser.role}

) : (
Select a friend to message
)}
{activeTab === 'dm' && activeDmUser && activeDmUser.id !== 'rudra-ai-system' && ( )}
{(activeTab === 'community' ? messages : directMessages).map((msg: any) => { const isMe = profile?.id === (msg.userId || msg.senderId); const isRudra = (msg.userId || msg.senderId) === 'rudra-ai-system'; const isKarma = msg.type === 'karma'; return (
{activeTab === 'community' && ( )}
{activeTab === 'community' && (
navigate(`/profile/${msg.userId}`)}>{isMe ? 'You' : msg.userName} {msg.userRole}
)} {isKarma ? (

Karma Gift

{msg.amount}

) : (
{isRudra &&
Rudra System
} {msg.type === 'image' && msg.imageUrl ? Shared setPreviewImage(msg.imageUrl)} /> : null} {msg.text &&

{msg.text}

}
)} {new Date(msg.timestamp).toLocaleTimeString([], { hour: '2-digit', minute: '2-digit' })}
); })}
{showEmojiPicker && (
{EMOJIS.map(emoji => ())}
)}