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";
|
2020-07-30 09:54:16 +00:00
|
|
|
import { IntlShape } from "react-intl";
|
2020-06-26 17:06:48 +00:00
|
|
|
|
2020-07-30 09:54:16 +00:00
|
|
|
import messages from "./messages";
|
2020-06-26 17:06:48 +00:00
|
|
|
import {
|
|
|
|
InvoiceGenerateParams,
|
|
|
|
QueuedTask,
|
|
|
|
TaskData,
|
|
|
|
TaskStatus
|
|
|
|
} from "./types";
|
2020-07-30 09:54:16 +00:00
|
|
|
import { CheckExportFileStatus } from "./types/CheckExportFileStatus";
|
|
|
|
import { CheckOrderInvoicesStatus } from "./types/CheckOrderInvoicesStatus";
|
2020-06-26 17:06:48 +00:00
|
|
|
|
2020-07-30 09:54:16 +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-07-30 09:54:16 +00:00
|
|
|
}
|
2020-06-19 10:42:29 +00:00
|
|
|
|
2020-07-06 14:24:54 +00:00
|
|
|
export async function handleTask(task: QueuedTask): Promise<TaskStatus> {
|
|
|
|
let status = TaskStatus.PENDING;
|
2020-06-19 10:42:29 +00:00
|
|
|
try {
|
2020-07-06 14:24:54 +00:00
|
|
|
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);
|
|
|
|
}
|
|
|
|
|
2020-07-06 14:24:54 +00:00
|
|
|
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;
|
|
|
|
|
2020-07-30 09:54:16 +00:00
|
|
|
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({
|
2020-07-30 09:54:16 +00:00
|
|
|
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
|
|
|
|
}
|
|
|
|
];
|
|
|
|
}
|
2020-07-30 09:54:16 +00:00
|
|
|
|
|
|
|
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
|
|
|
|
}
|
|
|
|
];
|
|
|
|
}
|