@@ -719,6 +719,7 @@ const ModernizationPage = () => {
719719 // Update files state when Redux fileList changes
720720 useEffect ( ( ) => {
721721 if ( reduxFileList && reduxFileList . length > 0 ) {
722+ setAllFilesCompleted ( false ) ;
722723 // Map the Redux fileList to our FileItem format
723724 const fileItems : FileItem [ ] = reduxFileList . filter ( file => file . type !== 'summary' ) . map ( ( file : any , index : number ) => ( {
724725
@@ -784,111 +785,137 @@ const ModernizationPage = () => {
784785
785786
786787 //new PT FR ends
788+ const updateSummaryStatus = async ( ) => {
789+ try {
790+ const latestBatch = await fetchBatchSummary ( batchId ! ) ;
791+ setBatchSummary ( latestBatch ) ;
792+ const allFilesDone = latestBatch . files . every ( file =>
793+ [ "completed" , "failed" , "error" ] . includes ( file . status ?. toLowerCase ( ) || "" )
794+ ) ;
795+
796+ if ( allFilesDone ) {
797+ setAllFilesCompleted ( true ) ;
798+ const hasUsableFile = latestBatch . files . some ( file =>
799+ file . status ?. toLowerCase ( ) === "completed" &&
800+ file . file_result !== "error" &&
801+ ! ! file . translated_content ?. trim ( )
802+ ) ;
803+
804+ setIsZipButtonDisabled ( ! hasUsableFile ) ;
805+
806+ setFiles ( prevFiles => {
807+ const updated = [ ...prevFiles ] ;
808+ const summaryIndex = updated . findIndex ( f => f . id === "summary" ) ;
809+
810+ if ( summaryIndex !== - 1 ) {
811+ updated [ summaryIndex ] = {
812+ ...updated [ summaryIndex ] ,
813+ status : "completed" ,
814+ errorCount : latestBatch . error_count ,
815+ warningCount : latestBatch . warning_count ,
816+ } ;
817+ }
818+
819+ return updated ;
820+ } ) ;
821+ }
822+ } catch ( err ) {
823+ console . error ( "Failed to update summary status:" , err ) ;
824+ }
825+ } ;
826+
787827 // Handle WebSocket messages
788828 const handleWebSocketMessage = useCallback ( async ( data : WebSocketMessage ) => {
789829 console . log ( 'Received WebSocket message:' , data ) ;
790-
830+
791831 if ( ! data || ! data . file_id ) {
792832 console . warn ( 'Received invalid WebSocket message:' , data ) ;
793833 return ;
794834 }
795-
796- if ( data . file_id ) {
797- currentProcessingFileRef . current = data . file_id ;
798- }
799- // Update process steps dynamically from agent_type
835+
836+ setFileId ( data . file_id ) ;
837+
800838 const agent = formatAgent ( data . agent_type ) ;
801839 const message = formatDescription ( data . agent_message ) ;
802- setFileId ( data . file_id ) ;
803-
804- // Update file status based on the message
840+ data . agent_type = agent ;
841+ data . agent_message = message ;
842+
805843 setFiles ( prevFiles => {
806844 const fileIndex = prevFiles . findIndex ( file => file . fileId === data . file_id ) ;
807-
808- if ( fileIndex === - 1 ) {
809- console . warn ( `File with ID ${ data . file_id } not found in the file list` ) ;
810- return prevFiles ;
811- }
812- data . agent_message = message ;
813- data . agent_type = agent ;
814- const updatedFiles = [ ...prevFiles ] ;
815- const newTrackLog = updatedFiles [ fileIndex ] . file_track_log ?. some ( entry =>
845+ if ( fileIndex === - 1 ) return prevFiles ;
846+
847+ const newTrackLog = prevFiles [ fileIndex ] . file_track_log ?. some ( entry =>
816848 entry . agent_type === data . agent_type && entry . agent_message === data . agent_message
817849 )
818- ? updatedFiles [ fileIndex ] . file_track_log
819- : [ data , ...( updatedFiles [ fileIndex ] . file_track_log || [ ] ) ] ;
850+ ? prevFiles [ fileIndex ] . file_track_log
851+ : [ data , ...( prevFiles [ fileIndex ] . file_track_log || [ ] ) ] ;
852+
853+ const updatedFiles = [ ...prevFiles ] ;
820854 updatedFiles [ fileIndex ] = {
821855 ...updatedFiles [ fileIndex ] ,
822856 status : data . process_status ,
823857 file_track_log : newTrackLog ,
824858 file_track_percentage : getTrackPercentage ( data . process_status , newTrackLog ) ,
825859 } ;
826-
827- // Update summary status
828- const summaryIndex = updatedFiles . findIndex ( file => file . id === 'summary' ) ;
829- if ( summaryIndex !== - 1 ) {
830- const totalFiles = updatedFiles . filter ( file => file . id !== 'summary' ) . length ;
831- const completedFiles = updatedFiles . filter ( file => file . status === 'completed' && file . id !== 'summary' ) . length ;
832- const newAllFilesCompleted = completedFiles === totalFiles && totalFiles > 0 ;
833- setAllFilesCompleted ( newAllFilesCompleted ) ;
834-
835- updatedFiles [ summaryIndex ] = {
836- ...updatedFiles [ summaryIndex ] ,
837- status : newAllFilesCompleted ? 'completed' : 'Processing'
838- } ;
839- }
840-
860+
841861 return updatedFiles ;
842862 } ) ;
843-
844- // Fetch file content if processing is completed
863+
845864 if ( data . process_status === 'completed' ) {
846865 try {
847866 const newFileUpdate = await fetchFileFromAPI ( data . file_id ) ;
848- const batchSumamry = await fetchBatchSummary ( data . batch_id ) ;
849- setBatchSummary ( batchSumamry ) ;
850- setFiles ( currentFiles => {
851- const c = currentFiles . map ( f =>
852- f . fileId === data . file_id ? {
853- ...f ,
854- code : newFileUpdate . content ,
855- status : data . process_status ,
856- translatedCode : newFileUpdate . translated_content ,
857- errorCount : fileErrorCounter ( newFileUpdate ) ,
858- warningCount : fileWarningCounter ( newFileUpdate ) ,
859- file_result : newFileUpdate . file_result ,
860- file_logs : filesLogsBuilder ( newFileUpdate ) ,
861- } : f
862-
863- ) ;
864- // Update summary status
865- const summaryIndex = c . findIndex ( file => file . id === 'summary' ) ;
866- if ( summaryIndex !== - 1 ) {
867-
868- setAllFilesCompleted ( batchSumamry . status === "completed" ) ;
869- if ( batchSumamry . status === "completed" && batchSumamry . hasFiles > 0 ) {
870- setIsZipButtonDisabled ( false ) ;
871- }
872-
873- c [ summaryIndex ] = {
874- ...c [ summaryIndex ] ,
875- errorCount : batchSumamry . error_count ,
876- warningCount : batchSumamry . warning_count ,
877- status : batchSumamry . status === "completed" ? batchSumamry . status : 'Processing'
878- } ;
879- }
880- return c ;
881- }
867+
868+ setFiles ( prevFiles =>
869+ prevFiles . map ( file =>
870+ file . fileId === data . file_id
871+ ? {
872+ ...file ,
873+ code : newFileUpdate . content ,
874+ translatedCode : newFileUpdate . translated_content ,
875+ status : data . process_status ,
876+ errorCount : fileErrorCounter ( newFileUpdate ) ,
877+ warningCount : fileWarningCounter ( newFileUpdate ) ,
878+ file_result : newFileUpdate . file_result ,
879+ file_logs : filesLogsBuilder ( newFileUpdate ) ,
880+ }
881+ : file
882+ )
882883 ) ;
883- // updateProgressPercentage();
884- } catch ( error ) {
885- console . error ( 'Error fetching completed file:' , error ) ;
884+
885+ //Check and update summary + download status
886+ await updateSummaryStatus ( ) ;
887+
888+ } catch ( err ) {
889+ console . error ( "Error updating after file completion:" , err ) ;
886890 }
887- } else {
888- // updateProgressPercentage();
889891 }
890- } , [ files , fileId ] ) ;
892+ } , [ updateSummaryStatus ] ) ;
891893
894+ useEffect ( ( ) => {
895+ const areAllFilesTerminal = files . every ( file =>
896+ file . id === "summary" || // skip summary
897+ [ "completed" , "failed" , "error" ] . includes ( file . status ?. toLowerCase ( ) || "" )
898+ ) ;
899+
900+ if ( files . length > 1 && areAllFilesTerminal && ! allFilesCompleted ) {
901+ updateSummaryStatus ( ) ;
902+ }
903+ } , [ files , allFilesCompleted ] ) ;
904+
905+
906+ useEffect ( ( ) => {
907+ const nonSummaryFiles = files . filter ( f => f . id !== "summary" ) ;
908+ const completedCount = nonSummaryFiles . filter ( f => f . status === "completed" ) . length ;
909+
910+ if (
911+ nonSummaryFiles . length > 0 &&
912+ completedCount === nonSummaryFiles . length &&
913+ ! allFilesCompleted
914+ ) {
915+ updateSummaryStatus ( ) ; //single source of truth
916+ }
917+ } , [ files , allFilesCompleted , batchId ] ) ;
918+ //new end
892919 // Listen for WebSocket messages using the WebSocketService
893920 useEffect ( ( ) => {
894921 webSocketService . on ( 'message' , handleWebSocketMessage ) ;
0 commit comments