import React, { useState } from 'react'; import { useNavigate } from 'react-router-dom'; import { MessageSquare, ArrowUp, CheckCircle2, Bold, Italic, List, Link2, Image as ImageIcon, Send, CornerDownRight } from 'lucide-react'; import { Question, Answer } from '../types'; import { useAuth } from '../context/AuthContext'; import { forumService } from '../services'; import MarkdownContent from './MarkdownContent'; interface Props { question: Question; onAnswerAdded?: () => void; // Callback pour recharger les questions } const QuestionCard: React.FC = ({ question, onAnswerAdded }) => { const [isReplying, setIsReplying] = useState(false); const [replyContent, setReplyContent] = useState(''); const [isSubmitting, setIsSubmitting] = useState(false); const [error, setError] = useState(null); const [votes, setVotes] = useState(question.votes); const [hasVoted, setHasVoted] = useState(question.userVote === 1); const [isVoting, setIsVoting] = useState(false); // Nouveaux états pour la réponse inline const [newAnswer, setNewAnswer] = useState(null); const [showNewAnswer, setShowNewAnswer] = useState(false); const [answersCount, setAnswersCount] = useState(question.answers); const { isAuthenticated, gainPoints, unlockBadge } = useAuth(); const navigate = useNavigate(); const handleVote = async () => { if (!isAuthenticated) { navigate('/login'); return; } if (isVoting) return; setIsVoting(true); try { const result = await forumService.voteQuestion(question.id, 1); setVotes(result.votes); setHasVoted(!hasVoted); } catch (err) { console.error('Failed to vote:', err); } finally { setIsVoting(false); } }; const handleSubmit = async () => { if (!replyContent.trim()) return; if (!isAuthenticated) { navigate('/login'); return; } setIsSubmitting(true); setError(null); try { // Appel API pour créer la réponse const answer = await forumService.createAnswer(question.id, replyContent); // Gamification : Répondre à une question gainPoints(20); unlockBadge('b2'); // Badge "Savant" // Stocker et afficher la réponse localement setNewAnswer(answer); setShowNewAnswer(true); setAnswersCount(prev => prev + 1); // Reset formulaire setIsReplying(false); setReplyContent(''); // NOTE: On n'appelle PAS onAnswerAdded ici pour éviter le rechargement de la liste // qui ferait disparaître notre affichage local de la réponse. } catch (err: any) { console.error('Erreur lors de la création de la réponse:', err); setError( err.response?.data?.message || err.response?.data?.detail || 'Impossible de publier votre réponse. Veuillez réessayer.' ); } finally { setIsSubmitting(false); } }; return (
{/* Vote Section */}
{votes}
{/* Content Section */}

navigate(`/questions/${question.id}`)} className="text-lg font-semibold text-edu-primary dark:text-white hover:text-edu-secondary cursor-pointer mb-2 line-clamp-2" > {question.title}

{question.isSolved && (
Résolu
)}
{question.tags.map((tag, index) => { const isLevel = ['université', 'lycée', 'collège', 'licence', 'master', 'doctorat', 'primaire', 'l1', 'l2', 'l3', 'm1', 'm2', '6ème', '5ème', '4ème', '3ème', '2nde', '1ère', 'tle', 'terminale'].includes(tag.toLowerCase()); const tagClass = isLevel ? 'bg-amber-50 dark:bg-amber-900/30 text-amber-600 dark:text-amber-400 border-amber-100 dark:border-amber-800' : 'bg-blue-50 dark:bg-blue-900/30 text-blue-600 dark:text-blue-300 border-blue-100 dark:border-blue-800'; return ( {tag} ); })}
{question.author.name} {question.author.name} {question.author.country} {question.createdAt}
navigate(`/questions/${question.id}`)} className="flex items-center space-x-1 cursor-pointer hover:text-edu-secondary transition-colors" > {answersCount} réponses
{/* WYSIWYG Editor Area */} {isReplying && (
{/* Message d'erreur */} {error && (
Erreur: {error}
)}
{/* Toolbar */}
{/* Textarea */}