saleor-dashboard/src/giftCards/GiftCardExportDialogContent/GiftCardExportDialogContent.tsx
Paweł Chyła ce1854b2ca
Introduce datagrid in grift cards list (#3894)
Co-authored-by: wojteknowacki <124166231+wojteknowacki@users.noreply.github.com>
2023-07-19 15:31:33 +02:00

163 lines
4.7 KiB
TypeScript

import { ConfirmButton } from "@dashboard/components/ConfirmButton";
import { Task } from "@dashboard/containers/BackgroundTasks/types";
import {
useExportGiftCardsMutation,
useGiftCardTotalCountQuery,
} from "@dashboard/graphql";
import useBackgroundTask from "@dashboard/hooks/useBackgroundTask";
import useForm from "@dashboard/hooks/useForm";
import useNotifier from "@dashboard/hooks/useNotifier";
import ExportDialogSettings from "@dashboard/products/components/ProductExportDialog/ExportDialogSettings";
import {
ExportSettingsFormData,
exportSettingsInitialFormData,
exportSettingsInitialFormDataWithIds,
} from "@dashboard/products/components/ProductExportDialog/types";
import { DialogProps } from "@dashboard/types";
import {
DialogActions,
DialogContent,
DialogTitle,
Typography,
} from "@material-ui/core";
import React from "react";
import { FormattedMessage, useIntl } from "react-intl";
import ContentWithProgress from "../GiftCardCreateDialog/ContentWithProgress";
import { useGiftCardList } from "../GiftCardsList/providers/GiftCardListProvider";
import { giftCardExportDialogMessages as messages } from "./messages";
import useStyles from "./styles";
import { getExportGiftCardsInput } from "./utils";
const GiftCardExportDialog: React.FC<
Pick<DialogProps, "onClose"> & {
idsToExport?: string[] | null;
}
> = ({ onClose, idsToExport }) => {
const intl = useIntl();
const notify = useNotifier();
const { queue } = useBackgroundTask();
const classes = useStyles();
const hasIdsToExport = !!idsToExport?.length;
const {
loading: loadingGiftCardList,
totalCount: filteredGiftCardsCount,
selectedRowIds,
} = useGiftCardList();
const selectedIds = idsToExport ?? selectedRowIds;
const { data: allGiftCardsCountData, loading: loadingGiftCardCount } =
useGiftCardTotalCountQuery();
const loading = loadingGiftCardList || loadingGiftCardCount;
const [exportGiftCards, exportGiftCardsOpts] = useExportGiftCardsMutation({
onCompleted: data => {
const errors = data?.exportGiftCards?.errors;
if (!errors?.length) {
notify({
text: intl.formatMessage(messages.successAlertDescription),
title: intl.formatMessage(messages.successAlertTitle),
});
queue(Task.EXPORT, {
id: data?.exportGiftCards?.exportFile?.id,
});
onClose();
}
},
});
const handleSubmit = (data: ExportSettingsFormData) => {
exportGiftCards({
variables: {
input: getExportGiftCardsInput({
data,
ids: selectedIds,
}),
},
});
};
const { data, change, submit } = useForm(
hasIdsToExport
? exportSettingsInitialFormDataWithIds
: exportSettingsInitialFormData,
handleSubmit,
);
const allGiftCardsCount = allGiftCardsCountData?.giftCards?.totalCount ?? 0;
const exportScopeLabels = {
allItems: intl.formatMessage(
{
id: "uQk8gB",
defaultMessage: "All gift cards ({number})",
description: "export all items to csv file",
},
{
number: allGiftCardsCount || "...",
},
),
selectedItems: intl.formatMessage(
{
id: "n97Ii0",
defaultMessage: "Selected giftCards ({number})",
description: "export selected items to csv file",
},
{
number: selectedRowIds.length,
},
),
};
return (
<>
<DialogTitle disableTypography>
<FormattedMessage {...messages.title} />
</DialogTitle>
<DialogContent>
<ContentWithProgress>
{!loading && (
<>
<ExportDialogSettings
errors={
exportGiftCardsOpts?.data?.exportGiftCards?.errors ?? []
}
onChange={change}
selectedItems={selectedIds?.length}
data={data}
exportScopeLabels={exportScopeLabels}
allowScopeSelection={!hasIdsToExport}
itemsQuantity={{
filter: filteredGiftCardsCount,
all: allGiftCardsCount,
}}
/>
<Typography className={classes.note} variant="body2">
{intl.formatMessage(messages.exportNote)}
</Typography>
</>
)}
</ContentWithProgress>
</DialogContent>
<DialogActions>
<ConfirmButton
transitionState={exportGiftCardsOpts.status}
variant="primary"
type="submit"
data-test-id="submit"
onClick={submit}
>
<FormattedMessage {...messages.confirmButtonLabel} />
</ConfirmButton>
</DialogActions>
</>
);
};
export default GiftCardExportDialog;