Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[FEATURE] - An option to print the invoice immediately with window.print() #603

Open
dragonman225 opened this issue Feb 24, 2025 · 0 comments

Comments

@dragonman225
Copy link

dragonman225 commented Feb 24, 2025

Feature Summary

Offer an option to print the invoice immediately with window.print().

Use Case

  • Protect users' privacy: Some people may feel uncomfortable to send sensitive data such as phone numbers, addresses, payment information, order details, etc., to a public server, worrying that the server might log their personal data and potentially leak it.

  • Save users' time: window.print() can generate the PDF immediately so users don't have to wait for the server or retry multiple times when the server is busy and often failing.

    • When I was trying the demo, it failed several times with 504 Gateway Timeout error and the following message:

      An error occurred with your deployment
      
      FUNCTION_INVOCATION_TIMEOUT
      
      hkg1::f5s6h-1740397075308-80dc8b2d7cc7
      
  • Reduce service providers' hosting costs: When a portion of users generate invoices with the window.print() implementation, the pressure on the server-side implementation is lowered and service providers can save money.

Proposed Solution

The fastest way is to add a button besides existing "Generate PDF" button that calls the following function when clicked.

// Add this function to InvoiceContextProvider in contexts/InvoiceContext.tsx
// This function replicates the behavior of services/invoice/server/generatePdfService.ts
const printPdfImmediatelyAndPrivately = useCallback(async (data: InvoiceType) => {
  const ReactDOMServer = (await import("react-dom/server")).default;

  // Get the selected invoice template
  const templateId = data.details.pdfTemplate;
  const InvoiceTemplate = await getInvoiceTemplate(templateId);

  // Read the HTML template from a React component
  const htmlTemplate = `<link rel="stylesheet" href="${TAILWIND_CDN}">`.concat(ReactDOMServer.renderToStaticMarkup(
    InvoiceTemplate(data)
  ));

  const printWindow = window.open("", "");
  if (printWindow) {
    printWindow.document.open();
    printWindow.document.write(htmlTemplate);
    printWindow.document.close();
    printWindow.onload = () => {
      printWindow.print();
    };
  }
}, []);

But from UX perspective it might be confusing to see both server-side and client-side implementation of the same feature. A more thoughtful change would be

  • allowing users to generate invoices with the faster and more privacy-friendly client-side implementation by default to get value immediately and
  • rethinking what other unique value which only the server can provide.

Additional Information

Example: A quickly hacked-together solution that replaces the functionality of existing "Generate PDF" button with the window.print() implementation.

dragonman225@45446f7

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

1 participant