import React, { useState, useEffect, useRef } from 'react' import { FaCheckCircle, FaExclamationTriangle, FaEye, FaPlay, FaTimes } from 'react-icons/fa' import { ListFormImportDto } from '@/proxy/imports/models' import { GridDto } from '@/proxy/form/models' import { ImportService } from '@/services/import.service' import { useLocalization } from '@/utils/hooks/useLocalization' interface ImportPreviewProps { session: ListFormImportDto gridDto: GridDto onExecute: ( sessionId: string, listFormCode: string, selectedRows?: number[], ) => Promise<{ successCount?: number } | void> loading: boolean importService: ImportService onPreviewLoaded?: () => void } export const ImportPreview: React.FC = ({ session, gridDto, onExecute, loading, importService, onPreviewLoaded, }) => { const [previewData, setPreviewData] = useState(null) const [selectedRows, setSelectedRows] = useState([]) const [selectAll, setSelectAll] = useState(false) const [showSuccessMessage, setShowSuccessMessage] = useState(false) const [lastExecutionResult, setLastExecutionResult] = useState<{ selectedCount: number successCount: number } | null>(null) const hasCalledOnPreviewLoaded = useRef(false) const { translate } = useLocalization() // Selection handlers const handleRowSelect = (rowIndex: number) => { setSelectedRows((prev) => { const newSelection = prev.includes(rowIndex) ? prev.filter((index) => index !== rowIndex) : [...prev, rowIndex] return newSelection }) } const handleSelectAll = () => { if (selectAll) { // Deselect all setSelectedRows([]) } else { // Select all available rows const allRowIndices = previewData?.rows ? Array.from({ length: previewData.rows.length }, (_, i) => i) : [] setSelectedRows(allRowIndices) } } // Update selectAll state when individual rows are selected useEffect(() => { if (previewData?.rows && previewData.rows.length > 0) { const allSelected = selectedRows.length === previewData.rows.length setSelectAll(allSelected) } else { setSelectAll(false) } }, [selectedRows, previewData?.rows]) useEffect(() => { const loadData = async () => { try { const data = await importService.getImportPreview(session.id, gridDto) setPreviewData(data) // Reset selections when new data is loaded setSelectedRows([]) setSelectAll(false) // Reset success message when new data is loaded setShowSuccessMessage(false) setLastExecutionResult(null) // Call onPreviewLoaded callback to refresh history (only once per session) if (onPreviewLoaded && !hasCalledOnPreviewLoaded.current) { hasCalledOnPreviewLoaded.current = true onPreviewLoaded() } } catch (error) { console.error('Failed to load preview data:', error) } } // Reset the flag when session changes hasCalledOnPreviewLoaded.current = false loadData() }, [session.id, importService, gridDto]) // Remove session.status, onSessionUpdate and onPreviewLoaded from dependencies const getStatusColor = (status: string) => { switch (status) { case 'uploaded': return 'text-green-600 bg-green-50 border-green-200' case 'failed': return 'text-red-600 bg-red-50 border-red-200' case 'validating': return 'text-yellow-600 bg-yellow-50 border-yellow-200' default: return 'text-blue-600 bg-blue-50 border-blue-200' } } const canExecute = (previewData?.rows?.length || 0) > 0 && selectedRows.length > 0 && !loading // Execute handler to clear selections after execution const handleExecute = async () => { const selectedCount = selectedRows.length try { const result = await onExecute(session.id, session.listFormCode, selectedRows) // Check if execution was successful if (result && typeof result === 'object' && 'successCount' in result) { const successCount = result.successCount || 0 setLastExecutionResult({ selectedCount, successCount }) // Show success message if all selected rows were processed successfully if (successCount === selectedCount) { setShowSuccessMessage(true) // Hide success message after 5 seconds setTimeout(() => { setShowSuccessMessage(false) }, 5000) } } // Clear selections after execute setSelectedRows([]) setSelectAll(false) } catch (error) { console.error('Import execution failed:', error) // Clear selections even on error setSelectedRows([]) setSelectAll(false) } } return (
{/* Header */}
{/* Başlık kısmı - Üstte mobile, solda desktop */}

{translate('::App.Listforms.ImportManager.ImportPreviewTitle')}

{/* İstatistik kartları - Mobile'da alt alta, desktop'ta yan yana */}
{previewData?.rows?.length || session.totalRows || 0}{' '} {translate('::App.Listforms.ImportManager.TotalRows')}
{/* Durum göstergesi - Altta mobile, sağda desktop */}
{session.status.charAt(0).toUpperCase() + session.status.slice(1)}
{/* Preview Data */} {previewData && previewData.headers && previewData.headers.length > 0 ? (

{translate('::App.Listforms.ImportManager.DataPreviewTitle')}

{previewData.headers.map((header: string, index: number) => ( ))} {previewData.rows.map((row: any[], rowIndex: number) => ( {row.map((cell, cellIndex) => ( ))} ))}
{header}
handleRowSelect(rowIndex)} className="rounded border-gray-300 text-blue-600 focus:ring-blue-500" /> {cell?.toString() || '-'}
) : previewData && previewData.headers && previewData.headers.length === 0 ? (

{translate('::App.Listforms.ImportManager.NoDataFoundTitle')}

{translate('::App.Listforms.ImportManager.NoDataFoundDescription')}

) : (

{translate('::App.Listforms.ImportManager.LoadingPreviewTitle')}

{translate('::App.Listforms.ImportManager.LoadingPreviewDescription')}

)} {/* Actions */}
{/* Success Message */} {showSuccessMessage && lastExecutionResult && (
{translate('::App.Listforms.ImportManager.ImportProgress.Status.Uploaded')}{' '} {lastExecutionResult.successCount} of {lastExecutionResult.selectedCount} rows were imported.
)}
{selectedRows.length === 0 && (previewData?.rows?.length || 0) > 0 && (
{translate('::App.Listforms.ImportManager.SelectRowsWarning')}
)} {selectedRows.length > 0 && (
{selectedRows.length} {translate('::App.Listforms.ImportManager.RowsSelected')}
)} {(previewData?.rows?.length || 0) === 0 && (
{translate('::App.Listforms.ImportManager.NoRowsAvailable')}
)}
) }