import React, { useEffect, useState, useRef } from "react"; import { useFeatures } from "../../hooks/useMasterRole"; import { useForm } from "react-hook-form"; import { set, z } from "zod"; import { zodResolver } from "@hookform/resolvers/zod"; import { MasterRespository } from "../../repositories/MastersRepository"; import { cacheData, getCachedData } from "../../slices/apiDataManager"; import showToast from "../../services/toastService"; import { useCreateApplicationRole } from "../../hooks/masterHook/useMaster"; const schema = z.object({ role: z.string().min(1, { message: "Role is required" }), description: z .string() .min(1, { message: "Description is required" }) .max(255, { message: "Description cannot exceed 255 characters" }), selectedPermissions: z .array(z.string()) .min(1, { message: "Please select at least one permission" }), }); const CreateRole = ({ modalType, onClose }) => { const maxDescriptionLength = 255; const [descriptionLength, setDescriptionLength] = useState(0); const popoverRefs = useRef([]); const { masterFeatures } = useFeatures(); const { mutate: submitNewApplicationRole, isPending: isLoading } = useCreateApplicationRole(() => { onClose?.(); }); const { register, handleSubmit, formState: { errors }, reset, } = useForm({ resolver: zodResolver(schema), defaultValues: { role: "", description: "", selectedPermissions: [], }, }); const onSubmit = (values) => { const payload = { role: values.role, description: values.description, featuresPermission: values.selectedPermissions.map((id) => ({ id, isEnabled: true, })), }; submitNewApplicationRole(payload); }; // const onSubmit = (values) => { // setIsLoading(true) // const result = { // role: values.role, // description: values.description, // featuresPermission: values.selectedPermissions.map((id) => ({ // id, // isEnabled: true, // })), // }; // MasterRespository.createRole(result).then((resp) => { // setIsLoading(false) // const cachedData = getCachedData("Application Role"); // const updatedData = [...cachedData, resp.data]; // cacheData("Application Role", updatedData); // showToast("Application Role Added successfully.", "success"); // onClose() // }).catch((err) => { // showToast(err?.response?.data?.message, "error"); // setIsLoading(false) // onClose() // }) // }; useEffect(() => { setDescriptionLength(0); }, []); useEffect(() => { popoverRefs.current.forEach((el) => { if (el) { new bootstrap.Popover(el, { trigger: "focus", placement: "right", html: true, content: el.getAttribute("data-bs-content"), }); } }); }, [masterFeatures]); return (
{/*
*/}
{errors.role &&

{errors.role.message}

}
{maxDescriptionLength - descriptionLength} characters left
{errors.description && (

{errors.description.message}

)}
{masterFeatures.map((feature, featureIndex) => (
{/* Feature Title */}
{feature.name}
{/* Permissions Grid */}
{feature.featurePermissions.map((perm, permIndex) => { const refIndex = featureIndex * 100 + permIndex; return (
{/* Info icon */}
(popoverRefs.current[refIndex] = el)} tabIndex="0" className="d-flex align-items-center justify-content-center" data-bs-toggle="popover" data-bs-trigger="focus" data-bs-placement="right" data-bs-html="true" data-bs-content={`
${perm.description}
`} >  
); })}

))} {errors.selectedPermissions && (

{errors.selectedPermissions.message}

)} {!masterFeatures &&

Loading...

}
{masterFeatures && (
)}
); }; export default CreateRole;