import React, { useState } from 'react';
import { useQuery, useMutation, useQueryClient } from '@tanstack/react-query';
import { CheckCircle, XCircle, ExternalLink, Calendar, Tag, FileText } from 'lucide-react';
import { apiClient, type Article } from '../lib/api';
const Articles: React.FC = () => {
const [page, setPage] = useState(1);
const queryClient = useQueryClient();
const { data, isLoading, error } = useQuery({
queryKey: ['articles', page],
queryFn: () => apiClient.getArticles(page),
});
const approveMutation = useMutation({
mutationFn: (articleId: number) => apiClient.approveArticle(articleId),
onSuccess: () => {
queryClient.invalidateQueries({ queryKey: ['articles'] });
},
});
const rejectMutation = useMutation({
mutationFn: (articleId: number) => apiClient.rejectArticle(articleId),
onSuccess: () => {
queryClient.invalidateQueries({ queryKey: ['articles'] });
},
});
const handleApprove = (articleId: number) => {
approveMutation.mutate(articleId);
};
const handleReject = (articleId: number) => {
rejectMutation.mutate(articleId);
};
const getStatusBadge = (status: string) => {
switch (status) {
case 'approved':
return (
Approved
);
case 'rejected':
return (
Rejected
);
default:
return (
Pending
);
}
};
if (isLoading) {
return (
{[...Array(5)].map((_, i) => (
))}
);
}
if (error) {
return (
);
}
const articles = data?.articles || [];
const pagination = data?.pagination;
const settings = data?.settings;
return (
Articles
Manage and review articles from your feeds
{settings?.publishing_approvals_enabled && (
Approval system enabled
)}
{articles.map((article: Article) => (
{article.title || 'Untitled Article'}
{article.description || 'No description available'}
Feed: {article.feed?.name || 'Unknown'}
•
{new Date(article.created_at).toLocaleDateString()}
{article.is_valid !== null && (
<>
•
{article.is_valid ? 'Valid' : 'Invalid'}
>
)}
{article.is_duplicate && (
<>
•
Duplicate
>
)}
{getStatusBadge(article.approval_status)}
{article.approval_status === 'pending' && settings?.publishing_approvals_enabled && (
)}
))}
{articles.length === 0 && (
No articles
No articles have been fetched yet.
)}
{/* Pagination */}
{pagination && pagination.last_page > 1 && (
Showing{' '}
{pagination.from} to{' '}
{pagination.to} of{' '}
{pagination.total} results
)}
);
};
export default Articles;