@agentpaid/paid-nextjs-client 0.2.1 → 0.3.0-test.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (52) hide show
  1. package/dist/api/api/handlePaidInvoicePdf.ts +79 -0
  2. package/dist/api/api/handlePaidInvoices.ts +77 -0
  3. package/dist/api/api/handlePaidPayments.ts +77 -0
  4. package/dist/api/handlePaidInvoicePdf.d.ts +6 -0
  5. package/dist/api/handlePaidInvoicePdf.d.ts.map +1 -0
  6. package/dist/api/handlePaidInvoicePdf.js +60 -0
  7. package/dist/api/handlePaidInvoicePdf.js.map +1 -0
  8. package/dist/api/handlePaidInvoices.d.ts +6 -0
  9. package/dist/api/handlePaidInvoices.d.ts.map +1 -0
  10. package/dist/api/handlePaidInvoices.js +56 -0
  11. package/dist/api/handlePaidInvoices.js.map +1 -0
  12. package/dist/api/handlePaidPayments.d.ts +6 -0
  13. package/dist/api/handlePaidPayments.d.ts.map +1 -0
  14. package/dist/api/handlePaidPayments.js +56 -0
  15. package/dist/api/handlePaidPayments.js.map +1 -0
  16. package/dist/components/PaidActivityLog.d.ts +0 -1
  17. package/dist/components/PaidActivityLog.d.ts.map +1 -1
  18. package/dist/components/PaidActivityLog.js +13 -3
  19. package/dist/components/PaidActivityLog.js.map +1 -1
  20. package/dist/components/PaidContainer.d.ts +45 -0
  21. package/dist/components/PaidContainer.d.ts.map +1 -0
  22. package/dist/components/PaidContainer.js +29 -0
  23. package/dist/components/PaidContainer.js.map +1 -0
  24. package/dist/components/PaidInvoiceTable.d.ts +35 -0
  25. package/dist/components/PaidInvoiceTable.d.ts.map +1 -0
  26. package/dist/components/PaidInvoiceTable.js +138 -0
  27. package/dist/components/PaidInvoiceTable.js.map +1 -0
  28. package/dist/components/PaidPaymentsTable.d.ts +35 -0
  29. package/dist/components/PaidPaymentsTable.d.ts.map +1 -0
  30. package/dist/components/PaidPaymentsTable.js +99 -0
  31. package/dist/components/PaidPaymentsTable.js.map +1 -0
  32. package/dist/components/components/PaidActivityLog.js +31 -9
  33. package/dist/components/components/PaidContainer.js +113 -0
  34. package/dist/components/components/PaidInvoiceTable.js +321 -0
  35. package/dist/components/components/PaidPaymentsTable.js +216 -0
  36. package/dist/hooks/useCache.d.ts +12 -0
  37. package/dist/hooks/useCache.d.ts.map +1 -0
  38. package/dist/hooks/useCache.js +43 -0
  39. package/dist/hooks/useCache.js.map +1 -0
  40. package/dist/index.d.ts +7 -1
  41. package/dist/index.d.ts.map +1 -1
  42. package/dist/index.js +7 -1
  43. package/dist/index.js.map +1 -1
  44. package/dist/styles/paid-container.css +139 -0
  45. package/dist/styles/paid-invoice-table.css +344 -0
  46. package/dist/styles/paid-payments-table.css +238 -0
  47. package/dist/tsconfig.tsbuildinfo +1 -1
  48. package/dist/utils/cache.d.ts +30 -0
  49. package/dist/utils/cache.d.ts.map +1 -0
  50. package/dist/utils/cache.js +101 -0
  51. package/dist/utils/cache.js.map +1 -0
  52. package/package.json +9 -3
@@ -0,0 +1,35 @@
1
+ import React from 'react';
2
+ import '../styles/paid-invoice-table.css';
3
+ interface PaidStyleProperties {
4
+ paidTitleColor?: string;
5
+ paidTitleFontWeight?: string;
6
+ paidFontFamily?: string;
7
+ paidWrapperBorder?: string;
8
+ paidHeaderBorderBottom?: string;
9
+ paidThBorderBottom?: string;
10
+ paidTdBorderBottom?: string;
11
+ paidTdBg?: string;
12
+ paidTdFontWeight?: string;
13
+ paidTitleFontSize?: string;
14
+ paidToggleFontSize?: string;
15
+ paidToggleFontWeight?: string;
16
+ paidToggleColor?: string;
17
+ paidThFontSize?: string;
18
+ paidThFontWeight?: string;
19
+ paidThColor?: string;
20
+ paidTdFontSize?: string;
21
+ paidTdColor?: string;
22
+ paidEmptyColor?: string;
23
+ paidWrapperBg?: string;
24
+ paidHeaderBg?: string;
25
+ paidTableBg?: string;
26
+ paidThBg?: string;
27
+ paidRowHoverBg?: string;
28
+ }
29
+ interface PaidInvoiceTableProps {
30
+ accountExternalId: string;
31
+ paidStyle?: PaidStyleProperties;
32
+ }
33
+ export declare const PaidInvoiceTable: React.FC<PaidInvoiceTableProps>;
34
+ export {};
35
+ //# sourceMappingURL=PaidInvoiceTable.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"PaidInvoiceTable.d.ts","sourceRoot":"","sources":["../../src/components/PaidInvoiceTable.tsx"],"names":[],"mappings":"AAEA,OAAO,KAA8B,MAAM,OAAO,CAAC;AAGnD,OAAO,kCAAkC,CAAC;AAE1C,UAAU,mBAAmB;IACzB,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,mBAAmB,CAAC,EAAE,MAAM,CAAC;IAC7B,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,sBAAsB,CAAC,EAAE,MAAM,CAAC;IAChC,kBAAkB,CAAC,EAAE,MAAM,CAAC;IAC5B,kBAAkB,CAAC,EAAE,MAAM,CAAC;IAC5B,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,kBAAkB,CAAC,EAAE,MAAM,CAAC;IAC5B,oBAAoB,CAAC,EAAE,MAAM,CAAC;IAC9B,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,cAAc,CAAC,EAAE,MAAM,CAAC;CAC3B;AAqBD,UAAU,qBAAqB;IAC3B,iBAAiB,EAAE,MAAM,CAAC;IAC1B,SAAS,CAAC,EAAE,mBAAmB,CAAC;CACnC;AAED,eAAO,MAAM,gBAAgB,EAAE,KAAK,CAAC,EAAE,CAAC,qBAAqB,CAsQ5D,CAAC"}
@@ -0,0 +1,138 @@
1
+ 'use client';
2
+ import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
3
+ import { useEffect, useState } from 'react';
4
+ import { useIsInContainer } from './PaidContainer';
5
+ import { getCacheKey, CACHE_TTL, dataCache } from '../utils/cache';
6
+ import '../styles/paid-invoice-table.css';
7
+ export const PaidInvoiceTable = ({ accountExternalId, paidStyle = {} }) => {
8
+ const [invoices, setInvoices] = useState([]);
9
+ const [loading, setLoading] = useState(true);
10
+ const [error, setError] = useState(null);
11
+ const [isPreviewOpen, setIsPreviewOpen] = useState(false);
12
+ const [pdfResponse, setPdfResponse] = useState(null);
13
+ const [selectedInvoice, setSelectedInvoice] = useState(null);
14
+ const [loadingPdf, setLoadingPdf] = useState(false);
15
+ const isInContainer = useIsInContainer();
16
+ // Convert paidStyle entries into CSS custom properties
17
+ const cssVariables = Object.entries(paidStyle).reduce((vars, [key, value]) => {
18
+ let varName;
19
+ if (key.startsWith('--')) {
20
+ varName = key;
21
+ }
22
+ else {
23
+ const raw = key.replace(/([A-Z])/g, '-$1').toLowerCase();
24
+ varName = raw.startsWith('--') ? raw : `--${raw}`;
25
+ }
26
+ // @ts-ignore allow custom property
27
+ vars[varName] = value;
28
+ return vars;
29
+ }, {});
30
+ const formatCurrency = (amount) => {
31
+ return new Intl.NumberFormat("en-US", {
32
+ style: "currency",
33
+ currency: "USD",
34
+ minimumFractionDigits: 2,
35
+ maximumFractionDigits: 2,
36
+ }).format(amount / 100);
37
+ };
38
+ const formatDate = (dateString) => {
39
+ return new Date(dateString).toLocaleDateString('en-US', {
40
+ year: 'numeric',
41
+ month: 'short',
42
+ day: 'numeric'
43
+ });
44
+ };
45
+ const getStatusBadge = (status) => {
46
+ const statusClass = `paid-invoice-status paid-invoice-status-${status.toLowerCase()}`;
47
+ const displayStatus = status.charAt(0).toUpperCase() + status.slice(1).toLowerCase();
48
+ return _jsx("span", { className: statusClass, children: displayStatus });
49
+ };
50
+ const handlePreview = async (invoice) => {
51
+ try {
52
+ setLoadingPdf(true);
53
+ setSelectedInvoice(invoice);
54
+ // Check cache first for PDF
55
+ const pdfCacheKey = getCacheKey.invoicePdf(invoice.id);
56
+ const cachedPdf = dataCache.get(pdfCacheKey);
57
+ if (cachedPdf) {
58
+ setPdfResponse(cachedPdf);
59
+ setIsPreviewOpen(true);
60
+ setLoadingPdf(false);
61
+ return;
62
+ }
63
+ // Fetch PDF if not cached
64
+ const response = await fetch(`/api/invoice-pdf/${invoice.id}`);
65
+ if (!response.ok) {
66
+ throw new Error('Failed to fetch PDF');
67
+ }
68
+ const data = await response.json();
69
+ const pdfData = "data:application/pdf;base64," + data.data.pdfBytes;
70
+ // Cache the PDF data
71
+ dataCache.set(pdfCacheKey, pdfData, CACHE_TTL.PDF);
72
+ setPdfResponse(pdfData);
73
+ setIsPreviewOpen(true);
74
+ }
75
+ catch (error) {
76
+ console.error('Error fetching PDF:', error);
77
+ alert('Failed to load PDF preview');
78
+ }
79
+ finally {
80
+ setLoadingPdf(false);
81
+ }
82
+ };
83
+ const handleDownload = () => {
84
+ if (!pdfResponse || !selectedInvoice)
85
+ return;
86
+ const base64WithoutPrefix = pdfResponse.split(",")[1];
87
+ const byteCharacters = atob(base64WithoutPrefix);
88
+ const byteNumbers = new Array(byteCharacters.length)
89
+ .fill(0)
90
+ .map((_, i) => byteCharacters.charCodeAt(i));
91
+ const byteArray = new Uint8Array(byteNumbers);
92
+ const blob = new Blob([byteArray], { type: "application/pdf" });
93
+ const url = URL.createObjectURL(blob);
94
+ const a = document.createElement("a");
95
+ a.href = url;
96
+ a.download = `invoice-${selectedInvoice.number}.pdf`;
97
+ document.body.appendChild(a);
98
+ a.click();
99
+ document.body.removeChild(a);
100
+ URL.revokeObjectURL(url);
101
+ };
102
+ useEffect(() => {
103
+ const fetchInvoiceData = async () => {
104
+ try {
105
+ setLoading(true);
106
+ // TEMPORARILY DISABLED: Use cached fetch for invoice data
107
+ // const cacheKey = getCacheKey.invoices(accountExternalId);
108
+ // const data = await cachedFetch<InvoiceApiResponse>(
109
+ // `/api/invoices/${accountExternalId}`,
110
+ // cacheKey,
111
+ // CACHE_TTL.DATA
112
+ // );
113
+ // Direct fetch without caching
114
+ const response = await fetch(`/api/invoices/${accountExternalId}`);
115
+ if (!response.ok) {
116
+ throw new Error(`Failed to fetch: ${response.statusText}`);
117
+ }
118
+ const data = await response.json();
119
+ setInvoices(data.data || []);
120
+ }
121
+ catch (err) {
122
+ setError(err instanceof Error ? err.message : 'An error occurred');
123
+ }
124
+ finally {
125
+ setLoading(false);
126
+ }
127
+ };
128
+ fetchInvoiceData();
129
+ }, [accountExternalId]);
130
+ if (loading) {
131
+ return _jsx("div", { children: "Loading invoice data..." });
132
+ }
133
+ if (error) {
134
+ return _jsxs("div", { children: ["Error: ", error] });
135
+ }
136
+ return (_jsxs(_Fragment, { children: [_jsx("div", { className: "paid-invoice-container", style: { ...cssVariables }, children: _jsxs("div", { className: "paid-invoice-table-wrapper", children: [!isInContainer && (_jsx("div", { className: "paid-invoice-header", children: _jsx("h3", { className: "paid-invoice-title", children: "Invoices" }) })), _jsx("div", { style: { background: '#fff', overflow: 'auto' }, children: _jsxs("table", { className: "paid-invoice-table", children: [_jsx("thead", { children: _jsxs("tr", { children: [_jsx("th", { children: "Invoice Number" }), _jsx("th", { children: "Status" }), _jsx("th", { children: "Invoice Date" }), _jsx("th", { children: "Due Date" }), _jsx("th", { style: { textAlign: 'right' }, children: "Total amount" }), _jsx("th", { style: { textAlign: 'center' }, children: "Actions" })] }) }), _jsx("tbody", { children: invoices.length === 0 ? (_jsx("tr", { children: _jsx("td", { colSpan: 6, className: "paid-invoice-empty", children: "No invoices found" }) })) : (invoices.map((invoice) => (_jsxs("tr", { children: [_jsxs("td", { style: { fontWeight: 500 }, children: ["INV-", invoice.number] }), _jsx("td", { children: getStatusBadge(invoice.status) }), _jsx("td", { children: formatDate(invoice.issueDate) }), _jsx("td", { children: formatDate(invoice.dueDate) }), _jsx("td", { style: { textAlign: 'right', fontWeight: 500 }, children: formatCurrency(invoice.invoiceTotal) }), _jsx("td", { style: { textAlign: 'center' }, children: _jsx("button", { className: "paid-invoice-action-btn", onClick: () => handlePreview(invoice), disabled: loadingPdf, title: "Preview Invoice", children: loadingPdf ? (_jsx("svg", { width: "16", height: "16", viewBox: "0 0 16 16", fill: "none", children: _jsx("circle", { cx: "8", cy: "8", r: "6", stroke: "currentColor", strokeWidth: "2", fill: "none", strokeDasharray: "37.7", strokeDashoffset: "37.7", children: _jsx("animateTransform", { attributeName: "transform", type: "rotate", values: "0 8 8;360 8 8", dur: "1s", repeatCount: "indefinite" }) }) })) : (_jsxs("svg", { width: "16", height: "16", viewBox: "0 0 16 16", fill: "none", children: [_jsx("path", { d: "M2 2h8l4 4v8a1 1 0 01-1 1H2a1 1 0 01-1-1V3a1 1 0 011-1z", stroke: "currentColor", strokeWidth: "1.5", fill: "none" }), _jsx("path", { d: "M10 2v4h4", stroke: "currentColor", strokeWidth: "1.5", fill: "none" }), _jsx("path", { d: "M5 9h6M5 11h4", stroke: "currentColor", strokeWidth: "1.5" })] })) }) })] }, invoice.id)))) })] }) })] }) }), isPreviewOpen && (_jsx("div", { className: "paid-invoice-modal-overlay", onClick: () => setIsPreviewOpen(false), children: _jsxs("div", { className: "paid-invoice-modal-content", onClick: (e) => e.stopPropagation(), children: [_jsxs("div", { className: "paid-invoice-modal-header", children: [_jsxs("h3", { children: ["Invoice Preview - INV-", selectedInvoice === null || selectedInvoice === void 0 ? void 0 : selectedInvoice.number] }), _jsxs("div", { className: "paid-invoice-modal-actions", children: [_jsx("button", { className: "paid-invoice-modal-btn paid-invoice-modal-btn-download", onClick: handleDownload, title: "Download PDF", children: _jsx("svg", { width: "16", height: "16", viewBox: "0 0 24 24", fill: "none", stroke: "currentColor", strokeWidth: "2", children: _jsx("path", { d: "M4 16v1a3 3 0 003 3h10a3 3 0 003-3v-1m-4-4l-4 4m0 0l-4-4m4 4V4" }) }) }), _jsx("button", { className: "paid-invoice-modal-btn paid-invoice-modal-btn-close", onClick: () => setIsPreviewOpen(false), title: "Close", children: _jsxs("svg", { width: "16", height: "16", viewBox: "0 0 24 24", fill: "none", stroke: "currentColor", strokeWidth: "2", children: [_jsx("line", { x1: "18", y1: "6", x2: "6", y2: "18" }), _jsx("line", { x1: "6", y1: "6", x2: "18", y2: "18" })] }) })] })] }), _jsx("div", { className: "paid-invoice-modal-body", children: pdfResponse ? (_jsx("iframe", { src: pdfResponse, width: "100%", height: "100%", style: { border: 'none' }, title: "Invoice PDF" })) : (_jsx("div", { className: "paid-invoice-modal-loading", children: "Loading PDF..." })) })] }) }))] }));
137
+ };
138
+ //# sourceMappingURL=PaidInvoiceTable.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"PaidInvoiceTable.js","sourceRoot":"","sources":["../../src/components/PaidInvoiceTable.tsx"],"names":[],"mappings":"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"}
@@ -0,0 +1,35 @@
1
+ import React from 'react';
2
+ import '../styles/paid-payments-table.css';
3
+ interface PaidStyleProperties {
4
+ paidTitleColor?: string;
5
+ paidTitleFontWeight?: string;
6
+ paidFontFamily?: string;
7
+ paidWrapperBorder?: string;
8
+ paidHeaderBorderBottom?: string;
9
+ paidThBorderBottom?: string;
10
+ paidTdBorderBottom?: string;
11
+ paidTdBg?: string;
12
+ paidTdFontWeight?: string;
13
+ paidTitleFontSize?: string;
14
+ paidToggleFontSize?: string;
15
+ paidToggleFontWeight?: string;
16
+ paidToggleColor?: string;
17
+ paidThFontSize?: string;
18
+ paidThFontWeight?: string;
19
+ paidThColor?: string;
20
+ paidTdFontSize?: string;
21
+ paidTdColor?: string;
22
+ paidEmptyColor?: string;
23
+ paidWrapperBg?: string;
24
+ paidHeaderBg?: string;
25
+ paidTableBg?: string;
26
+ paidThBg?: string;
27
+ paidRowHoverBg?: string;
28
+ }
29
+ interface PaidPaymentsTableProps {
30
+ accountExternalId: string;
31
+ paidStyle?: PaidStyleProperties;
32
+ }
33
+ export declare const PaidPaymentsTable: React.FC<PaidPaymentsTableProps>;
34
+ export default PaidPaymentsTable;
35
+ //# sourceMappingURL=PaidPaymentsTable.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"PaidPaymentsTable.d.ts","sourceRoot":"","sources":["../../src/components/PaidPaymentsTable.tsx"],"names":[],"mappings":"AAEA,OAAO,KAA8B,MAAM,OAAO,CAAC;AAGnD,OAAO,mCAAmC,CAAC;AAE3C,UAAU,mBAAmB;IACzB,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,mBAAmB,CAAC,EAAE,MAAM,CAAC;IAC7B,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,sBAAsB,CAAC,EAAE,MAAM,CAAC;IAChC,kBAAkB,CAAC,EAAE,MAAM,CAAC;IAC5B,kBAAkB,CAAC,EAAE,MAAM,CAAC;IAC5B,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,kBAAkB,CAAC,EAAE,MAAM,CAAC;IAC5B,oBAAoB,CAAC,EAAE,MAAM,CAAC;IAC9B,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,cAAc,CAAC,EAAE,MAAM,CAAC;CAC3B;AAeD,UAAU,sBAAsB;IAC5B,iBAAiB,EAAE,MAAM,CAAC;IAC1B,SAAS,CAAC,EAAE,mBAAmB,CAAC;CACnC;AAED,eAAO,MAAM,iBAAiB,EAAE,KAAK,CAAC,EAAE,CAAC,sBAAsB,CAiK9D,CAAC;AAEF,eAAe,iBAAiB,CAAC"}
@@ -0,0 +1,99 @@
1
+ 'use client';
2
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
3
+ import { useEffect, useState } from 'react';
4
+ import { useIsInContainer } from './PaidContainer';
5
+ import '../styles/paid-payments-table.css';
6
+ export const PaidPaymentsTable = ({ accountExternalId, paidStyle = {} }) => {
7
+ const [payments, setPayments] = useState([]);
8
+ const [loading, setLoading] = useState(true);
9
+ const [error, setError] = useState(null);
10
+ const isInContainer = useIsInContainer();
11
+ // Convert paidStyle entries into CSS custom properties
12
+ const cssVariables = Object.entries(paidStyle).reduce((vars, [key, value]) => {
13
+ let varName;
14
+ if (key.startsWith('--')) {
15
+ varName = key;
16
+ }
17
+ else {
18
+ const raw = key.replace(/([A-Z])/g, '-$1').toLowerCase();
19
+ varName = raw.startsWith('--') ? raw : `--${raw}`;
20
+ }
21
+ // @ts-ignore allow custom property
22
+ vars[varName] = value;
23
+ return vars;
24
+ }, {});
25
+ const formatCurrency = (amount) => {
26
+ return new Intl.NumberFormat("en-US", {
27
+ style: "currency",
28
+ currency: "USD",
29
+ minimumFractionDigits: 0,
30
+ maximumFractionDigits: 0,
31
+ }).format(amount / 100);
32
+ };
33
+ const formatDate = (dateString) => {
34
+ return new Date(dateString).toLocaleDateString('en-US', {
35
+ day: '2-digit',
36
+ month: 'short',
37
+ year: 'numeric'
38
+ });
39
+ };
40
+ const getStatusBadge = (status) => {
41
+ const statusClass = `paid-payment-status paid-payment-status-${status.toLowerCase()}`;
42
+ const displayStatus = status.charAt(0).toUpperCase() + status.slice(1).toLowerCase();
43
+ return _jsx("span", { className: statusClass, children: displayStatus });
44
+ };
45
+ useEffect(() => {
46
+ const fetchPaymentData = async () => {
47
+ try {
48
+ setLoading(true);
49
+ console.log('PaidPaymentsTable: Fetching payment data for', accountExternalId);
50
+ // TEMPORARILY DISABLED: Use cached fetch for payment data
51
+ // const cacheKey = getCacheKey.payments(accountExternalId);
52
+ // console.log('PaidPaymentsTable: Using cache key', cacheKey);
53
+ // const data = await cachedFetch<PaymentApiResponse>(
54
+ // `/api/payments/${accountExternalId}`,
55
+ // cacheKey,
56
+ // CACHE_TTL.DATA
57
+ // );
58
+ // Direct fetch without caching
59
+ const response = await fetch(`/api/payments/${accountExternalId}`);
60
+ if (!response.ok) {
61
+ throw new Error(`Failed to fetch: ${response.statusText}`);
62
+ }
63
+ const data = await response.json();
64
+ console.log('PaidPaymentsTable: Received data', data);
65
+ setPayments(data.data || []);
66
+ }
67
+ catch (err) {
68
+ console.error('PaidPaymentsTable: Error fetching data', err);
69
+ setError(err instanceof Error ? err.message : 'An error occurred');
70
+ }
71
+ finally {
72
+ setLoading(false);
73
+ }
74
+ };
75
+ fetchPaymentData();
76
+ // Listen for cache refresh events
77
+ const handleCacheRefresh = (event) => {
78
+ var _a, _b;
79
+ console.log('PaidPaymentsTable: Cache refresh event received', event.detail);
80
+ if (((_a = event.detail) === null || _a === void 0 ? void 0 : _a.accountId) === accountExternalId || ((_b = event.detail) === null || _b === void 0 ? void 0 : _b.type) === 'all') {
81
+ console.log('PaidPaymentsTable: Refetching data due to cache refresh');
82
+ fetchPaymentData();
83
+ }
84
+ };
85
+ window.addEventListener('cache-refresh', handleCacheRefresh);
86
+ return () => {
87
+ window.removeEventListener('cache-refresh', handleCacheRefresh);
88
+ };
89
+ }, [accountExternalId]);
90
+ if (loading) {
91
+ return _jsx("div", { children: "Loading payment data..." });
92
+ }
93
+ if (error) {
94
+ return _jsxs("div", { children: ["Error: ", error] });
95
+ }
96
+ return (_jsx("div", { className: "paid-payment-container", style: { position: 'relative', minWidth: 0, ...cssVariables }, children: _jsxs("div", { className: "paid-payment-table-wrapper", style: { position: 'static', width: '100%', height: 'auto', left: undefined, top: undefined, boxShadow: undefined, cursor: undefined }, children: [!isInContainer && (_jsx("div", { className: "paid-payment-header", children: _jsx("h3", { className: "paid-payment-title", children: "Payments" }) })), _jsx("div", { style: { background: '#fff', overflow: 'auto' }, children: _jsxs("table", { className: "paid-payment-table", children: [_jsx("thead", { children: _jsxs("tr", { children: [_jsx("th", { children: "Payment Number" }), _jsx("th", { children: "Payment type" }), _jsx("th", { children: "Due date" }), _jsx("th", { children: "Status" }), _jsx("th", { style: { textAlign: 'right' }, children: "Amount" }), _jsx("th", {})] }) }), _jsx("tbody", { children: payments.length === 0 ? (_jsx("tr", { children: _jsx("td", { colSpan: 6, className: "paid-payment-empty", children: "No payments found" }) })) : (payments.map((payment) => (_jsxs("tr", { children: [_jsx("td", { children: _jsxs("div", { className: "paid-payment-number", children: [_jsx("span", { className: "paid-payment-dollar", children: "$" }), _jsx("span", { children: "PAY-1" })] }) }), _jsx("td", { children: payment.paymentType }), _jsx("td", { children: formatDate(payment.paymentDate) }), _jsx("td", { children: getStatusBadge(payment.status) }), _jsx("td", { style: { textAlign: 'right' }, children: _jsxs("div", { className: "paid-payment-amount", children: [_jsx("span", { children: formatCurrency(payment.amount) }), _jsx("span", { className: "paid-payment-dollar-right", children: "$" })] }) }), _jsx("td", { style: { textAlign: 'center' }, children: _jsx("span", { className: "paid-payment-currency", children: payment.currency }) })] }, payment.id)))) })] }) })] }) }));
97
+ };
98
+ export default PaidPaymentsTable;
99
+ //# sourceMappingURL=PaidPaymentsTable.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"PaidPaymentsTable.js","sourceRoot":"","sources":["../../src/components/PaidPaymentsTable.tsx"],"names":[],"mappings":"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"}
@@ -1,6 +1,8 @@
1
1
  'use client';
2
2
 
3
3
  import React, { useEffect, useState } from 'react';
4
+ import { useIsInContainer } from './PaidContainer';
5
+ import { cachedFetch, getCacheKey, CACHE_TTL } from '../utils/cache';
4
6
  import '../styles/activity-log-table.css';
5
7
 
6
8
  interface PaidStyleProperties {
@@ -47,16 +49,25 @@ interface UsageSummary {
47
49
  invoiceLineId: string | null;
48
50
  }
49
51
 
52
+ interface UsageApiResponse {
53
+ data: {
54
+ usageSummary: UsageSummary[];
55
+ };
56
+ }
57
+
50
58
  interface PaidActivityLogProps {
51
59
  accountExternalId: string;
52
- host?: string;
53
- paidStyle?: PaidStyleProperties; // make it a seperate interface
60
+ paidStyle?: PaidStyleProperties;
54
61
  }
55
62
 
56
- export const PaidActivityLog: React.FC<PaidActivityLogProps> = ({ accountExternalId, host, paidStyle = {} }) => {
63
+ export const PaidActivityLog: React.FC<PaidActivityLogProps> = ({
64
+ accountExternalId,
65
+ paidStyle = {}
66
+ }) => {
57
67
  const [usageSummaries, setUsageSummaries] = useState<UsageSummary[]>([]);
58
68
  const [loading, setLoading] = useState(true);
59
69
  const [error, setError] = useState<string | null>(null);
70
+ const isInContainer = useIsInContainer();
60
71
 
61
72
  // Convert paidStyle entries into CSS custom properties
62
73
  const cssVariables: React.CSSProperties = Object.entries(paidStyle).reduce((vars, [key, value]) => {
@@ -100,13 +111,22 @@ export const PaidActivityLog: React.FC<PaidActivityLogProps> = ({ accountExterna
100
111
  const fetchUsageData = async () => {
101
112
  try {
102
113
  setLoading(true);
114
+
115
+ // TEMPORARILY DISABLED: Use cached fetch for usage data
116
+ // const cacheKey = getCacheKey.usage(accountExternalId);
117
+ // const data = await cachedFetch<UsageApiResponse>(
118
+ // `/api/usage/${accountExternalId}`,
119
+ // cacheKey,
120
+ // CACHE_TTL.DATA
121
+ // );
122
+
123
+ // Direct fetch without caching
103
124
  const response = await fetch(`/api/usage/${accountExternalId}`);
104
-
105
125
  if (!response.ok) {
106
- throw new Error('Failed to fetch usage data');
126
+ throw new Error(`Failed to fetch: ${response.statusText}`);
107
127
  }
108
-
109
128
  const data = await response.json();
129
+
110
130
  const mappedUsageSummaries = (data.data.usageSummary || []).map((summary: any) => ({
111
131
  ...summary,
112
132
  accountId: summary.customerId,
@@ -135,9 +155,11 @@ export const PaidActivityLog: React.FC<PaidActivityLogProps> = ({ accountExterna
135
155
  return (
136
156
  <div className="paid-activity-log-container" style={{ position: 'relative', minWidth: 0, ...cssVariables }}>
137
157
  <div className="paid-activity-log-table-wrapper" style={{ position: 'static', width: '100%', height: 'auto', left: undefined, top: undefined, boxShadow: undefined, cursor: undefined }}>
138
- <div className="paid-activity-log-header">
139
- <h3 className="paid-activity-log-title">Paid.ai Activity Log</h3>
140
- </div>
158
+ {!isInContainer && (
159
+ <div className="paid-activity-log-header">
160
+ <h3 className="paid-activity-log-title">Paid.ai Activity Log</h3>
161
+ </div>
162
+ )}
141
163
  <div style={{ background: '#fff', overflow: 'auto' }}>
142
164
  <table className="paid-activity-log-table">
143
165
  <thead>
@@ -0,0 +1,113 @@
1
+ 'use client';
2
+
3
+ import React, { useState, createContext, useContext } from 'react';
4
+ import '../styles/paid-container.css';
5
+
6
+ // Create context to detect if components are inside a container
7
+ const PaidContainerContext = createContext<boolean>(false);
8
+
9
+ // Export hook for components to use
10
+ export const useIsInContainer = () => useContext(PaidContainerContext);
11
+
12
+ interface PaidStyleProperties {
13
+ paidTitleColor?: string;
14
+ paidTitleFontWeight?: string;
15
+ paidFontFamily?: string;
16
+ paidWrapperBorder?: string;
17
+ paidHeaderBorderBottom?: string;
18
+ paidThBorderBottom?: string;
19
+ paidTdBorderBottom?: string;
20
+ paidTdBg?: string;
21
+ paidTdFontWeight?: string;
22
+ paidTitleFontSize?: string;
23
+ paidToggleFontSize?: string;
24
+ paidToggleFontWeight?: string;
25
+ paidToggleColor?: string;
26
+ paidThFontSize?: string;
27
+ paidThFontWeight?: string;
28
+ paidThColor?: string;
29
+ paidTdFontSize?: string;
30
+ paidTdColor?: string;
31
+ paidEmptyColor?: string;
32
+ paidWrapperBg?: string;
33
+ paidHeaderBg?: string;
34
+ paidTableBg?: string;
35
+ paidThBg?: string;
36
+ paidRowHoverBg?: string;
37
+ }
38
+
39
+ interface PaidContainerTab {
40
+ id: string;
41
+ label: string;
42
+ component: React.ReactNode;
43
+ }
44
+
45
+ interface PaidContainerProps {
46
+ title: string;
47
+ description?: string;
48
+ tabs?: PaidContainerTab[];
49
+ defaultActiveTab?: string;
50
+ paidStyle?: PaidStyleProperties;
51
+ children?: React.ReactNode;
52
+ }
53
+
54
+ export const PaidContainer: React.FC<PaidContainerProps> = ({
55
+ title,
56
+ description,
57
+ tabs = [],
58
+ defaultActiveTab,
59
+ paidStyle = {},
60
+ children
61
+ }) => {
62
+ const [activeTab, setActiveTab] = useState(defaultActiveTab || tabs[0]?.id);
63
+
64
+ // Convert paidStyle entries into CSS custom properties
65
+ const cssVariables: React.CSSProperties = Object.entries(paidStyle).reduce((vars, [key, value]) => {
66
+ let varName: string;
67
+ if (key.startsWith('--')) {
68
+ varName = key;
69
+ } else {
70
+ const raw = key.replace(/([A-Z])/g, '-$1').toLowerCase();
71
+ varName = raw.startsWith('--') ? raw : `--${raw}`;
72
+ }
73
+ // @ts-ignore allow custom property
74
+ vars[varName] = value;
75
+ return vars;
76
+ }, {} as React.CSSProperties);
77
+
78
+ const activeTabData = tabs.find(tab => tab.id === activeTab);
79
+
80
+ return (
81
+ <PaidContainerContext.Provider value={true}>
82
+ <div className="paid-container" style={{ ...cssVariables }}>
83
+ <div className="paid-container-wrapper">
84
+ <div className="paid-container-header">
85
+ <div className="paid-container-header-content">
86
+ <h2 className="paid-container-title">{title}</h2>
87
+ {description && (
88
+ <p className="paid-container-description">{description}</p>
89
+ )}
90
+ </div>
91
+
92
+ {tabs.length > 1 && (
93
+ <div className="paid-container-tabs">
94
+ {tabs.map((tab) => (
95
+ <button
96
+ key={tab.id}
97
+ className={`paid-container-tab ${activeTab === tab.id ? 'active' : ''}`}
98
+ onClick={() => setActiveTab(tab.id)}
99
+ >
100
+ {tab.label}
101
+ </button>
102
+ ))}
103
+ </div>
104
+ )}
105
+ </div>
106
+ <div className="paid-container-content">
107
+ {children || activeTabData?.component}
108
+ </div>
109
+ </div>
110
+ </div>
111
+ </PaidContainerContext.Provider>
112
+ );
113
+ };