saleor-dashboard/src/services/views/ServiceDetails/ServiceDetails.tsx

279 lines
10 KiB
TypeScript
Raw Normal View History

2019-09-27 10:17:23 +00:00
import React from "react";
import { useIntl } from "react-intl";
import { WindowTitle } from "@saleor/components/WindowTitle";
import useNavigator from "@saleor/hooks/useNavigator";
import useNotifier from "@saleor/hooks/useNotifier";
import useShop from "@saleor/hooks/useShop";
import { commonMessages } from "@saleor/intl";
import { getMutationState, maybe } from "@saleor/misc";
2019-09-27 14:09:57 +00:00
import ServiceDeleteDialog from "@saleor/services/components/ServiceDeleteDialog";
2019-09-30 10:32:00 +00:00
import ServiceTokenCreateDialog from "@saleor/services/components/ServiceTokenCreateDialog";
import ServiceTokenDeleteDialog from "@saleor/services/components/ServiceTokenDeleteDialog";
2019-09-27 14:09:57 +00:00
import {
ServiceDeleteMutation,
2019-09-30 10:32:00 +00:00
ServiceTokenCreateMutation,
ServiceTokenDeleteMutation,
2019-09-27 14:09:57 +00:00
ServiceUpdateMutation
} from "@saleor/services/mutations";
import { ServiceDelete } from "@saleor/services/types/ServiceDelete";
2019-09-30 10:36:39 +00:00
import { ServiceTokenCreate } from "@saleor/services/types/ServiceTokenCreate";
2019-09-30 10:32:00 +00:00
import { ServiceTokenDelete } from "@saleor/services/types/ServiceTokenDelete";
2019-09-27 14:09:57 +00:00
import { ServiceUpdate } from "@saleor/services/types/ServiceUpdate";
2019-09-27 10:17:23 +00:00
import ServiceDetailsPage, {
ServiceDetailsPageFormData
} from "../../components/ServiceDetailsPage";
import { ServiceDetailsQuery } from "../../queries";
2019-09-27 12:21:38 +00:00
import {
serviceListUrl,
serviceUrl,
ServiceUrlDialog,
ServiceUrlQueryParams
} from "../../urls";
2019-09-27 10:17:23 +00:00
interface OrderListProps {
id: string;
params: ServiceUrlQueryParams;
2019-09-30 16:46:48 +00:00
token: string;
onTokenClose: () => void;
2019-09-27 10:17:23 +00:00
}
export const ServiceDetails: React.StatelessComponent<OrderListProps> = ({
id,
2019-09-30 16:46:48 +00:00
params,
token,
onTokenClose
2019-09-27 10:17:23 +00:00
}) => {
const navigate = useNavigator();
const notify = useNotifier();
const intl = useIntl();
const shop = useShop();
2019-09-30 16:46:48 +00:00
React.useEffect(() => onTokenClose, []);
2019-09-27 12:21:38 +00:00
const closeModal = () =>
navigate(
serviceUrl(id, {
...params,
action: undefined,
id: undefined
}),
true
);
const openModal = (action: ServiceUrlDialog, tokenId?: string) =>
navigate(
serviceUrl(id, {
...params,
action,
id: tokenId
})
);
2019-09-27 14:09:57 +00:00
const onServiceUpdate = (data: ServiceUpdate) => {
2019-09-30 10:32:00 +00:00
if (maybe(() => data.serviceAccountUpdate.errors.length === 0)) {
2019-09-27 14:09:57 +00:00
notify({
text: intl.formatMessage(commonMessages.savedChanges)
});
}
};
const onServiceDelete = (data: ServiceDelete) => {
if (data.serviceAccountDelete.errors.length === 0) {
notify({
text: intl.formatMessage(commonMessages.savedChanges)
});
navigate(serviceListUrl());
}
};
const handleBack = () => navigate(serviceListUrl());
2019-09-27 10:17:23 +00:00
return (
<ServiceDetailsQuery
displayLoader
variables={{ id }}
require={["serviceAccount"]}
>
2019-09-30 10:32:00 +00:00
{({ data, loading, refetch }) => {
2019-09-30 10:36:39 +00:00
const onTokenCreate = (data: ServiceTokenCreate) => {
if (maybe(() => data.serviceAccountTokenCreate.errors.length === 0)) {
refetch();
}
};
2019-09-30 10:32:00 +00:00
const onTokenDelete = (data: ServiceTokenDelete) => {
if (maybe(() => data.serviceAccountTokenDelete.errors.length === 0)) {
notify({
text: intl.formatMessage(commonMessages.savedChanges)
});
refetch();
closeModal();
}
};
2019-09-30 10:36:39 +00:00
2019-09-30 10:32:00 +00:00
return (
<ServiceUpdateMutation onCompleted={onServiceUpdate}>
{(updateService, updateServiceOpts) => (
<ServiceDeleteMutation onCompleted={onServiceDelete}>
{(deleteService, deleteServiceOpts) => (
2019-09-30 10:36:39 +00:00
<ServiceTokenCreateMutation onCompleted={onTokenCreate}>
2019-09-30 10:32:00 +00:00
{(createToken, createTokenOpts) => (
<ServiceTokenDeleteMutation onCompleted={onTokenDelete}>
{(deleteToken, deleteTokenOpts) => {
const handleSubmit = (
data: ServiceDetailsPageFormData
) =>
updateService({
variables: {
id,
input: {
isActive: data.isActive,
name: data.name,
permissions: data.hasFullAccess
? shop.permissions.map(
permission => permission.code
)
: data.permissions
}
}
});
const handleRemoveConfirm = () =>
deleteService({
variables: {
id
}
});
const handleTokenCreate = (name: string) =>
createToken({
variables: {
input: {
name,
serviceAccount: id
}
}
});
const handleTokenDelete = () =>
deleteToken({
variables: {
id: params.id
}
});
const formTransitionState = getMutationState(
updateServiceOpts.called,
updateServiceOpts.loading,
maybe(
() =>
updateServiceOpts.data.serviceAccountUpdate
.errors
)
);
const deleteTransitionState = getMutationState(
deleteServiceOpts.called,
deleteServiceOpts.loading,
maybe(
() =>
deleteServiceOpts.data.serviceAccountDelete
.errors
)
);
const createTokenTransitionState = getMutationState(
createTokenOpts.called,
createTokenOpts.loading,
maybe(
() =>
createTokenOpts.data.serviceAccountTokenCreate
.errors
)
);
const deleteTokenTransitionState = getMutationState(
deleteTokenOpts.called,
deleteTokenOpts.loading,
maybe(
() =>
deleteTokenOpts.data.serviceAccountTokenDelete
.errors
)
);
return (
<>
<WindowTitle
title={maybe(() => data.serviceAccount.name)}
/>
<ServiceDetailsPage
disabled={loading}
errors={[]}
2019-09-30 16:46:48 +00:00
token={token}
2019-09-30 10:32:00 +00:00
onBack={handleBack}
onDelete={() => openModal("remove")}
onSubmit={handleSubmit}
2019-09-30 16:46:48 +00:00
onTokenClose={onTokenClose}
2019-09-30 10:32:00 +00:00
onTokenCreate={() => openModal("create-token")}
onTokenDelete={id =>
openModal("remove-token", id)
}
permissions={maybe(() => shop.permissions)}
service={maybe(() => data.serviceAccount)}
saveButtonBarState={formTransitionState}
/>
<ServiceDeleteDialog
confirmButtonState={deleteTransitionState}
name={maybe(
() => data.serviceAccount.name,
"..."
)}
onClose={closeModal}
onConfirm={handleRemoveConfirm}
open={params.action === "remove"}
/>
<ServiceTokenCreateDialog
confirmButtonState={createTokenTransitionState}
onClose={closeModal}
onCreate={handleTokenCreate}
open={params.action === "create-token"}
token={maybe(
() =>
createTokenOpts.data
.serviceAccountTokenCreate.authToken
)}
/>
<ServiceTokenDeleteDialog
confirmButtonState={deleteTokenTransitionState}
name={maybe(() => {
const token = data.serviceAccount.tokens.find(
token => token.id === params.id
);
if (token.name) {
return token.name;
}
return `**** ${token.authToken}`;
}, "...")}
onClose={closeModal}
onConfirm={handleTokenDelete}
open={params.action === "remove-token"}
/>
</>
);
}}
</ServiceTokenDeleteMutation>
)}
</ServiceTokenCreateMutation>
)}
</ServiceDeleteMutation>
)}
</ServiceUpdateMutation>
);
}}
2019-09-27 10:17:23 +00:00
</ServiceDetailsQuery>
);
};
export default ServiceDetails;