import { useState } from 'react' import { useQuery } from '@tanstack/react-query' import { queryOptions } from '@tanstack/react-query' import { api } from '@/lib/api-client' import { usePOSStore } from '@/stores/pos.store' import { Dialog, DialogContent, DialogHeader, DialogTitle } from '@/components/ui/dialog' import { Input } from '@/components/ui/input' import { Button } from '@/components/ui/button' import { Badge } from '@/components/ui/badge' import { Printer } from 'lucide-react' import { POSReceipt, printReceipt, downloadReceiptPDF } from './pos-receipt' import type { Transaction } from '@/api/pos' interface ReceiptData { transaction: Transaction & { lineItems: { description: string; qty: number; unitPrice: string; taxAmount: string; lineTotal: string; discountAmount: string }[] } company: { name: string; phone: string | null; email: string | null; address: { street?: string; city?: string; state?: string; zip?: string } | null } location: { name: string; phone: string | null; email: string | null; address: { street?: string; city?: string; state?: string; zip?: string } | null } } interface AppConfigEntry { key: string; value: string | null } function recentTransactionsOptions(search: string) { return queryOptions({ queryKey: ['pos', 'recent-transactions', search], queryFn: () => api.get<{ data: Transaction[] }>('/v1/transactions', { limit: 15, sort: 'created_at', order: 'desc', ...(search ? { q: search } : {}), }), }) } interface POSTransactionsDialogProps { open: boolean onOpenChange: (open: boolean) => void } export function POSTransactionsDialog({ open, onOpenChange }: POSTransactionsDialogProps) { const [search, setSearch] = useState('') const [receiptTxnId, setReceiptTxnId] = useState(null) const { data: txnData } = useQuery({ ...recentTransactionsOptions(search), enabled: open, }) const transactions = txnData?.data ?? [] // Fetch receipt for selected transaction const { data: receiptData } = useQuery({ queryKey: ['pos', 'receipt', receiptTxnId], queryFn: () => api.get(`/v1/transactions/${receiptTxnId}/receipt`), enabled: !!receiptTxnId, }) const { data: configData } = useQuery({ queryKey: ['config'], queryFn: () => api.get<{ data: AppConfigEntry[] }>('/v1/config'), enabled: !!receiptTxnId, }) const receiptFormat = usePOSStore((s) => s.receiptFormat) const receiptConfig = { header: configData?.data?.find((c) => c.key === 'receipt_header')?.value || undefined, footer: configData?.data?.find((c) => c.key === 'receipt_footer')?.value || undefined, returnPolicy: configData?.data?.find((c) => c.key === 'receipt_return_policy')?.value || undefined, social: configData?.data?.find((c) => c.key === 'receipt_social')?.value || undefined, } // Receipt view if (receiptTxnId && receiptData) { return (
) } return ( Recent Transactions setSearch(e.target.value)} placeholder="Search by transaction number..." className="h-10" autoFocus />
{transactions.length === 0 ? (

No transactions found

) : (
{transactions.map((txn) => ( ))}
)}
) }