@@ -4,19 +4,11 @@ import {isUnitTest} from '../../../../public/node/context/local.js'
44import { AbortSignal } from '../../../../public/node/abort.js'
55import useAbortSignal from '../hooks/use-abort-signal.js'
66import { useExitOnCtrlC } from '../hooks/use-exit-on-ctrl-c.js'
7- import { TokenizedString } from '../../../../public/node/output .js'
7+ import { runTasks , Task } from '../tasks .js'
88
9- import React , { useRef , useState } from 'react'
9+ import React , { useState } from 'react'
1010
11- export interface Task < TContext = unknown > {
12- title : string | TokenizedString
13-
14- task : ( ctx : TContext , task : Task < TContext > ) => Promise < void | Task < TContext > [ ] >
15- retry ?: number
16- retryCount ?: number
17- errors ?: Error [ ]
18- skip ?: ( ctx : TContext ) => boolean
19- }
11+ export type { Task } from '../tasks.js'
2012
2113interface TasksProps < TContext > {
2214 tasks : Task < TContext > [ ]
@@ -33,30 +25,6 @@ enum TasksState {
3325 Failure = 'failure' ,
3426}
3527
36- async function runTask < TContext > ( task : Task < TContext > , ctx : TContext ) {
37- task . retryCount = 0
38- task . errors = [ ]
39- const retry = task . retry && task . retry > 0 ? task . retry + 1 : 1
40-
41- for ( let retries = 1 ; retries <= retry ; retries ++ ) {
42- try {
43- if ( task . skip ?.( ctx ) ) {
44- return
45- }
46- // eslint-disable-next-line no-await-in-loop
47- return await task . task ( ctx , task )
48- // eslint-disable-next-line @typescript-eslint/no-explicit-any
49- } catch ( error : any ) {
50- if ( retries === retry ) {
51- throw error
52- } else {
53- task . errors . push ( error )
54- task . retryCount = retries
55- }
56- }
57- }
58- }
59-
6028const noop = ( ) => { }
6129
6230function Tasks < TContext > ( {
@@ -69,30 +37,11 @@ function Tasks<TContext>({
6937} : React . PropsWithChildren < TasksProps < TContext > > ) {
7038 const [ currentTask , setCurrentTask ] = useState < Task < TContext > > ( tasks [ 0 ] ! )
7139 const [ state , setState ] = useState < TasksState > ( TasksState . Loading )
72- const ctx = useRef < TContext > ( { } as TContext )
73-
74- const runTasks = async ( ) => {
75- for ( const task of tasks ) {
76- setCurrentTask ( task )
77-
78- // eslint-disable-next-line no-await-in-loop
79- const subTasks = await runTask ( task , ctx . current )
80-
81- // subtasks
82- if ( Array . isArray ( subTasks ) && subTasks . length > 0 && subTasks . every ( ( task ) => 'task' in task ) ) {
83- for ( const subTask of subTasks ) {
84- setCurrentTask ( subTask )
85- // eslint-disable-next-line no-await-in-loop
86- await runTask ( subTask , ctx . current )
87- }
88- }
89- }
90- }
9140
92- useAsyncAndUnmount ( runTasks , {
93- onFulfilled : ( ) => {
41+ useAsyncAndUnmount ( ( ) => runTasks ( tasks , setCurrentTask ) , {
42+ onFulfilled : ( context ) => {
9443 setState ( TasksState . Success )
95- onComplete ( ctx . current )
44+ onComplete ( context )
9645 } ,
9746 onRejected : ( ) => {
9847 setState ( TasksState . Failure )
0 commit comments