diff --git a/src/pages/roles/role-form/RoleFormPage.tsx b/src/pages/roles/role-form/RoleFormPage.tsx new file mode 100644 index 0000000..891c8d3 --- /dev/null +++ b/src/pages/roles/role-form/RoleFormPage.tsx @@ -0,0 +1,149 @@ +import { useEffect } from "react"; +import { useNavigate, useParams } from "react-router-dom"; +import { useForm } from "react-hook-form"; +import { yupResolver } from "@hookform/resolvers/yup"; +import * as yup from "yup"; +import { useRole, useCreateRole, useUpdateRole } from "../core/_hooks"; +import { Button } from "@/components/ui/Button"; +import { Input } from "@/components/ui/Input"; +import { LoadingSpinner } from "@/components/ui/LoadingSpinner"; +import { RoleFormData } from "../core/_models"; +import { ArrowRight } from "lucide-react"; + +const roleSchema = yup.object({ + title: yup + .string() + .required("نام نقش الزامی است") + .min(2, "نام نقش باید حداقل ۲ کاراکتر باشد"), + description: yup + .string() + .required("توضیحات الزامی است") + .min(5, "توضیحات باید حداقل ۵ کاراکتر باشد"), +}); + +const RoleFormPage = () => { + const navigate = useNavigate(); + const { id } = useParams(); + const isEdit = !!id; + + const { data: role, isLoading: roleLoading } = useRole(id || ""); + const { mutate: createRole, isPending: creating } = useCreateRole(); + const { mutate: updateRole, isPending: updating } = useUpdateRole(); + + const { + register, + handleSubmit, + formState: { errors, isValid }, + reset, + } = useForm({ + resolver: yupResolver(roleSchema), + mode: 'onChange', + }); + + useEffect(() => { + if (isEdit && role) { + reset({ + title: role.title, + description: role.description, + }); + } + }, [isEdit, role, reset]); + + const onSubmit = (data: RoleFormData) => { + if (isEdit && id) { + updateRole({ + id: parseInt(id), + ...data, + }, { + onSuccess: () => { + navigate('/roles'); + } + }); + } else { + createRole(data, { + onSuccess: () => { + navigate('/roles'); + } + }); + } + }; + + if (isEdit && roleLoading) { + return ; + } + + const isLoading = creating || updating; + + return ( +
+
+
+ +

+ {isEdit ? 'ویرایش نقش' : 'ایجاد نقش جدید'} +

+
+
+ +
+
+
+ + +
+ +