diff --git a/bun.lockb b/bun.lockb index 883ed2f..7bf6e32 100755 Binary files a/bun.lockb and b/bun.lockb differ diff --git a/package.json b/package.json index 1a967bd..465d66c 100644 --- a/package.json +++ b/package.json @@ -45,6 +45,7 @@ "@radix-ui/react-toggle": "^1.1.10", "@radix-ui/react-toggle-group": "^1.1.11", "@radix-ui/react-tooltip": "^1.2.8", + "@react-email/components": "^1.0.12", "@supabase/supabase-js": "^2.104.1", "@tailwindcss/vite": "^4.2.1", "@tanstack/react-query": "^5.83.0", @@ -83,6 +84,7 @@ "react": "^19.2.0", "react-day-picker": "^9.14.0", "react-dom": "^19.2.0", + "react-email": "^6.0.0", "react-hook-form": "^7.71.2", "react-resizable-panels": "^4.6.5", "recharts": "^2.15.4", diff --git a/src/routeTree.gen.ts b/src/routeTree.gen.ts index 3caf79d..c40c56e 100644 --- a/src/routeTree.gen.ts +++ b/src/routeTree.gen.ts @@ -44,6 +44,7 @@ import { Route as PayIdRouteImport } from './routes/pay.$id' import { Route as InvoicesNewRouteImport } from './routes/invoices.new' import { Route as InvoicesInvoiceIdRouteImport } from './routes/invoices.$invoiceId' import { Route as HooksPollImapRouteImport } from './routes/hooks/poll-imap' +import { Route as EmailUnsubscribeRouteImport } from './routes/email/unsubscribe' import { Route as ContactsContactIdRouteImport } from './routes/contacts.$contactId' import { Route as CollectionsCollectionIdRouteImport } from './routes/collections.$collectionId' import { Route as ClientsClientIdRouteImport } from './routes/clients.$clientId' @@ -52,11 +53,14 @@ import { Route as CasesCaseIdRouteImport } from './routes/cases.$caseId' import { Route as ApiStripeWebhookRouteImport } from './routes/api.stripe-webhook' import { Route as AdminUsersRouteImport } from './routes/admin.users' import { Route as DocumentsTemplatesIndexRouteImport } from './routes/documents.templates.index' +import { Route as LovableEmailSuppressionRouteImport } from './routes/lovable/email/suppression' import { Route as InvoicesNewClientIdRouteImport } from './routes/invoices.new.$clientId' import { Route as DocumentsTemplatesNewRouteImport } from './routes/documents.templates.new' import { Route as DocumentsTemplatesTemplateIdRouteImport } from './routes/documents.templates.$templateId' import { Route as DocumentsPleadingNewRouteImport } from './routes/documents.pleading.new' import { Route as ClientsClientIdFeesRouteImport } from './routes/clients.$clientId.fees' +import { Route as LovableEmailTransactionalSendRouteImport } from './routes/lovable/email/transactional/send' +import { Route as LovableEmailTransactionalPreviewRouteImport } from './routes/lovable/email/transactional/preview' import { Route as LovableEmailQueueProcessRouteImport } from './routes/lovable/email/queue/process' const SetupRoute = SetupRouteImport.update({ @@ -234,6 +238,11 @@ const HooksPollImapRoute = HooksPollImapRouteImport.update({ path: '/hooks/poll-imap', getParentRoute: () => rootRouteImport, } as any) +const EmailUnsubscribeRoute = EmailUnsubscribeRouteImport.update({ + id: '/email/unsubscribe', + path: '/email/unsubscribe', + getParentRoute: () => rootRouteImport, +} as any) const ContactsContactIdRoute = ContactsContactIdRouteImport.update({ id: '/contacts/$contactId', path: '/contacts/$contactId', @@ -274,6 +283,11 @@ const DocumentsTemplatesIndexRoute = DocumentsTemplatesIndexRouteImport.update({ path: '/documents/templates/', getParentRoute: () => rootRouteImport, } as any) +const LovableEmailSuppressionRoute = LovableEmailSuppressionRouteImport.update({ + id: '/lovable/email/suppression', + path: '/lovable/email/suppression', + getParentRoute: () => rootRouteImport, +} as any) const InvoicesNewClientIdRoute = InvoicesNewClientIdRouteImport.update({ id: '/$clientId', path: '/$clientId', @@ -300,6 +314,18 @@ const ClientsClientIdFeesRoute = ClientsClientIdFeesRouteImport.update({ path: '/fees', getParentRoute: () => ClientsClientIdRoute, } as any) +const LovableEmailTransactionalSendRoute = + LovableEmailTransactionalSendRouteImport.update({ + id: '/lovable/email/transactional/send', + path: '/lovable/email/transactional/send', + getParentRoute: () => rootRouteImport, + } as any) +const LovableEmailTransactionalPreviewRoute = + LovableEmailTransactionalPreviewRouteImport.update({ + id: '/lovable/email/transactional/preview', + path: '/lovable/email/transactional/preview', + getParentRoute: () => rootRouteImport, + } as any) const LovableEmailQueueProcessRoute = LovableEmailQueueProcessRouteImport.update({ id: '/lovable/email/queue/process', @@ -319,6 +345,7 @@ export interface FileRoutesByFullPath { '/clients/$clientId': typeof ClientsClientIdRouteWithChildren '/collections/$collectionId': typeof CollectionsCollectionIdRoute '/contacts/$contactId': typeof ContactsContactIdRoute + '/email/unsubscribe': typeof EmailUnsubscribeRoute '/hooks/poll-imap': typeof HooksPollImapRoute '/invoices/$invoiceId': typeof InvoicesInvoiceIdRoute '/invoices/new': typeof InvoicesNewRouteWithChildren @@ -355,8 +382,11 @@ export interface FileRoutesByFullPath { '/documents/templates/$templateId': typeof DocumentsTemplatesTemplateIdRoute '/documents/templates/new': typeof DocumentsTemplatesNewRoute '/invoices/new/$clientId': typeof InvoicesNewClientIdRoute + '/lovable/email/suppression': typeof LovableEmailSuppressionRoute '/documents/templates/': typeof DocumentsTemplatesIndexRoute '/lovable/email/queue/process': typeof LovableEmailQueueProcessRoute + '/lovable/email/transactional/preview': typeof LovableEmailTransactionalPreviewRoute + '/lovable/email/transactional/send': typeof LovableEmailTransactionalSendRoute } export interface FileRoutesByTo { '/': typeof IndexRoute @@ -369,6 +399,7 @@ export interface FileRoutesByTo { '/clients/$clientId': typeof ClientsClientIdRouteWithChildren '/collections/$collectionId': typeof CollectionsCollectionIdRoute '/contacts/$contactId': typeof ContactsContactIdRoute + '/email/unsubscribe': typeof EmailUnsubscribeRoute '/hooks/poll-imap': typeof HooksPollImapRoute '/invoices/$invoiceId': typeof InvoicesInvoiceIdRoute '/invoices/new': typeof InvoicesNewRouteWithChildren @@ -405,8 +436,11 @@ export interface FileRoutesByTo { '/documents/templates/$templateId': typeof DocumentsTemplatesTemplateIdRoute '/documents/templates/new': typeof DocumentsTemplatesNewRoute '/invoices/new/$clientId': typeof InvoicesNewClientIdRoute + '/lovable/email/suppression': typeof LovableEmailSuppressionRoute '/documents/templates': typeof DocumentsTemplatesIndexRoute '/lovable/email/queue/process': typeof LovableEmailQueueProcessRoute + '/lovable/email/transactional/preview': typeof LovableEmailTransactionalPreviewRoute + '/lovable/email/transactional/send': typeof LovableEmailTransactionalSendRoute } export interface FileRoutesById { __root__: typeof rootRouteImport @@ -421,6 +455,7 @@ export interface FileRoutesById { '/clients/$clientId': typeof ClientsClientIdRouteWithChildren '/collections/$collectionId': typeof CollectionsCollectionIdRoute '/contacts/$contactId': typeof ContactsContactIdRoute + '/email/unsubscribe': typeof EmailUnsubscribeRoute '/hooks/poll-imap': typeof HooksPollImapRoute '/invoices/$invoiceId': typeof InvoicesInvoiceIdRoute '/invoices/new': typeof InvoicesNewRouteWithChildren @@ -457,8 +492,11 @@ export interface FileRoutesById { '/documents/templates/$templateId': typeof DocumentsTemplatesTemplateIdRoute '/documents/templates/new': typeof DocumentsTemplatesNewRoute '/invoices/new/$clientId': typeof InvoicesNewClientIdRoute + '/lovable/email/suppression': typeof LovableEmailSuppressionRoute '/documents/templates/': typeof DocumentsTemplatesIndexRoute '/lovable/email/queue/process': typeof LovableEmailQueueProcessRoute + '/lovable/email/transactional/preview': typeof LovableEmailTransactionalPreviewRoute + '/lovable/email/transactional/send': typeof LovableEmailTransactionalSendRoute } export interface FileRouteTypes { fileRoutesByFullPath: FileRoutesByFullPath @@ -474,6 +512,7 @@ export interface FileRouteTypes { | '/clients/$clientId' | '/collections/$collectionId' | '/contacts/$contactId' + | '/email/unsubscribe' | '/hooks/poll-imap' | '/invoices/$invoiceId' | '/invoices/new' @@ -510,8 +549,11 @@ export interface FileRouteTypes { | '/documents/templates/$templateId' | '/documents/templates/new' | '/invoices/new/$clientId' + | '/lovable/email/suppression' | '/documents/templates/' | '/lovable/email/queue/process' + | '/lovable/email/transactional/preview' + | '/lovable/email/transactional/send' fileRoutesByTo: FileRoutesByTo to: | '/' @@ -524,6 +566,7 @@ export interface FileRouteTypes { | '/clients/$clientId' | '/collections/$collectionId' | '/contacts/$contactId' + | '/email/unsubscribe' | '/hooks/poll-imap' | '/invoices/$invoiceId' | '/invoices/new' @@ -560,8 +603,11 @@ export interface FileRouteTypes { | '/documents/templates/$templateId' | '/documents/templates/new' | '/invoices/new/$clientId' + | '/lovable/email/suppression' | '/documents/templates' | '/lovable/email/queue/process' + | '/lovable/email/transactional/preview' + | '/lovable/email/transactional/send' id: | '__root__' | '/' @@ -575,6 +621,7 @@ export interface FileRouteTypes { | '/clients/$clientId' | '/collections/$collectionId' | '/contacts/$contactId' + | '/email/unsubscribe' | '/hooks/poll-imap' | '/invoices/$invoiceId' | '/invoices/new' @@ -611,8 +658,11 @@ export interface FileRouteTypes { | '/documents/templates/$templateId' | '/documents/templates/new' | '/invoices/new/$clientId' + | '/lovable/email/suppression' | '/documents/templates/' | '/lovable/email/queue/process' + | '/lovable/email/transactional/preview' + | '/lovable/email/transactional/send' fileRoutesById: FileRoutesById } export interface RootRouteChildren { @@ -627,6 +677,7 @@ export interface RootRouteChildren { ClientsClientIdRoute: typeof ClientsClientIdRouteWithChildren CollectionsCollectionIdRoute: typeof CollectionsCollectionIdRoute ContactsContactIdRoute: typeof ContactsContactIdRoute + EmailUnsubscribeRoute: typeof EmailUnsubscribeRoute HooksPollImapRoute: typeof HooksPollImapRoute InvoicesInvoiceIdRoute: typeof InvoicesInvoiceIdRoute InvoicesNewRoute: typeof InvoicesNewRouteWithChildren @@ -650,8 +701,11 @@ export interface RootRouteChildren { DocumentsPleadingNewRoute: typeof DocumentsPleadingNewRoute DocumentsTemplatesTemplateIdRoute: typeof DocumentsTemplatesTemplateIdRoute DocumentsTemplatesNewRoute: typeof DocumentsTemplatesNewRoute + LovableEmailSuppressionRoute: typeof LovableEmailSuppressionRoute DocumentsTemplatesIndexRoute: typeof DocumentsTemplatesIndexRoute LovableEmailQueueProcessRoute: typeof LovableEmailQueueProcessRoute + LovableEmailTransactionalPreviewRoute: typeof LovableEmailTransactionalPreviewRoute + LovableEmailTransactionalSendRoute: typeof LovableEmailTransactionalSendRoute } declare module '@tanstack/react-router' { @@ -901,6 +955,13 @@ declare module '@tanstack/react-router' { preLoaderRoute: typeof HooksPollImapRouteImport parentRoute: typeof rootRouteImport } + '/email/unsubscribe': { + id: '/email/unsubscribe' + path: '/email/unsubscribe' + fullPath: '/email/unsubscribe' + preLoaderRoute: typeof EmailUnsubscribeRouteImport + parentRoute: typeof rootRouteImport + } '/contacts/$contactId': { id: '/contacts/$contactId' path: '/contacts/$contactId' @@ -957,6 +1018,13 @@ declare module '@tanstack/react-router' { preLoaderRoute: typeof DocumentsTemplatesIndexRouteImport parentRoute: typeof rootRouteImport } + '/lovable/email/suppression': { + id: '/lovable/email/suppression' + path: '/lovable/email/suppression' + fullPath: '/lovable/email/suppression' + preLoaderRoute: typeof LovableEmailSuppressionRouteImport + parentRoute: typeof rootRouteImport + } '/invoices/new/$clientId': { id: '/invoices/new/$clientId' path: '/$clientId' @@ -992,6 +1060,20 @@ declare module '@tanstack/react-router' { preLoaderRoute: typeof ClientsClientIdFeesRouteImport parentRoute: typeof ClientsClientIdRoute } + '/lovable/email/transactional/send': { + id: '/lovable/email/transactional/send' + path: '/lovable/email/transactional/send' + fullPath: '/lovable/email/transactional/send' + preLoaderRoute: typeof LovableEmailTransactionalSendRouteImport + parentRoute: typeof rootRouteImport + } + '/lovable/email/transactional/preview': { + id: '/lovable/email/transactional/preview' + path: '/lovable/email/transactional/preview' + fullPath: '/lovable/email/transactional/preview' + preLoaderRoute: typeof LovableEmailTransactionalPreviewRouteImport + parentRoute: typeof rootRouteImport + } '/lovable/email/queue/process': { id: '/lovable/email/queue/process' path: '/lovable/email/queue/process' @@ -1070,6 +1152,7 @@ const rootRouteChildren: RootRouteChildren = { ClientsClientIdRoute: ClientsClientIdRouteWithChildren, CollectionsCollectionIdRoute: CollectionsCollectionIdRoute, ContactsContactIdRoute: ContactsContactIdRoute, + EmailUnsubscribeRoute: EmailUnsubscribeRoute, HooksPollImapRoute: HooksPollImapRoute, InvoicesInvoiceIdRoute: InvoicesInvoiceIdRoute, InvoicesNewRoute: InvoicesNewRouteWithChildren, @@ -1093,8 +1176,11 @@ const rootRouteChildren: RootRouteChildren = { DocumentsPleadingNewRoute: DocumentsPleadingNewRoute, DocumentsTemplatesTemplateIdRoute: DocumentsTemplatesTemplateIdRoute, DocumentsTemplatesNewRoute: DocumentsTemplatesNewRoute, + LovableEmailSuppressionRoute: LovableEmailSuppressionRoute, DocumentsTemplatesIndexRoute: DocumentsTemplatesIndexRoute, LovableEmailQueueProcessRoute: LovableEmailQueueProcessRoute, + LovableEmailTransactionalPreviewRoute: LovableEmailTransactionalPreviewRoute, + LovableEmailTransactionalSendRoute: LovableEmailTransactionalSendRoute, } export const routeTree = rootRouteImport ._addFileChildren(rootRouteChildren)