diff --git a/src/orders/components/OrderReturnPage/utils.tsx b/src/orders/components/OrderReturnPage/utils.tsx index c926dadb6..98b534ce4 100644 --- a/src/orders/components/OrderReturnPage/utils.tsx +++ b/src/orders/components/OrderReturnPage/utils.tsx @@ -91,3 +91,7 @@ export const getParsedFulfiledLines = ( export const getById = (idToCompare: string) => (obj: { id: string }) => obj.id === idToCompare; + +export const getByUnmatchingId = (idToCompare: string) => (obj: { + id: string; +}) => obj.id !== idToCompare; diff --git a/src/shipping/components/ShippingZonePostalCodes/ShippingZonePostalCodes.tsx b/src/shipping/components/ShippingZonePostalCodes/ShippingZonePostalCodes.tsx index 4fafac07a..054680855 100644 --- a/src/shipping/components/ShippingZonePostalCodes/ShippingZonePostalCodes.tsx +++ b/src/shipping/components/ShippingZonePostalCodes/ShippingZonePostalCodes.tsx @@ -24,7 +24,6 @@ import { FormattedMessage, useIntl } from "react-intl"; export interface ShippingZonePostalCodesProps { disabled: boolean; initialExpanded?: boolean; - initialInclusionType?: PostalCodeRuleInclusionTypeEnum; postalCodes: ShippingMethodFragment_postalCodeRules[] | undefined; onPostalCodeInclusionChange: ( inclusion: PostalCodeRuleInclusionTypeEnum @@ -64,7 +63,6 @@ const useStyles = makeStyles( const ShippingZonePostalCodes: React.FC = ({ disabled, initialExpanded = true, - initialInclusionType = PostalCodeRuleInclusionTypeEnum.EXCLUDE, postalCodes, onPostalCodeDelete, onPostalCodeInclusionChange, @@ -75,6 +73,15 @@ const ShippingZonePostalCodes: React.FC = ({ const intl = useIntl(); const classes = useStyles({}); + const getInclusionType = () => { + if (inclusionType) { + return inclusionType; + } + return ( + postalCodes[0]?.inclusionType || PostalCodeRuleInclusionTypeEnum.EXCLUDE + ); + }; + const onInclusionRadioChange = (event: React.ChangeEvent) => { const value = event.target.value; setInclusionType(value); @@ -93,9 +100,6 @@ const ShippingZonePostalCodes: React.FC = ({ return postalCodeRange.start; }; - const getInlcusionType = () => - inclusionType === null ? initialInclusionType : inclusionType; - return ( = ({ } ]} name="includePostalCodes" - value={getInlcusionType()} + value={getInclusionType()} onChange={onInclusionRadioChange} /> diff --git a/src/shipping/components/ShippingZoneRatesCreatePage/ShippingZoneRatesCreatePage.tsx b/src/shipping/components/ShippingZoneRatesCreatePage/ShippingZoneRatesCreatePage.tsx index 2b660be97..23ffab72b 100644 --- a/src/shipping/components/ShippingZoneRatesCreatePage/ShippingZoneRatesCreatePage.tsx +++ b/src/shipping/components/ShippingZoneRatesCreatePage/ShippingZoneRatesCreatePage.tsx @@ -91,12 +91,6 @@ export const ShippingZoneRatesCreatePage: React.FC { - onPostalCodeInclusionChange(inclusion); - }; - return (
{({ change, data, hasChanged, submit, triggerChange }) => { @@ -166,7 +160,7 @@ export const ShippingZoneRatesCreatePage: React.FC diff --git a/src/shipping/components/ShippingZoneRatesPage/ShippingZoneRatesPage.stories.tsx b/src/shipping/components/ShippingZoneRatesPage/ShippingZoneRatesPage.stories.tsx index 538cce234..10993c8a1 100644 --- a/src/shipping/components/ShippingZoneRatesPage/ShippingZoneRatesPage.stories.tsx +++ b/src/shipping/components/ShippingZoneRatesPage/ShippingZoneRatesPage.stories.tsx @@ -56,6 +56,7 @@ const props: ShippingZoneRatesPageProps = { onProductUnassign: () => undefined, onSubmit: () => undefined, openChannelsModal: () => undefined, + postalCodeRules: [], rate: shippingZone.shippingMethods[0], saveButtonBarState: "default", selected: 0, diff --git a/src/shipping/components/ShippingZoneRatesPage/ShippingZoneRatesPage.tsx b/src/shipping/components/ShippingZoneRatesPage/ShippingZoneRatesPage.tsx index 3b0691f9e..91993979a 100644 --- a/src/shipping/components/ShippingZoneRatesPage/ShippingZoneRatesPage.tsx +++ b/src/shipping/components/ShippingZoneRatesPage/ShippingZoneRatesPage.tsx @@ -20,7 +20,10 @@ import PricingCard from "@saleor/shipping/components/PricingCard"; import ShippingMethodProducts from "@saleor/shipping/components/ShippingMethodProducts"; import ShippingRateInfo from "@saleor/shipping/components/ShippingRateInfo"; import { createChannelsChangeHandler } from "@saleor/shipping/handlers"; -import { ShippingZone_shippingZone_shippingMethods } from "@saleor/shipping/types/ShippingZone"; +import { + ShippingZone_shippingZone_shippingMethods, + ShippingZone_shippingZone_shippingMethods_postalCodeRules +} from "@saleor/shipping/types/ShippingZone"; import { ListActions, ListProps } from "@saleor/types"; import { PostalCodeRuleInclusionTypeEnum, @@ -56,6 +59,7 @@ export interface ShippingZoneRatesPageProps channelErrors: ShippingChannelsErrorFragment[]; errors: ShippingErrorFragment[]; saveButtonBarState: ConfirmButtonTransitionState; + postalCodeRules: ShippingZone_shippingZone_shippingMethods_postalCodeRules[]; onBack: () => void; onDelete?: () => void; onSubmit: (data: FormData) => void; @@ -91,6 +95,7 @@ export const ShippingZoneRatesPage: React.FC = ({ openChannelsModal, rate, saveButtonBarState, + postalCodeRules, variant, ...listProps }) => { @@ -108,14 +113,6 @@ export const ShippingZoneRatesPage: React.FC = ({ type: rate?.type || null }; - const postalCodesInclusionType = rate?.postalCodeRules[0]?.inclusionType; - - const postalCodeInclusionChange = ( - inclusion: PostalCodeRuleInclusionTypeEnum - ) => { - onPostalCodeInclusionChange(inclusion); - }; - const { makeChangeHandler: makeMetadataChangeHandler } = useMetadataChangeTrigger(); @@ -181,10 +178,9 @@ export const ShippingZoneRatesPage: React.FC = ({ = ({ const navigate = useNavigator(); const intl = useIntl(); - const [postalCodes, setPostalCodes] = React.useState([]); - const [radioInclusionType, setRadioInclusionType] = React.useState( - PostalCodeRuleInclusionTypeEnum.EXCLUDE - ); - const { data: channelsData, loading: channelsLoading } = useChannelsList({}); const [openModal, closeModal] = createDialogActionHandlers< @@ -63,6 +63,14 @@ export const PriceRatesCreate: React.FC = ({ toggleAllChannels } = useChannels(allChannels, params?.action, { closeModal, openModal }); + const [state, dispatch] = React.useReducer(postalCodesReducer, { + codesToDelete: [], + havePostalCodesChanged: false, + inclusionType: PostalCodeRuleInclusionTypeEnum.EXCLUDE, + originalCodes: [], + postalCodeRules: [] + }); + const { channelErrors, createShippingRate, @@ -71,33 +79,42 @@ export const PriceRatesCreate: React.FC = ({ } = useShippingRateCreator( id, ShippingMethodTypeEnum.PRICE, - postalCodes, - radioInclusionType + state.postalCodeRules, + state.inclusionType ); const handleBack = () => navigate(shippingZoneUrl(id)); - const handlePostalCodeRangeAdd = (data: MinMax) => { - setPostalCodes(postalCodes => [ - ...postalCodes, - { - end: data.max, - start: data.min - } - ]); + 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 ) => { - setRadioInclusionType(inclusion); - setPostalCodes([]); + dispatch({ + inclusionType: inclusion, + postalCodeRules: [] + }); }; const onPostalCodeUnassign = code => { - setPostalCodes(filterPostalCodes(postalCodes, code)); - closeModal(); + dispatch({ + havePostalCodesChanged: true, + postalCodeRules: filterPostalCodes(state.postalCodeRules, code) + }); }; return ( @@ -130,7 +147,7 @@ export const PriceRatesCreate: React.FC = ({ onBack={handleBack} errors={errors} channelErrors={channelErrors} - postalCodes={postalCodes} + postalCodes={state.postalCodeRules} openChannelsModal={handleChannelsModalOpen} onChannelsChange={setCurrentChannels} onPostalCodeAssign={() => openModal("add-range")} @@ -141,7 +158,7 @@ export const PriceRatesCreate: React.FC = ({ diff --git a/src/shipping/views/PriceRatesUpdate/PriceRatesUpdate.tsx b/src/shipping/views/PriceRatesUpdate/PriceRatesUpdate.tsx index a6c9c3eaa..f6be75183 100644 --- a/src/shipping/views/PriceRatesUpdate/PriceRatesUpdate.tsx +++ b/src/shipping/views/PriceRatesUpdate/PriceRatesUpdate.tsx @@ -17,6 +17,10 @@ import usePaginator, { } from "@saleor/hooks/usePaginator"; import { sectionNames } from "@saleor/intl"; import { commonMessages } from "@saleor/intl"; +import { + getById, + getByUnmatchingId +} from "@saleor/orders/components/OrderReturnPage/utils"; import useProductSearch from "@saleor/searches/useProductSearch"; import DeleteShippingRateDialog from "@saleor/shipping/components/DeleteShippingRateDialog"; import ShippingMethodProductsAddDialog from "@saleor/shipping/components/ShippingMethodProductsAddDialog"; @@ -43,7 +47,12 @@ import { ShippingRateUrlQueryParams, shippingZoneUrl } from "@saleor/shipping/urls"; -import filterPostalCodes from "@saleor/shipping/views/utils"; +import postalCodesReducer from "@saleor/shipping/views/reducer"; +import { + filterPostalCodes, + getPostalCodeRuleByMinMax, + getRuleObject +} from "@saleor/shipping/views/utils"; import { MinMax } from "@saleor/types"; import { PostalCodeRuleInclusionTypeEnum, @@ -80,6 +89,9 @@ export const PriceRatesUpdate: React.FC = ({ displayLoader: true, variables: { id, ...paginationState } }); + + const rate = data?.shippingZone?.shippingMethods?.find(getById(rateId)); + const { loadMore, search: productsSearch, @@ -91,10 +103,6 @@ export const PriceRatesUpdate: React.FC = ({ ShippingRateUrlQueryParams >(navigate, params => shippingPriceRatesEditUrl(id, rateId, params), params); - const rate = data?.shippingZone?.shippingMethods.find( - rate => rate.id === rateId - ); - const { isSelected, listElements, reset, toggle, toggleAll } = useBulkActions( [] ); @@ -174,26 +182,33 @@ export const PriceRatesUpdate: React.FC = ({ const [updateMetadata] = useMetadataUpdate({}); const [updatePrivateMetadata] = usePrivateMetadataUpdate({}); - const [codesToDelete, setCodesToDelete] = React.useState([]); - const [havePostalCodesChanged, setHavePostalCodesChanged] = React.useState( - false - ); - const [originalCodes, setOriginalCodes] = React.useState([]); - const [inclusionType, setInclusionType] = React.useState( - rate?.postalCodeRules[0]?.inclusionType - ); + const [state, dispatch] = React.useReducer(postalCodesReducer, { + codesToDelete: [], + havePostalCodesChanged: false, + inclusionType: rate?.postalCodeRules[0]?.inclusionType, + originalCodes: [], + postalCodeRules: rate?.postalCodeRules || [] + }); + + const postalCodeRulesLoaded = + !loading && + !state.postalCodeRules?.length && + !state.codesToDelete?.length && + rate.postalCodeRules?.length; + + if (postalCodeRulesLoaded) { + dispatch({ postalCodeRules: rate.postalCodeRules }); + } const onPostalCodeInclusionChange = ( inclusion: PostalCodeRuleInclusionTypeEnum ) => { - setInclusionType(inclusion); - setCodesToDelete( - rate.postalCodeRules - .filter(code => code.id !== undefined) - .map(code => code.id) - ); - setHavePostalCodesChanged(true); - rate.postalCodeRules = []; + dispatch({ + codesToDelete: rate.postalCodeRules.map(code => code.id), + havePostalCodesChanged: true, + inclusionType: inclusion, + postalCodeRules: [] + }); }; const updateData = async (formData: FormData): Promise => { @@ -202,15 +217,15 @@ export const PriceRatesUpdate: React.FC = ({ formData, id, rateId, - rate.postalCodeRules, - codesToDelete + state.postalCodeRules, + state.codesToDelete ) }); - setCodesToDelete([]); - setHavePostalCodesChanged(false); + dispatch({ codesToDelete: [] }); const errors = response.data.shippingPriceUpdate.errors; if (errors.length === 0) { handleSuccess(); + dispatch({ havePostalCodesChanged: false }); updateShippingMethodChannelListing({ variables: getShippingMethodChannelVariables( rateId, @@ -244,38 +259,40 @@ export const PriceRatesUpdate: React.FC = ({ }; const onPostalCodeAssign = (rule: MinMax) => { - if (!originalCodes.length) { - setOriginalCodes([...rate.postalCodeRules]); + if (!state.originalCodes.length) { + dispatch({ originalCodes: rate.postalCodeRules }); } + if ( - rate.postalCodeRules.filter( - item => item.start === rule.min && item.end === rule.max - ).length > 0 + state.postalCodeRules.filter(getPostalCodeRuleByMinMax(rule)).length > 0 ) { closeModal(); return; } - const newCode = { - __typename: undefined, - end: rule.max, - id: undefined, - inclusionType, - start: rule.min - }; - rate.postalCodeRules.push(newCode); + + const newCode = getRuleObject(rule, state.inclusionType); + dispatch({ + havePostalCodesChanged: true, + postalCodeRules: [...state.postalCodeRules, newCode] + }); closeModal(); }; const onPostalCodeUnassign = code => { if (code.id !== undefined) { - setCodesToDelete([...codesToDelete, code.id]); - rate.postalCodeRules = rate.postalCodeRules.filter( - rule => rule.id !== code.id - ); + dispatch({ + codesToDelete: [...state.codesToDelete, code.id], + havePostalCodesChanged: true, + postalCodeRules: state.postalCodeRules.filter( + getByUnmatchingId(code.id) + ) + }); } else { - rate.postalCodeRules = filterPostalCodes(rate.postalCodeRules, code); + dispatch({ + havePostalCodesChanged: true, + postalCodeRules: filterPostalCodes(state.postalCodeRules, code) + }); } - setHavePostalCodesChanged(true); }; const handleBack = () => navigate(shippingZoneUrl(id)); @@ -344,7 +361,7 @@ export const PriceRatesUpdate: React.FC = ({ assignProductOpts?.status === "loading" } hasChannelChanged={shippingChannels?.length !== currentChannels?.length} - havePostalCodesChanged={havePostalCodesChanged} + havePostalCodesChanged={state.havePostalCodesChanged} saveButtonBarState={updateShippingRateOpts.status} onDelete={() => openModal("remove")} onSubmit={handleSubmit} @@ -378,14 +395,12 @@ export const PriceRatesUpdate: React.FC = ({ onPostalCodeInclusionChange={onPostalCodeInclusionChange} onPostalCodeAssign={() => openModal("add-range")} onPostalCodeUnassign={onPostalCodeUnassign} + postalCodeRules={state.postalCodeRules} /> { - onPostalCodeAssign(code); - setHavePostalCodesChanged(true); - }} + onSubmit={code => onPostalCodeAssign(code)} open={params.action === "add-range"} /> diff --git a/src/shipping/views/ShippingZoneDetails/index.tsx b/src/shipping/views/ShippingZoneDetails/index.tsx index 6cc93396f..da13434f6 100644 --- a/src/shipping/views/ShippingZoneDetails/index.tsx +++ b/src/shipping/views/ShippingZoneDetails/index.tsx @@ -9,6 +9,7 @@ import useNotifier from "@saleor/hooks/useNotifier"; import { createPaginationState } from "@saleor/hooks/usePaginator"; import useShop from "@saleor/hooks/useShop"; import { commonMessages } from "@saleor/intl"; +import { getById } from "@saleor/orders/components/OrderReturnPage/utils"; import useWarehouseSearch from "@saleor/searches/useWarehouseSearch"; import DeleteShippingRateDialog from "@saleor/shipping/components/DeleteShippingRateDialog"; import ShippingZoneAddWarehouseDialog from "@saleor/shipping/components/ShippingZoneAddWarehouseDialog"; @@ -78,9 +79,7 @@ const ShippingZoneDetails: React.FC = ({ ShippingZoneUrlDialog, ShippingZoneUrlQueryParams >(navigate, params => shippingZoneUrl(id, params), params); - const rate = data?.shippingZone?.shippingMethods?.find( - rate => rate.id === params.id - ); + const rate = data?.shippingZone?.shippingMethods?.find(getById(params.id)); const [deleteShippingRate, deleteShippingRateOpts] = useShippingRateDelete({ onCompleted: data => { diff --git a/src/shipping/views/WeightRatesCreate/WeightRatesCreate.tsx b/src/shipping/views/WeightRatesCreate/WeightRatesCreate.tsx index eccc1e15d..93bc558e6 100644 --- a/src/shipping/views/WeightRatesCreate/WeightRatesCreate.tsx +++ b/src/shipping/views/WeightRatesCreate/WeightRatesCreate.tsx @@ -17,7 +17,12 @@ import { shippingWeightRatesUrl, shippingZoneUrl } from "@saleor/shipping/urls"; -import filterPostalCodes from "@saleor/shipping/views/utils"; +import postalCodesReducer from "@saleor/shipping/views/reducer"; +import { + filterPostalCodes, + getPostalCodeRuleByMinMax, + getRuleObject +} from "@saleor/shipping/views/utils"; import { MinMax } from "@saleor/types"; import { PostalCodeRuleInclusionTypeEnum, @@ -39,11 +44,6 @@ export const WeightRatesCreate: React.FC = ({ const navigate = useNavigator(); const intl = useIntl(); - const [postalCodes, setPostalCodes] = React.useState([]); - const [radioInclusionType, setRadioInclusionType] = React.useState( - PostalCodeRuleInclusionTypeEnum.EXCLUDE - ); - const { data: channelsData, loading: channelsLoading } = useChannelsList({}); const [openModal, closeModal] = createDialogActionHandlers< @@ -67,6 +67,14 @@ export const WeightRatesCreate: React.FC = ({ toggleAllChannels } = useChannels(shippingChannels, params?.action, { closeModal, openModal }); + const [state, dispatch] = React.useReducer(postalCodesReducer, { + codesToDelete: [], + havePostalCodesChanged: false, + inclusionType: PostalCodeRuleInclusionTypeEnum.EXCLUDE, + originalCodes: [], + postalCodeRules: [] + }); + const { channelErrors, createShippingRate, @@ -75,36 +83,42 @@ export const WeightRatesCreate: React.FC = ({ } = useShippingRateCreator( id, ShippingMethodTypeEnum.WEIGHT, - postalCodes, - radioInclusionType + state.postalCodeRules, + state.inclusionType ); const handleBack = () => navigate(shippingZoneUrl(id)); - const handlePostalCodeRangeAdd = (data: MinMax) => { - setPostalCodes(postalCodes => [ - ...postalCodes, - { - __typename: "ShippingMethodPostalCodeRule", - end: data.max, - id: postalCodes.length.toString(), - inclusionType: postalCodes?.[0]?.inclusionType, - start: data.min - } - ]); + 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 ) => { - setRadioInclusionType(inclusion); - setPostalCodes([]); + dispatch({ + inclusionType: inclusion, + postalCodeRules: [] + }); }; const onPostalCodeUnassign = code => { - setPostalCodes(filterPostalCodes(postalCodes, code)); - closeModal(); + dispatch({ + havePostalCodesChanged: true, + postalCodeRules: filterPostalCodes(state.postalCodeRules, code) + }); }; return ( @@ -136,7 +150,7 @@ export const WeightRatesCreate: React.FC = ({ onBack={handleBack} errors={errors} channelErrors={channelErrors} - postalCodes={postalCodes} + postalCodes={state.postalCodeRules} openChannelsModal={handleChannelsModalOpen} onChannelsChange={setCurrentChannels} onPostalCodeAssign={() => openModal("add-range")} @@ -147,7 +161,7 @@ export const WeightRatesCreate: React.FC = ({ diff --git a/src/shipping/views/WeightRatesUpdate/WeightRatesUpdate.tsx b/src/shipping/views/WeightRatesUpdate/WeightRatesUpdate.tsx index aa7984c31..717cd5d0f 100644 --- a/src/shipping/views/WeightRatesUpdate/WeightRatesUpdate.tsx +++ b/src/shipping/views/WeightRatesUpdate/WeightRatesUpdate.tsx @@ -17,6 +17,10 @@ import usePaginator, { } from "@saleor/hooks/usePaginator"; import { sectionNames } from "@saleor/intl"; import { commonMessages } from "@saleor/intl"; +import { + getById, + getByUnmatchingId +} from "@saleor/orders/components/OrderReturnPage/utils"; import useProductSearch from "@saleor/searches/useProductSearch"; import DeleteShippingRateDialog from "@saleor/shipping/components/DeleteShippingRateDialog"; import ShippingMethodProductsAddDialog from "@saleor/shipping/components/ShippingMethodProductsAddDialog"; @@ -43,7 +47,12 @@ import { shippingWeightRatesEditUrl, shippingZoneUrl } from "@saleor/shipping/urls"; -import filterPostalCodes from "@saleor/shipping/views/utils"; +import postalCodesReducer from "@saleor/shipping/views/reducer"; +import { + filterPostalCodes, + getPostalCodeRuleByMinMax, + getRuleObject +} from "@saleor/shipping/views/utils"; import { MinMax } from "@saleor/types"; import { PostalCodeRuleInclusionTypeEnum, @@ -81,53 +90,59 @@ export const WeightRatesUpdate: React.FC = ({ variables: { id, ...paginationState } }); + const rate = data?.shippingZone?.shippingMethods?.find(getById(rateId)); + const [openModal, closeModal] = createDialogActionHandlers< ShippingRateUrlDialog, ShippingRateUrlQueryParams >(navigate, params => shippingWeightRatesEditUrl(id, rateId, params), params); - const [codesToDelete, setCodesToDelete] = React.useState([]); - const [havePostalCodesChanged, setHavePostalCodesChanged] = React.useState( - false - ); - const [originalCodes, setOriginalCodes] = React.useState([]); - const [inclusionType, setInclusionType] = React.useState( - PostalCodeRuleInclusionTypeEnum.EXCLUDE - ); + const [state, dispatch] = React.useReducer(postalCodesReducer, { + codesToDelete: [], + havePostalCodesChanged: false, + inclusionType: rate?.postalCodeRules[0]?.inclusionType, + originalCodes: [], + postalCodeRules: rate?.postalCodeRules || [] + }); + + const postalCodeRulesLoaded = + !loading && + !state.postalCodeRules?.length && + !state.codesToDelete?.length && + rate.postalCodeRules?.length; + + if (postalCodeRulesLoaded) { + dispatch({ postalCodeRules: rate.postalCodeRules }); + } const onPostalCodeInclusionChange = ( inclusion: PostalCodeRuleInclusionTypeEnum ) => { - setInclusionType(inclusion); - setCodesToDelete( - rate.postalCodeRules - .filter(code => code.id !== undefined) - .map(code => code.id) - ); - setHavePostalCodesChanged(true); - rate.postalCodeRules = []; + dispatch({ + codesToDelete: rate.postalCodeRules.map(code => code.id), + havePostalCodesChanged: true, + inclusionType: inclusion, + postalCodeRules: [] + }); }; const onPostalCodeAssign = (rule: MinMax) => { - if (!originalCodes.length) { - setOriginalCodes([...rate.postalCodeRules]); + if (!state.originalCodes.length) { + dispatch({ originalCodes: rate.postalCodeRules }); } + if ( - rate.postalCodeRules.filter( - item => item.start === rule.min && item.end === rule.max - ).length > 0 + state.postalCodeRules.filter(getPostalCodeRuleByMinMax(rule)).length > 0 ) { closeModal(); return; } - const newCode = { - __typename: undefined, - end: rule.max, - id: undefined, - inclusionType, - start: rule.min - }; - rate.postalCodeRules.push(newCode); + + const newCode = getRuleObject(rule, state.inclusionType); + dispatch({ + havePostalCodesChanged: true, + postalCodeRules: [...state.postalCodeRules, newCode] + }); closeModal(); }; @@ -137,10 +152,6 @@ export const WeightRatesUpdate: React.FC = ({ result: productsSearchOpts } = useProductSearch({ variables: DEFAULT_INITIAL_SEARCH_DATA }); - const rate = data?.shippingZone?.shippingMethods.find( - rate => rate.id === rateId - ); - const { isSelected, listElements, reset, toggle, toggleAll } = useBulkActions( [] ); @@ -227,15 +238,14 @@ export const WeightRatesUpdate: React.FC = ({ data, id, rateId, - rate.postalCodeRules, - codesToDelete + state.postalCodeRules, + state.codesToDelete ) }); - setCodesToDelete([]); - setHavePostalCodesChanged(false); const errors = response.data.shippingPriceUpdate.errors; if (errors.length === 0) { handleSuccess(); + dispatch({ havePostalCodesChanged: false }); updateShippingMethodChannelListing({ variables: getShippingMethodChannelVariables( rateId, @@ -251,14 +261,19 @@ export const WeightRatesUpdate: React.FC = ({ const onPostalCodeUnassign = code => { if (code.id !== undefined) { - setCodesToDelete([...codesToDelete, code.id]); - rate.postalCodeRules = rate.postalCodeRules.filter( - rule => rule.id !== code.id - ); + dispatch({ + codesToDelete: [...state.codesToDelete, code.id], + havePostalCodesChanged: true, + postalCodeRules: state.postalCodeRules.filter( + getByUnmatchingId(code.id) + ) + }); } else { - rate.postalCodeRules = filterPostalCodes(rate.postalCodeRules, code); + dispatch({ + havePostalCodesChanged: true, + postalCodeRules: filterPostalCodes(state.postalCodeRules, code) + }); } - setHavePostalCodesChanged(true); }; const handleSubmit = createMetadataUpdateHandler( @@ -346,7 +361,7 @@ export const WeightRatesUpdate: React.FC = ({ assignProductOpts?.status === "loading" } hasChannelChanged={shippingChannels?.length !== currentChannels?.length} - havePostalCodesChanged={havePostalCodesChanged} + havePostalCodesChanged={state.havePostalCodesChanged} saveButtonBarState={updateShippingRateOpts.status} onDelete={() => openModal("remove")} onSubmit={handleSubmit} @@ -368,6 +383,7 @@ export const WeightRatesUpdate: React.FC = ({ toggleAll={toggleAll} onNextPage={loadNextPage} onPreviousPage={loadPreviousPage} + postalCodeRules={state.postalCodeRules} pageInfo={pageInfo} toolbar={ - - - - - 51-235 - 51-240 - - - - - - - - 51-274 - - - + This shipping rate has no postal codes assigned + @@ -207580,7 +207486,7 @@ exports[`Storyshots Views / Shipping / Shipping rate create weight rate 1`] = `
- 3 postal code ranges + 0 postal code ranges
- 51-210 - 51-220 - - - - - - - - 51-235 - 51-240 - - - - - - - - 51-274 - - - + This shipping rate has no postal codes assigned + @@ -208933,11 +208745,11 @@ exports[`Storyshots Views / Shipping / Shipping rate loading 1`] = ` class="MuiTableCell-root-id MuiTableCell-head-id" scope="col" > - - ‌ - + 0 postal code ranges + - - ‌ - - - - + This shipping rate has no postal codes assigned + @@ -210223,7 +210009,7 @@ exports[`Storyshots Views / Shipping / Shipping rate update price rate 1`] = `
- 3 postal code ranges + 0 postal code ranges
- 51-210 - 51-220 - - - - - - - - 51-235 - 51-240 - - - - - - - - 51-274 - - - + This shipping rate has no postal codes assigned + @@ -211562,7 +211254,7 @@ exports[`Storyshots Views / Shipping / Shipping rate update weight rate 1`] = `
- 3 postal code ranges + 0 postal code ranges
- 51-210 - 51-220 - - - - - - - - 51-235 - 51-240 - - - - - - - - 51-274 - - - + This shipping rate has no postal codes assigned +