@@ -18,7 +18,11 @@ import type {
1818} from "@/types" ;
1919
2020type FailedStep = "analysis" | "characters" | "layout" | "panels" | null ;
21- type FailedPanel = { step : "panel" ; panelNumber : number } | null ;
21+ type FailedPanel = {
22+ step : "panel" ;
23+ panelNumber : number ;
24+ panelIndex : number ;
25+ } | null ;
2226
2327// IndexedDB setup for images
2428const DB_NAME = "MangaGeneratorDB" ;
@@ -889,7 +893,13 @@ export const useGenerationStore = create<GenerationState & GenerationActions>()(
889893 "panel_generation_failed" ,
890894 `Panel ${ i + 1 } : ${ errorMessage } ` ,
891895 ) ;
892- set ( { failedPanel : { step : "panel" , panelNumber : i + 1 } } ) ;
896+ set ( {
897+ failedPanel : {
898+ step : "panel" ,
899+ panelNumber : i + 1 ,
900+ panelIndex : i ,
901+ } ,
902+ } ) ;
893903 throw error ;
894904 }
895905 }
@@ -906,10 +916,19 @@ export const useGenerationStore = create<GenerationState & GenerationActions>()(
906916 const errorMessage =
907917 error instanceof Error ? error . message : "Generation failed" ;
908918
919+ const state = _get ( ) ;
909920 _get ( ) . setErrorWithContext (
910921 errorMessage ,
911922 currentStep ? `${ currentStep } step failed` : "Generation" ,
912- currentStep ? ( ) => _get ( ) . retryFromStep ( currentStep ) : undefined ,
923+ currentStep === "panels" && state . failedPanel
924+ ? ( ) =>
925+ _get ( ) . retryFailedPanel (
926+ state . failedPanel ! . panelNumber ,
927+ state . failedPanel ! . panelIndex ,
928+ )
929+ : currentStep
930+ ? ( ) => _get ( ) . retryFromStep ( currentStep )
931+ : undefined ,
913932 ) ;
914933 set ( {
915934 isGenerating : false ,
@@ -931,21 +950,56 @@ export const useGenerationStore = create<GenerationState & GenerationActions>()(
931950 return ;
932951 }
933952
953+ // Set appropriate loading state based on step
954+ const uiStore = useUIStore . getState ( ) ;
955+ switch ( step ) {
956+ case "analysis" :
957+ uiStore . setIsRerunningAnalysis ( true ) ;
958+ break ;
959+ case "characters" :
960+ uiStore . setIsRerunningCharacters ( true ) ;
961+ break ;
962+ case "layout" :
963+ uiStore . setIsRerunningLayout ( true ) ;
964+ break ;
965+ case "panels" :
966+ uiStore . setIsRerunningPanels ( true ) ;
967+ break ;
968+ }
969+
934970 trackEvent ( {
935971 action : "retry_from_step" ,
936972 category : "user_interaction" ,
937973 label : step ,
938974 } ) ;
939975
940- // Use the main generation flow starting from the specified step
941- await _get ( ) . generateComic (
942- state . originalStoryText ,
943- state . originalStyle ,
944- state . originalNoDialogue ,
945- state . originalUploadedCharacterReferences || [ ] ,
946- state . originalUploadedSettingReferences || [ ] ,
947- step ,
948- ) ;
976+ try {
977+ // Use the main generation flow starting from the specified step
978+ await _get ( ) . generateComic (
979+ state . originalStoryText ,
980+ state . originalStyle ,
981+ state . originalNoDialogue ,
982+ state . originalUploadedCharacterReferences || [ ] ,
983+ state . originalUploadedSettingReferences || [ ] ,
984+ step ,
985+ ) ;
986+ } finally {
987+ // Clear loading state regardless of success or failure
988+ switch ( step ) {
989+ case "analysis" :
990+ uiStore . setIsRerunningAnalysis ( false ) ;
991+ break ;
992+ case "characters" :
993+ uiStore . setIsRerunningCharacters ( false ) ;
994+ break ;
995+ case "layout" :
996+ uiStore . setIsRerunningLayout ( false ) ;
997+ break ;
998+ case "panels" :
999+ uiStore . setIsRerunningPanels ( false ) ;
1000+ break ;
1001+ }
1002+ }
9491003 } ,
9501004
9511005 retryFailedPanel : async ( panelNumber , panelIndex ) => {
@@ -958,22 +1012,31 @@ export const useGenerationStore = create<GenerationState & GenerationActions>()(
9581012 return ;
9591013 }
9601014
1015+ // Set loading state for panels
1016+ const uiStore = useUIStore . getState ( ) ;
1017+ uiStore . setIsRerunningPanels ( true ) ;
1018+
9611019 trackEvent ( {
9621020 action : "retry_failed_panel" ,
9631021 category : "user_interaction" ,
9641022 label : `panel_${ panelNumber } ` ,
9651023 } ) ;
9661024
967- // Use the main generation flow starting from the failed panel
968- await _get ( ) . generateComic (
969- state . originalStoryText ,
970- state . originalStyle ,
971- state . originalNoDialogue ,
972- state . originalUploadedCharacterReferences || [ ] ,
973- state . originalUploadedSettingReferences || [ ] ,
974- "panels" ,
975- panelIndex ,
976- ) ;
1025+ try {
1026+ // Use the main generation flow starting from the failed panel
1027+ await _get ( ) . generateComic (
1028+ state . originalStoryText ,
1029+ state . originalStyle ,
1030+ state . originalNoDialogue ,
1031+ state . originalUploadedCharacterReferences || [ ] ,
1032+ state . originalUploadedSettingReferences || [ ] ,
1033+ "panels" ,
1034+ panelIndex ,
1035+ ) ;
1036+ } finally {
1037+ // Clear loading state regardless of success or failure
1038+ uiStore . setIsRerunningPanels ( false ) ;
1039+ }
9771040 } ,
9781041
9791042 regenerateCharacter : async ( characterName ) => {
0 commit comments