import { zodResolver } from "@hookform/resolvers/zod" import { HttpTypes } from "@medusajs/types" import { Button, Input, Textarea, toast } from "@medusajs/ui" import { useForm } from "react-hook-form" import { useTranslation } from "react-i18next" import { z } from "zod" import { Form } from "../../../../../components/common/form" import { RouteDrawer, useRouteModal } from "../../../../../components/modals" import { KeyboundForm } from "../../../../../components/utilities/keybound-form" import { useUpdateRbacPolicy } from "../../../../../hooks/api/rbac-policies" const EditPolicySchema = z.object({ key: z.string().min(1), resource: z.string().min(1), operation: z.string().min(1), name: z.string().optional(), description: z.string().optional(), }) type EditPolicyFormProps = { policy: HttpTypes.AdminRbacPolicy } export const EditPolicyForm = ({ policy }: EditPolicyFormProps) => { const { t } = useTranslation() const { handleSuccess } = useRouteModal() const form = useForm>({ defaultValues: { key: policy.key, resource: policy.resource, operation: policy.operation, name: policy.name ?? "", description: policy.description ?? "", }, resolver: zodResolver(EditPolicySchema), }) const { mutateAsync, isPending } = useUpdateRbacPolicy(policy.id) const handleSubmit = form.handleSubmit(async (data) => { await mutateAsync( { key: data.key.trim(), resource: data.resource.trim(), operation: data.operation.trim(), name: data.name?.trim() || null, description: data.description?.trim() || null, }, { onSuccess: ({ policy: updated }) => { toast.success( t("policies.edit.successToast", { key: updated.key }) ) handleSuccess() }, onError: (error) => { toast.error(error.message) }, } ) }) return ( ( {t("fields.key")} )} /> ( {t("fields.resource")} )} /> ( {t("fields.operation")} )} /> ( {t("fields.name")} )} /> ( {t("fields.description")}