From 4b22add13e3c96d4bad663a81e40acdf7c51a0f2 Mon Sep 17 00:00:00 2001 From: KarimAldeen Date: Wed, 20 Mar 2024 10:15:54 +0300 Subject: [PATCH] Done --- src/Components/ValidationField/View/Date.tsx | 2 +- .../ValidationField/View/SearchField.tsx | 3 +- .../ValidationField/View/SelectField.tsx | 2 +- src/Layout/Dashboard/ViewPage.tsx | 21 +- .../View/Add/AttributeValueTab/Field/File.tsx | 13 +- .../Add/AttributeValueTab/TabsContainer.tsx | 7 +- .../Categories/View/Add/fn/isvalidation.ts | 2 +- src/Pages/Categories/View/AddPage.tsx | 156 +++++++++++--- .../Edit/AttributeValueTab/TabsContainer.tsx | 2 +- src/Pages/Categories/View/EditPage.tsx | 191 +++++++++++++----- src/Pages/Coupon/View/AddPage.tsx | 27 +-- src/Pages/Coupon/View/EditForm.tsx | 14 +- src/Pages/Coupon/View/EditPage.tsx | 6 +- src/Pages/Coupon/formUtil.ts | 28 +-- src/Pages/Notifcation/View/AddForm.tsx | 63 +++++- src/Pages/Notifcation/View/AddPage.tsx | 40 ++-- src/Pages/Notifcation/View/formUtil.ts | 2 +- src/Pages/Products/ProductsPage.tsx | 5 +- src/Pages/Products/View/AddPage.tsx | 6 +- .../Products/View/Addfn/AddNewVariation.ts | 14 +- src/Pages/Products/View/EditPage.tsx | 147 +++++++++----- .../View/FormikTab/Field/Atteibute.tsx | 6 +- .../Products/View/FormikTab/Field/File.tsx | 15 +- .../View/FormikTab/Field/FileImage.tsx | 5 +- .../Products/View/FormikTab/Field/Object.tsx | 2 +- .../Products/View/FormikTab/TabsContainer.tsx | 123 +++++------ .../Products/View/FormikTab/VariableTabs.tsx | 17 +- src/Pages/Products/formUtil.ts | 23 ++- src/Pages/Slider/View/AddPage.tsx | 4 +- src/Pages/Slider/View/EditPage.tsx | 4 +- .../Users/SendNotifcation/View/AddPage.tsx | 14 +- src/Pages/Users/View/AddPage.tsx | 4 +- src/Pages/order/Edit/EditPage.tsx | 4 +- src/Pages/order/Edit/formUtil.ts | 6 +- src/Pages/order/useTableColumns.tsx | 2 +- src/api/helper/ueGetPagination.tsx | 2 +- src/api/helper/useAddMutation.ts | 2 +- src/api/helper/useAddMutationJson.ts | 35 ++++ src/api/helper/useGetOneQuery.ts | 1 + src/api/product.ts | 4 +- src/utils/Array/filterUndefinedAndEmpty.ts | 2 +- 41 files changed, 682 insertions(+), 344 deletions(-) create mode 100644 src/api/helper/useAddMutationJson.ts diff --git a/src/Components/ValidationField/View/Date.tsx b/src/Components/ValidationField/View/Date.tsx index 8a21508..d913e4e 100644 --- a/src/Components/ValidationField/View/Date.tsx +++ b/src/Components/ValidationField/View/Date.tsx @@ -27,7 +27,7 @@ const Date = ({ name, label,picker="date" ,isDisabled,props,onChange,placeholder placeholder={placeholder} allowClear className={`${className} w-100`} - // defaultValue={formik.values[name]} + defaultValue={formik.values[name]} size="large" onChange={onChange || onCalendarChange} disabled={isDisabled} diff --git a/src/Components/ValidationField/View/SearchField.tsx b/src/Components/ValidationField/View/SearchField.tsx index d8ad1c6..b03d775 100644 --- a/src/Components/ValidationField/View/SearchField.tsx +++ b/src/Components/ValidationField/View/SearchField.tsx @@ -48,7 +48,8 @@ const SearchField = ({ name, label, placeholder, isDisabled, searchBy, option, i options={option} size="large" className={`${className} w-100`} - defaultValue={formik.values[name]} + value={formik.values[name]} + // defaultValue={formik.values[name]} allowClear {...(isMulti && { mode: "multiple" })} onChange={onChange || SelecthandleChange} diff --git a/src/Components/ValidationField/View/SelectField.tsx b/src/Components/ValidationField/View/SelectField.tsx index b208b48..b923d8b 100644 --- a/src/Components/ValidationField/View/SelectField.tsx +++ b/src/Components/ValidationField/View/SelectField.tsx @@ -25,7 +25,7 @@ const SelectField = ({ name, label, placeholder, isDisabled,option,isMulti,onCha options={option} size="large" className={`${className} w-100`} - defaultValue={formik.values[name]} + value={formik.values[name]} allowClear {...(isMulti && { mode: "multiple" })} onChange={onChange || SelecthandleChange} diff --git a/src/Layout/Dashboard/ViewPage.tsx b/src/Layout/Dashboard/ViewPage.tsx index f52b257..50e6e7f 100644 --- a/src/Layout/Dashboard/ViewPage.tsx +++ b/src/Layout/Dashboard/ViewPage.tsx @@ -14,10 +14,10 @@ type TViewPage ={ getDataToSend:any, handleSubmit:any, // BarStatus:any, - showProgressBar?:boolean, + IsloadingButton:boolean } -const ViewPage: React.FC= ({children,getInitialValues, getValidationSchema,handleSubmit,showProgressBar = true})=> { +const ViewPage: React.FC= ({children,getInitialValues, getValidationSchema,handleSubmit,IsloadingButton})=> { const {objectToEdit} = usePageState() const {t} = useTranslation(); @@ -43,23 +43,18 @@ const ViewPage: React.FC= ({children,getInitialValues, getValidation
{/* */} {children} - {showProgressBar && + { <> - {/* */} +
- {/* {t("save")} - */} - + + {/* */}
} diff --git a/src/Pages/Categories/View/Add/AttributeValueTab/Field/File.tsx b/src/Pages/Categories/View/Add/AttributeValueTab/Field/File.tsx index 30daeac..6926f69 100644 --- a/src/Pages/Categories/View/Add/AttributeValueTab/Field/File.tsx +++ b/src/Pages/Categories/View/Add/AttributeValueTab/Field/File.tsx @@ -5,14 +5,19 @@ import { Button, Upload, UploadFile } from 'antd' import { UploadOutlined } from '@ant-design/icons'; import { useTranslation } from 'react-i18next'; import { useFormikContext } from 'formik'; +import { ImageBaseURL } from '../../../../../../api/config'; -const File = ({ parentKey,tabKey}:any) => { +const FileAttributeaValue = ({ parentKey,tabKey}:any) => { const { t } = useTranslation(); const formik = useFormikContext(); const name = `Attribute.[${parentKey}].AttributeValue[${tabKey}].${"image"}`; - const imageUrl = formik?.values?.Attribute?.[parentKey]?.AttributeValue?.[tabKey]?.["image"] ? URL.createObjectURL(formik?.values?.Attribute?.[parentKey]?.AttributeValue?.[tabKey]?.["image"]) : "" ; - + const fileObject = formik?.values?.Attribute?.[parentKey]?.AttributeValue?.[tabKey]?.["image"]; + + const FormikimageUrl = fileObject ? ImageBaseURL + fileObject : ''; + + const imageUrl = typeof fileObject === "string" ? (FormikimageUrl)?.replace("public", "/storage") : (fileObject instanceof File) ? URL.createObjectURL(fileObject) : ""; + const fileList: UploadFile[] = [ { @@ -59,4 +64,4 @@ const File = ({ parentKey,tabKey}:any) => { ) } -export default File \ No newline at end of file +export default FileAttributeaValue \ No newline at end of file diff --git a/src/Pages/Categories/View/Add/AttributeValueTab/TabsContainer.tsx b/src/Pages/Categories/View/Add/AttributeValueTab/TabsContainer.tsx index dc1fd7d..e59d5b5 100644 --- a/src/Pages/Categories/View/Add/AttributeValueTab/TabsContainer.tsx +++ b/src/Pages/Categories/View/Add/AttributeValueTab/TabsContainer.tsx @@ -1,5 +1,5 @@ // TabsContainer.tsx -import React, { useEffect, useState } from 'react'; +import React, { useEffect, useRef, useState } from 'react'; import { Tabs, Space } from 'antd'; import { CopyOutlined } from '@ant-design/icons'; import { toast } from 'react-toastify'; @@ -74,9 +74,10 @@ export const TabsContainer= ({parentKey}:any) => { }; const [removedAttributeValue, setremovedAttributeValue] = useState([]); - useEffect(() => { - setFieldValue(`removedAttributeValue`, removedAttributeValue); + useEffect(() => { + setFieldValue(`removedAttributeValue[${parentKey}]`, removedAttributeValue); + }, [removedAttributeValue]); const handleRemove = (targetKey: string) => { diff --git a/src/Pages/Categories/View/Add/fn/isvalidation.ts b/src/Pages/Categories/View/Add/fn/isvalidation.ts index c6e3e4c..9011a3e 100644 --- a/src/Pages/Categories/View/Add/fn/isvalidation.ts +++ b/src/Pages/Categories/View/Add/fn/isvalidation.ts @@ -1,7 +1,7 @@ import { toast } from 'react-toastify'; -export const isvalidation = (attributes: any[] | undefined, t: any) => { +export const isvalidation = (attributes: any[] , t: any) => { const validationResults: boolean[] = []; let previousNames: { [key: string]: string } = {}; diff --git a/src/Pages/Categories/View/AddPage.tsx b/src/Pages/Categories/View/AddPage.tsx index 5dadea0..83a8183 100644 --- a/src/Pages/Categories/View/AddPage.tsx +++ b/src/Pages/Categories/View/AddPage.tsx @@ -14,12 +14,13 @@ import { useAddAttributeValue } from '../../../api/attributeValue'; import useNavigateOnSuccess from '../../../Hooks/useNavigateOnSuccess'; import { isvalidation } from './Add/fn/isvalidation'; +import { toast } from 'react-toastify'; const AddcategoriesPage = () => { const { setObjectToEdit, objectToEdit } = usePageState() - const {mutate ,isSuccess,data } = useAddCategories() + const {mutate,isLoading:IsloadingButton ,isSuccess,data } = useAddCategories() const {mutateAsync} = useAddAttribute() const {mutate:AddAttributeValue } = useAddAttributeValue() @@ -27,41 +28,122 @@ const AddcategoriesPage = () => { const [AttributeValues , setAttributeValues] = useState([]) - const handleSubmit = (values:any)=>{ - console.log(values,"values"); - function isValid(){ - values?.Attribute?.slice(1)?.forEach((item:any) => { - if (item && Object.keys(item).length > 0){ - setAttribute((prevAddAttributeValue) => [...prevAddAttributeValue, item]); - } - - }); - - setAttributeValues(values?.Attribute?.slice(1)?.map((item:any)=>{ - if (item && Object.keys(item).length > 0){ - return item?.AttributeValue - } - })) - const CategoriesValues = { - name: { - en:values?.name_en, - ar:values?.name_ar, - de:values?.name_de - }, - parent_id:values?.parent_id, - photo:values?.photo, - } - mutate(CategoriesValues) + const handleSubmit = (values:any)=>{ + console.log(values,"values"); + function isValid(){ + values?.Attribute?.slice(1)?.forEach((item:any) => { + if (item && Object.keys(item).length > 0){ + setAttribute((prevAddAttributeValue) => [...prevAddAttributeValue, item]); } - const validationResults = isvalidation(values?.Attribute, t); + + }); + + + setAttributeValues(values?.Attribute?.slice(1)?.map((item:any)=>{ + if (item && Object.keys(item).length > 0){ + return item?.AttributeValue + } + })) + const CategoriesValues = { + name: { + en:values?.name_en, + ar:values?.name_ar, + de:values?.name_de + }, + parent_id:values?.parent_id, + photo:values?.photo, + } + mutate(CategoriesValues) + } + const validationResults: boolean[] = []; + let previousNames: any = {}; + + values?.Attribute?.slice(1)?.forEach((item: any, index: any) => { + if (item && Object.keys(item).length > 0) { + const itemName = t('name'); + const itemNumber = index + 1; + + // Check if the names are unique across items + const currentItemNames = { + name_ar: item?.name_ar, + name_en: item?.name_en, + name_de: item?.name_de, + }; + + if ( + previousNames.name_ar === currentItemNames.name_ar || + previousNames.name_en === currentItemNames.name_en || + previousNames.name_de === currentItemNames.name_de + ) { + toast.error(`${itemName} ${t('unique_error_names')}`); + validationResults.push(false); + } + + previousNames = currentItemNames; + + // Check for other validation rules + if (!item?.name_ar || !item?.name_en || !item?.name_de) { + toast.error(`${t('required_name')} ${itemNumber}`); + validationResults.push(false); + } else if (!item?.type) { + toast.error(`${t('required_type')} ${itemNumber}`); + validationResults.push(false); + } else if (item?.type === "image") { + if (Array.isArray(item.AttributeValue)) { + item?.AttributeValue.slice(1)?.forEach((attrItem: any, index: number) => { + if (attrItem && Object.keys(attrItem).length > 0) { + if (attrItem.image === null) { + toast.error(`${t('required_image')} ${index + 1}`); + validationResults.push(false); + } else if (!attrItem?.value_ar || !attrItem?.value_en || !attrItem?.value_de) { + toast.error(`${t('required_text')} ${index + 1}`); + validationResults.push(false); + } else { + validationResults.push(true); + } + } + }); + } + } else if (item?.type === "color") { + if (Array.isArray(item.AttributeValue)) { + item?.AttributeValue.slice(1)?.forEach((attrItem: any, index: number) => { + if (attrItem && Object.keys(attrItem).length > 0) { + const hexColorRegex = /^#?([0-9a-fA-F]{3}|[0-9a-fA-F]{6})$/; + if (attrItem && !hexColorRegex.test(attrItem?.value_en)) { + toast.error(`${t('required_color')} ${index + 1}`); + validationResults.push(false); + } else { + validationResults.push(true); + } + } + }); + } + } else if (item?.type === "text") { + if (Array.isArray(item.AttributeValue)) { + item?.AttributeValue.slice(1)?.forEach((attrItem: any, index: number) => { + if (attrItem && Object.keys(attrItem).length > 0) { + if (attrItem && (!attrItem?.value_ar || !attrItem?.value_en || !attrItem?.value_de)) { + toast.error(` ${t('required_text')} ${index + 1}`); + validationResults.push(false); + } else { + validationResults.push(true); + } + } + }); + } + } else { + validationResults.push(true); + } + } + }); if (validationResults.every((result) => result)) { - isValid(); + isValid(); } - - - } + + + } useEffect(()=>{ if(isSuccess){ @@ -87,13 +169,21 @@ const AddcategoriesPage = () => { AttributeValues[index]?.slice(1)?.map((dataToSend:any , index:number)=>{ const AttributeValue = dataToSend + const IMage = + (typeof AttributeValue?.image === 'string') ? + { + copied_assets: { image: AttributeValue?.image } + } : + { + image: AttributeValue?.image + }; const NewAttributeValues = { value:{ en:AttributeValue?.value_en, ar:AttributeValue?.value_ar, de:AttributeValue?.value_de }, - image:AttributeValue?.main_photo, + ...IMage, attribute_id:AttributeId, } if (NewAttribute.type === "color") { @@ -125,7 +215,7 @@ const AddcategoriesPage = () => { }, []); - const ViewProps = { getInitialValues, getValidationSchema, getDataToSend, handleSubmit }; + const ViewProps = { getInitialValues, getValidationSchema, getDataToSend, handleSubmit,IsloadingButton }; return ( diff --git a/src/Pages/Categories/View/Edit/AttributeValueTab/TabsContainer.tsx b/src/Pages/Categories/View/Edit/AttributeValueTab/TabsContainer.tsx index bb93a98..b8cfe53 100644 --- a/src/Pages/Categories/View/Edit/AttributeValueTab/TabsContainer.tsx +++ b/src/Pages/Categories/View/Edit/AttributeValueTab/TabsContainer.tsx @@ -81,7 +81,7 @@ const initialItemShape: any = { const [removedAttributeValues, setRemovedAttributeValues] = useState([]); useEffect(() => { - setFieldValue(`removedAttributeValues`, removedAttributeValues); + setFieldValue(`removedAttributeValue[${parentKey}]`, removedAttributeValues); }, [removedAttributeValues]); diff --git a/src/Pages/Categories/View/EditPage.tsx b/src/Pages/Categories/View/EditPage.tsx index 1621050..7c3e713 100644 --- a/src/Pages/Categories/View/EditPage.tsx +++ b/src/Pages/Categories/View/EditPage.tsx @@ -4,7 +4,7 @@ import { Tab, TabList, TabPanel as TabBody, Tabs } from 'react-tabs' import 'react-tabs/style/react-tabs.css'; import { MdLanguage } from 'react-icons/md' import ViewPage from '../../../Layout/Dashboard/ViewPage'; -import { Rate, Spin } from 'antd'; +import { Spin } from 'antd'; import { usePageState } from '../../../lib/state mangment/LayoutPagestate'; import { useParams } from 'react-router-dom'; import LoadingPage from '../../../Layout/app/LoadingPage'; @@ -15,9 +15,9 @@ import { TabsContainer } from './Edit/AttributeTab/TabsContainer'; import { useAddAttribute, useGetSingleAttribute } from '../../../api/attribute'; import { useDeleteAttribute, useUpdateAttribute } from '../../../api/attribute'; import { useAddAttributeValue, useDeleteAttributeValue, useUpdateAttributeValue } from '../../../api/attributeValue'; +import { toast } from 'react-toastify'; import Form from './Add/AddForm'; import filterUndefinedAndEmpty from '../../../utils/Array/filterUndefinedAndEmpty'; -import { isvalidation } from './Add/fn/isvalidation'; const EditPage = () => { const { setObjectToEdit, objectToEdit } = usePageState() @@ -26,13 +26,13 @@ const EditPage = () => { const { id } = useParams() const { data: Atrribute, isLoading: isLoadingAtrribute, isRefetching: AttributeisRefetching } = useGetSingleAttribute({ name: "category_id", id: id }, {}) - const { mutate, isError, isSuccess } = useUpdateCategories() - const { mutateAsync, isSuccess: isSuccessAddAttribute, data: AttributeData, isError: isErrorAddAttribute } = useAddAttribute() - const { mutate: mutateAttributeValue, isSuccess: isSuccessAddAttributeValue, data: AttributeValueData, isError: isErrorAddAttributeValue } = useAddAttributeValue() - const { mutate: UpdateAttribute, isSuccess: isSuccessAttribute, isError: isErrorUpdateAttribute } = useUpdateAttribute("put") - const { mutate: UpdateAttributeValue, isSuccess: isSuccessAttributeValue, isError: isErrorUpdateAttributeValue } = useUpdateAttributeValue() - const { mutate: DeleteAttributeValue, isError: isErrorDeleteAttributeValue } = useDeleteAttributeValue() - const { mutate: DeleteAttribute, isError: isErrorDeleteAttribute } = useDeleteAttribute() + const { mutate, isSuccess,isLoading:IsloadingButton } = useUpdateCategories() + const { mutateAsync } = useAddAttribute() + const { mutate: mutateAttributeValue } = useAddAttributeValue() + const { mutate: UpdateAttribute } = useUpdateAttribute("put") + const { mutate: UpdateAttributeValue } = useUpdateAttributeValue() + const { mutate: DeleteAttributeValue } = useDeleteAttributeValue() + const { mutate: DeleteAttribute } = useDeleteAttribute() const [removedAttribute, setremovedAttribute] = useState([]) @@ -49,35 +49,41 @@ const EditPage = () => { const [OldDataValues, setOldDataValues] = useState([]) - const handleSubmit = (values: any - ) => { + const handleSubmit = (values: any) => { function isValid() { const attributes = values?.Attribute?.slice(1); + const flattenedAndFiltered = values?.removedAttributeValue?.flat().filter((value:any) => value !== undefined); + + console.log(flattenedAndFiltered,"flattenedAndFiltered"); setremovedAttribute(values?.removedAttribute) - setremovedAttributeValue(values?.removedAttributeValue) - console.log(attributes, "attributes"); - + setremovedAttributeValue(flattenedAndFiltered) + if (attributes) { attributes.forEach((item: any, index: number) => { if (item?.id && item?.id !== null) { + console.log(item,"setEditAttribute"); + setEditAttribute((prevEditAttribute) => [...prevEditAttribute, item]); - console.log(item, "item"); if (item?.AttributeValue) { item.AttributeValue.slice(1).forEach((attrValueItem: any) => { if (attrValueItem && Object.keys(attrValueItem).length > 0) { // Check if attrValueItem is defined and not empty setEditAttributeValue((prevEditAttributeValue) => [...prevEditAttributeValue, [index, attrValueItem]]); + console.log(attrValueItem,"setEditAttributeValue"); + } }); } } else { setAddAttribute((prevAddAttribute) => [...prevAddAttribute, item]); - if (item?.AttributeValue) { - item?.AttributeValue?.slice(1)?.forEach((attrValueItem: any) => { - console.log(attrValueItem, "attrValueItemadd"); + console.log(item,"setAddAttribute"); + if (item?.AttributeValue) { + item?.AttributeValue?.slice(1)?.forEach((attrValueItem: any) => { if (attrValueItem && Object.keys(attrValueItem)?.length > 0) { // Check if attrValueItem is defined and not empty + console.log(attrValueItem,"setAddAttributeValue"); + setAddAttributeValue((prevEditAttributeValue) => [...prevEditAttributeValue, [index, attrValueItem]]); } }); @@ -102,15 +108,94 @@ const EditPage = () => { delete EditedCategory['photo'] } - console.log(EditedCategory, "EditedCategory"); - + mutate(EditedCategory) } - const validationResults = isvalidation(values?.Attribute, t); - - if (validationResults.every((result) => result)) { + const validationResults: boolean[] = []; + let previousNames: any = {}; + + values?.Attribute?.slice(1)?.forEach((item: any, index: any) => { + if (item && Object.keys(item).length > 0) { + const itemName = t('name'); + const itemNumber = index + 1; + + // Check if the names are unique across items + const currentItemNames = { + name_ar: item?.name_ar, + name_en: item?.name_en, + name_de: item?.name_de, + }; + + if ( + previousNames.name_ar === currentItemNames.name_ar || + previousNames.name_en === currentItemNames.name_en || + previousNames.name_de === currentItemNames.name_de + ) { + toast.error(`${itemName} ${t('unique_error_names')}`); + validationResults.push(false); + } + + previousNames = currentItemNames; + + // Check for other validation rules + if (!item?.name_ar || !item?.name_en || !item?.name_de) { + toast.error(`${t('required_name')} ${itemNumber}`); + validationResults.push(false); + } else if (!item?.type) { + toast.error(`${t('required_type')} ${itemNumber}`); + validationResults.push(false); + } else if (item?.type === "image") { + if (Array.isArray(item.AttributeValue)) { + item?.AttributeValue.slice(1)?.forEach((attrItem: any, index: number) => { + if (attrItem && Object.keys(attrItem).length > 0) { + if (attrItem.image === null) { + toast.error(`${t('required_image')} ${index + 1}`); + validationResults.push(false); + } else if (!attrItem?.value_ar || !attrItem?.value_en || !attrItem?.value_de) { + toast.error(`${t('required_text')} ${index + 1}`); + validationResults.push(false); + } else { + validationResults.push(true); + } + } + }); + } + } else if (item?.type === "color") { + if (Array.isArray(item.AttributeValue)) { + item?.AttributeValue.slice(1)?.forEach((attrItem: any, index: number) => { + if (attrItem && Object.keys(attrItem).length > 0) { + const hexColorRegex = /^#?([0-9a-fA-F]{3}|[0-9a-fA-F]{6})$/; + if (attrItem && !hexColorRegex.test(attrItem?.value_en)) { + toast.error(`${t('required_color')} ${index + 1}`); + validationResults.push(false); + } else { + validationResults.push(true); + } + } + }); + } + } else if (item?.type === "text") { + if (Array.isArray(item.AttributeValue)) { + item?.AttributeValue.slice(1)?.forEach((attrItem: any, index: number) => { + if (attrItem && Object.keys(attrItem).length > 0) { + if (attrItem && (!attrItem?.value_ar || !attrItem?.value_en || !attrItem?.value_de)) { + toast.error(` ${t('required_text')} ${index + 1}`); + validationResults.push(false); + } else { + validationResults.push(true); + } + } + }); + } + } else { + validationResults.push(true); + } + } + }); + + if (validationResults.every((result) => result)) { isValid(); - } + } } @@ -125,7 +210,6 @@ const EditPage = () => { useEffect(() => { if (isSuccess) { - console.log(isSuccess, "isSuccess"); const categoryId = id; @@ -134,7 +218,6 @@ const EditPage = () => { filteredEditAttribute?.map((dataToSend: any, index: number) => { - console.log(index, "index"); const EditAttribute = dataToSend const foundObject = OldData.find((item: any) => item.id === EditAttribute?.id) as any; @@ -188,20 +271,19 @@ const EditPage = () => { } const result: [number, any][] = filterByIndex(index, EditAttributeValue); - console.log(result, "result"); const filteredresult = filterUndefinedAndEmpty(result); + console.log(filteredresult, "EditAttributeValue"); filteredresult?.map((dataToSend: any) => { if (dataToSend?.id && dataToSend.id !== null) { - console.log(OldDataValues, "OldDataValues"); const foundObjectValue = (OldDataValues[index] as any).find((item: any) => item.id === dataToSend?.id) as any; - console.log(foundObjectValue, "foundObjectValue"); - console.log(OldDataValues[index], "OldDataValues[index]"); const EditAttributeValue = dataToSend console.log(EditAttributeValue); + + const NewEditAttributeValue = { id: EditAttributeValue?.id, value: { @@ -209,7 +291,7 @@ const EditPage = () => { ar: EditAttributeValue?.value_ar, de: EditAttributeValue?.value_de }, - image: EditAttributeValue?.main_photo, + image: EditAttributeValue?.image, // attribute_id:EditAttribute?.id, // id: EditAttributeValue?.id, } @@ -225,8 +307,8 @@ const EditPage = () => { delete NewEditAttributeValue['image'] } + if (foundObjectValue) { - console.log(foundObjectValue, "foundObjectValue"); Object.keys(NewEditAttributeValue).forEach((propName: any) => { if (foundObjectValue.hasOwnProperty(propName)) { @@ -253,9 +335,6 @@ const EditPage = () => { //@ts-ignore delete NewEditAttributeValue.value; } - console.log(foundObjectValue.value, "foundObjectValue.value"); - console.log(NewEditAttributeValue.value, "NewEditAttributeValue.value"); - if (Object.keys(NewEditAttributeValue).length > 0) { //@ts-ignore @@ -264,7 +343,6 @@ const EditPage = () => { NewEditAttributeValue.id = foundObjectValue?.id; - console.log(NewEditAttributeValue, "EditAttribute"); UpdateAttributeValue(NewEditAttributeValue) } @@ -274,15 +352,16 @@ const EditPage = () => { } else { - console.log("mutateAttributeValue"); const EditAttributeValue = dataToSend - const IMages = EditAttributeValue?.id !== null ? { - main_photo: EditAttributeValue?.main_photo, - image: EditAttributeValue?.image, - } : { - copied_assets: { image: EditAttributeValue?.image }, - } + const IMage = + (typeof EditAttributeValue?.image === 'string') ? + { + copied_assets: { image: EditAttributeValue?.image } + } : + { + image: EditAttributeValue?.image + }; const NewEditAttributeValue = { value: { @@ -290,9 +369,7 @@ const EditPage = () => { ar: EditAttributeValue?.value_ar, de: EditAttributeValue?.value_de }, - // image: EditAttributeValue?.main_photo, - ...IMages, - // attribute_id:EditAttribute?.id, + ...IMage, attribute_id: EditAttribute?.id, } if (EditAttribute.type === "color") { @@ -317,8 +394,8 @@ const EditPage = () => { DeleteAttribute({ id: item }) }) - console.log(AddAttribute, "AddAttribute"); const filteredAddAttribute = filterUndefinedAndEmpty(AddAttribute); + console.log(filteredAddAttribute,"AddAttribute"); filteredAddAttribute?.map((dataToSend: any, index: number) => { @@ -337,18 +414,27 @@ const EditPage = () => { mutateAsync(NewAddAttribute).then((data: any) => { const AttributeId = (data as any)?.id; // console.log(AttributeValues[0]?.slice(1),"AttributeValues"); - const result: [number, any][] = filterByIndex(0, AddAttributeValue); + const result: [number, any][] = filterByIndex(index, AddAttributeValue); + console.log(AddAttribute?.AttributeValue,"AddAttribute?.AttributeValue"); - result?.map((dataToSend: any, index: number) => { + AddAttribute?.AttributeValue?.slice(1)?.map((dataToSend: any, index: number) => { const AddAttributeValue = dataToSend + const IMage = + (typeof AddAttributeValue?.image === 'string') ? + { + copied_assets: { image: AddAttributeValue?.image } + } : + { + image: AddAttributeValue?.image + }; const NewAddAttributeValue = { value: { en: AddAttributeValue?.value_en, ar: AddAttributeValue?.value_ar, de: AddAttributeValue?.value_de }, - image: AddAttributeValue?.main_photo, + ...IMage, attribute_id: AttributeId, } mutateAttributeValue(NewAddAttributeValue) @@ -396,9 +482,8 @@ const EditPage = () => { setOldDataValues(Atrribute?.data?.map((item: any) => { return item?.attribute_value })) - console.log(OldDataValues, "OldDataValues"); - }, [data?.category, Atrribute?.data, isRefetching, AttributeisRefetching]); + }, [data?.category, Atrribute?.data,isRefetching,AttributeisRefetching]); const getValidationSchema = () => { @@ -406,7 +491,7 @@ const EditPage = () => { }; - const ViewProps = { getInitialValues, getValidationSchema, getDataToSend, handleSubmit }; + const ViewProps = { getInitialValues, getValidationSchema, getDataToSend, handleSubmit,IsloadingButton }; if (AttributeisRefetching || isRefetching || isLoadingAtrribute || isLoading || !objectToEdit || (Array.isArray(objectToEdit) && objectToEdit.some(item => item === undefined))) { return diff --git a/src/Pages/Coupon/View/AddPage.tsx b/src/Pages/Coupon/View/AddPage.tsx index 20ea4f7..eba0c19 100644 --- a/src/Pages/Coupon/View/AddPage.tsx +++ b/src/Pages/Coupon/View/AddPage.tsx @@ -12,26 +12,29 @@ import Form from './AddForm'; const AddCouponPage = () => { - const { mutate, isLoading, isSuccess } = useAddCoupon() + const { mutate, isLoading:IsloadingButton, isSuccess } = useAddCoupon() const handleSubmit = (values: any) => { values.active_at = values.active[0].format('YYYY-MM-DD HH:mm:ss.SSS') values.active_to = values.active[1].format('YYYY-MM-DD HH:mm:ss.SSS') values.status = values.active ? "active" : "inactive" + const products = Array.isArray(values?.product_attr) ? + values?.product_attr.map((item: any) => { + return { "itemable_type": "product", "itemable_id": item }; + })?.filter((item: any) => item.itemable_id !== "") || [] : []; - + // Check if category_attr is an array before mapping over it + const category = Array.isArray(values?.category_attr) ? + values?.category_attr.map((item: any) => { + return { "itemable_type": "category", "itemable_id": item }; + })?.filter((item: any) => item.itemable_id !== "") || [] : []; -const products = values?.product_attr?.map((item: any) => { - return { "itemable_type": "product", "itemable_id": item }; -})?.filter((item: any) => item.itemable_id !== "")|| []; - -const category = values?.category_attr?.map((item: any) => { - return { "itemable_type": "category", "itemable_id": item }; -})?.filter((item: any) => item.itemable_id !== "") || []; - -values['items'] = [...products, ...category]; + if (products.length > 0 || category.length > 0 ) { + values['items'] = [...products, ...category]; + } + console.log(values, "values"); @@ -45,7 +48,7 @@ mutate(values) - const ViewProps = { getInitialValues, getValidationSchema, getDataToSend, handleSubmit }; + const ViewProps = { getInitialValues, getValidationSchema, getDataToSend, handleSubmit,IsloadingButton }; return ( diff --git a/src/Pages/Coupon/View/EditForm.tsx b/src/Pages/Coupon/View/EditForm.tsx index f49bca1..d9e826c 100644 --- a/src/Pages/Coupon/View/EditForm.tsx +++ b/src/Pages/Coupon/View/EditForm.tsx @@ -1,5 +1,5 @@ -import React from 'react' +import React, { useEffect } from 'react' import { Col, Row } from 'reactstrap'; import ValidationField from '../../../Components/ValidationField/ValidationField'; import { useFormikContext } from 'formik'; @@ -12,7 +12,7 @@ import useFormatToSelect from '../../../Hooks/useFormatToSelect'; import { useGetProduct } from '../../../api/product'; function Form() { - const { values } = useFormikContext(); + const { values,setFieldValue } = useFormikContext(); const [t] = useTranslation(); // FLAT coupn not be spacified && flate const coupon_type = [{ lable: "general", value: "general" },{ lable: "specified", value: "specified" }] const coupon_type_discount_flat = [{ lable: "general", value: "general" }] @@ -23,6 +23,16 @@ function Form() { const SelectCategoriesData = useFormatToSelect(CategoriesData?.categories) const SelectProductData = useFormatToSelect(ProductData?.BaseProducts) + useEffect(() => { + + if (values?.discount_type === 'flat') { + console.log(values?.coupon_type,"values?.coupon_type"); + + setFieldValue("coupon_type","general") + + } + }, [values?.discount_type]) + return ( diff --git a/src/Pages/Coupon/View/EditPage.tsx b/src/Pages/Coupon/View/EditPage.tsx index b145186..d21bd71 100644 --- a/src/Pages/Coupon/View/EditPage.tsx +++ b/src/Pages/Coupon/View/EditPage.tsx @@ -18,7 +18,7 @@ import Form from './EditForm'; const EditPage = () => { const { setObjectToEdit, objectToEdit } = usePageState() const { t } = useTranslation(); - const { data,isLoading,isRefetching } = useGetOneCoupon() + const { data,isLoading:IsloadingButton,isRefetching } = useGetOneCoupon() const { mutate, isSuccess } = useUpdateCoupon("put") const handleSubmit = (values: any) => { const products = values?.product_attr?.map((item: any) => { @@ -66,13 +66,13 @@ const EditPage = () => { const getValidationSchema = () => { return null }; - if ( isLoading || !objectToEdit || isRefetching) { + if ( IsloadingButton || !objectToEdit || isRefetching) { return } - const ViewProps = { getInitialValues, getValidationSchema, getDataToSend, handleSubmit }; + const ViewProps = { getInitialValues, getValidationSchema, getDataToSend, handleSubmit,IsloadingButton }; return ( diff --git a/src/Pages/Coupon/formUtil.ts b/src/Pages/Coupon/formUtil.ts index 796f6b6..b6d9c01 100644 --- a/src/Pages/Coupon/formUtil.ts +++ b/src/Pages/Coupon/formUtil.ts @@ -38,7 +38,7 @@ export const getInitialValues = (objectToEdit: any | null = null): any => { } }); return { - id: objectToEdit?.id ?? 0, + id: objectToEdit?.id ?? null, name: objectToEdit?.name , code: objectToEdit?.code , //@ts-ignore @@ -60,19 +60,19 @@ export const getInitialValues = (objectToEdit: any | null = null): any => { export const getInitialValuesForAdd = (objectToEdit: any | null = null): any => { return { - id: '', - name: '', - code: '', - active: '', - minimum_total_to_order: '', - maximum_number_of_uses_per_user: '', - maximum_number_of_uses: '', - coupon_value: '', - coupon_type: 'general', - discount_type: '', - product_attr: '', - category_attr: '', - status: '', + // id: '', + name: null, + code: null, + active: null, + minimum_total_to_order: null, + maximum_number_of_uses_per_user: null, + maximum_number_of_uses: null, + coupon_value: null, + coupon_type: null, + discount_type: null, + product_attr: null, + category_attr: null, + status: 0, diff --git a/src/Pages/Notifcation/View/AddForm.tsx b/src/Pages/Notifcation/View/AddForm.tsx index 8532a8b..9037571 100644 --- a/src/Pages/Notifcation/View/AddForm.tsx +++ b/src/Pages/Notifcation/View/AddForm.tsx @@ -1,31 +1,72 @@ import { Col, Row } from 'reactstrap'; import ValidationField from '../../../Components/ValidationField/ValidationField'; +import { useGetUsers } from '../../../api/users'; +import { useTranslation } from 'react-i18next'; +import { useFormikContext } from 'formik'; +import { useEffect } from 'react'; function Form() { - const type = [{ lable: "other", value: "other" },{ lable: "product", value: "product"},{ lable: "order", value: "order" }] + const type = [{ lable: "other", value: "other" }, { lable: "product", value: "product" }, { lable: "order", value: "order" }] + const { data: user } = useGetUsers() + const [t]=useTranslation() + const useFormatToSelect = (Data : any) => { + const format = (data :any) => { + if (!data) return []; + return data.map((item :any) => ({ + value: item?.id, + label: item?.name, + })); + }; + + return format(Data); + }; + const SelectData = useFormatToSelect(user?.data) + // const selectAllOption = [{ label: t("Select All"), value: "*" }]; + const selectAllOption = { label: "Select All", value: "*" }; + + const optionsWithSelectAll = [selectAllOption, ...SelectData]; + const { values,setFieldValue} = useFormikContext(); + + const hasAsterisk = values?.user_ids.some((item:any) => typeof item === 'string' && item.includes('*')); + const option = hasAsterisk ? [selectAllOption] : optionsWithSelectAll; + + useEffect(() => { + if(hasAsterisk){ + setFieldValue("user_ids",["*"]) + + } + }, [hasAsterisk]) + + + useEffect(() => { + console.log(values?.user_ids,"user_ids"); + + }, [values.user_ids]) + return ( - - - - - {/* */} + + + + + {/* */} + - - - + + + + + {/* */} - {/* */} - diff --git a/src/Pages/Notifcation/View/AddPage.tsx b/src/Pages/Notifcation/View/AddPage.tsx index 1a930d3..21ce48a 100644 --- a/src/Pages/Notifcation/View/AddPage.tsx +++ b/src/Pages/Notifcation/View/AddPage.tsx @@ -14,42 +14,48 @@ import { useAddNotification } from '../../../api/notification'; const AddPage = () => { - const { mutate, isLoading, isSuccess } = useAddNotification() + const { mutate, isLoading:IsloadingButton, isSuccess } = useAddNotification() const {id} = useParams() const handleSubmit = (values: any) => { - + const hasAsterisk = values?.user_ids.some((item:any) => typeof item === 'string' && item.includes('*')); + + const userIds = hasAsterisk ? { notifyAll: 1 } : { user_ids: values?.user_ids }; + const body = { en: values.body_en, ar: values.body_ar, - du: values.body_de - } - const meta = {} + de: values.body_de + }; + + const meta = {}; + const title = { en: values.title_en, ar: values.title_ar, - du: values.title_de - } - const dataToSend = { - body: JSON.stringify(body), - meta: JSON.stringify(meta), - title:JSON.stringify(title), - user_ids: [id], - type: "other", - + de: values.title_de }; - + const dataToSend = { + body: body, + meta: meta, + title: title, + type: "other", + ...userIds + }; + + console.log(dataToSend?.notifyAll); + mutate(dataToSend); }; const { t } = useTranslation(); - useNavigateOnSuccess(isSuccess, '/users') + useNavigateOnSuccess(isSuccess, '/notification') - const ViewProps = { getInitialValues, getValidationSchema, getDataToSend, handleSubmit }; + const ViewProps = { getInitialValues, getValidationSchema, getDataToSend, handleSubmit,IsloadingButton }; return ( diff --git a/src/Pages/Notifcation/View/formUtil.ts b/src/Pages/Notifcation/View/formUtil.ts index 0a2de17..199cf67 100644 --- a/src/Pages/Notifcation/View/formUtil.ts +++ b/src/Pages/Notifcation/View/formUtil.ts @@ -37,7 +37,7 @@ export const getValidationSchema = (editMode: boolean = false): Yup.Schema body_en: Yup.string().required('Required'), body_ar: Yup.string().required('Required'), body_de: Yup.string().required('Required'), - // meta: Yup.string().required('Required'), + user_ids: Yup.array().min(1, 'At least one user must be selected').required('Required'), title_en: Yup.string().required('Required'), title_ar: Yup.string().required('Required'), diff --git a/src/Pages/Products/ProductsPage.tsx b/src/Pages/Products/ProductsPage.tsx index ce717b1..52f880a 100644 --- a/src/Pages/Products/ProductsPage.tsx +++ b/src/Pages/Products/ProductsPage.tsx @@ -1,5 +1,5 @@ -import React from 'react' +import React, { useEffect } from 'react' import DashBody from '../../Layout/Dashboard/DashBody' import DashHeader from '../../Layout/Dashboard/DashHeader' import LyTable from '../../Layout/Dashboard/LyTable' @@ -10,6 +10,7 @@ import { useTranslation } from 'react-i18next' import { useNavigate } from 'react-router-dom' import AddButton from '../../Layout/Dashboard/AddButton/AddButton' import SearchField from '../../Layout/Dashboard/SearchField' +import { usePageState } from '../../lib/state mangment/LayoutPagestate' function ProductsPage() { @@ -18,6 +19,8 @@ function ProductsPage() { const [t] = useTranslation() const navigate = useNavigate() const totalRows = data?.meta?.total; + + return ( diff --git a/src/Pages/Products/View/AddPage.tsx b/src/Pages/Products/View/AddPage.tsx index a0a426a..fd8decc 100644 --- a/src/Pages/Products/View/AddPage.tsx +++ b/src/Pages/Products/View/AddPage.tsx @@ -18,7 +18,7 @@ import { AddNewVariation } from './Addfn/AddNewVariation'; const AddProductPage = () => { - const { mutate, isLoading, data, isSuccess } = useAddProduct() + const { mutate, isLoading:IsloadingButton, data, isSuccess } = useAddProduct() const { mutate: AddVariation, isSuccess: SuccessVariation } = useAddProductVariation() const [IsValed, setIsValed] = useState(false) @@ -65,11 +65,11 @@ const AddProductPage = () => { const { t } = useTranslation(); - useNavigateOnSuccess(SuccessVariation, '/products') + useNavigateOnSuccess(isSuccess, '/products') - const ViewProps = { getInitialValues, getValidationSchema, getDataToSend, handleSubmit }; + const ViewProps = { getInitialValues, getValidationSchema, getDataToSend, handleSubmit,IsloadingButton }; return ( diff --git a/src/Pages/Products/View/Addfn/AddNewVariation.ts b/src/Pages/Products/View/Addfn/AddNewVariation.ts index eb87da3..28b1bc1 100644 --- a/src/Pages/Products/View/Addfn/AddNewVariation.ts +++ b/src/Pages/Products/View/Addfn/AddNewVariation.ts @@ -3,19 +3,21 @@ export function AddNewVariation(Varibletaps: any[], data: any, AddVariation: any const baseProductId = data?.id; Varibletaps?.forEach((dataToSend: any) => { const varible = dataToSend; - const info = varible?.info; - const convertedArray = info?.reduce((acc: any, obj: any) => { - acc[obj.Description] = obj.key; - return acc; - }, {}); + const info = varible?.info ?? []; + const convertedArray = Array.isArray(info) ?? info.reduce((acc: any, obj: any) => { + acc[obj.Description] = obj.key; + return acc; + }, {}); const jsonString = JSON.stringify(convertedArray); - const IMages = varible?.id !== null ? { + + const IMages = (varible?.id !== null || varible?.id !== 0) ? { main_photo: varible?.main_photo, images: varible?.images, } : { copied_assets: { main_photo: varible?.main_photo, images: varible?.images }, } + const Newproduct = { name: { en: varible?.name_en, diff --git a/src/Pages/Products/View/EditPage.tsx b/src/Pages/Products/View/EditPage.tsx index dcbc33f..208d4ce 100644 --- a/src/Pages/Products/View/EditPage.tsx +++ b/src/Pages/Products/View/EditPage.tsx @@ -24,7 +24,7 @@ const ViewProduct = () => { const { data, isLoading, isRefetching } = useGetOneProduct({ id: id }) const [OldData, setOldData] = useState(data?.data?.products) - const { mutate, isSuccess } = useUpdateProduct('put') + const { mutate, isSuccess, isLoading: IsloadingButton } = useUpdateProduct('put') const { mutate: UpdateVariation, isSuccess: UpdetedSuccessVariation } = useUpdateProductVariation() const { mutate: AddVariation, isSuccess: AddedSuccessVariation, data: ProductVariationData } = useAddProductVariation() @@ -38,7 +38,9 @@ const ViewProduct = () => { const handleSubmit = (values: any) => { // Update removedVarianteValues state - console.log(values?.removedVariant, "values?.removedVariant"); + // console.log(values?.removedVariant, "values?.removedVariant"); + console.log(values, "values"); + function isValid() { setremovedVariant(values?.removedVariant); const variables = values?.variable?.slice(1); @@ -59,9 +61,9 @@ const ViewProduct = () => { mutate(newData); } const validationResults = isvalidation(values.variable, t); - if (validationResults.every((result) => result)) { - isValid(); - } + // if (validationResults.every((result) => result)) { + // isValid(); + // } }; @@ -69,6 +71,15 @@ const ViewProduct = () => { + function arraysAreEqual(array1: any, array2: any) { + // Sort both arrays + const sortedArray1 = array1.slice().sort(); + const sortedArray2 = array2.slice().sort(); + + // Compare the sorted arrays + return JSON.stringify(sortedArray1) === JSON.stringify(sortedArray2); + } + useEffect(() => { @@ -79,18 +90,29 @@ const ViewProduct = () => { filtered_Variant?.map((dataToSend: any, index: number) => { console.log(dataToSend, "dataToSend"); const varible = dataToSend - if (varible?.id && varible?.id !== null) { + if (varible?.id && varible?.id !== null && varible?.id !== 0) { const foundObject = OldData.find((item: any) => item.id === varible?.id) as any; - const info = varible?.info - console.log(info, "info"); - - const convertedArray = info.reduce((acc: any, obj: any) => { + const formattedOldInfoData = foundObject?.info ? Object.entries(foundObject?.info).map(([key, value], index) => ({ + [`Description`]: key, + [`key`]: value, + })) : []; + // const info = varible?.info + const info = varible?.info ?? []; + const convertedArray = Array.isArray(info) ?? info.reduce((acc: any, obj: any) => { acc[obj.Description] = obj.key; return acc; }, {}); const jsonString = JSON.stringify(convertedArray); - console.log(jsonString, "jsonStringinfo"); + const images_product = foundObject?.images?.map((item: any) => { + return item?.path + }) + const array1 =images_product; + const array2 =varible?.images; + + const isEqual2 = array1.length === array2.length && array1.every((value:any, index:any) => value === array2[index]); + + console.log("Arrays are equal:", isEqual2); const Editedproduct = { name: { @@ -103,16 +125,16 @@ const ViewProduct = () => { ar: varible?.description_ar, de: varible?.description_de }, - // quantity: varible?.quantity, + quantity: varible?.quantity, main_photo: varible?.main_photo, images: varible?.images, info: jsonString, price: varible?.price, - product_attributes: varible?.attribute?.map((item: any, index: any) => { - return { attribute_value_id: item?.value, attribute_id: item?.id } - }), + // product_attributes: varible?.attribute?.map((item: any, index: any) => { + // return { attribute_value_id: item?.value, attribute_id: item?.id } + // }), } if (foundObject) { @@ -154,35 +176,45 @@ const ViewProduct = () => { delete Editedproduct[key]; } }); - if (convertedArray && foundObject.info) { - const editedInfoKeys = Object.keys(convertedArray); - const foundInfoKeys = Object.keys(foundObject.info); - console.log(editedInfoKeys, "editedInfoKeys"); - console.log(foundInfoKeys, "foundInfoKeys"); + console.log(foundObject.info, "foundObject.info"); - // Check if the number of keys is the same - if (editedInfoKeys.length === foundInfoKeys.length) { - // Check if all keys and their corresponding values are the same + const isEqual = arraysAreEqual(formattedOldInfoData, varible?.info); + console.log(isEqual, "isEqual"); - const keysAreEqual = editedInfoKeys.every((key: any) => { - //@ts-ignore - console.log(convertedArray[key], "convertedArray[key] "); - console.log(foundObject.info[key], "foundObject.info[key]"); - return convertedArray[key] === foundObject.info[key]; - }); - - if (keysAreEqual) { - // Remove the info property from Editedproduct - //@ts-ignore - - delete Editedproduct.info; - } - } - if (Object.keys(Editedproduct.info).length === 0) { - //@ts-ignore - delete Editedproduct.info; - } + if (isEqual) { + //@ts-ignore + delete Editedproduct?.info; } + + // if (convertedArray && foundObject.info) { + // const editedInfoKeys = Object.keys(convertedArray); + // const foundInfoKeys = Object.keys(foundObject.info); + // console.log(editedInfoKeys, "editedInfoKeys"); + // console.log(foundInfoKeys, "foundInfoKeys"); + + // // Check if the number of keys is the same + // if (editedInfoKeys.length === foundInfoKeys.length) { + // // Check if all keys and their corresponding values are the same + + // const keysAreEqual = editedInfoKeys.every((key: any) => { + // //@ts-ignore + // console.log(convertedArray[key], "convertedArray[key] "); + // console.log(foundObject.info[key], "foundObject.info[key]"); + // return convertedArray[key] === foundObject.info[key]; + // }); + + // if (keysAreEqual) { + // // Remove the info property from Editedproduct + // //@ts-ignore + + // delete Editedproduct.info; + // } + // } + // if (Object.keys(Editedproduct.info).length === 0) { + // //@ts-ignore + // delete Editedproduct.info; + // } + // } if (Object.keys(Editedproduct).length > 0) { //@ts-ignore Editedproduct._method = "PUT"; @@ -197,19 +229,21 @@ const ViewProduct = () => { } else { - const info = varible?.info - const convertedArray = info?.reduce((acc: any, obj: any) => { + const info = varible?.info ?? []; + const convertedArray = Array.isArray(info) ?? info.reduce((acc: any, obj: any) => { acc[obj.Description] = obj.key; return acc; }, {}); const jsonString = JSON.stringify(convertedArray); - - const IMages = varible?.id !== null ? { - main_photo: varible?.main_photo, - images: varible?.images, - } : { - copied_assets: { main_photo: varible?.main_photo, images: varible?.images }, - } + const IMages = + (typeof varible?.main_photo === 'string' || typeof varible?.images === 'string') ? + { + copied_assets: { main_photo: varible?.main_photo, images: varible?.images } + } : + { + main_photo: varible?.main_photo, + images: varible?.images + }; const Newproduct = { name: { @@ -245,8 +279,9 @@ const ViewProduct = () => { console.log(removedVariant); const filtered_removedVariant = filterUndefinedAndEmpty(removedVariant); + console.log(filtered_removedVariant); - filtered_removedVariant?.map((item: any) => { + removedVariant?.map((item: any) => { return DeleteVariation({ id: item }) }) } @@ -254,23 +289,23 @@ const ViewProduct = () => { - useNavigateOnSuccess(isSuccess , '/products') + useNavigateOnSuccess(isSuccess, '/products') useEffect(() => { // refetch() setObjectToEdit(data?.data); setOldData(data?.data?.products) - }, [data, data?.data, id, isRefetching]); + }, [data, data?.data?.products, data?.data, id, isRefetching]); const getValidationSchema = () => { return null }; - if (isRefetching) { + if (isRefetching || isLoading) { return } - const ViewProps = { getInitialValues, getValidationSchema, getDataToSend, handleSubmit }; + const ViewProps = { getInitialValues, getValidationSchema, getDataToSend, handleSubmit, IsloadingButton }; return ( @@ -289,7 +324,7 @@ const ViewProduct = () => {
-
{isLoading && objectToEdit ? : }
+
{isLoading && objectToEdit && isRefetching ? : }
diff --git a/src/Pages/Products/View/FormikTab/Field/Atteibute.tsx b/src/Pages/Products/View/FormikTab/Field/Atteibute.tsx index d148124..06bd606 100644 --- a/src/Pages/Products/View/FormikTab/Field/Atteibute.tsx +++ b/src/Pages/Products/View/FormikTab/Field/Atteibute.tsx @@ -20,7 +20,7 @@ const Attribute = ({ tabKey }: any) => { const uniqueOptionsMap = new Map(); item?.attribute_value.forEach((attr: any) => { if (!uniqueOptionsMap.has(attr.value[language])) { - uniqueOptionsMap.set(attr.value[language], { attribute_id: attr.attribute_id, id: attr.id }); + uniqueOptionsMap.set(attr.value[language], { attribute_id: attr.id, id: attr.attribute_id }); } }); @@ -30,6 +30,10 @@ const Attribute = ({ tabKey }: any) => { id: value.id, // Include id in the option })); + if (options.length === 0) { + return <>; // Don't render anything if options are empty + } + return (
diff --git a/src/Pages/Products/View/FormikTab/Field/File.tsx b/src/Pages/Products/View/FormikTab/Field/File.tsx index 6264d87..7bce823 100644 --- a/src/Pages/Products/View/FormikTab/Field/File.tsx +++ b/src/Pages/Products/View/FormikTab/Field/File.tsx @@ -8,20 +8,23 @@ import { useFormikContext } from 'formik'; import { ImageBaseURL } from '../../../../../api/config'; -const File = ({ tabKey}:any) => { +const FileProduct = ({ tabKey}:any) => { const { t } = useTranslation(); const formik = useFormikContext(); const name = `variable[${tabKey}].${"main_photo"}`; - let FormikName = formik.values?.variable[tabKey]?.main_photo; - const imageUrl = FormikName ? ImageBaseURL + FormikName : ''; + let FormikName = formik?.values?.variable[tabKey]?.main_photo as any; + const FormikimageUrl = FormikName ? ImageBaseURL + FormikName : ''; + + const imageUrl = typeof FormikName === "string" ? (FormikimageUrl)?.replace("public", "/storage") : (FormikName instanceof File) ? URL.createObjectURL(FormikName) : ""; + const fileList: UploadFile[] = [ { uid: '-1', name: '', status: 'done', - url: imageUrl?.replace("public", "/storage"), - thumbUrl: imageUrl?.replace("public", "/storage") + url: imageUrl, + thumbUrl: imageUrl } ]; const FilehandleChange = (value:any) => { @@ -60,4 +63,4 @@ const File = ({ tabKey}:any) => { ) } -export default File \ No newline at end of file +export default FileProduct \ No newline at end of file diff --git a/src/Pages/Products/View/FormikTab/Field/FileImage.tsx b/src/Pages/Products/View/FormikTab/Field/FileImage.tsx index d46829a..d203090 100644 --- a/src/Pages/Products/View/FormikTab/Field/FileImage.tsx +++ b/src/Pages/Products/View/FormikTab/Field/FileImage.tsx @@ -11,8 +11,11 @@ const MaltyFile = ({ tabKey }: any) => { // Construct imageUrl and fileList for each file const files = formik.values?.variable[tabKey]?.images || []; + const fileItems = files.map((file: any, index: number) => { - const imageUrl = file ? ImageBaseURL + file : ''; + + const FormikimageUrl = file ? ImageBaseURL + file : ''; + const imageUrl = typeof file === "string" ? (FormikimageUrl)?.replace("public", "/storage") : (file instanceof File) ? URL.createObjectURL(file) : ""; return { uid: `-${index}`, name: file?.name || '', diff --git a/src/Pages/Products/View/FormikTab/Field/Object.tsx b/src/Pages/Products/View/FormikTab/Field/Object.tsx index 08e322f..f5cba50 100644 --- a/src/Pages/Products/View/FormikTab/Field/Object.tsx +++ b/src/Pages/Products/View/FormikTab/Field/Object.tsx @@ -34,7 +34,7 @@ const ObjectField = ({ tabKey }: any) => { }; useEffect(() => { - console.log(initialValues); + // console.log(initialValues); }, [initialValues]) return ( diff --git a/src/Pages/Products/View/FormikTab/TabsContainer.tsx b/src/Pages/Products/View/FormikTab/TabsContainer.tsx index d3927e3..de1c0a7 100644 --- a/src/Pages/Products/View/FormikTab/TabsContainer.tsx +++ b/src/Pages/Products/View/FormikTab/TabsContainer.tsx @@ -3,7 +3,7 @@ import React, { useEffect, useState } from 'react'; import { Tabs, Space } from 'antd'; import { CopyOutlined } from '@ant-design/icons'; import { toast } from 'react-toastify'; -import { FormikValues, useFormikContext } from 'formik'; +import { FormikValues, useFormikContext } from 'formik'; import { useTranslation } from 'react-i18next'; import { useProductVarianState } from '../../../../lib/state mangment/Pages/Products'; import { VariableTabs } from './VariableTabs'; @@ -15,24 +15,24 @@ export const TabsContainer: React.FC = () => { const [activeKey, setActiveKey] = useState('1'); const [t] = useTranslation() const initialItemShape: any = { - label: `${t(`variant`)} 1`, + label: `${t(`variant`)} 1`, key: '1', closable: true, }; const formikContext = useFormikContext(); -const { setFieldValue } = useFormikContext(); -const { values, handleChange } = formikContext; -const varianCount = values?.variable?.slice(1)?.map((item:any,index:any)=>{ - return { - label: `${t(`variant`)}`+ `${index+1}`, - key: index+1, - closable: true, - } -})?? initialItemShape -const [items, setItems] = useState(varianCount ?? [initialItemShape]); // Ensure items is always an array -const [width, setWidth] = useState(window.innerWidth); + const { setFieldValue } = useFormikContext(); + const { values, handleChange } = formikContext; + const varianCount = values?.variable?.slice(1)?.map((item: any, index: any) => { + return { + label: `${t(`variant`)}` + `${index + 1}`, + key: index + 1, + closable: true, + } + }) ?? initialItemShape + const [items, setItems] = useState(varianCount ?? [initialItemShape]); // Ensure items is always an array + const [width, setWidth] = useState(window.innerWidth); - const findFirstMissingKey = (itemKeys:string[]) => { + const findFirstMissingKey = (itemKeys: string[]) => { const keysAsNumbers = itemKeys.map(Number); // Convert strings to numbers for (let i = 1; i <= keysAsNumbers.length + 1; i++) { if (!keysAsNumbers.includes(i)) { @@ -52,9 +52,9 @@ const [width, setWidth] = useState(window.innerWidth); const keys = items.map((item: any) => `${item.key}`); setNextKey(findFirstMissingKey(keys)) - }, [items]); - - + }, [items]); + + const handleAdd = () => { const newKey = `${nextKey}`; setItems([...items, { key: newKey, label: `${t(`variant`)} ${newKey}`, closable: true }]); @@ -62,61 +62,68 @@ const [width, setWidth] = useState(window.innerWidth); }; const handleDuplicate = (targetKey: string) => { - const targetItem = items.find((item:any) => item.key === targetKey); + const targetItem = items.find((item: any) => item.key === targetKey); if (targetItem) { const newKey = `${nextKey}`; const newItem = { ...targetItem, key: newKey, label: `${t(`variant`)} ${newKey}` }; setItems([...items, newItem]); setActiveKey(newKey); - + const originalValues = values?.variable?.[targetKey]; - setFieldValue(`variable.${newKey}`, {...originalValues,id:null}); + if(originalValues.id === null){ + + setFieldValue(`variable.${newKey}`, { ...originalValues, id: 0 }); + + }else{ + setFieldValue(`variable.${newKey}`, { ...originalValues, id: null }); + + } const originalInfo = values?.info?.[targetKey]; - + setFieldValue(`info.${newKey}`, originalInfo); const originalvariable = values?.variable[targetKey]?.variable; - + setFieldValue(`variable.${newKey}.variable`, originalvariable); - + } }; - - const [removedVariant, setremovedVariant] = useState([]); + + const [removedVariant, setremovedVariant] = useState([]); useEffect(() => { setFieldValue(`removedVariant`, removedVariant); }, [removedVariant]); const handleRemove = (targetKey: string) => { - const newItems = items.filter((item:any) => item.key !== targetKey); + const newItems = items.filter((item: any) => item.key !== targetKey); const removedItem = values?.variable[targetKey] as any; if (removedItem?.id) { setremovedVariant((prevRemovedvariable) => [...prevRemovedvariable, removedItem.id]); } - const newActiveKey = newItems.length ? newItems[newItems.length - 1].key : '1'; - setItems(newItems); - setActiveKey(newActiveKey); - setFieldValue(`variable.${targetKey}`, undefined); - setFieldValue(`info.${targetKey}`, undefined); - - -}; + const newActiveKey = newItems.length ? newItems[newItems.length - 1].key : '1'; + setItems(newItems); + setActiveKey(newActiveKey); + setFieldValue(`variable.${targetKey}`, undefined); + setFieldValue(`info.${targetKey}`, undefined); -useEffect(() => { - const handleResize = () => { + + }; + + useEffect(() => { + const handleResize = () => { setWidth(window.innerWidth); - }; + }; - window.addEventListener('resize', handleResize); + window.addEventListener('resize', handleResize); - return () => { + return () => { window.removeEventListener('resize', handleResize); - }; -}, []); -const tabPosition = width > 1000 ? 'left' : 'top'; + }; + }, []); + const tabPosition = width > 1000 ? 'left' : 'top'; - return ( + return ( <> 1000 ? 'left' : 'top'; onEdit={(targetKey: any, action) => (action === 'add' ? handleAdd() : handleRemove(targetKey))} tabPosition={tabPosition} items={ - items.map((item: any) => ({ - label: {t(`${item.label}`)} handleDuplicate(item.key)} />, - children: , - key: item.key, - closable: item.closable, - })) - } - - > - - - { items.length === 0 && ( -
{t("Add New Variant")}
+ items.map((item: any) => ({ + label: {t(`${item.label}`)} handleDuplicate(item.key)} />, + children: , + key: item.key, + closable: item.closable, + })) + } - )} + > + + + {items.length === 0 && ( +
{t("Add New Variant")}
+ + )} - ); + ); }; diff --git a/src/Pages/Products/View/FormikTab/VariableTabs.tsx b/src/Pages/Products/View/FormikTab/VariableTabs.tsx index 578fde1..99d8e87 100644 --- a/src/Pages/Products/View/FormikTab/VariableTabs.tsx +++ b/src/Pages/Products/View/FormikTab/VariableTabs.tsx @@ -9,6 +9,7 @@ import ObjectField from './Field/Object'; import Atteibute from './Field/Atteibute'; import { useTranslation } from 'react-i18next'; +import { useParams } from 'react-router-dom'; interface VariableTabsProps { tabKey: string; @@ -18,6 +19,7 @@ export const VariableTabs: React.FC = ({ tabKey }) => { const { t } = useTranslation(); const formikContext = useFormikContext(); const { values, handleChange } = formikContext; + // const {id}= useParams() const handleFieldChange = (fieldName: string) => ( e: React.ChangeEvent | any @@ -56,14 +58,8 @@ export const VariableTabs: React.FC = ({ tabKey }) => { onChange={handleFieldChange('quantity')} type="number" /> */} - - {values?.category_id && + {(values?.category_id && (!values?.variable?.[tabKey]?.id || values?.variable?.[tabKey]?.id == null || values?.variable?.[tabKey]?.id == 0) ) && } @@ -85,7 +81,12 @@ export const VariableTabs: React.FC = ({ tabKey }) => { value={FormikName("description_de")} onChange={handleFieldChange('description_de')} /> - + diff --git a/src/Pages/Products/formUtil.ts b/src/Pages/Products/formUtil.ts index 975ec2a..945504a 100644 --- a/src/Pages/Products/formUtil.ts +++ b/src/Pages/Products/formUtil.ts @@ -9,14 +9,20 @@ export const getInitialValues = (objectToEdit: any) => { return {}; } const products = objectToEdit?.products?.map((item: any) => { - console.log(item,"item"); + // console.log(item,"item"); const formattedData = item?.info ? Object.entries(item?.info).map(([key, value], index) => ({ - [`${index}.Description`]: key, - [`${index}.key`]: value, + [`Description`]: key, + [`key`]: value, })) : []; - + + // console.log(formattedData,"formattedData"); + const images_product = item?.images?.map((item:any)=>{ + return item?.path + }) + console.log(images_product,"images_product"); + return ({ @@ -26,11 +32,11 @@ export const getInitialValues = (objectToEdit: any) => { description_ar: item?.description["ar"], description_en: item?.description["en"], description_de: item?.description["de"], - images: item?.images, + images: images_product, main_photo: item?.main_photo, price: item?.price, - quantity: item?.quantity, - products_attributes: item?.products_attributes, + // quantity: item?.quantity, + // products_attributes: item?.products_attributes, id:item?.id, info:formattedData @@ -43,7 +49,6 @@ export const getInitialValues = (objectToEdit: any) => { [`${index}.key`]: value, })); console.log(products,"products"); - console.log(objectToEdit,"objectToEdit"); return { @@ -60,7 +65,7 @@ export const getInitialValues = (objectToEdit: any) => { price: objectToEdit?.price ?? "", variable: [{}, ...products], - info: [undefined, ...formattedData] ?? [], + // info: [undefined, ...formattedData] ?? [], removedVariant:[], } }; diff --git a/src/Pages/Slider/View/AddPage.tsx b/src/Pages/Slider/View/AddPage.tsx index 08d3d1b..efd222f 100644 --- a/src/Pages/Slider/View/AddPage.tsx +++ b/src/Pages/Slider/View/AddPage.tsx @@ -13,7 +13,7 @@ import Form from './AddForm'; const AddSliderPage = () => { - const {mutate , isLoading , isSuccess} = useAddSlider() + const {mutate , isLoading:IsloadingButton , isSuccess} = useAddSlider() const handleSubmit = (values:any)=>{ mutate(values) @@ -26,7 +26,7 @@ const AddSliderPage = () => { - const ViewProps = { getInitialValues, getValidationSchema, getDataToSend, handleSubmit }; + const ViewProps = { getInitialValues, getValidationSchema, getDataToSend, handleSubmit,IsloadingButton }; return ( diff --git a/src/Pages/Slider/View/EditPage.tsx b/src/Pages/Slider/View/EditPage.tsx index bfdd36a..fa1fe20 100644 --- a/src/Pages/Slider/View/EditPage.tsx +++ b/src/Pages/Slider/View/EditPage.tsx @@ -19,7 +19,7 @@ const EditPage = () => { const { setObjectToEdit, objectToEdit } = usePageState() const {t} = useTranslation(); const { data } = useGetOneSlider() - const {mutate ,isSuccess} = useUpdateSlider() + const {mutate ,isSuccess,isLoading:IsloadingButton} = useUpdateSlider() const FormatedData = data?.data ; const handleSubmit = (values:any)=>{ @@ -51,7 +51,7 @@ const EditPage = () => { }; - const ViewProps = { getInitialValues, getValidationSchema, getDataToSend, handleSubmit }; + const ViewProps = { getInitialValues, getValidationSchema, getDataToSend, handleSubmit,IsloadingButton }; return ( diff --git a/src/Pages/Users/SendNotifcation/View/AddPage.tsx b/src/Pages/Users/SendNotifcation/View/AddPage.tsx index 02f097d..e2a9817 100644 --- a/src/Pages/Users/SendNotifcation/View/AddPage.tsx +++ b/src/Pages/Users/SendNotifcation/View/AddPage.tsx @@ -14,25 +14,25 @@ import { useAddNotification } from '../../../../api/notification'; const AddPage = () => { - const { mutate, isLoading, isSuccess } = useAddNotification() + const { mutate, isLoading:IsloadingButton, isSuccess } = useAddNotification() const {id} = useParams() const handleSubmit = (values: any) => { const body = { en: values.body_en, ar: values.body_ar, - du: values.body_de + de: values.body_de } const meta = {} const title = { en: values.title_en, ar: values.title_ar, - du: values.title_de + de: values.title_de } const dataToSend = { - body: JSON.stringify(body), - meta: JSON.stringify(meta), - title:JSON.stringify(title), + body: body, + meta: meta, + title:title, user_ids: [id], type: "other", @@ -48,7 +48,7 @@ const AddPage = () => { - const ViewProps = { getInitialValues, getValidationSchema, getDataToSend, handleSubmit }; + const ViewProps = { getInitialValues, getValidationSchema, getDataToSend, handleSubmit,IsloadingButton }; return ( diff --git a/src/Pages/Users/View/AddPage.tsx b/src/Pages/Users/View/AddPage.tsx index 9d6d788..723cd3d 100644 --- a/src/Pages/Users/View/AddPage.tsx +++ b/src/Pages/Users/View/AddPage.tsx @@ -12,7 +12,7 @@ import Form from './AddForm'; const AddPage = () => { - const { mutate, isLoading, isSuccess } = useAddUsers() + const { mutate, isLoading:IsloadingButton, isSuccess } = useAddUsers() const handleSubmit = (values: any) => { @@ -26,7 +26,7 @@ mutate(values) - const ViewProps = { getInitialValues, getValidationSchema, getDataToSend, handleSubmit }; + const ViewProps = { getInitialValues, getValidationSchema, getDataToSend, handleSubmit,IsloadingButton }; return ( diff --git a/src/Pages/order/Edit/EditPage.tsx b/src/Pages/order/Edit/EditPage.tsx index fbff27b..e5d2de6 100644 --- a/src/Pages/order/Edit/EditPage.tsx +++ b/src/Pages/order/Edit/EditPage.tsx @@ -21,7 +21,7 @@ import { useGetOneOrder, useUpdateOrder } from '../../../api/order'; const EditPage = () => { const { setObjectToEdit, objectToEdit } = usePageState() const {t} = useTranslation(); - const {mutate ,isSuccess} = useUpdateOrder("put") + const {mutate ,isSuccess,isLoading:IsloadingButton} = useUpdateOrder("put") const { id } = useParams(); const { data, isLoading } = useGetOneOrder({id: id }) const handleSubmit = (values:any)=>{ @@ -48,7 +48,7 @@ const EditPage = () => { }; - const ViewProps = { getInitialValues, getValidationSchema, getDataToSend, handleSubmit }; + const ViewProps = { getInitialValues, getValidationSchema, getDataToSend, handleSubmit,IsloadingButton }; if ( isLoading || !objectToEdit) { return } diff --git a/src/Pages/order/Edit/formUtil.ts b/src/Pages/order/Edit/formUtil.ts index 71e4647..7875898 100644 --- a/src/Pages/order/Edit/formUtil.ts +++ b/src/Pages/order/Edit/formUtil.ts @@ -1,6 +1,7 @@ import * as Yup from "yup"; import { buildFormData } from "../../../api/helper/buildFormData"; +import * as dayjs from 'dayjs' interface formUtilCommon { number:number, @@ -25,7 +26,8 @@ export const getInitialValues = (objectToEdit: any | null = null): any => { id: objectToEdit?.id ?? 0, state:objectToEdit?.state ?? "", admin_note: objectToEdit?.admin_note ?? '', - deliviration_estimated_time:objectToEdit?.deliviration_estimated_time ??"", + //@ts-ignore + deliviration_estimated_time: dayjs(objectToEdit?.deliviration_estimated_time,"YYYY-MM-DD") ??"", delivery_link:objectToEdit?.delivery_link ??"", }; @@ -35,7 +37,7 @@ export const getInitialValues = (objectToEdit: any | null = null): any => { export const getValidationSchema = (editMode: boolean = false): Yup.Schema => { // Validate input return Yup.object().shape({ - + }); }; diff --git a/src/Pages/order/useTableColumns.tsx b/src/Pages/order/useTableColumns.tsx index d4a61c8..f4c463e 100644 --- a/src/Pages/order/useTableColumns.tsx +++ b/src/Pages/order/useTableColumns.tsx @@ -21,7 +21,7 @@ const useTableColumns = () => { name: t("name"), sortable: false, center:true, - selector:(row:any) => row?.user?.name[language], + selector:(row:any) => row?.user?.name, }, { diff --git a/src/api/helper/ueGetPagination.tsx b/src/api/helper/ueGetPagination.tsx index 723dbf1..466747a 100644 --- a/src/api/helper/ueGetPagination.tsx +++ b/src/api/helper/ueGetPagination.tsx @@ -19,7 +19,7 @@ const navigate = useNavigate() }, { onError: (error:any) => { - if(error.response.status == 401 || error.response.status == 403){ + if(error?.response?.status == 401 || error?.response?.status == 403){ logout() navigate("/auth") diff --git a/src/api/helper/useAddMutation.ts b/src/api/helper/useAddMutation.ts index 0f60207..538ff34 100644 --- a/src/api/helper/useAddMutation.ts +++ b/src/api/helper/useAddMutation.ts @@ -26,7 +26,7 @@ function useAddMutation(key: string, url: string): UseMutationResult { queryClient.invalidateQueries([key]); - toast.success(data.message || t("added_uccessful")); + toast.success(data.message || t("added_successful")); }, onError: (error:any) => { const message = error?.response?.data?.message || t("failed_to_add_data"); diff --git a/src/api/helper/useAddMutationJson.ts b/src/api/helper/useAddMutationJson.ts new file mode 100644 index 0000000..8e9864b --- /dev/null +++ b/src/api/helper/useAddMutationJson.ts @@ -0,0 +1,35 @@ +import { useMutation, useQueryClient, UseMutationResult } from 'react-query'; +import { toast } from 'react-toastify'; +import useAxios from './useAxios'; +import { useTranslation } from 'react-i18next'; + +type AxiosResponse = { + message: string; + data:any , + success:true +}; + +function useAddMutationJson(key: string, url: string): UseMutationResult { + const axios = useAxios(); + const [t] = useTranslation(); + const queryClient = useQueryClient(); + + return useMutation( + async (dataToSend) => { + const { data } = await axios.post(url, dataToSend); + return data; + }, + { + onSuccess: (data) => { + queryClient.invalidateQueries([key]); + toast.success(data.message || t("added_successful")); + }, + onError: (error:any) => { + const message = error?.response?.data?.message || t("failed_to_add_data"); + toast.error(message); + } + } + ); +} + +export default useAddMutationJson; diff --git a/src/api/helper/useGetOneQuery.ts b/src/api/helper/useGetOneQuery.ts index 3013249..ce26472 100644 --- a/src/api/helper/useGetOneQuery.ts +++ b/src/api/helper/useGetOneQuery.ts @@ -27,6 +27,7 @@ function useGetOneQuery(key: string, url: string , params:any={},options:any={}) } }, + cacheTime: 0, // Set cacheTime to 0 to disable caching refetchOnWindowFocus: false, ...options diff --git a/src/api/product.ts b/src/api/product.ts index da4ed28..9c6f4cd 100644 --- a/src/api/product.ts +++ b/src/api/product.ts @@ -19,11 +19,11 @@ const API = { }; const KEY = "Product" -const ONEKEY = "OneProduct" +// const ONEKEY = "Product" export const useGetProduct = (params?:any) => useGetQueryPagination(KEY, API.GET_ALL,params); -export const useGetOneProduct = (params?:any) => useGetOneQuery(ONEKEY, API.GET_ALL,params); +export const useGetOneProduct = (params?:any) => useGetOneQuery(KEY, API.GET_ALL,params); export const useAddProduct = () => useAddMutation(KEY, API.ADD); export const useAddProductVariation = () => useAddMutation(KEY, API.ADD_VAR); diff --git a/src/utils/Array/filterUndefinedAndEmpty.ts b/src/utils/Array/filterUndefinedAndEmpty.ts index cb6229e..c0982ce 100644 --- a/src/utils/Array/filterUndefinedAndEmpty.ts +++ b/src/utils/Array/filterUndefinedAndEmpty.ts @@ -1,5 +1,5 @@ const filterUndefinedAndEmpty = (array:any) => { - return array.filter((data:any) => data !== undefined && Object.keys(data).length !== 0); + return array?.filter((data:any) => data !== undefined && Object.keys(data).length !== 0); }; export default filterUndefinedAndEmpty; \ No newline at end of file