From abf19644261f08e63d8961da04a4875abdabb8d5 Mon Sep 17 00:00:00 2001 From: Aimen Sahnoun Date: Fri, 27 Sep 2024 16:01:28 +0300 Subject: [PATCH 1/4] feat: add receipt export and viewing on request scan --- .../src/lib/dashboard/invoice-view.svelte | 5 +- .../src/lib/view-requests.svelte | 10 +- packages/invoice-dashboard/src/utils/index.ts | 1 - .../lib/components/payment-complete.svelte | 79 ++++++++++++++- .../components/payment-confirmation.svelte | 3 + .../src/lib/payment-widget.svelte | 12 ++- .../src/lib/react/PaymentWidget.d.ts | 2 + .../payment-widget/src/lib/utils/request.ts | 10 +- .../src => shared}/utils/generateInvoice.ts | 99 ++++++++++++------- .../src => shared}/utils/getCurrency.ts | 0 10 files changed, 173 insertions(+), 48 deletions(-) rename {packages/invoice-dashboard/src => shared}/utils/generateInvoice.ts (55%) rename {packages/invoice-dashboard/src => shared}/utils/getCurrency.ts (100%) diff --git a/packages/invoice-dashboard/src/lib/dashboard/invoice-view.svelte b/packages/invoice-dashboard/src/lib/dashboard/invoice-view.svelte index 510f2239..eefc3663 100644 --- a/packages/invoice-dashboard/src/lib/dashboard/invoice-view.svelte +++ b/packages/invoice-dashboard/src/lib/dashboard/invoice-view.svelte @@ -20,13 +20,14 @@ // Utils import { formatDate } from "@requestnetwork/shared-utils/formatDate"; import { calculateItemTotal } from "@requestnetwork/shared-utils/invoiceTotals"; + import { exportToPDF } from "@requestnetwork/shared-utils/generateInvoice"; + import { getCurrencyFromManager } from "@requestnetwork/shared-utils/getCurrency"; // Types import type { WalletState } from "@requestnetwork/shared-types/web3Onboard"; import { onMount } from "svelte"; import { formatUnits } from "viem"; - import { exportToPDF, walletClientToSigner } from "../../utils"; - import { getCurrencyFromManager } from "../../utils/getCurrency"; + import { walletClientToSigner } from "../../utils"; export let config; export let wallet: WalletState | undefined; diff --git a/packages/invoice-dashboard/src/lib/view-requests.svelte b/packages/invoice-dashboard/src/lib/view-requests.svelte index bb5e9ef5..d043b57f 100644 --- a/packages/invoice-dashboard/src/lib/view-requests.svelte +++ b/packages/invoice-dashboard/src/lib/view-requests.svelte @@ -25,14 +25,16 @@ // Utils import { config as defaultConfig } from "@requestnetwork/shared-utils/config"; import { initializeCurrencyManager } from "@requestnetwork/shared-utils/initCurrencyManager"; + import { exportToPDF } from "@requestnetwork/shared-utils/generateInvoice"; + import { getCurrencyFromManager } from "@requestnetwork/shared-utils/getCurrency"; import { CurrencyManager } from "@requestnetwork/currency"; import type { RequestNetwork } from "@requestnetwork/request-client.js"; import { Types } from "@requestnetwork/request-client.js"; import { onMount } from "svelte"; import { formatUnits } from "viem"; - import { capitalize, debounce, exportToPDF, formatAddress } from "../utils"; - import { getCurrencyFromManager } from "../utils/getCurrency"; + import { capitalize, debounce, formatAddress } from "../utils"; + import { Drawer, InvoiceView } from "./dashboard"; export let config: IConfig; @@ -515,8 +517,8 @@ {formatAddress( currentTab === "Pay" - ? (request.payee?.value ?? "") - : (request.payer?.value ?? "") + ? request.payee?.value ?? "" + : request.payer?.value ?? "" )} import { fade } from "svelte/transition"; + import { exportToPDF } from "@requestnetwork/shared-utils/generateInvoice"; + import { getCurrencyFromManager } from "@requestnetwork/shared-utils/getCurrency"; + import { initializeCurrencyManager } from "@requestnetwork/shared-utils/initCurrencyManager"; + + export let createdRequest: any; + export let enablePdfReceipt: boolean = true; + export let enableRequestScanLink: boolean = true; + export let sellerLogo: string | undefined; + + async function handleDownloadReceipt() { + if (createdRequest) { + try { + const currencyManager = initializeCurrencyManager([]); + + const currencyData = createdRequest?.inMemoryInfo?.requestData; + + await exportToPDF( + currencyData, + getCurrencyFromManager(currencyData.currencyInfo, currencyManager), + sellerLogo! + ); + } catch (error) { + console.error("Error downloading receipt:", error); + } + } + }
@@ -19,9 +45,24 @@

Payment Complete

Thank you for your payment. Your transaction was successful.

+ + {#if enablePdfReceipt || (enableRequestScanLink && createdRequest)} +
+ {#if enablePdfReceipt} + + {/if} + {#if enableRequestScanLink && createdRequest} + + View on Request Scan + + {/if} +
+ {/if} - -
+
${logo ? `Logo` : ""}
@@ -57,43 +82,43 @@ export const exportToPDF = async (
-

INVOICE #${ +

INVOICE #${ invoice.contentData?.invoiceNumber || "-" }

-
+
From:
-

${invoice.payee?.value || "-"}

- ${invoice.contentData?.sellerInfo?.firstName || ""} ${invoice.contentData?.sellerInfo?.lastName || ""}
- ${renderAddress(invoice.contentData?.sellerInfo)}
- ${invoice.contentData?.sellerInfo?.taxRegistration ? `VAT: ${invoice.contentData.sellerInfo.taxRegistration}` : ""} +

${invoice.payee?.value || "-"}

+

${invoice.contentData?.sellerInfo?.firstName || ""} ${invoice.contentData?.sellerInfo?.lastName || ""}

+

${renderAddress(invoice.contentData?.sellerInfo)}

+ ${invoice.contentData?.sellerInfo?.taxRegistration ? `

VAT: ${invoice.contentData.sellerInfo.taxRegistration}

` : ""}
-
+
To:
-

${invoice.payer?.value || "-"}

- ${invoice.contentData?.buyerInfo?.firstName || ""} ${invoice.contentData?.buyerInfo?.lastName || ""}
- ${renderAddress(invoice.contentData?.buyerInfo)}
- ${invoice.contentData?.buyerInfo?.taxRegistration ? `VAT: ${invoice.contentData.buyerInfo.taxRegistration}` : ""} +

${invoice.payer?.value || "-"}

+

${invoice.contentData?.buyerInfo?.firstName || ""} ${invoice.contentData?.buyerInfo?.lastName || ""}

+

${renderAddress(invoice.contentData?.buyerInfo)}

+ ${invoice.contentData?.buyerInfo?.taxRegistration ? `

VAT: ${invoice.contentData.buyerInfo.taxRegistration}

` : ""}
-
+
Payment Chain: ${invoice.currencyInfo?.network || "-"}
Invoice Currency: ${invoice.currency || "-"}
Invoice Type: Regular Invoice
- +
- - - - - - - + + + + + + + @@ -101,22 +126,22 @@ export const exportToPDF = async ( .map( (item: any) => ` - - - + + - - - - - +
DescriptionQuantityUnit PriceDiscountTaxAmount
DescriptionQuantityUnit PriceDiscountTaxAmount
${item.name || "-"}${item.quantity || "-"}${ + ${item.name || "-"}${item.quantity || "-"}${ item.unitPrice ? formatUnits(BigInt(item.unitPrice), currency?.decimals || 0) : "-" }${ + ${ item.discount ? formatUnits(BigInt(item.discount), currency?.decimals || 0) : "-" }${ + ${ item.tax?.amount ? `${item.tax.amount}%` : "-" }${ + ${ item ? formatUnits( BigInt(calculateItemTotal(item)), @@ -131,8 +156,8 @@ export const exportToPDF = async (
Due:${ + Due:${ invoice.expectedAmount ? `${formatUnits(BigInt(invoice.expectedAmount), currency?.decimals || 0)} ${invoice.currency || ""}` : "-" @@ -143,7 +168,7 @@ export const exportToPDF = async ( ${ invoice.contentData?.note - ? `
+ ? `

Note:

${invoice.contentData.note}

` diff --git a/packages/invoice-dashboard/src/utils/getCurrency.ts b/shared/utils/getCurrency.ts similarity index 100% rename from packages/invoice-dashboard/src/utils/getCurrency.ts rename to shared/utils/getCurrency.ts From 76ced699cf4fd0c44eb0d120e4b71932d00939c2 Mon Sep 17 00:00:00 2001 From: Aimen Sahnoun Date: Fri, 27 Sep 2024 16:30:25 +0300 Subject: [PATCH 2/4] fix: open request scan link in a new tab --- .../payment-widget/src/lib/components/payment-complete.svelte | 2 ++ 1 file changed, 2 insertions(+) diff --git a/packages/payment-widget/src/lib/components/payment-complete.svelte b/packages/payment-widget/src/lib/components/payment-complete.svelte index 132b713e..649764e0 100644 --- a/packages/payment-widget/src/lib/components/payment-complete.svelte +++ b/packages/payment-widget/src/lib/components/payment-complete.svelte @@ -53,6 +53,8 @@ {/if} {#if enableRequestScanLink && createdRequest} View on Request Scan From 87296adca07843b969d504cd728d7dbb23b2ca0c Mon Sep 17 00:00:00 2001 From: Aimen Sahnoun Date: Wed, 2 Oct 2024 16:16:59 +0300 Subject: [PATCH 3/4] fix: add extra checks on logo --- .../payment-widget/src/lib/components/payment-complete.svelte | 4 ++-- shared/utils/generateInvoice.ts | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/packages/payment-widget/src/lib/components/payment-complete.svelte b/packages/payment-widget/src/lib/components/payment-complete.svelte index 649764e0..722a6457 100644 --- a/packages/payment-widget/src/lib/components/payment-complete.svelte +++ b/packages/payment-widget/src/lib/components/payment-complete.svelte @@ -7,7 +7,7 @@ export let createdRequest: any; export let enablePdfReceipt: boolean = true; export let enableRequestScanLink: boolean = true; - export let sellerLogo: string | undefined; + export let sellerLogo: string = ""; async function handleDownloadReceipt() { if (createdRequest) { @@ -19,7 +19,7 @@ await exportToPDF( currencyData, getCurrencyFromManager(currencyData.currencyInfo, currencyManager), - sellerLogo! + sellerLogo ); } catch (error) { console.error("Error downloading receipt:", error); diff --git a/shared/utils/generateInvoice.ts b/shared/utils/generateInvoice.ts index bfbd2d70..b328f9f1 100644 --- a/shared/utils/generateInvoice.ts +++ b/shared/utils/generateInvoice.ts @@ -75,7 +75,7 @@ export const exportToPDF = async (
- ${logo ? `Logo` : ""} + ${logo && logo.length > 0 ? `Logo` : ""}

Issued on ${formatDate(invoice.contentData?.creationDate)}

Payment due by ${formatDate(invoice.contentData?.paymentTerms?.dueDate)}

From 4744d62fd0d4d4d9e8f607d1ec8ba45e1e7f53d1 Mon Sep 17 00:00:00 2001 From: Aimen Sahnoun Date: Thu, 3 Oct 2024 12:36:28 +0300 Subject: [PATCH 4/4] feat: add sonner when errors happens --- .../lib/components/payment-complete.svelte | 11 ++++++- shared/components/app.css | 31 ------------------- shared/components/sonner.svelte | 2 -- shared/components/tailwind.config.ts | 2 -- 4 files changed, 10 insertions(+), 36 deletions(-) diff --git a/packages/payment-widget/src/lib/components/payment-complete.svelte b/packages/payment-widget/src/lib/components/payment-complete.svelte index 722a6457..73e9fca3 100644 --- a/packages/payment-widget/src/lib/components/payment-complete.svelte +++ b/packages/payment-widget/src/lib/components/payment-complete.svelte @@ -3,6 +3,8 @@ import { exportToPDF } from "@requestnetwork/shared-utils/generateInvoice"; import { getCurrencyFromManager } from "@requestnetwork/shared-utils/getCurrency"; import { initializeCurrencyManager } from "@requestnetwork/shared-utils/initCurrencyManager"; + import Toaster from "@requestnetwork/shared-components/sonner.svelte"; + import { toast } from "svelte-sonner"; export let createdRequest: any; export let enablePdfReceipt: boolean = true; @@ -22,12 +24,19 @@ sellerLogo ); } catch (error) { - console.error("Error downloading receipt:", error); + toast.error(`Failed to export PDF`, { + description: `${error}`, + action: { + label: "X", + onClick: () => console.info("Close"), + }, + }); } } } +