MartinMalinda/vue-concurrency

View on GitHub
src/TaskGroup.ts

Summary

Maintainability
A
0 mins
Test Coverage
A
100%
import { Task } from "./Task";
import { reactive, computed } from "./utils/api";

export interface TaskState {
  isRunning: boolean;
  isIdle: boolean;
}

export type TaskGroup<U extends Record<string, Task<any, any>>> = TaskState & U;

export default function useTaskGroup<U extends Record<string, Task<any, any>>>(
  taskMap: U
): TaskGroup<U> {
  const taskArray = Object.values(taskMap);
  const isRunning = computed(() => !!taskArray.find((task) => task.isRunning));
  const taskGroup = reactive({
    isRunning: isRunning,
    isIdle: computed(() => !isRunning.value),
    isError: computed(() => !!taskArray.find((task) => task.isError)),
    ...taskMap,
  })

  return taskGroup as TaskGroup<U>;
}