saleor-dashboard/src/containers/BackgroundTasks/BackgroundTasksProvider.tsx

86 lines
2 KiB
TypeScript
Raw Normal View History

2020-06-19 10:42:29 +00:00
import React from "react";
import BackgroundTasksContext from "./context";
import { handleTask, queueCustom } from "./tasks";
2020-06-21 15:31:33 +00:00
import { QueuedTask, Task, TaskData, TaskStatus } from "./types";
2020-06-19 10:42:29 +00:00
export const backgroundTasksRefreshTime = 15 * 1000;
export function useBackgroundTasks() {
const idCounter = React.useRef(0);
const tasks = React.useRef<QueuedTask[]>([]);
React.useEffect(() => {
const intervalId = setInterval(() => {
2020-06-21 15:31:33 +00:00
const queue = async () => {
tasks.current = tasks.current.filter(
task => task.status !== TaskStatus.ENDED
);
try {
await Promise.all(
tasks.current.map(async task => {
let hasFinished: boolean;
try {
hasFinished = await handleTask(task);
} catch (error) {
throw error;
}
if (hasFinished) {
const taskIndex = tasks.current.findIndex(
t => t.id === task.id
);
tasks.current[taskIndex].status = TaskStatus.ENDED;
}
})
);
} catch (error) {
throw error;
}
};
queue();
2020-06-19 10:42:29 +00:00
}, backgroundTasksRefreshTime);
return () => clearInterval(intervalId);
});
function cancel(id: number) {
tasks.current = tasks.current.filter(task => task.id !== id);
}
function queue(type: Task, data?: TaskData) {
idCounter.current += 1;
switch (type) {
case Task.CUSTOM:
queueCustom(idCounter.current, tasks, data);
}
return idCounter.current;
}
return {
cancel,
queue
};
}
const BackgroundTasksProvider: React.FC = ({ children }) => {
const { cancel, queue } = useBackgroundTasks();
return (
<BackgroundTasksContext.Provider
value={{
cancel,
queue
}}
>
{children}
</BackgroundTasksContext.Provider>
);
};
BackgroundTasksProvider.displayName = "BackgroundTasksProvider";
export default BackgroundTasksProvider;