diff --git a/src/config/Pages.ts b/src/config/Pages.ts index 966c0e8..146f501 100644 --- a/src/config/Pages.ts +++ b/src/config/Pages.ts @@ -87,6 +87,7 @@ export const Pages = { customer: { list: "/customers/list", create: "/customers/create", + update: "/customers/update/", }, cardBank: { list: "/card-bank/list", diff --git a/src/langs/fa.json b/src/langs/fa.json index c00a035..d241844 100644 --- a/src/langs/fa.json +++ b/src/langs/fa.json @@ -645,7 +645,10 @@ "enter_company_name": "نام ثبتی شرکت را وارد کنید", "postal_code": "کد پستی", "enter_postal_code": "کد پستی را وارد کنید", - "address": "آدرس" + "address": "آدرس", + "image_profile": "تصویر پروفایل", + "upload_image": "آپلود تصویر", + "new_password": "رمز عبور جدید" }, "messages": { "messages_list": "لیست پیام ها", diff --git a/src/pages/customer/Create.tsx b/src/pages/customer/Create.tsx index 2f2ae70..269941d 100644 --- a/src/pages/customer/Create.tsx +++ b/src/pages/customer/Create.tsx @@ -54,10 +54,9 @@ const AddCustomer: FC = () => { nationalCode: '', password: '', economicCode: '', - companyRegisteredName: '', - registrationId: '', - nationalId: '', - number: '', + registrationName: '', + registrationCode: '', + nationalIdentity: '', postalCode: '', address: '', cityId: '', @@ -72,15 +71,15 @@ const AddCustomer: FC = () => { nationalCode: Yup.string().required(t('errors.required')), password: Yup.string().required(t('errors.required')), economicCode: Yup.string().required(t('errors.required')), - companyRegisteredName: Yup.string().required(t('errors.required')), - registrationId: Yup.string().required(t('errors.required')), - nationalId: Yup.string().required(t('errors.required')), - number: Yup.string().required(t('errors.required')), + registrationName: Yup.string().required(t('errors.required')), + registrationCode: Yup.string().required(t('errors.required')), + nationalIdentity: Yup.string().required(t('errors.required')), postalCode: Yup.string().required(t('errors.required')), address: Yup.string().required(t('errors.required')), cityId: Yup.string().required(t('errors.required')), }), onSubmit: async (values) => { + values.cityId = +values.cityId if (file) { const formData = new FormData() formData.append('file', file) @@ -185,15 +184,15 @@ const AddCustomer: FC = () => { @@ -222,16 +221,16 @@ const AddCustomer: FC = () => { - + {...formik.getFieldProps('phone')} + error_text={formik.touched.phone && formik.errors.phone ? formik.errors.phone : ''} + /> */}
diff --git a/src/pages/customer/List.tsx b/src/pages/customer/List.tsx index 73c3788..4d7e033 100644 --- a/src/pages/customer/List.tsx +++ b/src/pages/customer/List.tsx @@ -105,7 +105,7 @@ const CustomerList: FC = () => { - + diff --git a/src/pages/customer/Update.tsx b/src/pages/customer/Update.tsx new file mode 100644 index 0000000..b64419a --- /dev/null +++ b/src/pages/customer/Update.tsx @@ -0,0 +1,331 @@ +import { FC, useEffect, useState } from 'react' +import { useTranslation } from 'react-i18next' +import Input from '../../components/Input' +import UploadBoxDraggble from '../../components/UploadBoxDraggble'; +import Button from '../../components/Button'; +import { TickCircle } from 'iconsax-react'; +import DatePickerComponent from '../../components/DatePicker'; +import Select from '../../components/Select'; +import * as Yup from 'yup' +import { useFormik } from 'formik'; +import { CreateCustomerType, ProvinesItemType } from './types/CustomerTypes'; +import { useCreateCustomer, useGetCities, useGetCustomerDetail, useGetProvines, useUpdateCustomer } from './hooks/useCustomerData'; +import PageLoading from '../../components/PageLoading'; +import { toast } from 'react-toastify'; +import { ErrorType } from '../../helpers/types'; +import { useSingleUpload } from '../service/hooks/useServiceData'; +import { useNavigate, useParams } from 'react-router-dom'; +import { Pages } from '../../config/Pages'; +import Textarea from '../../components/Textarea'; + +const UpdateCustomer: FC = () => { + + const { id } = useParams() + const { t } = useTranslation('global') + const navigate = useNavigate() + const [provinesId, setProvinesId] = useState('') + const [file, setFile] = useState() + const getProvines = useGetProvines() + const getCities = useGetCities(provinesId) + const singleUpload = useSingleUpload() + const createCustomer = useCreateCustomer() + const getDetailCustomer = useGetCustomerDetail(id) + const updateCustomer = useUpdateCustomer(id ? id : '') + + const handleUpdateCustomer = (values: CreateCustomerType) => { + updateCustomer.mutate(values, { + onSuccess: () => { + toast.success(t('success')) + navigate(Pages.customer.list) + }, + onError: (error: ErrorType) => { + toast.error(error.response?.data?.error.message[0]) + } + }) + } + + const formik = useFormik({ + initialValues: { + phone: '', + firstName: '', + lastName: '', + email: '', + birthDate: '', + nationalCode: '', + password: '', + economicCode: '', + registrationName: '', + registrationCode: '', + nationalIdentity: '', + postalCode: '', + address: '', + cityId: '', + profilePic: '' + }, + validationSchema: Yup.object({ + phone: Yup.string().required(t('errors.required')), + firstName: Yup.string().required(t('errors.required')), + lastName: Yup.string().required(t('errors.required')), + email: Yup.string().email(t('errors.email')).required(t('errors.required')), + birthDate: Yup.string().required(t('errors.required')), + nationalCode: Yup.string().required(t('errors.required')), + economicCode: Yup.string().required(t('errors.required')), + registrationName: Yup.string().required(t('errors.required')), + registrationCode: Yup.string().required(t('errors.required')), + nationalIdentity: Yup.string().required(t('errors.required')), + postalCode: Yup.string().required(t('errors.required')), + address: Yup.string().required(t('errors.required')), + cityId: Yup.string().required(t('errors.required')), + }), + onSubmit: async (values) => { + values.cityId = +values.cityId + if (values.password === '') values.password = undefined + if (file) { + const formData = new FormData() + formData.append('file', file) + await singleUpload.mutateAsync(formData, { + onSuccess: (data) => { + values.profilePic = data?.data?.url + }, + onError: (error: ErrorType) => { + toast.error(error.response?.data?.error?.message[0]) + } + }) + + handleUpdateCustomer(values) + } else { + values.profilePic = undefined + handleUpdateCustomer(values) + } + } + }) + + useEffect(() => { + + if (getDetailCustomer.data) { + const data = getDetailCustomer.data.data?.customer + const legal = getDetailCustomer.data.data?.customer.legalUser + formik.setValues({ + phone: data.phone || '', + firstName: data.firstName || '', + lastName: data.lastName || '', + email: data.email || '', + birthDate: data.birthDate || '', + nationalCode: data.nationalCode || '', + password: data.password || '', + economicCode: legal.economicCode || '', + registrationName: legal.registrationName || '', + registrationCode: legal.registrationCode || '', + nationalIdentity: legal.nationalIdentity || '', + postalCode: legal.address.postalCode || '', + address: legal.address?.fullAddress || '', + cityId: legal?.address?.city?.id, + profilePic: data.profilePic || '' + }); + + setProvinesId(legal?.address?.city.province?.id); + } + + // eslint-disable-next-line react-hooks/exhaustive-deps + }, [getDetailCustomer.data]) + + + return ( +
+
+
+ {t('customer.add_cutomer')} +
+
+ +
+
+ { + getProvines.isPending ? + + : +
+
+ +
+
+ + + +
+ +
+ formik.setFieldValue('birthDate', value)} + error_text={formik.touched.birthDate && formik.errors.birthDate ? formik.errors.birthDate : ''} + placeholder='' + defaulValue={formik.values.birthDate} + /> + +
+ +
+ + + +
+ +
+ {t('customer.information_legal')} +
+ +
+ + + + + + +
+ +
+ + + + + + +
+ +
+ + + {/* */} +
+ +
+ ({ label: item.name, value: item.id })) : []} + placeholder={t('select')} + {...formik.getFieldProps('cityId')} + error_text={formik.touched.cityId && formik.errors.cityId ? formik.errors.cityId : ''} + /> +
+ +
+