From 578ecc1d768738f3ece2cd4237463bd2d61f288f Mon Sep 17 00:00:00 2001 From: hamid zarghami Date: Sat, 21 Feb 2026 15:54:50 +0330 Subject: [PATCH] confimed order --- src/components/DefaulModal.tsx | 2 +- src/components/ModalConfirm.tsx | 48 +++++++++++++++++++ src/pages/invoice/Detail.tsx | 51 +++++++++++++++++---- src/pages/invoice/hooks/useInvoiceData.ts | 8 +++- src/pages/invoice/service/InvoiceService.ts | 9 +++- 5 files changed, 105 insertions(+), 13 deletions(-) create mode 100644 src/components/ModalConfirm.tsx diff --git a/src/components/DefaulModal.tsx b/src/components/DefaulModal.tsx index 67729e8..4136d77 100644 --- a/src/components/DefaulModal.tsx +++ b/src/components/DefaulModal.tsx @@ -27,7 +27,7 @@ const DefaulModal: FC = (props: Props) => {
-
+
{ props.isHeader && props.title_header && diff --git a/src/components/ModalConfirm.tsx b/src/components/ModalConfirm.tsx new file mode 100644 index 0000000..85805d9 --- /dev/null +++ b/src/components/ModalConfirm.tsx @@ -0,0 +1,48 @@ +import { type FC } from 'react' +import DefaulModal from './DefaulModal' +import Button from './Button' + +interface Props { + open: boolean + onClose: () => void + onConfirm: () => void + title?: string + message?: string + confirmLabel?: string + cancelLabel?: string + isLoading?: boolean +} + +const ModalConfirm: FC = ({ + open, + onClose, + onConfirm, + title = 'تایید', + message = 'آیا از انجام این عمل اطمینان دارید؟', + confirmLabel = 'تایید', + cancelLabel = 'انصراف', + isLoading = false, +}) => { + return ( + +
+

{message}

+
+
+
+
+ ) +} + +export default ModalConfirm diff --git a/src/pages/invoice/Detail.tsx b/src/pages/invoice/Detail.tsx index 89e089c..e570be7 100644 --- a/src/pages/invoice/Detail.tsx +++ b/src/pages/invoice/Detail.tsx @@ -1,11 +1,13 @@ -import { type FC } from 'react' +import { type FC, useState } from 'react' import { Helmet } from 'react-helmet-async' import { Printer, TickCircle } from 'iconsax-react' +import ModalConfirm from '@/components/ModalConfirm' import Button from '@/components/Button' import Table from '@/components/Table' import type { RowDataType } from '@/components/types/TableTypes' import { useParams } from 'react-router-dom' -import { useGetInvoiceDetail } from './hooks/useInvoiceData' +import { useQueryClient } from '@tanstack/react-query' +import { useConfirmInvoiceItem, useGetInvoiceDetail } from './hooks/useInvoiceData' import { NumberFormat } from '@/config/func' import moment from 'moment-jalaali' import type { InvoiceItem as ApiInvoiceItem } from './types/InvoiceTypes' @@ -25,7 +27,10 @@ const formatPrice = (num: number) => `${NumberFormat(num)} تومان` const InvoiceDetail: FC = () => { const { id } = useParams() + const queryClient = useQueryClient() const { data, isPending } = useGetInvoiceDetail(id!) + const { mutate: confirmInvoiceItem, isPending: isConfirming } = useConfirmInvoiceItem() + const [confirmingItemId, setConfirmingItemId] = useState(null) const invoice = data?.data const invoiceData = invoice @@ -62,6 +67,16 @@ const InvoiceDetail: FC = () => { window.print() } + const handleConfirmProforma = () => { + if (!confirmingItemId) return + confirmInvoiceItem(confirmingItemId, { + onSuccess: () => { + queryClient.invalidateQueries({ queryKey: ['invoice', id] }) + setConfirmingItemId(null) + }, + }) + } + const columns = [ { key: 'title', @@ -86,14 +101,21 @@ const InvoiceDetail: FC = () => { { key: 'image', title: '', - render: () => ( -
- - + ) : null ) } ] @@ -233,6 +255,17 @@ const InvoiceDetail: FC = () => {
+ + setConfirmingItemId(null)} + onConfirm={handleConfirmProforma} + title='تایید پیش فاکتور' + message='آیا از تایید این پیش فاکتور اطمینان دارید؟' + confirmLabel='تایید' + cancelLabel='انصراف' + isLoading={isConfirming} + /> ) } diff --git a/src/pages/invoice/hooks/useInvoiceData.ts b/src/pages/invoice/hooks/useInvoiceData.ts index 9419090..0b7d276 100644 --- a/src/pages/invoice/hooks/useInvoiceData.ts +++ b/src/pages/invoice/hooks/useInvoiceData.ts @@ -1,4 +1,4 @@ -import { useQuery } from "@tanstack/react-query"; +import { useMutation, useQuery } from "@tanstack/react-query"; import * as api from "../service/InvoiceService"; export const useGetInvoices = () => { @@ -15,3 +15,9 @@ export const useGetInvoiceDetail = (id: string) => { enabled: !!id, }); }; + +export const useConfirmInvoiceItem = () => { + return useMutation({ + mutationFn: api.confrimInvoiceItem, + }); +}; diff --git a/src/pages/invoice/service/InvoiceService.ts b/src/pages/invoice/service/InvoiceService.ts index fa9a41c..52d142a 100644 --- a/src/pages/invoice/service/InvoiceService.ts +++ b/src/pages/invoice/service/InvoiceService.ts @@ -10,10 +10,15 @@ export const getInvoices = async (): Promise => { }; export const getInvoiceDetail = async ( - id: string + id: string, ): Promise => { const { data } = await axios.get( - `/public/invoice/${id}` + `/public/invoice/${id}`, ); return data; }; + +export const confrimInvoiceItem = async (id: string) => { + const { data } = await axios.post(`/public/invoice/item/${id}/confirm`); + return data; +};