1414 * limitations under the License.
1515 */
1616
17- import React , { useRef , useState } from 'react' ;
17+ import { useCallback , useRef , useState } from 'react' ;
1818import { useNavigate } from 'react-router-dom' ;
1919import { useAsync } from 'react-use' ;
2020
@@ -215,14 +215,13 @@ export const WorkflowInstancePage = () => {
215215 const [ isAbortConfirmationDialogOpen , setIsAbortConfirmationDialogOpen ] =
216216 useState ( false ) ;
217217
218- const [ isAborting , setIsAborting ] = React . useState ( false ) ;
219- const [ isAbortSnackbarOpen , setIsAbortSnackbarOpen ] = React . useState ( false ) ;
220- const [ abortError , setAbortError ] = React . useState ( '' ) ;
218+ const [ isAborting , setIsAborting ] = useState ( false ) ;
219+ const [ isAbortSnackbarOpen , setIsAbortSnackbarOpen ] = useState ( false ) ;
220+ const [ abortError , setAbortError ] = useState ( '' ) ;
221221
222- const [ isRetrigger , setIsRetrigger ] = React . useState ( false ) ;
223- const [ isRetriggerSnackbarOpen , setIsRetriggerSnackbarOpen ] =
224- React . useState ( false ) ;
225- const [ retriggerError , setRetriggerError ] = React . useState ( '' ) ;
222+ const [ isRetrigger , setIsRetrigger ] = useState ( false ) ;
223+ const [ isRetriggerSnackbarOpen , setIsRetriggerSnackbarOpen ] = useState ( false ) ;
224+ const [ retriggerError , setRetriggerError ] = useState ( '' ) ;
226225
227226 const handleAbortBarClose = ( ) => {
228227 setIsAbortSnackbarOpen ( false ) ;
@@ -231,7 +230,7 @@ export const WorkflowInstancePage = () => {
231230 setIsRetriggerSnackbarOpen ( false ) ;
232231 } ;
233232
234- const fetchInstance = React . useCallback ( async ( ) => {
233+ const fetchInstance = useCallback ( async ( ) => {
235234 if ( ! instanceId ) {
236235 return undefined ;
237236 }
@@ -283,28 +282,40 @@ export const WorkflowInstancePage = () => {
283282 value ?. state === ProcessInstanceStatusDTO . Aborted ||
284283 value ?. state === ProcessInstanceStatusDTO . Error ;
285284
286- const toggleAbortConfirmationDialog = React . useCallback ( ( ) => {
285+ const toggleAbortConfirmationDialog = useCallback ( ( ) => {
287286 setIsAbortConfirmationDialogOpen ( prev => ! prev ) ;
288287 } , [ ] ) ;
289288
290- const handleAbort = React . useCallback ( async ( ) => {
289+ const handleAbort = useCallback ( async ( ) => {
291290 if ( value ) {
292291 setIsAborting ( true ) ;
293292
294293 try {
295294 await orchestratorApi . abortWorkflowInstance ( value . id ) ;
296295 restart ( ) ;
297296 } catch ( e ) {
298- setAbortError ( `Abort failed: ${ ( e as Error ) . message } ` ) ;
297+ const res = await fetchInstance ( ) ;
298+ if ( res ?. state === ProcessInstanceStatusDTO . Completed ) {
299+ setAbortError ( 'Abort failed: Run has already been completed.' ) ;
300+ restart ( ) ;
301+ } else {
302+ setAbortError ( `Abort failed: ${ ( e as Error ) . message } ` ) ;
303+ }
299304 setIsAbortSnackbarOpen ( true ) ;
300305 } finally {
301306 setIsAborting ( false ) ;
302307 toggleAbortConfirmationDialog ( ) ;
303308 }
304309 }
305- } , [ orchestratorApi , restart , value , toggleAbortConfirmationDialog ] ) ;
310+ } , [
311+ orchestratorApi ,
312+ restart ,
313+ value ,
314+ toggleAbortConfirmationDialog ,
315+ fetchInstance ,
316+ ] ) ;
306317
307- const handleRerun = React . useCallback ( ( ) => {
318+ const handleRerun = useCallback ( ( ) => {
308319 if ( ! value ) {
309320 return ;
310321 }
0 commit comments