import { ChannelVoucherData } from "@saleor/channels/utils"; import CardSpacer from "@saleor/components/CardSpacer"; import ChannelsAvailabilityCard from "@saleor/components/ChannelsAvailabilityCard"; import { ConfirmButtonTransitionState } from "@saleor/components/ConfirmButton"; import Container from "@saleor/components/Container"; import Form from "@saleor/components/Form"; import Grid from "@saleor/components/Grid"; import Metadata, { MetadataFormData } from "@saleor/components/Metadata"; import PageHeader from "@saleor/components/PageHeader"; import Savebar from "@saleor/components/Savebar"; import { createChannelsChangeHandler, createDiscountTypeChangeHandler } from "@saleor/discounts/handlers"; import { DiscountErrorFragment } from "@saleor/fragments/types/DiscountErrorFragment"; import { sectionNames } from "@saleor/intl"; import { Backlink } from "@saleor/macaw-ui"; import { validatePrice } from "@saleor/products/utils/validation"; import useMetadataChangeTrigger from "@saleor/utils/metadata/useMetadataChangeTrigger"; import React from "react"; import { useIntl } from "react-intl"; import { PermissionEnum, VoucherTypeEnum } from "../../../types/globalTypes"; import { DiscountTypeEnum, RequirementsPicker } from "../../types"; import VoucherDates from "../VoucherDates"; import VoucherInfo from "../VoucherInfo"; import VoucherLimits from "../VoucherLimits"; import VoucherRequirements from "../VoucherRequirements"; import VoucherTypes from "../VoucherTypes"; import VoucherValue from "../VoucherValue"; export interface FormData extends MetadataFormData { applyOncePerCustomer: boolean; applyOncePerOrder: boolean; onlyForStaff: boolean; channelListings: ChannelVoucherData[]; code: string; discountType: DiscountTypeEnum; endDate: string; endTime: string; hasEndDate: boolean; hasUsageLimit: boolean; minCheckoutItemsQuantity: string; requirementsPicker: RequirementsPicker; startDate: string; startTime: string; type: VoucherTypeEnum; usageLimit: string; value: number; } export interface VoucherCreatePageProps { allChannelsCount: number; channelListings: ChannelVoucherData[]; hasChannelChanged: boolean; disabled: boolean; errors: DiscountErrorFragment[]; saveButtonBarState: ConfirmButtonTransitionState; onBack: () => void; onChannelsChange: (data: ChannelVoucherData[]) => void; openChannelsModal: () => void; onSubmit: (data: FormData) => void; } const VoucherCreatePage: React.FC = ({ allChannelsCount, channelListings = [], disabled, errors, saveButtonBarState, onBack, onChannelsChange, onSubmit, hasChannelChanged, openChannelsModal }) => { const intl = useIntl(); const { makeChangeHandler: makeMetadataChangeHandler } = useMetadataChangeTrigger(); const initialForm: FormData = { applyOncePerCustomer: false, applyOncePerOrder: false, onlyForStaff: false, channelListings, code: "", discountType: DiscountTypeEnum.VALUE_FIXED, endDate: "", endTime: "", hasEndDate: false, hasUsageLimit: false, minCheckoutItemsQuantity: "0", requirementsPicker: RequirementsPicker.NONE, startDate: "", startTime: "", type: VoucherTypeEnum.ENTIRE_ORDER, usageLimit: "0", value: 0, metadata: [], privateMetadata: [] }; return (
{({ change, data, hasChanged, submit, triggerChange }) => { const handleDiscountTypeChange = createDiscountTypeChangeHandler( change ); const handleChannelChange = createChannelsChangeHandler( data.channelListings, onChannelsChange, triggerChange ); const formDisabled = data.discountType.toString() !== "SHIPPING" && data.channelListings?.some( channel => validatePrice(channel.discountValue) || (data.requirementsPicker === RequirementsPicker.ORDER && validatePrice(channel.minSpent)) ); const changeMetadata = makeMetadataChangeHandler(change); return ( {intl.formatMessage(sectionNames.vouchers)}
handleDiscountTypeChange(data, event)} variant="create" /> {data.discountType.toString() !== "SHIPPING" ? ( <> ) : null}
({ id: channel.id, name: channel.name }))} disabled={disabled} openModal={openChannelsModal} />
); }}
); }; VoucherCreatePage.displayName = "VoucherCreatePage"; export default VoucherCreatePage;