saleor-dashboard/src/containers/BackgroundTasks/tasks.ts

145 lines
3.9 KiB
TypeScript
Raw Normal View History

2020-06-26 17:06:48 +00:00
import { IMessageContext } from "@saleor/components/messages";
import { commonMessages } from "@saleor/intl";
import { JobStatusEnum } from "@saleor/types/globalTypes";
import { ApolloQueryResult } from "apollo-client";
import { IntlShape } from "react-intl";
2020-06-26 17:06:48 +00:00
import messages from "./messages";
2020-06-26 17:06:48 +00:00
import {
InvoiceGenerateParams,
QueuedTask,
TaskData,
TaskStatus
} from "./types";
import { CheckExportFileStatus } from "./types/CheckExportFileStatus";
import { CheckOrderInvoicesStatus } from "./types/CheckOrderInvoicesStatus";
2020-06-26 17:06:48 +00:00
function getTaskStatus(jobStatus: JobStatusEnum): TaskStatus {
switch (jobStatus) {
case JobStatusEnum.SUCCESS:
return TaskStatus.SUCCESS;
case JobStatusEnum.PENDING:
return TaskStatus.PENDING;
default:
return TaskStatus.FAILURE;
2020-06-26 17:06:48 +00:00
}
}
2020-06-19 10:42:29 +00:00
export async function handleTask(task: QueuedTask): Promise<TaskStatus> {
let status = TaskStatus.PENDING;
2020-06-19 10:42:29 +00:00
try {
status = await task.handle();
if (status !== TaskStatus.PENDING) {
task.onCompleted({
status
});
2020-06-21 15:31:33 +00:00
}
2020-06-19 10:42:29 +00:00
} catch (error) {
task.onError(error);
}
return status;
2020-06-19 10:42:29 +00:00
}
export function handleError(error: Error) {
throw error;
}
export function queueCustom(
id: number,
tasks: React.MutableRefObject<QueuedTask[]>,
data: TaskData
) {
(["handle", "onCompleted"] as Array<keyof TaskData>)
.filter(field => !data[field])
.forEach(field => {
throw new Error(`${field} is required when creating custom task`);
});
tasks.current = [
...tasks.current,
{
handle: data.handle,
id,
onCompleted: data.onCompleted,
2020-06-21 15:31:33 +00:00
onError: data.onError || handleError,
status: TaskStatus.PENDING
2020-06-19 10:42:29 +00:00
}
];
}
2020-06-26 17:06:48 +00:00
export function queueInvoiceGenerate(
id: number,
generateInvoice: InvoiceGenerateParams,
tasks: React.MutableRefObject<QueuedTask[]>,
fetch: () => Promise<ApolloQueryResult<CheckOrderInvoicesStatus>>,
notify: IMessageContext,
intl: IntlShape
) {
if (!generateInvoice) {
throw new Error("generateInvoice is required when creating custom task");
}
tasks.current = [
...tasks.current,
{
handle: async () => {
const result = await fetch();
const status = result.data.order.invoices.find(
invoice => invoice.id === generateInvoice.invoiceId
).status;
return getTaskStatus(status);
2020-06-26 17:06:48 +00:00
},
id,
onCompleted: data =>
data.status === TaskStatus.SUCCESS
? notify({
2020-07-07 14:01:16 +00:00
status: "success",
2020-06-26 17:06:48 +00:00
text: intl.formatMessage(messages.invoiceGenerateFinishedText),
title: intl.formatMessage(messages.invoiceGenerateFinishedTitle)
})
: notify({
status: "error",
2020-06-26 17:06:48 +00:00
text: intl.formatMessage(commonMessages.somethingWentWrong),
title: intl.formatMessage(messages.invoiceGenerationFailedTitle)
}),
onError: handleError,
status: TaskStatus.PENDING
}
];
}
export function queueExport(
id: number,
tasks: React.MutableRefObject<QueuedTask[]>,
fetch: () => Promise<ApolloQueryResult<CheckExportFileStatus>>,
notify: IMessageContext,
intl: IntlShape
) {
tasks.current = [
...tasks.current,
{
handle: async () => {
const result = await fetch();
const status = result.data.exportFile.status;
return getTaskStatus(status);
},
id,
onCompleted: data =>
data.status === TaskStatus.SUCCESS
? notify({
status: "success",
text: intl.formatMessage(messages.exportFinishedText),
title: intl.formatMessage(messages.exportFinishedTitle)
})
: notify({
status: "error",
text: intl.formatMessage(commonMessages.somethingWentWrong),
title: intl.formatMessage(messages.exportFailedTitle)
}),
onError: handleError,
status: TaskStatus.PENDING
}
];
}