import { useEffect, useState } from 'react' import type { Review, Article } from '@/types/nostr' import { getReviewsForArticle } from '@/lib/reviews' import { getReviewTipsForArticle } from '@/lib/reviewAggregation' import { ReviewForm } from './ReviewForm' import { ReviewTipForm } from './ReviewTipForm' import { t } from '@/lib/i18n' interface ArticleReviewsProps { article: Article authorPubkey: string } export function ArticleReviews({ article, authorPubkey }: ArticleReviewsProps): React.ReactElement { const [reviews, setReviews] = useState([]) const [tips, setTips] = useState(0) const [loading, setLoading] = useState(false) const [error, setError] = useState(null) const [showReviewForm, setShowReviewForm] = useState(false) const [selectedReviewForTip, setSelectedReviewForTip] = useState(null) const loadReviews = async (): Promise => { setLoading(true) setError(null) try { const [list, tipsTotal] = await Promise.all([ getReviewsForArticle(article.id), getReviewTipsForArticle({ authorPubkey, articleId: article.id }), ]) setReviews(list) setTips(tipsTotal) } catch (e) { setError(e instanceof Error ? e.message : 'Erreur lors du chargement des critiques') } finally { setLoading(false) } } useEffect(() => { void loadReviews() }, [article.id, authorPubkey]) return (
{ setShowReviewForm(true) }} /> {showReviewForm && ( { setShowReviewForm(false) void loadReviews() }} onCancel={() => { setShowReviewForm(false) }} /> )} {loading &&

{t('common.loading')}

} {error &&

{error}

} {!loading && !error && reviews.length === 0 && !showReviewForm && (

{t('review.empty')}

)} {!loading && !error && { setSelectedReviewForTip(reviewId) }} />} {selectedReviewForTip && ( r.id === selectedReviewForTip)!} article={article} onSuccess={() => { setSelectedReviewForTip(null) void loadReviews() }} onCancel={() => { setSelectedReviewForTip(null) }} /> )}
) } function ArticleReviewsHeader({ tips, onAddReview }: { tips: number; onAddReview: () => void }): React.ReactElement { return (

{t('review.title')}

{t('review.tips.total', { amount: tips })}
) } function ArticleReviewsList({ reviews, onTipReview }: { reviews: Review[]; onTipReview: (reviewId: string) => void }): React.ReactElement { return (
{reviews.map((r) => (
{r.title && (

{r.title}

)}
{r.content}
{r.text && (
{r.text}
)}
{t('review.reviewer')}: {formatPubkey(r.reviewerPubkey)} {formatDate(r.createdAt)}
))}
) } function formatPubkey(pubkey: string): string { return `${pubkey.slice(0, 8)}...${pubkey.slice(-8)}` } function formatDate(timestamp: number): string { return new Date(timestamp * 1000).toLocaleString() }