diff --git a/.env.development.local.example b/.env.development.local.example index 0fcaa9cb9..a246a5252 100644 --- a/.env.development.local.example +++ b/.env.development.local.example @@ -1,7 +1,6 @@ -# Email provider: 'customerio' (default) or 'mailgun' -# EMAIL_PROVIDER=customerio # MAILGUN_API_KEY=key-... # MAILGUN_DOMAIN=app.kilocode.ai +# NEVERBOUNCE_API_KEY=... # Stripe integration STRIPE_WEBHOOK_SECRET="...extract this from: stripe listen --forward-to http://localhost:3000/api/stripe/webhook" diff --git a/.env.test b/.env.test index 42cb5bd5e..2d8f83f64 100644 --- a/.env.test +++ b/.env.test @@ -3,7 +3,6 @@ NEXTAUTH_URL=http://localhost:3000 NEXTAUTH_SECRET=test-only-non-secret XAI_API_KEY=invalid-mock-grok-key MISTRAL_API_KEY=invalid-mock-mistral-key -CUSTOMERIO_EMAIL_API_KEY=invalid-mock-customerio-key STRIPE_SECRET_KEY=invalid-mock-stripe-key POSTGRES_URL="postgres://postgres:postgres@localhost:5432/postgres" POSTGRES_CONNECT_TIMEOUT=10000 @@ -84,4 +83,3 @@ STRIPE_KILOCLAW_STANDARD_FIRST_MONTH_COUPON_ID=coupon_test_kiloclaw_standard_fir NEXT_PUBLIC_STRIPE_PUBLISHABLE_KEY=pk_test_invalid_mock_key CREDIT_CATEGORIES_ENCRYPTION_KEY= -EMAIL_PROVIDER=customerio diff --git a/package.json b/package.json index 5cc39f8bf..9d468ede6 100644 --- a/package.json +++ b/package.json @@ -106,7 +106,6 @@ "class-variance-authority": "^0.7.1", "clsx": "^2.1.1", "cmdk": "^1.1.1", - "customerio-node": "^4.3.0", "date-fns": "^4.1.0", "dayjs": "^1.11.20", "discord-api-types": "^0.38.42", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 93f2d6a0a..2cefc2afb 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -308,9 +308,6 @@ importers: cmdk: specifier: ^1.1.1 version: 1.1.1(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) - customerio-node: - specifier: ^4.3.0 - version: 4.3.0 date-fns: specifier: ^4.1.0 version: 4.1.0 @@ -8574,9 +8571,6 @@ packages: csstype@3.2.3: resolution: {integrity: sha512-z1HGKcYy2xA8AGQfwrn0PAy+PB7X/GSj3UVJW9qKyn43xWa+gl5nXmU4qqLMRzWVLFC8KusUX8T/0kCiOYpAIQ==} - customerio-node@4.3.0: - resolution: {integrity: sha512-umNxZzBNmyT+OQRQE1M7IgARgrgvnoY8bw+XGAuazB9QMfPTktkPnXImmyR8WAQHhnyfnsi8pqc1PzzToZmB5g==} - cwd@0.10.0: resolution: {integrity: sha512-YGZxdTTL9lmLkCUTpg4j0zQ7IhRB5ZmqNBbGCl3Tg6MP/d5/6sY7L5mmTjzbc6JKgVZYiqTQTNhPFsbXNGlRaA==} engines: {node: '>=0.8'} @@ -22848,8 +22842,6 @@ snapshots: csstype@3.2.3: {} - customerio-node@4.3.0: {} - cwd@0.10.0: dependencies: find-pkg: 0.1.2 diff --git a/src/app/admin/email-testing/page.tsx b/src/app/admin/email-testing/page.tsx index 616edc03b..76b19f111 100644 --- a/src/app/admin/email-testing/page.tsx +++ b/src/app/admin/email-testing/page.tsx @@ -34,11 +34,9 @@ export default function EmailTestingPage() { const { data: session } = useSession(); const [selectedTemplate, setSelectedTemplate] = useState(null); - const [selectedProvider, setSelectedProvider] = useState(null); const [recipient, setRecipient] = useState(''); const { data: templates } = useQuery(trpc.admin.emailTesting.getTemplates.queryOptions()); - const { data: providers } = useQuery(trpc.admin.emailTesting.getProviders.queryOptions()); // Pre-fill recipient with logged-in admin's email useEffect(() => { @@ -47,44 +45,34 @@ export default function EmailTestingPage() { } }, [session?.user?.email, recipient]); - // Auto-select first template and provider on load + // Auto-select first template on load useEffect(() => { if (templates && templates.length > 0 && !selectedTemplate) { setSelectedTemplate(templates[0].name); } }, [templates, selectedTemplate]); - useEffect(() => { - if (providers && providers.length > 0 && !selectedProvider) { - setSelectedProvider(providers[0]); - } - }, [providers, selectedProvider]); - const previewQuery = useQuery( trpc.admin.emailTesting.getPreview.queryOptions( { - // Values come directly from the server's getTemplates/getProviders responses, - // so the cast is safe — tRPC zod will reject anything invalid at runtime anyway. template: (selectedTemplate ?? 'orgSubscription') as TemplateName, - provider: (selectedProvider ?? 'customerio') as 'customerio' | 'mailgun', }, - { enabled: selectedTemplate !== null && selectedProvider !== null } + { enabled: selectedTemplate !== null } ) ); const sendTestMutation = useMutation(trpc.admin.emailTesting.sendTest.mutationOptions()); const handleSend = () => { - if (!selectedTemplate || !selectedProvider || !recipient) return; + if (!selectedTemplate || !recipient) return; sendTestMutation.mutate( { template: selectedTemplate as TemplateName, - provider: selectedProvider as 'customerio' | 'mailgun', recipient, }, { onSuccess: result => { - toast.success(`Test email sent via ${result?.provider} to ${result?.recipient}`); + toast.success(`Test email sent to ${result?.recipient}`); }, onError: error => { toast.error(error.message || 'Failed to send test email'); @@ -111,11 +99,11 @@ export default function EmailTestingPage() { Test Email Controls - Select a template and provider, then send a test email to any address. + Select a template, then send a test email to any address. -
+
-
- - -
-
{sendTestMutation.isPending ? 'Sending...' : 'Send Test Email'} @@ -173,7 +143,7 @@ export default function EmailTestingPage() { {/* Preview Pane */} - {selectedTemplate && selectedProvider && ( + {selectedTemplate && ( @@ -185,49 +155,13 @@ export default function EmailTestingPage() { )} - - {selectedProvider === 'customerio' - ? 'Variables that will be sent to the Customer.io API' - : 'Rendered HTML email'} - + Rendered HTML email {previewQuery.isPending && (

Loading preview...

)} - {previewQuery.data?.type === 'customerio' && ( -
-

- Template ID:{' '} - {previewQuery.data.transactional_message_id} -

-
- - - - - - - - - {Object.entries(previewQuery.data.message_data).map(([key, value]) => ( - - - - - ))} - -
- Variable - - Value -
{key} - {String(value)} -
-
-
- )} - {previewQuery.data?.type === 'mailgun' && ( + {previewQuery.data && (