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 ?
+
+ :
+
+
+
+
+
+
+
+
+
+ {/*
+
+
*/}
+
+
+
{t('customer.image_profile')}
+
+ setFile(files[0])}
+ />
+
+
+
+
+ }
+
+ )
+}
+
+export default UpdateCustomer
\ No newline at end of file
diff --git a/src/pages/customer/hooks/useCustomerData.ts b/src/pages/customer/hooks/useCustomerData.ts
index efe2d86..2cdec6e 100644
--- a/src/pages/customer/hooks/useCustomerData.ts
+++ b/src/pages/customer/hooks/useCustomerData.ts
@@ -36,3 +36,24 @@ export const useCreateCustomer = () => {
},
});
};
+
+export const useGetCustomerDetail = (id?: string) => {
+ return useQuery({
+ queryKey: ["customer-detail", id],
+ queryFn: () => api.getDetailCustomer(id ? id : ""),
+ enabled: !!id,
+ });
+};
+
+export const useUpdateCustomer = (id: string) => {
+ const queryClient = useQueryClient();
+ return useMutation({
+ mutationFn: (variables: CreateCustomerType) =>
+ api.updateCustomer(id, variables),
+ onSuccess: () => {
+ queryClient.invalidateQueries({
+ queryKey: ["customers"],
+ });
+ },
+ });
+};
diff --git a/src/pages/customer/service/CustomerService.ts b/src/pages/customer/service/CustomerService.ts
index db15fdd..6b31634 100644
--- a/src/pages/customer/service/CustomerService.ts
+++ b/src/pages/customer/service/CustomerService.ts
@@ -17,6 +17,19 @@ export const getCities = async (id: string) => {
};
export const createCustomer = async (params: CreateCustomerType) => {
- const { data } = await axios.post(`/users/customer`, params);
+ const { data } = await axios.post(`/users/customers`, params);
+ return data;
+};
+
+export const getDetailCustomer = async (id: string) => {
+ const { data } = await axios.get(`/users/customers/${id}`);
+ return data;
+};
+
+export const updateCustomer = async (
+ id: string,
+ params: CreateCustomerType
+) => {
+ const { data } = await axios.patch(`/users/customers/${id}`, params);
return data;
};
diff --git a/src/pages/customer/types/CustomerTypes.ts b/src/pages/customer/types/CustomerTypes.ts
index 85d4542..fddafcf 100644
--- a/src/pages/customer/types/CustomerTypes.ts
+++ b/src/pages/customer/types/CustomerTypes.ts
@@ -26,18 +26,17 @@ export type CreateCustomerType = {
phone: string;
firstName: string;
lastName: string;
- email: string | null;
+ email: string;
birthDate: string;
nationalCode: string;
- password: string;
+ password?: string;
economicCode: string;
- companyRegisteredName: string;
- registrationId: string;
- nationalId: string;
- number: string;
+ registrationName: string;
+ registrationCode: string;
+ nationalIdentity: string;
postalCode: string;
address: string;
- cityId: string;
+ cityId: string | number;
profilePic?: string;
};
diff --git a/src/pages/service/Category.tsx b/src/pages/service/Category.tsx
index fb3b7e7..c287d7f 100644
--- a/src/pages/service/Category.tsx
+++ b/src/pages/service/Category.tsx
@@ -9,6 +9,7 @@ import { ServiceCategoryType } from './types/ServiceTypes'
import { useGetAllCategory } from './hooks/useServiceData'
import StatusCategory from './components/StatusCategory'
import Pagination from '../../components/Pagination'
+import UpdateCategory from './components/UpdateCategory'
const Category: FC = () => {
@@ -87,7 +88,9 @@ const Category: FC = () => {
id={item.id}
/>
- |
+
+ getCategory.refetch()} id={item.id} />
+ |
)
})
diff --git a/src/pages/service/components/UpdateCategory.tsx b/src/pages/service/components/UpdateCategory.tsx
new file mode 100644
index 0000000..61c0a2b
--- /dev/null
+++ b/src/pages/service/components/UpdateCategory.tsx
@@ -0,0 +1,168 @@
+import { Edit, TickCircle } from 'iconsax-react'
+import { FC, useEffect, useState } from 'react'
+import DefaulModal from '../../../components/DefaulModal'
+import { useGetCategoryDetail, useGetCategoryParents, useSingleUpload, useUpdateCategory } from '../hooks/useServiceData'
+import Input from '../../../components/Input'
+import { CreateServiceCategoryType, ServiceCategoryType } from '../types/ServiceTypes'
+import * as Yup from 'yup'
+import { useFormik } from 'formik'
+import { toast } from 'react-toastify'
+import { useTranslation } from 'react-i18next'
+import { ErrorType } from '../../../helpers/types'
+import Select from '../../../components/Select'
+import UploadBox from '../../../components/UploadBox'
+import Button from '../../../components/Button'
+
+type Props = {
+ id: string,
+ refetch: () => void
+}
+
+const UpdateCategory: FC = (props) => {
+
+ const { t } = useTranslation('global')
+ const [showModal, setShowModal] = useState(false)
+ const [file, setFile] = useState()
+ const getCategoryDetail = useGetCategoryDetail(props.id, showModal)
+ const singleUpload = useSingleUpload()
+ const getCategory = useGetCategoryParents()
+ const updateCategory = useUpdateCategory(props.id)
+
+ const formik = useFormik({
+ initialValues: {
+ title: '',
+ isActive: true,
+ parentId: ''
+ },
+ validationSchema: Yup.object({
+ title: Yup.string().required(t('errors.required')),
+ }),
+ onSubmit: async (values) => {
+ if (file) {
+ const formData = new FormData()
+ formData.append('file', file)
+ await singleUpload.mutateAsync(formData, {
+ onSuccess: (data) => {
+ values.icon = data?.data?.url
+ },
+ onError: (error: ErrorType) => {
+ toast.error(error.response?.data?.error?.message[0])
+ }
+ })
+ }
+
+
+
+ const params = {
+ ...values,
+ parentId: values.parentId ? values.parentId : undefined
+ }
+ updateCategory.mutate(params, {
+ onSuccess: () => {
+ formik.resetForm()
+ getCategory.refetch()
+ toast.success(t('success'))
+ setShowModal(false)
+ props.refetch()
+ },
+ onError: (error: ErrorType) => {
+ toast.error(error?.response?.data?.error?.message[0])
+ }
+ })
+ }
+ })
+
+ useEffect(() => {
+
+ if (getCategoryDetail.data) {
+ const data = getCategoryDetail.data?.data?.category
+ formik.setValues({
+ title: data?.title,
+ parentId: data?.parentId,
+ isActive: data?.isActive
+ })
+ }
+
+ // eslint-disable-next-line react-hooks/exhaustive-deps
+ }, [getCategoryDetail.data])
+
+
+ return (
+
+
setShowModal(true)} size={20} color='#888888' />
+
+ setShowModal(false)}
+ isHeader
+ title_header='ویرایش دسته بندی'
+ >
+
+
+
+
+ {
+ getCategory.data &&
+
+
+ }
+
+
+ setFile(file[0])}
+ />
+
+
+
+
+
+
+
+
+
+ )
+}
+
+export default UpdateCategory
\ No newline at end of file
diff --git a/src/pages/service/hooks/useServiceData.ts b/src/pages/service/hooks/useServiceData.ts
index 21b830b..b23d551 100644
--- a/src/pages/service/hooks/useServiceData.ts
+++ b/src/pages/service/hooks/useServiceData.ts
@@ -161,3 +161,18 @@ export const useUpdateService = (id: string) => {
api.updateService(id, variables),
});
};
+
+export const useGetCategoryDetail = (id: string, enabled: boolean) => {
+ return useQuery({
+ queryKey: ["category-detail", id],
+ queryFn: () => api.getCategoryDetail(id),
+ enabled: enabled,
+ });
+};
+
+export const useUpdateCategory = (id: string) => {
+ return useMutation({
+ mutationFn: (variables: CreateServiceCategoryType) =>
+ api.updateCategory(id, variables),
+ });
+};
diff --git a/src/pages/service/service/ServiceService.ts b/src/pages/service/service/ServiceService.ts
index 7c2c57d..5f4fe49 100644
--- a/src/pages/service/service/ServiceService.ts
+++ b/src/pages/service/service/ServiceService.ts
@@ -140,3 +140,19 @@ export const updateService = async (id: string, params: CreateServiceType) => {
const { data } = await axios.patch(`/danak-services/${id}`, params);
return data;
};
+
+export const getCategoryDetail = async (id: string) => {
+ const { data } = await axios.get(`/danak-services/categories/${id}`);
+ return data;
+};
+
+export const updateCategory = async (
+ id: string,
+ params: CreateServiceCategoryType
+) => {
+ const { data } = await axios.patch(
+ `/danak-services/categories/${id}`,
+ params
+ );
+ return data;
+};
diff --git a/src/router/Main.tsx b/src/router/Main.tsx
index 0fb72cb..e239c3a 100644
--- a/src/router/Main.tsx
+++ b/src/router/Main.tsx
@@ -57,6 +57,7 @@ import GroupList from '../pages/users/GroupList'
import Reviews from '../pages/service/Reviews'
import UpdateAds from '../pages/ads/Update'
import UpdateService from '../pages/service/UpdateService'
+import UpdateCustomer from '../pages/customer/Update'
const MainRouter: FC = () => {
@@ -114,6 +115,7 @@ const MainRouter: FC = () => {
} />
} />
} />
+ } />
} />
} />
} />