diff --git a/src/app/api/v1/invoices/[id]/generate-pdf/route.ts b/src/app/api/v1/invoices/[id]/generate-pdf/route.ts deleted file mode 100644 index 8bebe9db..00000000 --- a/src/app/api/v1/invoices/[id]/generate-pdf/route.ts +++ /dev/null @@ -1,21 +0,0 @@ -import { NextResponse } from 'next/server'; - -import { withAuth, withPermission } from '@/lib/api/helpers'; -import { errorResponse } from '@/lib/errors'; -import { generateInvoicePdf } from '@/lib/services/invoices'; - -export const POST = withAuth( - withPermission('invoices', 'edit', async (_req, ctx, params) => { - try { - const fileRecord = await generateInvoicePdf(params.id!, ctx.portId, { - userId: ctx.userId, - portId: ctx.portId, - ipAddress: ctx.ipAddress, - userAgent: ctx.userAgent, - }); - return NextResponse.json({ data: fileRecord }); - } catch (error) { - return errorResponse(error); - } - }), -); diff --git a/src/components/invoices/invoice-detail.tsx b/src/components/invoices/invoice-detail.tsx index c0dae673..b8b5611e 100644 --- a/src/components/invoices/invoice-detail.tsx +++ b/src/components/invoices/invoice-detail.tsx @@ -23,7 +23,6 @@ import { SelectValue, } from '@/components/ui/select'; import { Tabs, TabsContent, TabsList, TabsTrigger } from '@/components/ui/tabs'; -import { InvoicePdfPreview } from './invoice-pdf-preview'; import { apiFetch } from '@/lib/api/client'; import { toastError } from '@/lib/api/toast-error'; import { useMobileChrome } from '@/components/layout/mobile/mobile-layout-provider'; @@ -218,7 +217,6 @@ export function InvoiceDetail({ invoiceId }: InvoiceDetailProps) { Overview Linked Expenses - PDF Preview Payment @@ -360,11 +358,6 @@ export function InvoiceDetail({ invoiceId }: InvoiceDetailProps) { )} - {/* PDF Preview */} - - - - {/* Payment */} {invoice.status === 'paid' ? ( diff --git a/src/components/invoices/invoice-pdf-preview.tsx b/src/components/invoices/invoice-pdf-preview.tsx deleted file mode 100644 index ccc2708a..00000000 --- a/src/components/invoices/invoice-pdf-preview.tsx +++ /dev/null @@ -1,104 +0,0 @@ -'use client'; - -import { useState } from 'react'; -import { useQuery, useMutation, useQueryClient } from '@tanstack/react-query'; -import { Loader2, RefreshCw, FileText } from 'lucide-react'; - -import { Button } from '@/components/ui/button'; -import { apiFetch } from '@/lib/api/client'; - -interface InvoicePdfPreviewProps { - invoiceId: string; - pdfFileId?: string | null; -} - -export function InvoicePdfPreview({ - invoiceId, - pdfFileId: initialPdfFileId, -}: InvoicePdfPreviewProps) { - const queryClient = useQueryClient(); - const [pdfFileId, setPdfFileId] = useState(initialPdfFileId); - - const { data: previewData, isLoading: previewLoading } = useQuery<{ - url: string; - mimeType: string; - }>({ - queryKey: ['file-preview', pdfFileId], - queryFn: () => apiFetch(`/api/v1/files/${pdfFileId}/preview`), - enabled: !!pdfFileId, - }); - - const regenerateMutation = useMutation({ - mutationFn: () => - apiFetch<{ data?: { id?: string } }>(`/api/v1/invoices/${invoiceId}/generate-pdf`, { - method: 'POST', - }), - onSuccess: (data) => { - const fileId = data?.data?.id; - if (fileId) { - setPdfFileId(fileId); - queryClient.invalidateQueries({ queryKey: ['invoices', invoiceId] }); - queryClient.invalidateQueries({ queryKey: ['file-preview', fileId] }); - } - }, - }); - - if (!pdfFileId) { - return ( -
- -

No PDF generated yet

- -
- ); - } - - return ( -
-
- -
- - {previewLoading ? ( -
- -
- ) : previewData?.url ? ( -