saleor-dashboard/src/staff/views/StaffDetails.tsx

290 lines
12 KiB
TypeScript
Raw Normal View History

import DialogContentText from "@material-ui/core/DialogContentText";
2019-06-19 14:40:52 +00:00
import ActionDialog from "@saleor/components/ActionDialog";
import NotFoundPage from "@saleor/components/NotFoundPage";
2019-06-19 14:40:52 +00:00
import { WindowTitle } from "@saleor/components/WindowTitle";
import { DEFAULT_INITIAL_SEARCH_DATA } from "@saleor/config";
2019-06-19 14:40:52 +00:00
import useNavigator from "@saleor/hooks/useNavigator";
import useNotifier from "@saleor/hooks/useNotifier";
import useUser from "@saleor/hooks/useUser";
import { commonMessages } from "@saleor/intl";
import { getStringOrPlaceholder, maybe } from "@saleor/misc";
import usePermissionGroupSearch from "@saleor/searches/usePermissionGroupSearch";
import React from "react";
import { FormattedMessage, useIntl } from "react-intl";
2019-06-19 14:40:52 +00:00
import StaffDetailsPage from "../components/StaffDetailsPage/StaffDetailsPage";
import StaffPasswordResetDialog from "../components/StaffPasswordResetDialog";
2019-06-19 14:40:52 +00:00
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 { ChangeStaffPassword } from "../types/ChangeStaffPassword";
2019-06-19 14:40:52 +00:00
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";
import { groupsDiff } from "../utils";
2019-06-19 14:40:52 +00:00
interface OrderListProps {
id: string;
params: StaffMemberDetailsUrlQueryParams;
}
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();
const intl = useIntl();
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());
const {
loadMore: loadMorePermissionGroups,
search: searchPermissionGroups,
result: searchPermissionGroupsOpts
} = usePermissionGroupSearch({
variables: DEFAULT_INITIAL_SEARCH_DATA
});
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({
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({
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({
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({
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 =
user.user?.id === data?.user?.id;
2019-06-19 14:40:52 +00:00
return (
<>
<WindowTitle
title={getStringOrPlaceholder(
staffMember?.email
)}
2019-06-19 14:40:52 +00:00
/>
<StaffDetailsPage
errors={
updateResult?.data?.staffUpdate?.errors || []
}
2019-06-19 14:40:52 +00:00
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}
initialSearch=""
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 => {
2019-06-19 14:40:52 +00:00
updateStaffMember({
variables: {
id,
input: {
email: variables.email,
firstName: variables.firstName,
isActive: variables.isActive,
lastName: variables.lastName,
...groupsDiff(data?.user, variables)
2019-06-19 14:40:52 +00:00
}
}
});
}}
2019-06-19 14:40:52 +00:00
onImageUpload={file =>
updateStaffAvatar({
variables: {
image: file
}
})
}
onImageDelete={() =>
navigate(
staffMemberDetailsUrl(id, {
action: "remove-avatar"
})
)
}
availablePermissionGroups={searchPermissionGroupsOpts.data?.search.edges.map(
edge => edge.node
)}
2020-02-20 14:18:22 +00:00
staffMember={staffMember}
2019-12-06 17:17:44 +00:00
saveButtonBarState={updateResult.status}
fetchMorePermissionGroups={{
hasMore:
searchPermissionGroupsOpts.data?.search
.pageInfo.hasNextPage,
loading: searchPermissionGroupsOpts.loading,
onFetchMore: loadMorePermissionGroups
}}
onSearchChange={searchPermissionGroups}
2019-06-19 14:40:52 +00:00
/>
<ActionDialog
open={params.action === "remove"}
title={intl.formatMessage({
2019-09-05 10:44:10 +00:00
defaultMessage: "delete Staff User",
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}
>
<DialogContentText>
<FormattedMessage
2019-09-05 10:44:10 +00:00
defaultMessage="Are you sure you want to delete {email} from staff members?"
values={{
email: getStringOrPlaceholder(
data?.user?.email
)
}}
/>
</DialogContentText>
2019-06-19 14:40:52 +00:00
</ActionDialog>
<ActionDialog
open={params.action === "remove-avatar"}
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}
>
<DialogContentText>
<FormattedMessage
defaultMessage="Are you sure you want to remove {email} avatar?"
values={{
email: (
<strong>
{getStringOrPlaceholder(
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}
errors={
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;