import { Key, PencilSquare, Trash } from "@medusajs/icons"
import { HttpTypes } from "@medusajs/types"
import { Container, Heading, toast, usePrompt } from "@medusajs/ui"
import { useMemo } from "react"
import { useTranslation } from "react-i18next"
import { useNavigate } from "react-router-dom"
import {
ActionGroup,
ActionMenu,
} from "../../../../../components/common/action-menu"
import { ListSummary } from "../../../../../components/common/list-summary"
import { SectionRow } from "../../../../../components/common/section"
import { useDeleteRbacRole } from "../../../../../hooks/api/rbac-roles"
import { usePermissions } from "../../../../../providers/permissions-provider"
type RoleWithUsers = HttpTypes.AdminRbacRole & {
users_link?: { user?: HttpTypes.AdminUser | null }[]
}
type RoleGeneralSectionProps = {
role: RoleWithUsers
}
export const RoleGeneralSection = ({ role }: RoleGeneralSectionProps) => {
const { t } = useTranslation()
const { hasPermission } = usePermissions()
const prompt = usePrompt()
const navigate = useNavigate()
const { mutateAsync: deleteRole, isPending: isDeleting } = useDeleteRbacRole(
role.id
)
const handleDelete = async () => {
const confirmed = await prompt({
title: t("roles.delete.title"),
description: t("roles.delete.description", { name: role.name }),
confirmText: t("actions.delete"),
cancelText: t("actions.cancel"),
})
if (!confirmed) {
return
}
try {
await deleteRole()
toast.success(t("roles.delete.successToast", { name: role.name }))
navigate("/settings/roles", { replace: true })
} catch (error) {
toast.error((error as Error).message)
}
}
const users = useMemo(() => {
return (
role.users_link
?.map((link) => link.user)
.filter((user): user is HttpTypes.AdminUser => !!user) ?? []
)
}, [role.users_link])
const userLabels = useMemo(() => {
return users.map((user) => {
const fullName = `${user.first_name || ""} ${user.last_name || ""}`.trim()
return fullName || user.email || user.id
})
}, [users])
const permissionLabels = useMemo(() => {
return (
role.policies?.map((policy) => {
if (policy.key) {
return policy.key
}
const resource = policy.resource ?? ""
const operation = policy.operation ?? ""
if (resource && operation) {
return `${resource}:${operation}`
}
return policy.id
}) ?? []
)
}, [role.policies])
const canUpdate = hasPermission("rbac_role:update")
const canDelete = hasPermission("rbac_role:delete")
const groups: ActionGroup[] = []
if (canUpdate) {
groups.push({
actions: [
{
icon: ,
label: t("actions.edit"),
to: `edit`,
},
{
icon: ,
label: t("roles.actions.managePermissions"),
to: `permissions`,
},
],
})
}
if (canDelete) {
groups.push({
actions: [
{
icon: ,
label: t("actions.delete"),
onClick: handleDelete,
disabled: isDeleting,
},
],
})
}
return (
{role.name}
{groups.length &&
}
{hasPermission("user:read") && (
) : (
"-"
)
}
/>
)}
{hasPermission("rbac_policy:read") && (
) : (
"-"
)
}
/>
)}
)
}