import ChannelDeleteDialog from "@saleor/channels/components/ChannelDeleteDialog"; import { FormData } from "@saleor/channels/components/ChannelForm/ChannelForm"; import { getChannelsCurrencyChoices } from "@saleor/channels/utils"; import { Backlink } from "@saleor/components/Backlink"; import Container from "@saleor/components/Container"; import PageHeader from "@saleor/components/PageHeader"; import { WindowTitle } from "@saleor/components/WindowTitle"; import { DEFAULT_INITIAL_SEARCH_DATA } from "@saleor/config"; import { ChannelDeleteMutation, ChannelErrorFragment, ChannelUpdateMutation, useChannelActivateMutation, useChannelDeactivateMutation, useChannelDeleteMutation, useChannelQuery, useChannelReorderWarehousesMutation, useChannelShippingZonesQuery, useChannelsQuery, useChannelUpdateMutation, useShippingZonesCountQuery, useWarehousesCountQuery, } from "@saleor/graphql"; import { getSearchFetchMoreProps } from "@saleor/hooks/makeTopLevelSearch/utils"; import useNavigator from "@saleor/hooks/useNavigator"; import useNotifier from "@saleor/hooks/useNotifier"; import { getDefaultNotifierSuccessErrorData } from "@saleor/hooks/useNotifier/utils"; import useShop from "@saleor/hooks/useShop"; import { sectionNames } from "@saleor/intl"; import { extractMutationErrors } from "@saleor/misc"; import useShippingZonesSearch from "@saleor/searches/useShippingZonesSearch"; import useWarehouseSearch from "@saleor/searches/useWarehouseSearch"; import getChannelsErrorMessage from "@saleor/utils/errors/channels"; import createDialogActionHandlers from "@saleor/utils/handlers/dialogActionHandlers"; import { mapEdgesToItems } from "@saleor/utils/maps"; import React from "react"; import { useIntl } from "react-intl"; import ChannelDetailsPage from "../../pages/ChannelDetailsPage"; import { channelsListUrl, channelUrl, ChannelUrlDialog, ChannelUrlQueryParams, } from "../../urls"; import { calculateItemsOrderMoves } from "./handlers"; interface ChannelDetailsProps { id: string; params: ChannelUrlQueryParams; } export const ChannelDetails: React.FC = ({ id, params, }) => { const navigate = useNavigator(); const notify = useNotifier(); const intl = useIntl(); const shop = useShop(); const channelsListData = useChannelsQuery({ displayLoader: true }); const [openModal, closeModal] = createDialogActionHandlers< ChannelUrlDialog, ChannelUrlQueryParams >(navigate, params => channelUrl(id, params), params); const [updateChannel, updateChannelOpts] = useChannelUpdateMutation({ onCompleted: ({ channelUpdate: { errors } }: ChannelUpdateMutation) => notify(getDefaultNotifierSuccessErrorData(errors, intl)), }); const { data, loading } = useChannelQuery({ displayLoader: true, variables: { id }, }); const handleError = (error: ChannelErrorFragment) => { notify({ status: "error", text: getChannelsErrorMessage(error, intl), }); }; const [activateChannel, activateChannelOpts] = useChannelActivateMutation({ onCompleted: data => { const errors = data.channelActivate.errors; if (errors.length) { errors.forEach(error => handleError(error)); } }, }); const [ deactivateChannel, deactivateChannelOpts, ] = useChannelDeactivateMutation({ onCompleted: data => { const errors = data.channelDeactivate.errors; if (errors.length) { errors.forEach(error => handleError(error)); } }, }); const [ reorderChannelWarehouses, reorderChannelWarehousesOpts, ] = useChannelReorderWarehousesMutation({ onCompleted: data => { const errors = data.channelReorderWarehouses.errors; if (errors.length) { errors.forEach(error => handleError(error)); } }, }); const handleSubmit = async ({ name, slug, shippingZonesIdsToRemove, shippingZonesIdsToAdd, warehousesIdsToRemove, warehousesIdsToAdd, warehousesToDisplay, defaultCountry, allocationStrategy, }: FormData) => { const updateChannelMutation = updateChannel({ variables: { id: data?.channel.id, input: { name, slug, defaultCountry, addShippingZones: shippingZonesIdsToAdd, removeShippingZones: shippingZonesIdsToRemove, addWarehouses: warehousesIdsToAdd, removeWarehouses: warehousesIdsToRemove, stockSettings: { allocationStrategy, }, }, }, }); const result = await updateChannelMutation; const errors = await extractMutationErrors(updateChannelMutation); if (!errors?.length) { const moves = calculateItemsOrderMoves( result.data?.channelUpdate.channel?.warehouses, warehousesToDisplay, ); await reorderChannelWarehouses({ variables: { channelId: id, moves, }, }); } return errors; }; const onDeleteCompleted = (data: ChannelDeleteMutation) => { const errors = data.channelDelete.errors; if (errors.length === 0) { notify({ status: "success", text: intl.formatMessage({ id: "AkyGP2", defaultMessage: "Channel deleted", }), }); closeModal(); navigate(channelsListUrl()); } else { errors.map(error => notify({ status: "error", text: getChannelsErrorMessage(error, intl), }), ); } }; const [deleteChannel, deleteChannelOpts] = useChannelDeleteMutation({ onCompleted: onDeleteCompleted, }); const channelsChoices = getChannelsCurrencyChoices( id, data?.channel, channelsListData?.data?.channels, ); const handleRemoveConfirm = (channelId?: string) => { const data = channelId ? { id, input: { channelId } } : { id }; deleteChannel({ variables: data }); }; const { data: shippingZonesCountData, loading: shippingZonesCountLoading, } = useShippingZonesCountQuery(); const { data: channelShippingZonesData, loading: channelsShippingZonesLoading, } = useChannelShippingZonesQuery({ variables: { filter: { channels: [id], }, }, }); const { loadMore: fetchMoreShippingZones, search: searchShippingZones, result: searchShippingZonesResult, } = useShippingZonesSearch({ variables: DEFAULT_INITIAL_SEARCH_DATA, }); const { data: warehousesCountData, loading: warehousesCountLoading, } = useWarehousesCountQuery(); const { loadMore: fetchMoreWarehouses, search: searchWarehouses, result: searchWarehousesResult, } = useWarehouseSearch({ variables: DEFAULT_INITIAL_SEARCH_DATA, }); const channelWarehouses = data?.channel?.warehouses || []; const channelShippingZones = mapEdgesToItems( channelShippingZonesData?.shippingZones, ); return ( <> {intl.formatMessage(sectionNames.channels)} openModal("remove")} onSubmit={handleSubmit} updateChannelStatus={() => data?.channel?.isActive ? deactivateChannel({ variables: { id } }) : activateChannel({ variables: { id } }) } saveButtonBarState={updateChannelOpts.status} countries={shop?.countries || []} /> navigate(channelsListUrl())} onClose={closeModal} onConfirm={handleRemoveConfirm} /> ); }; export default ChannelDetails;