saleor-dashboard/src/channels/views/ChannelDetails/ChannelDetails.tsx
mmarkusik 50764b5932
Unify channel ID param in graphql (#1131)
* Update schema & types

* Change channel param to channelId in create order mutation usages

* Update types and plugin update mutation params

* Change usages of channel in graphql mutation params to channelId
2021-06-01 14:25:43 +02:00

227 lines
6.8 KiB
TypeScript

import ChannelDeleteDialog from "@saleor/channels/components/ChannelDeleteDialog";
import { FormData } from "@saleor/channels/components/ChannelForm/ChannelForm";
import { ChannelDelete } from "@saleor/channels/types/ChannelDelete";
import { getChannelsCurrencyChoices } from "@saleor/channels/utils";
import AppHeader from "@saleor/components/AppHeader";
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 { ChannelErrorFragment } from "@saleor/fragments/types/ChannelErrorFragment";
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 { sectionNames } from "@saleor/intl";
import useShippingZonesSearch from "@saleor/searches/useShippingZonesSearch";
import { useChannelShippingZones } from "@saleor/shipping/queries";
import getChannelsErrorMessage from "@saleor/utils/errors/channels";
import createDialogActionHandlers from "@saleor/utils/handlers/dialogActionHandlers";
import React from "react";
import { useIntl } from "react-intl";
import {
useChannelActivateMutation,
useChannelDeactivateMutation,
useChannelDeleteMutation,
useChannelUpdateMutation
} from "../../mutations";
import ChannelDetailsPage from "../../pages/ChannelDetailsPage";
import { useChannelDetails, useChannelsList } from "../../queries";
import { ChannelUpdate } from "../../types/ChannelUpdate";
import {
channelsListUrl,
channelUrl,
ChannelUrlDialog,
ChannelUrlQueryParams
} from "../../urls";
interface ChannelDetailsProps {
id: string;
params: ChannelUrlQueryParams;
}
export const ChannelDetails: React.FC<ChannelDetailsProps> = ({
id,
params
}) => {
const navigate = useNavigator();
const notify = useNotifier();
const intl = useIntl();
const handleBack = () => navigate(channelsListUrl());
const channelsListData = useChannelsList({ displayLoader: true });
const [openModal, closeModal] = createDialogActionHandlers<
ChannelUrlDialog,
ChannelUrlQueryParams
>(navigate, params => channelUrl(id, params), params);
const [updateChannel, updateChannelOpts] = useChannelUpdateMutation({
onCompleted: ({ channelUpdate: { errors } }: ChannelUpdate) =>
notify(getDefaultNotifierSuccessErrorData(errors, intl))
});
const { data, loading } = useChannelDetails({
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 handleSubmit = ({
name,
slug,
shippingZonesIdsToRemove,
shippingZonesIdsToAdd
}: FormData) =>
updateChannel({
variables: {
id: data?.channel.id,
input: {
name,
slug,
addShippingZones: shippingZonesIdsToAdd,
removeShippingZones: shippingZonesIdsToRemove
}
}
});
const onDeleteCompleted = (data: ChannelDelete) => {
const errors = data.channelDelete.errors;
if (errors.length === 0) {
notify({
status: "success",
text: intl.formatMessage({
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: channelShippingZonesData,
loading: channelsShippingZonesLoading
} = useChannelShippingZones({
variables: {
filter: {
channels: [id]
}
}
});
const {
loadMore: fetchMoreShippingZones,
search: searchShippingZones,
result: searchShippingZonesResult
} = useShippingZonesSearch({
variables: DEFAULT_INITIAL_SEARCH_DATA
});
return (
<>
<WindowTitle
title={intl.formatMessage({
defaultMessage: "Channel details",
description: "window title"
})}
/>
<Container>
<AppHeader onBack={handleBack}>
{intl.formatMessage(sectionNames.channels)}
</AppHeader>
<PageHeader title={data?.channel?.name} />
<ChannelDetailsPage
channelShippingZones={channelShippingZonesData?.shippingZones?.edges?.map(
({ node }) => node
)}
searchShippingZones={searchShippingZones}
searchShippingZonesData={searchShippingZonesResult.data}
fetchMoreShippingZones={getSearchFetchMoreProps(
searchShippingZonesResult,
fetchMoreShippingZones
)}
channel={data?.channel}
disabled={
updateChannelOpts.loading || loading || channelsShippingZonesLoading
}
disabledStatus={
activateChannelOpts.loading || deactivateChannelOpts.loading
}
errors={updateChannelOpts?.data?.channelUpdate?.errors || []}
onBack={handleBack}
onDelete={() => openModal("remove")}
onSubmit={handleSubmit}
updateChannelStatus={() =>
data?.channel?.isActive
? deactivateChannel({ variables: { id } })
: activateChannel({ variables: { id } })
}
saveButtonBarState={updateChannelOpts.status}
/>
</Container>
<ChannelDeleteDialog
channelsChoices={channelsChoices}
hasOrders={data?.channel?.hasOrders}
open={params.action === "remove"}
confirmButtonState={deleteChannelOpts.status}
onBack={() => navigate(channelsListUrl())}
onClose={closeModal}
onConfirm={handleRemoveConfirm}
/>
</>
);
};
export default ChannelDetails;