import Button from '@/components/Button';
import { BaseDeliveryOrder, Marketing } from '@/types/api/marketing/marketing';
import { Icon } from '@iconify/react';
import { Document, Page, pdf, Text, View } from '@react-pdf/renderer';
import { useMemo, useState } from 'react';
import { formatDate, formatNumber, formatVechicleNumber } from '@/lib/helper';
import pdfStyles from '@/components/pages/marketing/pdf/styles/MarketingPDFStyles';
import toast from 'react-hot-toast';
import { useSearchParams } from 'next/navigation';
interface DeliveryOrderExportProps {
data?: Marketing;
deliveryOrder: BaseDeliveryOrder;
className?: string;
}
const DeliveryOrderExport = ({
data,
deliveryOrder,
}: DeliveryOrderExportProps) => {
const [isGeneratingPDF, setIsGeneratingPDF] = useState(false);
const salesData = data;
const searchParams = useSearchParams();
const action = searchParams.get('action');
const id = searchParams.get('id');
const handleDownloadPDF = async () => {
if (!salesData) {
toast.error('No sales order data available');
return;
}
setIsGeneratingPDF(true);
try {
const blob = await pdf(
).toBlob();
const url = window.URL.createObjectURL(blob);
const link = document.createElement('a');
link.style.display = 'none';
link.href = url;
link.download = `${deliveryOrder?.do_number || 'delivery-order'}.pdf`;
link.setAttribute('target', '_blank');
link.setAttribute('rel', 'noopener noreferrer');
document.body.appendChild(link);
link.click();
// Delay cleanup to ensure download starts
setTimeout(() => {
document.body.removeChild(link);
window.URL.revokeObjectURL(url);
}, 150);
} catch {
toast.error('Failed to generate PDF. Please try again.');
} finally {
setIsGeneratingPDF(false);
window.location.href = `/marketing?action=${action}&id=${id}`;
}
};
if (!salesData) {
return (
No sales order data available
);
}
return deliveryOrder?.do_number ? (
) : null;
};
export default DeliveryOrderExport;
const PDFDocument = ({
data,
deliveryOrder,
}: {
data: Marketing;
deliveryOrder: BaseDeliveryOrder;
}) => {
const grandTotal = useMemo(() => {
return (
deliveryOrder.deliveries?.reduce((a, b) => a + b.total_price, 0) ?? 0
);
}, []);
return (
{/* Header Section */}
PT LUMBUNG TELUR INDONESIA
SOHO Building Lt.3 (Paris Van Java), Jalan Karang Tinggal, Kel.
Cipedes, Kec. Sukajadi, Kota Bandung 40162
{/* Delivery Order Title */}
DELIVERY ORDER
{deliveryOrder.do_number || '-'}
{/* Depature Table */}
Ship To
Depature From
{data?.customer?.name || '-'} ({data?.customer?.type || '-'})
{data?.customer.email || ''} - {data?.customer.phone || ''}
{data?.customer.address || ''}
{deliveryOrder.warehouse?.name || '-'}
{formatDate(deliveryOrder.delivery_date, 'DD MMM YYYY')}
{deliveryOrder.warehouse?.area?.name}
{/* Delivery Table */}
Product Shipped
Item Description
Vehicle Number
Unit Price
Quantity
Total Amount
{deliveryOrder.deliveries?.map((item, index) => {
return (
{item.product_warehouse?.product?.name || '-'}
{formatVechicleNumber(item.vehicle_number) || '-'}
Rp{formatNumber(item.unit_price || 0)}
{formatNumber(item.qty || 0)}
Rp{formatNumber(item.total_price || 0)}
);
}) || []}
{/* Grand Total Row inside table */}
Grand Total
Rp{formatNumber(grandTotal)}
{/* Footer with Special Instructions */}
From Sales Order
{data?.so_number || '-'} -{' '}
{formatDate(data.so_date, 'DD MMM YYYY')}
PT LUMBUNG TELUR INDONESIA
);
};