import React, { useState } from 'react'; import { Card, CardContent } from '@/components/ui/card'; import { Button } from '@/components/ui/button'; import { Input } from '@/components/ui/input'; import { Badge } from '@/components/ui/badge'; import { Alert, AlertDescription, AlertTitle } from '@/components/ui/alert'; // Tabs not currently used from '@/components/ui/tabs'; import { Select, SelectContent, SelectItem, SelectTrigger, SelectValue } from '@/components/ui/select'; import { LoadingState } from '@pezkuwi/components/AsyncComponent'; import { MessageSquare, Users, Search, Filter, Clock, Flame, Pin, Lock, TrendingUp, ThumbsUp, ThumbsDown, Plus, Megaphone, AlertTriangle, Info, CheckCircle, Eye } from 'lucide-react'; import { useTranslation } from 'react-i18next'; import { useForum } from '@/hooks/useForum'; import { DiscussionThread } from './DiscussionThread'; import { useAuth } from '@/contexts/AuthContext'; import { formatDistanceToNow } from 'date-fns'; export function ForumOverview() { const { user } = useAuth(); const { t } = useTranslation(); const { announcements, categories, discussions, loading, reactToDiscussion } = useForum(); const [selectedDiscussion, setSelectedDiscussion] = useState(null); const [searchQuery, setSearchQuery] = useState(''); const [sortBy, setSortBy] = useState('recent'); const [filterCategory, setFilterCategory] = useState('all'); const getAnnouncementStyle = (type: string) => { switch (type) { case 'critical': return { variant: 'destructive' as const, icon: AlertTriangle, bgClass: 'bg-red-500/10 border-red-500/20' }; case 'warning': return { variant: 'default' as const, icon: AlertTriangle, bgClass: 'bg-yellow-500/10 border-yellow-500/20' }; case 'success': return { variant: 'default' as const, icon: CheckCircle, bgClass: 'bg-green-500/10 border-green-500/20' }; default: return { variant: 'default' as const, icon: Info, bgClass: 'bg-blue-500/10 border-blue-500/20' }; } }; const filteredDiscussions = discussions .filter(d => { const matchesSearch = d.title.toLowerCase().includes(searchQuery.toLowerCase()) || d.content.toLowerCase().includes(searchQuery.toLowerCase()); const matchesCategory = filterCategory === 'all' || d.category?.name.toLowerCase() === filterCategory.toLowerCase(); return matchesSearch && matchesCategory; }) .sort((a, b) => { switch (sortBy) { case 'popular': return (b.upvotes || 0) - (a.upvotes || 0); case 'replies': return b.replies_count - a.replies_count; case 'views': return b.views_count - a.views_count; default: return new Date(b.last_activity_at).getTime() - new Date(a.last_activity_at).getTime(); } }); if (selectedDiscussion) { return (
); } if (loading) { return ; } return (
{/* Admin Announcements Banner */} {announcements.length > 0 && (
{announcements.map((announcement) => { const style = getAnnouncementStyle(announcement.type); const Icon = style.icon; return (
{announcement.title} {announcement.content}
Posted {formatDistanceToNow(new Date(announcement.created_at), { addSuffix: true })}
); })}
)} {/* Forum Stats */}

{t('forum.totalDiscussions')}

{discussions.length}

{t('forum.categories')}

{categories.length}

{t('forum.activeUsers')}

{new Set(discussions.map(d => d.author_id)).size}

{t('forum.totalReplies')}

{discussions.reduce((sum, d) => sum + d.replies_count, 0)}

{/* Search, Filters & Actions */}
setSearchQuery(e.target.value)} className="pl-10" />
{user && ( )}
{/* Categories Grid */}
{categories.map((category) => ( setFilterCategory(category.name.toLowerCase())} >
{category.icon}

{category.name}

{t('forum.discussionCount', { count: discussions.filter(d => d.category?.id === category.id).length })}

))}
{/* Discussions List */}
{filteredDiscussions.length === 0 ? (

{t('forum.noDiscussions')}

{t('forum.adjustFilters')}

) : ( filteredDiscussions.map((discussion) => ( setSelectedDiscussion(discussion.id)} >
{/* Badges */}
{discussion.is_pinned && ( {t('forum.pinned')} )} {discussion.is_locked && ( {t('forum.locked')} )} {discussion.category && ( {discussion.category.icon} {discussion.category.name} )} {(discussion.upvotes || 0) > 10 && ( {t('forum.trending')} )}
{/* Title */}

{discussion.title}

{/* Meta Info */}
{t('forum.by')} {discussion.author_name} {discussion.replies_count} {t('forum.replies')} {discussion.views_count} {t('forum.views')} {formatDistanceToNow(new Date(discussion.last_activity_at), { addSuffix: true })}
{/* Tags */} {discussion.tags && discussion.tags.length > 0 && (
{discussion.tags.map((tag) => ( #{tag} ))}
)}
{/* Voting */}
{(discussion.upvotes || 0) - (discussion.downvotes || 0)}
)) )}
); }