/** * pdf-templates — dispatcher : sélectionne le bon thème et rend en Buffer. * * Le code applicatif (`#services/invoice_pdf`) appelle `renderInvoiceToBuffer` * qui : * 1. Choisit le composant React selon `themeSlug` * 2. Le rend en PDF via `@react-pdf/renderer.renderToBuffer` * 3. Retourne le Buffer prêt à être uploadé sur MinIO ou streamé * * Les 4 thèmes consomment tous le même `InvoiceTemplateProps` (cf. common.tsx), * ce qui permet d'ajouter ou de remplacer un thème sans toucher au dispatcher. */ import React from 'react' import { renderToBuffer, type DocumentProps } from '@react-pdf/renderer' import { type InvoiceTemplateProps, type InvoiceThemeSlug, } from '#pdf-templates/common' import { ClassiqueTemplate } from '#pdf-templates/classique' import { ModerneTemplate } from '#pdf-templates/moderne' import { MinimalTemplate } from '#pdf-templates/minimal' import { ElegantTemplate } from '#pdf-templates/elegant' /** Mapping slug → composant. Source de vérité du dispatcher. */ const THEMES: Record< InvoiceThemeSlug, (props: InvoiceTemplateProps) => React.ReactElement > = { classique: ClassiqueTemplate, moderne: ModerneTemplate, minimal: MinimalTemplate, elegant: ElegantTemplate, } /** * Rend la facture en PDF (Buffer). * * @param themeSlug Slug du thème — fallback "classique" si inconnu (defensive). * @param props Données passées au template (cf. InvoiceTemplateProps). */ export async function renderInvoiceToBuffer( themeSlug: InvoiceThemeSlug, props: InvoiceTemplateProps ): Promise { const Template = THEMES[themeSlug] ?? THEMES.classique const element = Template(props) return await renderToBuffer(element) } export type { InvoiceTemplateProps, InvoiceThemeSlug }