@@ -93,6 +93,7 @@ export default function ProblemRender({
9393 > ( [ { id : `test-case-${ Date . now ( ) } ` , inputText : "" } ] ) ;
9494 const hasInitializedCustomTestCases = useRef ( false ) ;
9595 const [ isAdjustingDifficulty , setIsAdjustingDifficulty ] = useState ( false ) ;
96+ const [ isRegeneratingSimilar , setIsRegeneratingSimilar ] = useState ( false ) ;
9697
9798 const {
9899 isLoading : isProblemTextLoading ,
@@ -506,10 +507,21 @@ export default function ProblemRender({
506507 </ div >
507508 ) }
508509 { generationError && overallStatus . type === "error" && (
509- < div className = "text-xs text-destructive" >
510- { typeof generationError === "string"
511- ? generationError
512- : String ( generationError ) }
510+ < div className = "flex items-center justify-between gap-2" >
511+ < div className = "text-xs text-destructive" >
512+ { typeof generationError === "string"
513+ ? generationError
514+ : String ( generationError ) }
515+ </ div >
516+ < Button
517+ variant = "outline"
518+ size = "sm"
519+ onClick = { handleRegenerateSimilar }
520+ disabled = { isRegeneratingSimilar || ! selectedModel }
521+ className = "h-6 text-xs"
522+ >
523+ { isRegeneratingSimilar ? "Creating..." : "Try Again" }
524+ </ Button >
513525 </ div >
514526 ) }
515527 </ div >
@@ -714,6 +726,25 @@ export default function ProblemRender({
714726 }
715727 } ;
716728
729+ const handleRegenerateSimilar = async ( ) => {
730+ if ( ! selectedModel ) return ;
731+ setIsRegeneratingSimilar ( true ) ;
732+ try {
733+ const result = await createProblem (
734+ selectedModel ,
735+ user . apiKey ,
736+ true ,
737+ undefined ,
738+ { problemId, direction : "similar" } ,
739+ ) ;
740+ router . push ( `/problem/${ result . problemId } ` ) ;
741+ } catch ( error ) {
742+ console . error ( "Failed to regenerate similar problem:" , error ) ;
743+ } finally {
744+ setIsRegeneratingSimilar ( false ) ;
745+ }
746+ } ;
747+
717748 return (
718749 < div className = "h-screen w-screen flex flex-col overflow-hidden" >
719750 < div className = "w-full p-4 flex items-center justify-between gap-4 border-b flex-shrink-0" >
@@ -749,18 +780,36 @@ export default function ProblemRender({
749780 variant = "outline"
750781 size = "sm"
751782 onClick = { ( ) => handleAdjustDifficulty ( "easier" ) }
752- disabled = { isAdjustingDifficulty || ! selectedModel }
783+ disabled = {
784+ isAdjustingDifficulty || isRegeneratingSimilar || ! selectedModel
785+ }
753786 >
754787 { isAdjustingDifficulty ? "Creating..." : "Make Easier" }
755788 </ Button >
756789 < Button
757790 variant = "outline"
758791 size = "sm"
759792 onClick = { ( ) => handleAdjustDifficulty ( "harder" ) }
760- disabled = { isAdjustingDifficulty || ! selectedModel }
793+ disabled = {
794+ isAdjustingDifficulty || isRegeneratingSimilar || ! selectedModel
795+ }
761796 >
762797 { isAdjustingDifficulty ? "Creating..." : "Make Harder" }
763798 </ Button >
799+ { ( isWorkflowErrored || isFailed ) && (
800+ < Button
801+ variant = "outline"
802+ size = "sm"
803+ onClick = { handleRegenerateSimilar }
804+ disabled = {
805+ isAdjustingDifficulty ||
806+ isRegeneratingSimilar ||
807+ ! selectedModel
808+ }
809+ >
810+ { isRegeneratingSimilar ? "Creating..." : "Regenerate Similar" }
811+ </ Button >
812+ ) }
764813 </ div >
765814 </ div >
766815 < div className = "flex items-center gap-4" >
@@ -832,13 +881,6 @@ export default function ProblemRender({
832881 </ div >
833882 ) }
834883
835- { generationError && (
836- < Alert variant = "destructive" >
837- < AlertTitle > Generation Error</ AlertTitle >
838- < AlertDescription > { generationError } </ AlertDescription >
839- </ Alert >
840- ) }
841-
842884 < div className = "space-y-4" >
843885 < StepSection
844886 step = "generateProblemText"
0 commit comments