From d34fadfc6da6c62e644fa7d4ad2dd58ea4304110 Mon Sep 17 00:00:00 2001 From: pramod mahajan Date: Thu, 24 Jul 2025 15:27:58 +0530 Subject: [PATCH] implement delete functionality for Draft expenses only --- src/components/Expenses/ExpenseList.jsx | 156 ++++++++++++++++++------ src/hooks/useExpense.js | 30 +++++ src/repositories/ExpsenseRepository.jsx | 2 +- 3 files changed, 147 insertions(+), 41 deletions(-) diff --git a/src/components/Expenses/ExpenseList.jsx b/src/components/Expenses/ExpenseList.jsx index b2b0eac1..bf0c991e 100644 --- a/src/components/Expenses/ExpenseList.jsx +++ b/src/components/Expenses/ExpenseList.jsx @@ -1,5 +1,5 @@ import React, { useState } from "react"; -import { useExpenseList } from "../../hooks/useExpense"; +import { useDeleteExpense, useExpenseList } from "../../hooks/useExpense"; import Avatar from "../common/Avatar"; import { useExpenseContext } from "../../pages/Expense/ExpensePage"; import { formatDate, formatUTCToLocalTime } from "../../utils/dateUtils"; @@ -7,12 +7,17 @@ import Pagination from "../common/Pagination"; import { ITEMS_PER_PAGE } from "../../utils/constants"; import { AppColorconfig, getColorNameFromHex } from "../../utils/appUtils"; import { ExpenseTableSkeleton } from "./ExpenseSkeleton"; +import ConfirmModal from "../common/ConfirmModal"; +import { useProfile } from "../../hooks/useProfile"; const ExpenseList = () => { - const { setViewExpense,setManageExpenseModal } = useExpenseContext(); + const [deletingId, setDeletingId] = useState(null); + const [IsDeleteModalOpen, setIsDeleteModalOpen] = useState(false); + const { setViewExpense, setManageExpenseModal } = useExpenseContext(); const [currentPage, setCurrentPage] = useState(1); const pageSize = 10; - + const {profile} = useProfile() +console.log(profile) const filter = { projectIds: [], statusIds: [], @@ -21,10 +26,25 @@ const ExpenseList = () => { startDate: null, endDate: null, }; - - const { data, isLoading, isError,isInitialLoading,error,isFetching } = useExpenseList(10, currentPage, filter); - if (isInitialLoading ) return ; + const { mutate: DeleteExpense, isPending } = useDeleteExpense(); + const { data, isLoading, isError, isInitialLoading, error, isFetching } = + useExpenseList(10, currentPage, filter); + + const handleDelete = (id) => { + setDeletingId(id); + DeleteExpense( + { id }, + { + onSettled: () => { + setDeletingId(null); + setIsDeleteModalOpen(false) + }, + } + ); + }; + + if (isInitialLoading) return ; if (isError) return
{error}
; const items = data?.data ?? []; const totalPages = data?.totalPages ?? 1; @@ -36,16 +56,41 @@ const ExpenseList = () => { } }; return ( + <> + + {IsDeleteModalOpen && ( +
+ + setIsDeleteModalOpen(false)} + loading={isPending} + paramData={deletingId} + /> +
+ )}
@@ -149,7 +194,9 @@ const ExpenseList = () => { - @@ -211,15 +287,15 @@ const ExpenseList = () => {
- {formatUTCToLocalTime(expense.transactionDate)} + + {formatUTCToLocalTime(expense.transactionDate)} +
@@ -176,33 +223,62 @@ const ExpenseList = () => { {expense.amount} - - {expense.status?.displayName || "Unknown"} + {expense.status?.displayName || "Unknown"} -
- - setViewExpense({ expenseId:expense.id, view: true }) - } - > - - - setManageExpenseModal({IsOpen:true,expenseId:expense.id})} - > - - - - - +
+
+ + setViewExpense({ + expenseId: expense.id, + view: true, + }) + } + > + + + {(expense.status.name === 'Draft' || expense.status.name === 'Rejected') && (expense.createdBy.id === profile.employeeInfo.id ) &&( + + setManageExpenseModal({ + IsOpen: true, + expenseId: expense.id, + }) + } + > + + + )} + {expense.status.name == "Draft" && ( + { + setIsDeleteModalOpen(true) + setDeletingId(expense.id) + }} + > + {/* {deletingId === expense.id ? ( +
+ + Loading... + +
+ ) : ( */} + + {/* )} */} +
+ )}
{!isInitialLoading && items.length > 0 && ( - - )} + + )}
-
+ ); }; diff --git a/src/hooks/useExpense.js b/src/hooks/useExpense.js index c2928acc..328dd389 100644 --- a/src/hooks/useExpense.js +++ b/src/hooks/useExpense.js @@ -163,3 +163,33 @@ export const useActionOnExpense = (onSuccessCallBack) => { }, }); }; + +export const useDeleteExpense = () => { + const queryClient = useQueryClient(); + + return useMutation({ + mutationFn: async ({ id }) => { + const response = await ExpenseRepository.DeleteExpense(id); + return response.data; + }, + onSuccess: (data, variables) => { + queryClient.setQueryData(["Expenses"], (oldData) => { + if (!oldData || !oldData.data) return queryClient.invalidateQueries({queryKey:["Expenses"]}); + + const updatedList = oldData.data.filter( + (expense) => expense.id !== variables.id + ); + + return { + ...oldData, + data: updatedList, + }; + }); + + showToast(data.message || "Expense deleted successfully", "success"); + }, + onError: (error) => { + showToast("Failed to delete expense", "error"); + }, + }); +} diff --git a/src/repositories/ExpsenseRepository.jsx b/src/repositories/ExpsenseRepository.jsx index eedf5a7d..31e7fb9c 100644 --- a/src/repositories/ExpsenseRepository.jsx +++ b/src/repositories/ExpsenseRepository.jsx @@ -13,7 +13,7 @@ const ExpenseRepository = { GetExpenseDetails:(id)=>api.get(`/api/Expense/details/${id}`), CreateExpense:(data)=>api.post("/api/Expense/create",data), UpdateExpense:(id,data)=>api.put(`/api/Expense/edit/${id}`,data), - DeleteExpense:(id)=>api.delete(`/api/Expense/edit/${id}`), + DeleteExpense:(id)=>api.delete(`/api/Expense/delete/${id}`), ActionOnExpense:(data)=>api.post('/api/expense/action',data),