import { useState } from 'react'; import { useQuery, useMutation, useQueryClient } from '@tanstack/react-query'; import { getComments, createComment, deleteComment, } from '../services/commentService'; import { useAuthStore } from '@/stores/auth'; import { useToast } from '@/hooks/useToast'; import { Button } from '@/components/ui/button'; import { Input } from '@/components/ui/input'; import { Card, CardContent, CardHeader, CardTitle } from '@/components/ui/card'; import { Avatar, AvatarFallback, AvatarImage } from '@/components/ui/avatar'; import { MessageCircle, Send, Trash2, MoreVertical } from 'lucide-react'; import { formatDistanceToNow } from 'date-fns'; import { fr } from 'date-fns/locale'; import { DropdownMenu, DropdownMenuContent, DropdownMenuItem, DropdownMenuTrigger, } from '@/components/ui/dropdown-menu'; import { LoadingSpinner } from '@/components/ui/loading-spinner'; // FE-PAGE-007: Complete Track Detail page implementation - Comments Section interface CommentSectionProps { trackId: string; } export function CommentSection({ trackId }: CommentSectionProps) { const { user } = useAuthStore(); const toast = useToast(); const queryClient = useQueryClient(); const [newComment, setNewComment] = useState(''); const [page, setPage] = useState(1); const limit = 20; const { data: commentsData, isLoading, error, } = useQuery({ queryKey: ['trackComments', trackId, page], queryFn: () => getComments(trackId, page, limit), enabled: !!trackId, }); const createCommentMutation = useMutation({ mutationFn: (content: string) => createComment(trackId, content), onSuccess: () => { queryClient.invalidateQueries({ queryKey: ['trackComments', trackId] }); setNewComment(''); toast.success('Comment posted'); }, onError: (error: any) => { toast.error(error.message || 'Failed to post comment'); }, }); const deleteCommentMutation = useMutation({ mutationFn: deleteComment, onSuccess: () => { queryClient.invalidateQueries({ queryKey: ['trackComments', trackId] }); toast.success('Comment deleted'); }, onError: (error: any) => { toast.error(error.message || 'Failed to delete comment'); }, }); const handleSubmit = (e: React.FormEvent) => { e.preventDefault(); if (!newComment.trim() || !user) return; createCommentMutation.mutate(newComment.trim()); }; const handleDelete = (commentId: string) => { if (confirm('Are you sure you want to delete this comment?')) { deleteCommentMutation.mutate(commentId); } }; const comments = commentsData?.comments || []; const total = commentsData?.total || 0; const totalPages = Math.ceil(total / limit); return ( Comments ({commentsData?.total || 0}) {/* Comment Form */} {user ? (
setNewComment(e.target.value)} placeholder="Write a comment..." maxLength={500} />
) : (

Please log in to comment

)} {/* Comments List */} {isLoading ? (
) : error ? (
Failed to load comments
) : comments.length === 0 ? (
No comments yet. Be the first to comment!
) : (
{comments.map((comment) => (
{comment.user.username.charAt(0).toUpperCase()}
{comment.user.username} {formatDistanceToNow(new Date(comment.created_at), { addSuffix: true, locale: fr, })}
{user?.id === comment.user_id && ( handleDelete(comment.id)} className="text-destructive" > Delete )}

{comment.content}

))} {/* Pagination */} {totalPages > 1 && (
Page {page} of {totalPages}
)}
)}
); }