import React, { useEffect } from 'react'; import { useParams, useNavigate } from 'react-router-dom'; import { useForm, Controller } from 'react-hook-form'; import { yupResolver } from '@hookform/resolvers/yup'; import * as yup from 'yup'; import { User, ArrowLeft, Save, UserPlus } from 'lucide-react'; import { useUser, useCreateUser, useUpdateUser } from '../core/_hooks'; import { CreateUserRequest, UpdateUserRequest } from '../core/_models'; import { PageContainer } from '../../../components/ui/Typography'; import { Button } from '../../../components/ui/Button'; import { Input } from '../../../components/ui/Input'; import { LoadingSpinner } from '../../../components/ui/LoadingSpinner'; // Validation schema const createUserSchema = yup.object({ phone_number: yup .string() .required('شماره تلفن الزامی است') .matches(/^(\+98|0)?9\d{9}$/, 'شماره تلفن معتبر نیست'), first_name: yup .string() .required('نام الزامی است') .min(1, 'نام باید حداقل ۱ کاراکتر باشد') .max(100, 'نام نباید بیشتر از ۱۰۰ کاراکتر باشد'), last_name: yup .string() .required('نام خانوادگی الزامی است') .min(1, 'نام خانوادگی باید حداقل ۱ کاراکتر باشد') .max(100, 'نام خانوادگی نباید بیشتر از ۱۰۰ کاراکتر باشد'), email: yup .string() .email('ایمیل معتبر نیست') .max(255, 'ایمیل نباید بیشتر از ۲۵۵ کاراکتر باشد') .nullable(), national_code: yup .string() .max(20, 'کد ملی نباید بیشتر از ۲۰ کاراکتر باشد') .nullable(), verified: yup.boolean().required('وضعیت تأیید الزامی است'), password: yup .string() .min(6, 'رمز عبور باید حداقل ۶ کاراکتر باشد') .max(100, 'رمز عبور نباید بیشتر از ۱۰۰ کاراکتر باشد') .nullable(), }); const updateUserSchema = yup.object({ first_name: yup .string() .required('نام الزامی است') .min(1, 'نام باید حداقل ۱ کاراکتر باشد') .max(100, 'نام نباید بیشتر از ۱۰۰ کاراکتر باشد'), last_name: yup .string() .required('نام خانوادگی الزامی است') .min(1, 'نام خانوادگی باید حداقل ۱ کاراکتر باشد') .max(100, 'نام خانوادگی نباید بیشتر از ۱۰۰ کاراکتر باشد'), email: yup .string() .email('ایمیل معتبر نیست') .max(255, 'ایمیل نباید بیشتر از ۲۵۵ کاراکتر باشد') .nullable(), national_code: yup .string() .max(20, 'کد ملی نباید بیشتر از ۲۰ کاراکتر باشد') .nullable(), verified: yup.boolean().required('وضعیت تأیید الزامی است'), }); type FormData = CreateUserRequest | UpdateUserRequest; const UserAdminFormPage: React.FC = () => { const { id } = useParams<{ id: string }>(); const navigate = useNavigate(); const isEdit = !!id; // Hooks const { data: user, isLoading: userLoading } = useUser(id || ''); const createUserMutation = useCreateUser(); const updateUserMutation = useUpdateUser(); const { register, handleSubmit, formState: { errors, isValid }, reset, setValue, } = useForm({ resolver: yupResolver(isEdit ? updateUserSchema : createUserSchema), mode: 'onChange', defaultValues: { verified: false, }, }); // Populate form in edit mode useEffect(() => { if (isEdit && user) { reset({ first_name: user.first_name, last_name: user.last_name, email: user.email || '', national_code: user.national_code || '', verified: user.verified, } as any); } }, [isEdit, user, reset]); // Handlers const onSubmit = (data: FormData) => { if (isEdit && id) { updateUserMutation.mutate( { id, userData: data as UpdateUserRequest }, { onSuccess: () => { navigate(`/users-admin/${id}`); }, } ); } else { createUserMutation.mutate(data as CreateUserRequest, { onSuccess: (newUser) => { navigate(`/users-admin/${newUser.id}`); }, }); } }; const handleBack = () => { if (isEdit) { navigate(`/users-admin/${id}`); } else { navigate('/users-admin'); } }; const isLoading = createUserMutation.isPending || updateUserMutation.isPending; if (isEdit && userLoading) { return (
); } return (
{/* Header */}

{isEdit ? : } {isEdit ? 'ویرایش کاربر' : 'ایجاد کاربر جدید'}

{isEdit ? 'ویرایش اطلاعات کاربر' : 'افزودن کاربر جدید به سیستم'}

{/* اطلاعات اصلی */}

اطلاعات اصلی کاربر

{!isEdit && ( )} {!isEdit && ( )}
{/* تنظیمات حساب */}

تنظیمات حساب

{errors.verified && (

{errors.verified.message}

)}
{/* دکمه‌های اکشن */}
); }; export default UserAdminFormPage;