diff --git a/src/App.scss b/src/App.scss index fbf0a796..865a710e 100644 --- a/src/App.scss +++ b/src/App.scss @@ -43,4 +43,5 @@ @import "./assets/styles/liveChat.scss"; @import "./assets//styles/UserProfile.scss"; @import "./assets/styles/SellerSideProduct.scss"; +@import "./assets/styles/SellerDeleteItem.scss"; @import "./assets/styles/SellerDeleteItem.scss" diff --git a/src/components/product/SellerProduct.tsx b/src/components/product/SellerProduct.tsx index d04fff0f..95d0697e 100644 --- a/src/components/product/SellerProduct.tsx +++ b/src/components/product/SellerProduct.tsx @@ -12,6 +12,8 @@ import { PuffLoader } from 'react-spinners'; import { Meta } from '../Meta'; import { toast } from 'react-toastify'; import { getErrorMessage } from '../../utils/axios/axiosInstance'; +import { deleteItem } from '../../store/features/product/sellerCollectionProductsSlice'; +import ConfirmModal from './ConfirmModal'; const initialProductState: ISingleProduct = { id: "", @@ -43,6 +45,8 @@ const SellerProduct = ({ productId }: { productId: string }) => { const [isThereAnyUpdate, setIsThereAnyUpdate] = useState(false); const [updateLoading, setUpdateLoading] = useState(false); + const [showConfirm, setShowConfirm] = useState(false); + const [itemToDelete, setItemToDelete] = useState(null); useEffect(() => { if (!isAdd) { @@ -123,6 +127,14 @@ const SellerProduct = ({ productId }: { productId: string }) => { } }; + const handleDelete = async () => { + if (updatedProduct) { + await dispatch(deleteItem(itemToDelete)); + setShowConfirm(false); + navigate('/seller/products'); + } + }; + if (isLoading) { return (
@@ -150,7 +162,7 @@ const SellerProduct = ({ productId }: { productId: string }) => { - {!isAdd && } + {!isAdd && }
@@ -233,6 +245,14 @@ const SellerProduct = ({ productId }: { productId: string }) => { + + ${product?.name} will be permanently removed from the system. This can't be undone!`} + onConfirm={handleDelete} + onCancel={() => setShowConfirm(false)} + /> diff --git a/src/pages/seller/SellerCollection.tsx b/src/pages/seller/SellerCollection.tsx index 835555c7..dd28a92c 100644 --- a/src/pages/seller/SellerCollection.tsx +++ b/src/pages/seller/SellerCollection.tsx @@ -2,7 +2,7 @@ import React, { useEffect, useState } from 'react' import Table from '../../components/table/Table'; import { useAppDispatch, useAppSelector } from '../../store/store'; -import { fetchSellerCollectionProduct} from '../../store/features/product/sellerCollectionProductsSlice'; +import { fetchSellerCollectionProduct, deleteItem, removeItem } from '../../store/features/product/sellerCollectionProductsSlice'; import Zoom from '@mui/material/Zoom'; import Tooltip from '@mui/material/Tooltip'; import DeleteIcon from '@mui/icons-material/Delete'; @@ -47,8 +47,8 @@ export default function SellerCollection() { const handleDelete = async () => { try { setShowConfirm(false) - // dispatch(removeItem(itemToDelete.id)) - // await dispatch(deleteItem(itemToDelete.id)).unwrap(); + dispatch(removeItem(itemToDelete.id)) + await dispatch(deleteItem(itemToDelete.id)).unwrap(); dispatch(fetchSellerCollectionProduct()); setItemToDelete(null) } catch (error) { diff --git a/src/store/features/product/productService.tsx b/src/store/features/product/productService.tsx index ed625f8c..504d824e 100644 --- a/src/store/features/product/productService.tsx +++ b/src/store/features/product/productService.tsx @@ -97,6 +97,15 @@ const sellerGetOrderHistory = async () => { return response.data; } +const SellerDeleteItem = async(id: string)=>{ + try{ + const response = await axiosInstance.delete(`api/shop/seller-delete-product/${id}`); + return response.data + }catch(error){ + throw new Error("failed to delete product") + } +} + const productService = { fetchProducts, fetchSingleProduct, @@ -109,6 +118,7 @@ const productService = { addSellerProduct, updateSellerProductStatus, sellerGetAllProducts, - sellerGetOrderHistory + sellerGetOrderHistory, + SellerDeleteItem } export default productService; \ No newline at end of file diff --git a/src/store/features/product/sellerCollectionProductsSlice.tsx b/src/store/features/product/sellerCollectionProductsSlice.tsx index a14d4290..b0916d18 100644 --- a/src/store/features/product/sellerCollectionProductsSlice.tsx +++ b/src/store/features/product/sellerCollectionProductsSlice.tsx @@ -43,10 +43,24 @@ export const sellerGetOrderHistory = createAsyncThunk('seller/seller-get-orderHi } }) +export const deleteItem = createAsyncThunk("product/deleteProduct", async (id, thunkApi) => { + try { + const response = await productService.SellerDeleteItem(id) + return response + } catch (error) { + return thunkApi.rejectWithValue(error) + } +}) + const sellerCollectionProductsSlice = createSlice({ name: "sellerCollectionProducts", initialState, - reducers: {}, + reducers: { + removeItem: (state, action: any) => { + const itemId = action.payload + state.data.products = state.data?.products.filter((item) =>item.id !== itemId) + } + }, extraReducers: (builder) => { builder .addCase(fetchSellerCollectionProduct.pending, (state) => { @@ -96,8 +110,24 @@ const sellerCollectionProductsSlice = createSlice({ state.isError = false; state.isSuccess = false; state.message = action.payload.message || null - }); + }) + .addCase(deleteItem.pending, (state) => { + state.isError = false, + state.isSuccess = false + }) + .addCase(deleteItem.fulfilled, (state, action: PayloadAction) => { + state.isLoading = false, + state.isError = false, + state.isSuccess = true + state.message = action.payload.message + }) + .addCase(deleteItem.rejected, (state, action: PayloadAction) => { + state.isLoading = false, + state.isError = true, + state.message = action.payload, + state.isSuccess = false + });; } }) - +export const {removeItem} = sellerCollectionProductsSlice.actions export default sellerCollectionProductsSlice.reducer; \ No newline at end of file