import React, { useState, memo } from 'react'; import type { Submission, GeIdResult } from '../types'; import GeIdResultItem from './GeIdResultItem'; import TrashIcon from './TrashIcon'; import RetryIcon from './RetryIcon'; import ConfirmModal from './ConfirmModal'; interface HistoryItemProps { submission: Submission; onErrorClick: (details: string) => void; onDelete: (id: string) => void; onRetry: (submission: Submission, errorGeIds: string[], errorUsernames: string[]) => void; onPaste: (username: string, geIdAndLang: string) => void; hideNonErrors: boolean; } const HistoryItem: React.FC = ({ submission, onErrorClick, onDelete, onRetry, onPaste, hideNonErrors }) => { const [showRetryConfirm, setShowRetryConfirm] = useState(false); // Find GE IDs with errors const errorResults = submission.results?.filter(r => r.details?.some(d => d.status === 'error')) ?? []; const errorGeIds = errorResults.map(r => r.geIdAndLang); const hasError = errorGeIds.length > 0; // Get unique usernames from error results const errorUsernames = [...new Set( errorResults.flatMap(r => r.details?.filter(d => d.status === 'error').map(d => d.username) ?? []) )]; // Filter results based on hideNonErrors toggle const filteredResults = hideNonErrors ? submission.results?.filter(r => r.details?.some(d => d.status === 'error')) : submission.results; const handlePaste = () => { onPaste(submission.username, submission.geIdAndLang); window.scrollTo({ top: 0, behavior: 'smooth' }); }; const handleRetryConfirm = () => { setShowRetryConfirm(false); onRetry(submission, errorGeIds, errorUsernames); }; // If hideNonErrors is on and no errors, don't render if (hideNonErrors && !hasError) { return null; } return ( <>
{submission.timestamp.toLocaleString('vi-VN')}
{hasError && ( )}
{filteredResults && filteredResults.length > 0 ? ( filteredResults.map((result, i) => ( )) ) : (

{hideNonErrors ? 'Không có lỗi trong lần submit này.' : 'Không có dữ liệu kết quả chi tiết cho lần submit này.'}

)}
{/* Retry Confirmation Modal */}

Bạn có muốn retry các GE ID & LANG sau?

GE ID & LANG bị lỗi:

{errorGeIds.map((geId, i) => (
{geId}
))}

Usernames:

{errorUsernames.map((username, i) => (
{username}
))}

Các GE ID & LANG lỗi sẽ được tách thành record mới và bắt đầu cấp quyền ngay.

} confirmText="Retry" cancelText="Huỷ" onConfirm={handleRetryConfirm} onCancel={() => setShowRetryConfirm(false)} /> ); }; export default memo(HistoryItem);