From 6a7d5523a7eafaed9c92ee30c4f11cd44ea1c186 Mon Sep 17 00:00:00 2001 From: hamid zarghami Date: Sat, 4 Jul 2026 12:56:01 +0330 Subject: [PATCH] dublicate food --- .env | 4 ++-- src/pages/food/List.tsx | 30 ++++++++++++++++++++++++++- src/pages/food/hooks/useFoodData.ts | 10 +++++++++ src/pages/food/service/FoodService.ts | 5 +++++ 4 files changed, 46 insertions(+), 3 deletions(-) diff --git a/.env b/.env index a309f21..048a89d 100644 --- a/.env +++ b/.env @@ -1,8 +1,8 @@ VITE_TOKEN_NAME = 'dmnu_a_t' VITE_REFRESH_TOKEN_NAME = 'dmnu-a-rt' -# VITE_BASE_URL = 'https://dmenu-api.danakcorp.com' -VITE_BASE_URL = 'http://192.168.99.131:2000' +VITE_BASE_URL = 'https://dmenu-api.danakcorp.com' +# VITE_BASE_URL = 'http://192.168.99.131:2000' VITE_SOCKET_URL = 'https://dmenu-api.danakcorp.com' VITE_INVOICE_URL = 'https://console.danakcorp.com/receipts/' \ No newline at end of file diff --git a/src/pages/food/List.tsx b/src/pages/food/List.tsx index 756f645..9288882 100644 --- a/src/pages/food/List.tsx +++ b/src/pages/food/List.tsx @@ -3,7 +3,7 @@ import Table from '@/components/Table' import Filters from '@/components/Filters' import { Add } from 'iconsax-react' import Button from '@/components/Button' -import { useGetFoods, useDeleteFood, useSetStockForFood } from './hooks/useFoodData' +import { useGetFoods, useDeleteFood, useCloneFood, useSetStockForFood } from './hooks/useFoodData' import { useFoodFilters } from './hooks/useFoodFilters' import { getFoodTableColumns } from './components/FoodTableColumns' import { useFoodFiltersFields } from './components/FoodFiltersFields' @@ -20,6 +20,7 @@ const FoodsList: FC = () => { const navigate = useNavigate() const [stockModalFood, setStockModalFood] = useState(null) const [deleteConfirmFood, setDeleteConfirmFood] = useState(null) + const [cloneConfirmFood, setCloneConfirmFood] = useState(null) const { filters, @@ -31,6 +32,7 @@ const FoodsList: FC = () => { const { data: foodsData, isLoading } = useGetFoods(apiParams, filters) const { mutate: deleteFood, isPending: isDeleting } = useDeleteFood() + const { mutate: cloneFood, isPending: isCloning } = useCloneFood() const { mutate: setStock, isPending: isUpdatingStock } = useSetStockForFood() const foods = foodsData?.data || [] @@ -49,6 +51,10 @@ const FoodsList: FC = () => { label: 'بروزرسانی موجودی', onClick: () => setStockModalFood(item), }, + { + label: 'دابلیکیت کردن', + onClick: () => setCloneConfirmFood(item), + }, { label: 'حذف', onClick: () => setDeleteConfirmFood(item), @@ -85,6 +91,20 @@ const FoodsList: FC = () => { }) } + const handleCloneConfirm = () => { + if (!cloneConfirmFood) return + + cloneFood(cloneConfirmFood.id, { + onSuccess: () => { + toast.success('غذا با موفقیت دابلیکیت شد') + setCloneConfirmFood(null) + }, + onError: (error) => { + toast.error(extractErrorMessage(error)) + }, + }) + } + return (
@@ -138,6 +158,14 @@ const FoodsList: FC = () => { isloading={isDeleting} label={deleteConfirmFood ? `آیا از حذف «${deleteConfirmFood.title}» اطمینان دارید؟` : undefined} /> + + setCloneConfirmFood(null)} + onConfrim={handleCloneConfirm} + isloading={isCloning} + label={cloneConfirmFood ? `آیا از دابلیکیت کردن «${cloneConfirmFood.title}» اطمینان دارید؟` : undefined} + />
) } diff --git a/src/pages/food/hooks/useFoodData.ts b/src/pages/food/hooks/useFoodData.ts index 67227e8..696294f 100644 --- a/src/pages/food/hooks/useFoodData.ts +++ b/src/pages/food/hooks/useFoodData.ts @@ -55,6 +55,16 @@ export const useDeleteFood = () => { }); }; +export const useCloneFood = () => { + const queryClient = useQueryClient(); + return useMutation({ + mutationFn: api.cloneFood, + onSuccess: () => { + queryClient.invalidateQueries({ queryKey: ["foods"] }); + }, + }); +}; + export const useCreateCategory = () => { const queryClient = useQueryClient(); return useMutation({ diff --git a/src/pages/food/service/FoodService.ts b/src/pages/food/service/FoodService.ts index 3b3b6fc..4236ca9 100644 --- a/src/pages/food/service/FoodService.ts +++ b/src/pages/food/service/FoodService.ts @@ -55,6 +55,11 @@ export const deleteFood = async (id: string) => { return data; }; +export const cloneFood = async (id: string) => { + const { data } = await axios.post(`/admin/foods/${id}/clone`); + return data; +}; + export const createCategory = async (params: CreateCategoryType) => { const { data } = await axios.post(`/admin/categories`, params); return data;