import { AppPermissionsDialogConfirmation } from "@dashboard/apps/components/AppPermissionsDialog/AppPermissionsDialogConfirmation";
import { AppPermissionsDialogPermissionPicker } from "@dashboard/apps/components/AppPermissionsDialog/AppPermissionsDialogPermissionPicker";
import { useAppPermissionsDialogState } from "@dashboard/apps/components/AppPermissionsDialog/AppPermissionsDialogState";
import { AppPermissionsDialogMessages } from "@dashboard/apps/components/AppPermissionsDialog/messages";
import { useGetAvailableAppPermissions } from "@dashboard/apps/components/AppPermissionsDialog/useGetAvailableAppPermissions";
import {
PermissionEnum,
useAppQuery,
useAppUpdatePermissionsMutation,
} from "@dashboard/graphql";
import useNotifier from "@dashboard/hooks/useNotifier";
import { Dialog, DialogContent, DialogTitle } from "@material-ui/core";
import { Skeleton } from "@material-ui/lab";
import { Box, Text } from "@saleor/macaw-ui/next";
import React, { useEffect } from "react";
import { useIntl } from "react-intl";
const messages = AppPermissionsDialogMessages.dialogRoot;
interface AppPermissionsDialogProps {
onClose: () => void;
assignedPermissions: PermissionEnum[];
appId: string;
}
export const AppPermissionsDialog = ({
assignedPermissions,
onClose,
appId,
}: AppPermissionsDialogProps) => {
const { availablePermissions } = useGetAvailableAppPermissions();
const { formatMessage } = useIntl();
const {
updateSelected,
onConfirmSelection,
state,
onBackFromConfirmation,
selectedPermissions,
onMutationError,
onApprove,
} = useAppPermissionsDialogState(assignedPermissions);
const { refetch } = useAppQuery({ variables: { id: appId }, skip: true });
const notify = useNotifier();
const [mutate] = useAppUpdatePermissionsMutation({
onError(err) {
onMutationError(err.message);
},
onCompleted(data) {
if (data.appUpdate?.errors.length) {
onMutationError(
data.appUpdate?.errors[0].message ??
formatMessage(messages.fallbackErrorText),
);
return;
}
refetch().then(onClose);
notify({
status: "success",
title: formatMessage(messages.successNotificationTitle),
autohide: 1000,
text: formatMessage(messages.successNotificationBody),
});
},
});
useEffect(() => {
if (state.type === "saving") {
mutate({
variables: {
permissions: state.selected,
id: appId,
},
});
}
}, [state.type, appId]);
const renderDialogContent = () => {
switch (state.type) {
case "pick-permissions":
return (
);
case "confirm-permissions":
return (
);
case "saving":
return ;
case "error":
return (
{state.error}
);
}
};
return (
);
};