@@ -719,6 +719,7 @@ const ModernizationPage = () => {
719
719
// Update files state when Redux fileList changes
720
720
useEffect ( ( ) => {
721
721
if ( reduxFileList && reduxFileList . length > 0 ) {
722
+ setAllFilesCompleted ( false ) ;
722
723
// Map the Redux fileList to our FileItem format
723
724
const fileItems : FileItem [ ] = reduxFileList . filter ( file => file . type !== 'summary' ) . map ( ( file : any , index : number ) => ( {
724
725
@@ -784,111 +785,137 @@ const ModernizationPage = () => {
784
785
785
786
786
787
//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
+
787
827
// Handle WebSocket messages
788
828
const handleWebSocketMessage = useCallback ( async ( data : WebSocketMessage ) => {
789
829
console . log ( 'Received WebSocket message:' , data ) ;
790
-
830
+
791
831
if ( ! data || ! data . file_id ) {
792
832
console . warn ( 'Received invalid WebSocket message:' , data ) ;
793
833
return ;
794
834
}
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
+
800
838
const agent = formatAgent ( data . agent_type ) ;
801
839
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
+
805
843
setFiles ( prevFiles => {
806
844
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 =>
816
848
entry . agent_type === data . agent_type && entry . agent_message === data . agent_message
817
849
)
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 ] ;
820
854
updatedFiles [ fileIndex ] = {
821
855
...updatedFiles [ fileIndex ] ,
822
856
status : data . process_status ,
823
857
file_track_log : newTrackLog ,
824
858
file_track_percentage : getTrackPercentage ( data . process_status , newTrackLog ) ,
825
859
} ;
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
+
841
861
return updatedFiles ;
842
862
} ) ;
843
-
844
- // Fetch file content if processing is completed
863
+
845
864
if ( data . process_status === 'completed' ) {
846
865
try {
847
866
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
+ )
882
883
) ;
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 ) ;
886
890
}
887
- } else {
888
- // updateProgressPercentage();
889
891
}
890
- } , [ files , fileId ] ) ;
892
+ } , [ updateSummaryStatus ] ) ;
891
893
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
892
919
// Listen for WebSocket messages using the WebSocketService
893
920
useEffect ( ( ) => {
894
921
webSocketService . on ( 'message' , handleWebSocketMessage ) ;
0 commit comments