From 1bea0ed3ec73b5727922d1591ed2b8cec785872a Mon Sep 17 00:00:00 2001 From: morteza-mortezai Date: Thu, 23 Jul 2026 18:47:48 +0330 Subject: [PATCH] count --- src/pages/invoice/ProformaInvoice.tsx | 25 +++++++++++++++++++-- src/pages/invoice/hooks/useInvoiceData.ts | 17 +++++++++++++- src/pages/invoice/service/InvoiceService.ts | 14 ++++++++++++ 3 files changed, 53 insertions(+), 3 deletions(-) diff --git a/src/pages/invoice/ProformaInvoice.tsx b/src/pages/invoice/ProformaInvoice.tsx index 7f45cd3..a5d7e1a 100644 --- a/src/pages/invoice/ProformaInvoice.tsx +++ b/src/pages/invoice/ProformaInvoice.tsx @@ -8,7 +8,7 @@ import { } from './enum/InvoiceEnum' import Filters from '@/components/Filters' import Table from '@/components/Table' -import { useGetInvoices } from './hooks/useInvoiceData' +import { useGetInvoices, useGetInvoiceTabCounts } from './hooks/useInvoiceData' import type { Invoice } from './types/InvoiceTypes' import type { ColumnType } from '@/components/types/TableTypes' import type { FilterValues } from '@/components/Filters' @@ -51,8 +51,29 @@ const ProformaInvoice: FC = () => { } const { data, isPending } = useGetInvoices({ statuses }) + const { data: tabCounts } = useGetInvoiceTabCounts() const invoices = useMemo(() => data?.data ?? [], [data?.data]) + const tabsWithCount = useMemo( + () => + invoiceListTabs.map((tab) => { + const total = + tab.value === ProformaInvoiceStatusEnum.PENDING + ? (tabCounts?.pending ?? 0) + : tab.value === ProformaInvoiceStatusEnum.CONFIRMED + ? (tabCounts?.confirmed ?? 0) + : (tabCounts?.archived ?? 0) + return { + ...tab, + label: + total > 0 + ? `${tab.label} (${total.toLocaleString('fa-IR')})` + : tab.label, + } + }), + [tabCounts], + ) + const filteredInvoices = useMemo(() => { let result = invoices @@ -150,7 +171,7 @@ const ProformaInvoice: FC = () => {
setActiveTab(tab as ProformaInvoiceStatusEnum)} /> diff --git a/src/pages/invoice/hooks/useInvoiceData.ts b/src/pages/invoice/hooks/useInvoiceData.ts index 3a57d65..4cea385 100644 --- a/src/pages/invoice/hooks/useInvoiceData.ts +++ b/src/pages/invoice/hooks/useInvoiceData.ts @@ -1,4 +1,4 @@ -import { useMutation, useQuery } from "@tanstack/react-query"; +import { useMutation, useQuery, useQueryClient } from "@tanstack/react-query"; import * as api from "../service/InvoiceService"; export const useGetInvoices = (params: api.GetInvoicesParams) => { @@ -8,6 +8,14 @@ export const useGetInvoices = (params: api.GetInvoicesParams) => { }); }; +export const useGetInvoiceTabCounts = () => { + return useQuery({ + queryKey: ["invoice-tab-counts"], + queryFn: () => api.getInvoiceTabCounts(), + refetchInterval: 20_000, + }); +}; + export const useGetInvoiceDetail = (id: string) => { return useQuery({ queryKey: ["invoice", id], @@ -17,7 +25,14 @@ export const useGetInvoiceDetail = (id: string) => { }; export const useConfirmInvoiceItem = () => { + const queryClient = useQueryClient(); + return useMutation({ mutationFn: api.confrimInvoiceItem, + onSuccess: () => { + queryClient.invalidateQueries({ queryKey: ["invoices"] }); + queryClient.invalidateQueries({ queryKey: ["invoice"] }); + queryClient.invalidateQueries({ queryKey: ["invoice-tab-counts"] }); + }, }); }; diff --git a/src/pages/invoice/service/InvoiceService.ts b/src/pages/invoice/service/InvoiceService.ts index 9040844..1c5abb4 100644 --- a/src/pages/invoice/service/InvoiceService.ts +++ b/src/pages/invoice/service/InvoiceService.ts @@ -4,11 +4,18 @@ import type { InvoiceDetailResponseType, } from "../types/InvoiceTypes"; import type { InvoiceConfirmStatus } from "../enum/InvoiceEnum"; +import type { BaseResponse } from "@/shared/types/Types"; export type GetInvoicesParams = { statuses?: InvoiceConfirmStatus[]; }; +export type InvoiceTabCountsResponseType = { + pending: number; + confirmed: number; + archived: number; +}; + export const getInvoices = async ( params: GetInvoicesParams = {}, ): Promise => { @@ -21,6 +28,13 @@ export const getInvoices = async ( return data; }; +export const getInvoiceTabCounts = async (): Promise => { + const { data } = await axios.get>( + "/public/invoice/tab-counts", + ); + return data.data; +}; + export const getInvoiceDetail = async ( id: string, ): Promise => {