11import { NextApiRequest , NextApiResponse } from 'next'
2+ import { NextResponse } from 'next/server'
3+ import type { NextRequest } from 'next/server'
24import { buttondownHandler } from './buttondown'
35import { convertkitHandler } from './convertkit'
46import { mailchimpHandler } from './mailchimp'
@@ -16,7 +18,7 @@ export interface NewsletterRequest extends NextApiRequest {
1618
1719export type NewsletterResponse < T = any > = NextApiResponse < T >
1820
19- async function NewsletterHandler (
21+ async function NewsletterAPIHandler (
2022 req : NextApiRequest ,
2123 res : NextApiResponse ,
2224 options : NewsletterConfig
@@ -29,22 +31,22 @@ async function NewsletterHandler(
2931 let response : Response
3032 switch ( options . provider ) {
3133 case 'buttondown' :
32- response = await buttondownHandler ( req , res )
34+ response = await buttondownHandler ( req )
3335 break
3436 case 'convertkit' :
35- response = await convertkitHandler ( req , res )
37+ response = await convertkitHandler ( req )
3638 break
3739 case 'mailchimp' :
38- response = await mailchimpHandler ( req , res )
40+ response = await mailchimpHandler ( req )
3941 break
4042 case 'klaviyo' :
41- response = await klaviyoHandler ( req , res )
43+ response = await klaviyoHandler ( req )
4244 break
4345 case 'revue' :
44- response = await revueHandler ( req , res )
46+ response = await revueHandler ( req )
4547 break
4648 case 'emailoctopus' :
47- response = await emailOctopusHandler ( req , res )
49+ response = await emailOctopusHandler ( req )
4850 break
4951 default :
5052 res . status ( 500 ) . json ( { error : `${ options . provider } not supported` } )
@@ -58,20 +60,79 @@ async function NewsletterHandler(
5860 }
5961}
6062
63+ async function NewsletterRouteHandler ( req : NextRequest , options : NewsletterConfig ) {
64+ const res = await req . json ( )
65+ if ( ! res . email ) {
66+ return NextResponse . json ( { error : 'Email is required' } , { status : 400 } )
67+ }
68+ try {
69+ let response : Response
70+ switch ( options . provider ) {
71+ case 'buttondown' :
72+ response = await buttondownHandler ( req )
73+ break
74+ case 'convertkit' :
75+ response = await convertkitHandler ( req )
76+ break
77+ case 'mailchimp' :
78+ response = await mailchimpHandler ( req )
79+ break
80+ case 'klaviyo' :
81+ response = await klaviyoHandler ( req )
82+ break
83+ case 'revue' :
84+ response = await revueHandler ( req )
85+ break
86+ case 'emailoctopus' :
87+ response = await emailOctopusHandler ( req )
88+ break
89+ default :
90+ return NextResponse . json ( { error : `${ options . provider } not supported` } , { status : 500 } )
91+ }
92+ if ( response . status == 200 ) {
93+ return NextResponse . json (
94+ { message : 'Successfully subscribed to the newsletter' } ,
95+ { status : response . status }
96+ )
97+ } else if ( response . status >= 400 ) {
98+ return NextResponse . json (
99+ { error : `There was an error subscribing to the list` } ,
100+ { status : response . status }
101+ )
102+ }
103+ return NextResponse . json ( { error : '' } , { status : 201 } )
104+ } catch ( error ) {
105+ return NextResponse . json ( { error : error . message || error . toString ( ) } , { status : 500 } )
106+ }
107+ }
108+
61109export function NewsletterAPI ( options : NewsletterConfig ) : any
110+ export function NewsletterAPI ( req : NextRequest , options : NewsletterConfig ) : any
62111export function NewsletterAPI (
63112 req : NextApiRequest ,
64113 res : NextApiResponse ,
65114 options : NewsletterConfig
66115) : any
67116
68117export function NewsletterAPI (
69- ...args : [ NewsletterConfig ] | [ NextApiRequest , NextApiResponse , NewsletterConfig ]
118+ ...args :
119+ | [ NewsletterConfig ]
120+ | [ NextRequest , NewsletterConfig ]
121+ | [ NextApiRequest , NextApiResponse , NewsletterConfig ]
70122) {
71123 if ( args . length === 1 ) {
72- return async ( req : NewsletterRequest , res : NewsletterResponse ) =>
73- await NewsletterHandler ( req , res , args [ 0 ] )
124+ return async ( req : NewsletterRequest | NextRequest , res : NewsletterResponse ) => {
125+ // For route handlers, 2nd argument contains the 'params' property instead of a response object
126+ if ( 'params' in res ) {
127+ return await NewsletterRouteHandler ( req as NextRequest , args [ 0 ] )
128+ }
129+ return await NewsletterAPIHandler ( req as NewsletterRequest , res , args [ 0 ] )
130+ }
131+ }
132+
133+ if ( args . length === 2 ) {
134+ return NewsletterRouteHandler ( ...args )
74135 }
75136
76- return NewsletterHandler ( args [ 0 ] , args [ 1 ] , args [ 2 ] )
137+ return NewsletterAPIHandler ( ... args )
77138}
0 commit comments