import { useQueryClient } from '@tanstack/react-query'; import { useEffect, useRef, useState } from '@wordpress/element'; import { applyFix } from '../../shared/api/fixRuns'; import { refreshLinkData } from '../../shared/api/refreshLinkData'; import type { Fix } from '../../shared/api/types/fixes'; import { errorMessage } from '../../shared/ui/errorMessage'; import type { FixAllRequest } from './fixAllRequest'; export type FixAllStep = 'choose' | 'running' | 'done' | 'failed'; export function useFixAllRun() { const queryClient = useQueryClient(); const [ step, setStep ] = useState< FixAllStep >( 'choose' ); const [ fix, setFix ] = useState< Fix | null >( null ); const [ failureMessage, setFailureMessage ] = useState( '' ); const stopper = useRef< AbortController | null >( null ); useEffect( () => () => { stopper.current?.abort(); }, [] ); const start = async ( request: FixAllRequest ) => { const controller = new AbortController(); stopper.current = controller; setStep( 'running' ); try { setFix( await applyFix( request, setFix, controller.signal ) ); setStep( 'done' ); } catch ( error ) { setFailureMessage( errorMessage( error, '' ) ); setStep( 'failed' ); } finally { refreshLinkData( queryClient ); } }; const stop = () => { stopper.current?.abort(); }; return { step, fix, failureMessage, start, stop }; }