saleor-dashboard/src/shipping/views/RateCreate.tsx
Dominik Żegleń 8ab05ab8e1
Merge shipping rates views (#1851)
* Merge price and weight based rate pages

* Increate text field width

* Update messages
2022-02-25 16:04:11 +01:00

177 lines
5.1 KiB
TypeScript

import { createSortedShippingChannels } from "@saleor/channels/utils";
import ChannelsAvailabilityDialog from "@saleor/components/ChannelsAvailabilityDialog";
import { WindowTitle } from "@saleor/components/WindowTitle";
import useChannels from "@saleor/hooks/useChannels";
import useNavigator from "@saleor/hooks/useNavigator";
import { sectionNames } from "@saleor/intl";
import ShippingZonePostalCodeRangeDialog from "@saleor/shipping/components/ShippingZonePostalCodeRangeDialog";
import ShippingZoneRatesCreatePage from "@saleor/shipping/components/ShippingZoneRatesCreatePage";
import { useShippingRateCreator } from "@saleor/shipping/handlers";
import { useShippingZoneChannels } from "@saleor/shipping/queries";
import {
shippingRateCreateUrl,
ShippingRateCreateUrlDialog,
ShippingRateCreateUrlQueryParams,
shippingZoneUrl
} from "@saleor/shipping/urls";
import postalCodesReducer from "@saleor/shipping/views/reducer";
import {
filterPostalCodes,
getPostalCodeRuleByMinMax,
getRuleObject
} from "@saleor/shipping/views/utils";
import { MinMax } from "@saleor/types";
import { PostalCodeRuleInclusionTypeEnum } from "@saleor/types/globalTypes";
import createDialogActionHandlers from "@saleor/utils/handlers/dialogActionHandlers";
import React from "react";
import { useIntl } from "react-intl";
const FORM_ID = Symbol();
export interface RateCreateProps {
id: string;
params: ShippingRateCreateUrlQueryParams;
}
export const RateCreate: React.FC<RateCreateProps> = ({ id, params }) => {
const navigate = useNavigator();
const intl = useIntl();
const [openModal, closeModal] = createDialogActionHandlers<
ShippingRateCreateUrlDialog,
ShippingRateCreateUrlQueryParams
>(navigate, params => shippingRateCreateUrl(id, params), params);
const {
data: shippingZoneData,
loading: channelsLoading
} = useShippingZoneChannels({
displayLoader: true,
variables: { id }
});
const allChannels = createSortedShippingChannels(
shippingZoneData?.shippingZone?.channels
);
const {
channelListElements,
channelsToggle,
currentChannels,
handleChannelsConfirm,
handleChannelsModalClose,
handleChannelsModalOpen,
isChannelSelected,
isChannelsModalOpen,
setCurrentChannels,
toggleAllChannels
} = useChannels(
allChannels,
params?.action,
{ closeModal, openModal },
{ formId: FORM_ID }
);
const [state, dispatch] = React.useReducer(postalCodesReducer, {
codesToDelete: [],
havePostalCodesChanged: false,
inclusionType: PostalCodeRuleInclusionTypeEnum.EXCLUDE,
originalCodes: [],
postalCodeRules: []
});
const {
channelErrors,
createShippingRate,
errors,
status
} = useShippingRateCreator(
id,
params.type,
state.postalCodeRules,
state.inclusionType
);
const handleBack = () => navigate(shippingZoneUrl(id));
const onPostalCodeAssign = (rule: MinMax) => {
if (
state.postalCodeRules.filter(getPostalCodeRuleByMinMax(rule)).length > 0
) {
closeModal();
return;
}
const newCode = getRuleObject(rule, state.inclusionType);
dispatch({
havePostalCodesChanged: true,
postalCodeRules: [...state.postalCodeRules, newCode]
});
closeModal();
};
const onPostalCodeInclusionChange = (
inclusion: PostalCodeRuleInclusionTypeEnum
) => {
dispatch({
inclusionType: inclusion,
postalCodeRules: []
});
};
const onPostalCodeUnassign = code => {
dispatch({
havePostalCodesChanged: true,
postalCodeRules: filterPostalCodes(state.postalCodeRules, code)
});
};
return (
<>
<WindowTitle title={intl.formatMessage(sectionNames.shipping)} />
{!!allChannels?.length && (
<ChannelsAvailabilityDialog
isSelected={isChannelSelected}
channels={allChannels}
onChange={channelsToggle}
onClose={handleChannelsModalClose}
open={isChannelsModalOpen}
title={intl.formatMessage({
defaultMessage: "Manage Channel Availability"
})}
confirmButtonState="default"
selected={channelListElements.length}
onConfirm={handleChannelsConfirm}
toggleAll={toggleAllChannels}
/>
)}
<ShippingZoneRatesCreatePage
formId={FORM_ID}
allChannelsCount={allChannels?.length}
shippingChannels={currentChannels}
disabled={channelsLoading || status === "loading"}
saveButtonBarState={status}
onSubmit={createShippingRate}
onBack={handleBack}
errors={errors}
channelErrors={channelErrors}
postalCodes={state.postalCodeRules}
openChannelsModal={handleChannelsModalOpen}
onChannelsChange={setCurrentChannels}
onPostalCodeAssign={() => openModal("add-range")}
onPostalCodeUnassign={onPostalCodeUnassign}
onPostalCodeInclusionChange={onPostalCodeInclusionChange}
variant={params.type}
/>
<ShippingZonePostalCodeRangeDialog
confirmButtonState="default"
onClose={closeModal}
onSubmit={onPostalCodeAssign}
open={params.action === "add-range"}
/>
</>
);
};
export default RateCreate;