2019-06-19 14:40:52 +00:00
|
|
|
import DialogContentText from "@material-ui/core/DialogContentText";
|
2019-08-09 10:26:22 +00:00
|
|
|
import React from "react";
|
2019-08-26 21:43:29 +00:00
|
|
|
import { FormattedMessage, useIntl } from "react-intl";
|
2019-06-19 14:40:52 +00:00
|
|
|
|
|
|
|
import ActionDialog from "@saleor/components/ActionDialog";
|
|
|
|
import { WindowTitle } from "@saleor/components/WindowTitle";
|
|
|
|
import useNavigator from "@saleor/hooks/useNavigator";
|
|
|
|
import useNotifier from "@saleor/hooks/useNotifier";
|
2019-09-26 13:16:36 +00:00
|
|
|
import useShop from "@saleor/hooks/useShop";
|
2019-06-19 14:40:52 +00:00
|
|
|
import useUser from "@saleor/hooks/useUser";
|
2019-08-26 21:43:29 +00:00
|
|
|
import { commonMessages } from "@saleor/intl";
|
2020-02-20 14:18:22 +00:00
|
|
|
import NotFoundPage from "@saleor/components/NotFoundPage";
|
2019-12-06 17:11:46 +00:00
|
|
|
import { maybe } from "../../misc";
|
2019-06-19 14:40:52 +00:00
|
|
|
import StaffDetailsPage from "../components/StaffDetailsPage/StaffDetailsPage";
|
|
|
|
import {
|
|
|
|
TypedStaffAvatarDeleteMutation,
|
|
|
|
TypedStaffAvatarUpdateMutation,
|
|
|
|
TypedStaffMemberDeleteMutation,
|
2019-12-03 16:39:27 +00:00
|
|
|
TypedStaffMemberUpdateMutation,
|
|
|
|
useChangeStaffPassword
|
2019-06-19 14:40:52 +00:00
|
|
|
} from "../mutations";
|
|
|
|
import { TypedStaffMemberDetailsQuery } from "../queries";
|
|
|
|
import { StaffAvatarDelete } from "../types/StaffAvatarDelete";
|
|
|
|
import { StaffAvatarUpdate } from "../types/StaffAvatarUpdate";
|
|
|
|
import { StaffMemberDelete } from "../types/StaffMemberDelete";
|
|
|
|
import { StaffMemberUpdate } from "../types/StaffMemberUpdate";
|
|
|
|
import {
|
|
|
|
staffListUrl,
|
|
|
|
staffMemberDetailsUrl,
|
|
|
|
StaffMemberDetailsUrlQueryParams
|
|
|
|
} from "../urls";
|
2019-12-03 16:30:37 +00:00
|
|
|
import StaffPasswordResetDialog from "../components/StaffPasswordResetDialog";
|
2019-12-03 16:39:27 +00:00
|
|
|
import { ChangeStaffPassword } from "../types/ChangeStaffPassword";
|
2019-06-19 14:40:52 +00:00
|
|
|
|
|
|
|
interface OrderListProps {
|
|
|
|
id: string;
|
|
|
|
params: StaffMemberDetailsUrlQueryParams;
|
|
|
|
}
|
|
|
|
|
2019-11-07 11:34:54 +00:00
|
|
|
export const StaffDetails: React.FC<OrderListProps> = ({ id, params }) => {
|
2019-06-19 14:40:52 +00:00
|
|
|
const navigate = useNavigator();
|
|
|
|
const notify = useNotifier();
|
|
|
|
const user = useUser();
|
2019-08-26 21:43:29 +00:00
|
|
|
const intl = useIntl();
|
2019-09-26 13:16:36 +00:00
|
|
|
const shop = useShop();
|
2019-06-19 14:40:52 +00:00
|
|
|
|
2019-12-03 16:30:37 +00:00
|
|
|
const closeModal = () =>
|
|
|
|
navigate(
|
|
|
|
staffMemberDetailsUrl(id, {
|
|
|
|
...params,
|
|
|
|
action: undefined
|
|
|
|
})
|
|
|
|
);
|
|
|
|
|
2019-12-03 16:39:27 +00:00
|
|
|
const handleChangePassword = (data: ChangeStaffPassword) => {
|
|
|
|
if (data.passwordChange.errors.length === 0) {
|
|
|
|
notify({
|
|
|
|
text: intl.formatMessage(commonMessages.savedChanges)
|
|
|
|
});
|
|
|
|
closeModal();
|
|
|
|
}
|
|
|
|
};
|
|
|
|
const [changePassword, changePasswordOpts] = useChangeStaffPassword({
|
|
|
|
onCompleted: handleChangePassword
|
|
|
|
});
|
|
|
|
|
2020-02-20 14:18:22 +00:00
|
|
|
const handleBack = () => navigate(staffListUrl());
|
|
|
|
|
2019-06-19 14:40:52 +00:00
|
|
|
return (
|
2020-02-20 14:18:22 +00:00
|
|
|
<TypedStaffMemberDetailsQuery displayLoader variables={{ id }}>
|
2019-06-19 14:40:52 +00:00
|
|
|
{({ data, loading }) => {
|
2020-02-20 14:18:22 +00:00
|
|
|
const staffMember = data?.user;
|
|
|
|
|
|
|
|
if (staffMember === null) {
|
|
|
|
return <NotFoundPage onBack={handleBack} />;
|
|
|
|
}
|
|
|
|
|
2019-06-19 14:40:52 +00:00
|
|
|
const handleStaffMemberUpdate = (data: StaffMemberUpdate) => {
|
|
|
|
if (!maybe(() => data.staffUpdate.errors.length !== 0)) {
|
|
|
|
notify({
|
2019-08-26 21:43:29 +00:00
|
|
|
text: intl.formatMessage(commonMessages.savedChanges)
|
2019-06-19 14:40:52 +00:00
|
|
|
});
|
|
|
|
}
|
|
|
|
};
|
|
|
|
const handleStaffMemberDelete = (data: StaffMemberDelete) => {
|
|
|
|
if (!maybe(() => data.staffDelete.errors.length !== 0)) {
|
|
|
|
notify({
|
2019-08-26 21:43:29 +00:00
|
|
|
text: intl.formatMessage(commonMessages.savedChanges)
|
2019-06-19 14:40:52 +00:00
|
|
|
});
|
|
|
|
navigate(staffListUrl());
|
|
|
|
}
|
|
|
|
};
|
|
|
|
const handleStaffMemberAvatarUpdate = (data: StaffAvatarUpdate) => {
|
|
|
|
if (!maybe(() => data.userAvatarUpdate.errors.length !== 0)) {
|
|
|
|
notify({
|
2019-08-26 21:43:29 +00:00
|
|
|
text: intl.formatMessage(commonMessages.savedChanges)
|
2019-06-19 14:40:52 +00:00
|
|
|
});
|
|
|
|
}
|
|
|
|
};
|
|
|
|
const handleStaffMemberAvatarDelete = (data: StaffAvatarDelete) => {
|
|
|
|
if (!maybe(() => data.userAvatarDelete.errors.length !== 0)) {
|
|
|
|
notify({
|
2019-08-26 21:43:29 +00:00
|
|
|
text: intl.formatMessage(commonMessages.savedChanges)
|
2019-06-19 14:40:52 +00:00
|
|
|
});
|
|
|
|
navigate(staffMemberDetailsUrl(id));
|
|
|
|
}
|
|
|
|
};
|
2020-02-20 14:18:22 +00:00
|
|
|
|
2019-06-19 14:40:52 +00:00
|
|
|
return (
|
|
|
|
<TypedStaffMemberUpdateMutation onCompleted={handleStaffMemberUpdate}>
|
|
|
|
{(updateStaffMember, updateResult) => (
|
|
|
|
<TypedStaffMemberDeleteMutation
|
|
|
|
variables={{ id }}
|
|
|
|
onCompleted={handleStaffMemberDelete}
|
|
|
|
>
|
|
|
|
{(deleteStaffMember, deleteResult) => (
|
|
|
|
<TypedStaffAvatarUpdateMutation
|
|
|
|
onCompleted={handleStaffMemberAvatarUpdate}
|
|
|
|
>
|
|
|
|
{updateStaffAvatar => (
|
|
|
|
<TypedStaffAvatarDeleteMutation
|
|
|
|
onCompleted={handleStaffMemberAvatarDelete}
|
|
|
|
>
|
|
|
|
{(deleteStaffAvatar, deleteAvatarResult) => {
|
|
|
|
const isUserSameAsViewer = maybe(
|
|
|
|
() => user.user.id === data.user.id,
|
|
|
|
true
|
|
|
|
);
|
|
|
|
|
|
|
|
return (
|
|
|
|
<>
|
|
|
|
<WindowTitle
|
2020-02-20 14:18:22 +00:00
|
|
|
title={staffMember?.email || "..."}
|
2019-06-19 14:40:52 +00:00
|
|
|
/>
|
|
|
|
<StaffDetailsPage
|
|
|
|
canEditAvatar={isUserSameAsViewer}
|
2019-10-16 15:18:29 +00:00
|
|
|
canEditPreferences={isUserSameAsViewer}
|
2019-06-19 14:40:52 +00:00
|
|
|
canEditStatus={!isUserSameAsViewer}
|
|
|
|
canRemove={!isUserSameAsViewer}
|
|
|
|
disabled={loading}
|
2020-02-20 14:18:22 +00:00
|
|
|
onBack={handleBack}
|
2019-12-03 16:14:30 +00:00
|
|
|
onChangePassword={() =>
|
|
|
|
navigate(
|
|
|
|
staffMemberDetailsUrl(id, {
|
|
|
|
action: "change-password"
|
|
|
|
})
|
|
|
|
)
|
|
|
|
}
|
2019-06-19 14:40:52 +00:00
|
|
|
onDelete={() =>
|
|
|
|
navigate(
|
|
|
|
staffMemberDetailsUrl(id, {
|
|
|
|
action: "remove"
|
|
|
|
})
|
|
|
|
)
|
|
|
|
}
|
|
|
|
onSubmit={variables =>
|
|
|
|
updateStaffMember({
|
|
|
|
variables: {
|
|
|
|
id,
|
|
|
|
input: {
|
|
|
|
email: variables.email,
|
|
|
|
firstName: variables.firstName,
|
|
|
|
isActive: variables.isActive,
|
|
|
|
lastName: variables.lastName,
|
|
|
|
permissions: variables.permissions
|
|
|
|
}
|
|
|
|
}
|
|
|
|
})
|
|
|
|
}
|
|
|
|
onImageUpload={file =>
|
|
|
|
updateStaffAvatar({
|
|
|
|
variables: {
|
|
|
|
image: file
|
|
|
|
}
|
|
|
|
})
|
|
|
|
}
|
|
|
|
onImageDelete={() =>
|
|
|
|
navigate(
|
|
|
|
staffMemberDetailsUrl(id, {
|
|
|
|
action: "remove-avatar"
|
|
|
|
})
|
|
|
|
)
|
|
|
|
}
|
2019-09-26 13:16:36 +00:00
|
|
|
permissions={maybe(() => shop.permissions)}
|
2020-02-20 14:18:22 +00:00
|
|
|
staffMember={staffMember}
|
2019-12-06 17:17:44 +00:00
|
|
|
saveButtonBarState={updateResult.status}
|
2019-06-19 14:40:52 +00:00
|
|
|
/>
|
|
|
|
<ActionDialog
|
|
|
|
open={params.action === "remove"}
|
2019-08-26 21:43:29 +00:00
|
|
|
title={intl.formatMessage({
|
2019-09-05 10:44:10 +00:00
|
|
|
defaultMessage: "delete Staff User",
|
2019-08-26 21:43:29 +00:00
|
|
|
description: "dialog header"
|
|
|
|
})}
|
2019-12-06 17:17:44 +00:00
|
|
|
confirmButtonState={deleteResult.status}
|
2019-06-19 14:40:52 +00:00
|
|
|
variant="delete"
|
2019-12-03 16:30:37 +00:00
|
|
|
onClose={closeModal}
|
2019-06-19 14:40:52 +00:00
|
|
|
onConfirm={deleteStaffMember}
|
|
|
|
>
|
2019-08-26 21:43:29 +00:00
|
|
|
<DialogContentText>
|
|
|
|
<FormattedMessage
|
2019-09-05 10:44:10 +00:00
|
|
|
defaultMessage="Are you sure you want to delete {email} from staff members?"
|
2019-08-26 21:43:29 +00:00
|
|
|
values={{
|
|
|
|
email: maybe(() => data.user.email, "...")
|
|
|
|
}}
|
|
|
|
/>
|
|
|
|
</DialogContentText>
|
2019-06-19 14:40:52 +00:00
|
|
|
</ActionDialog>
|
|
|
|
<ActionDialog
|
|
|
|
open={params.action === "remove-avatar"}
|
2019-08-26 21:43:29 +00:00
|
|
|
title={intl.formatMessage({
|
|
|
|
defaultMessage: "Delete Staff User Avatar",
|
|
|
|
description: "dialog header"
|
|
|
|
})}
|
2019-12-06 17:17:44 +00:00
|
|
|
confirmButtonState={deleteAvatarResult.status}
|
2019-06-19 14:40:52 +00:00
|
|
|
variant="delete"
|
2019-12-03 16:30:37 +00:00
|
|
|
onClose={closeModal}
|
2019-06-19 14:40:52 +00:00
|
|
|
onConfirm={deleteStaffAvatar}
|
|
|
|
>
|
2019-08-26 21:43:29 +00:00
|
|
|
<DialogContentText>
|
|
|
|
<FormattedMessage
|
|
|
|
defaultMessage="Are you sure you want to remove {email} avatar?"
|
|
|
|
values={{
|
|
|
|
email: (
|
|
|
|
<strong>
|
|
|
|
{maybe(() => data.user.email, "...")}
|
|
|
|
</strong>
|
|
|
|
)
|
|
|
|
}}
|
|
|
|
/>
|
|
|
|
</DialogContentText>
|
2019-06-19 14:40:52 +00:00
|
|
|
</ActionDialog>
|
2019-12-03 16:30:37 +00:00
|
|
|
<StaffPasswordResetDialog
|
2019-12-06 17:17:44 +00:00
|
|
|
confirmButtonState={changePasswordOpts.status}
|
2019-12-03 16:39:27 +00:00
|
|
|
errors={maybe(
|
|
|
|
() =>
|
|
|
|
changePasswordOpts.data.passwordChange
|
|
|
|
.errors,
|
|
|
|
[]
|
|
|
|
)}
|
2019-12-03 16:30:37 +00:00
|
|
|
open={params.action === "change-password"}
|
|
|
|
onClose={closeModal}
|
2019-12-03 16:39:27 +00:00
|
|
|
onSubmit={data =>
|
|
|
|
changePassword({
|
2019-12-03 16:42:27 +00:00
|
|
|
variables: data
|
2019-12-03 16:39:27 +00:00
|
|
|
})
|
|
|
|
}
|
2019-12-03 16:30:37 +00:00
|
|
|
/>
|
2019-06-19 14:40:52 +00:00
|
|
|
</>
|
|
|
|
);
|
|
|
|
}}
|
|
|
|
</TypedStaffAvatarDeleteMutation>
|
|
|
|
)}
|
|
|
|
</TypedStaffAvatarUpdateMutation>
|
|
|
|
)}
|
|
|
|
</TypedStaffMemberDeleteMutation>
|
|
|
|
)}
|
|
|
|
</TypedStaffMemberUpdateMutation>
|
|
|
|
);
|
|
|
|
}}
|
|
|
|
</TypedStaffMemberDetailsQuery>
|
|
|
|
);
|
|
|
|
};
|
|
|
|
|
|
|
|
export default StaffDetails;
|