Skip to content

Commit d4b7999

Browse files
committed
🎨 replace subscription route handler with server action
1 parent c44cd4a commit d4b7999

3 files changed

Lines changed: 83 additions & 67 deletions

File tree

web/.dockerignore

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,9 @@ node_modules
33

44
# Ignore local environment files
55
.env
6+
.env.template
67
.env.local
8+
.env.local.template
79
.env.development
810
.env.test
911
.env.production
Lines changed: 59 additions & 62 deletions
Original file line numberDiff line numberDiff line change
@@ -1,19 +1,17 @@
1+
'use server'
12
import axios from 'axios'
2-
import type { NextRequest } from 'next/server'
33
import type z from 'zod'
4-
import type { Level2Keys } from '@/lib/helpers/typescriptTyping'
4+
//import type { Level2Keys } from '@/lib/helpers/typescriptTyping'
55
import { subscribeSchema } from '@/lib/zodSchemas/zodSchemas'
6-
import { validateFormRequest } from '../../forms/validateFormRequest'
7-
8-
export type SubscribeFormParameters = z.infer<typeof subscribeSchema>
6+
import { validateFormRequest } from '../api/forms/validateFormRequest'
97

108
const MAKE_SUBSCRIBER_API_BASE_URL = process.env.MAKE_SUBSCRIBER_API_BASE_URL
119
const MAKE_API_KEY = process.env.MAKE_API_KEY || ''
1210
const SUBSCRIBER_LIST_ID_EN = process.env.MAKE_SUBSCRIBER_LIST_ID_EN
1311
const SUBSCRIBER_LIST_ID_NO = process.env.MAKE_SUBSCRIBER_LIST_ID_NO
1412
const MAKE_API_USER = process.env.MAKE_API_USERID || ''
1513

16-
export const newsletterCategoryMap = {
14+
const newsletterCategoryMap = {
1715
no: {
1816
generalNews: 'generelle nyheter',
1917
Company: 'generelle nyheter',
@@ -35,7 +33,7 @@ export const newsletterCategoryMap = {
3533
}
3634

3735
export type newsletterCategoryLocale = keyof typeof newsletterCategoryMap
38-
export type newsletterCategoryKeys = Level2Keys<typeof newsletterCategoryMap>
36+
//type newsletterCategoryKeys = Level2Keys<typeof newsletterCategoryMap>
3937

4038
const subscriberApi = axios.create({
4139
baseURL: MAKE_SUBSCRIBER_API_BASE_URL,
@@ -45,81 +43,80 @@ const subscriberApi = axios.create({
4543
},
4644
})
4745

48-
/**
49-
* Subscribe a user using subscriber_list_id and tags
50-
*/
51-
export const signUp = async (
52-
data: SubscribeFormParameters,
53-
languageCode: newsletterCategoryLocale,
54-
) => {
55-
const { email, categories } = data
56-
console.log('categories', categories)
46+
type SubscribeProps = {
47+
locale: newsletterCategoryLocale
48+
frcCaptchaSolution: any
49+
formData: z.infer<typeof subscribeSchema>
50+
}
51+
52+
export async function subscribe({
53+
locale,
54+
frcCaptchaSolution,
55+
formData,
56+
}: SubscribeProps) {
57+
const captchaResult = await validateFormRequest(
58+
frcCaptchaSolution,
59+
'subscription form',
60+
)
61+
if (captchaResult.status !== 200) {
62+
return {
63+
status: false,
64+
message: captchaResult.message,
65+
}
66+
}
67+
68+
const validatedData = subscribeSchema.safeParse(formData)
69+
70+
if (!validatedData.success) {
71+
return { status: false, errors: validatedData.error }
72+
}
73+
74+
const { email, categories } = formData
75+
5776
try {
5877
const tags = categories?.map(
59-
category => newsletterCategoryMap[languageCode][category],
78+
category => newsletterCategoryMap[locale][category],
6079
)
80+
//Leave for testing period
6181
console.log('newsletter tags', tags)
6282

6383
const response = await subscriberApi.post(
6484
`/subscribers?subscriber_list_id=${
65-
languageCode === 'no' ? SUBSCRIBER_LIST_ID_NO : SUBSCRIBER_LIST_ID_EN
85+
locale === 'no' ? SUBSCRIBER_LIST_ID_NO : SUBSCRIBER_LIST_ID_EN
6686
}&tag=merge`,
6787
{
6888
email,
6989
tags,
7090
},
7191
)
72-
console.log('Response from Make subscriber api', response.statusText)
92+
//Leave for testing period
93+
console.log('Response from Make subscriber api', response)
7394

74-
return response.status === 200
95+
if (response?.status === 200) {
96+
return {
97+
status: true,
98+
message: 'Successfully subscribed',
99+
}
100+
}
101+
//Leave for testing period
102+
console.log(
103+
'Error occured while newsletter subscription',
104+
response?.statusText,
105+
)
106+
return {
107+
status: false,
108+
message: 'Error during subscription',
109+
}
75110
} catch (error: any) {
76111
console.error('❌ Error in signUp:', {
77112
message: error.message,
78113
responseData: error.response?.data,
79114
responseStatus: error.response?.status,
80115
requestHeaders: error.config?.headers,
81116
})
82-
return false
117+
return {
118+
status: false,
119+
message: 'Error during subscription',
120+
}
83121
}
84122
}
85-
86-
export async function POST(req: NextRequest) {
87-
const body = await req.json()
88-
const { frcCaptchaSolution, languageCode, data } = body
89-
90-
const captchaResult = await validateFormRequest(
91-
frcCaptchaSolution,
92-
'subscription form',
93-
)
94-
if (captchaResult.status !== 200) {
95-
return Response.json(
96-
{ msg: captchaResult.message },
97-
{ status: captchaResult.status },
98-
)
99-
}
100-
101-
const validatedData = subscribeSchema.safeParse(data)
102-
103-
if (!validatedData.success) {
104-
return Response.json({ msg: 'Invalid data' }, { status: 400 })
105-
}
106-
107-
await signUp(data, languageCode)
108-
.then(isSuccessful => {
109-
if (!isSuccessful) {
110-
console.log('Signup was not successfull while newsletter subscription')
111-
return Response.json(
112-
{ msg: 'Error during subscription' },
113-
{ status: 500 },
114-
)
115-
}
116-
return Response.json({ msg: 'Successfully subscribed' }, { status: 200 })
117-
})
118-
.catch(error => {
119-
console.log('Error occured while newsletter subscription', error)
120-
return Response.json(
121-
{ msg: 'Error during subscription' },
122-
{ status: 500 },
123-
)
124-
})
125-
}

web/templates/forms/SubscribeForm.tsx

Lines changed: 22 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -6,11 +6,16 @@ import { useLocale, useTranslations } from 'next-intl'
66
import { type BaseSyntheticEvent, useId, useState } from 'react'
77
import { Controller, useForm } from 'react-hook-form'
88
import type * as z from 'zod'
9+
import {
10+
type newsletterCategoryLocale,
11+
subscribe,
12+
} from '@/app/_actions/subscription.actions'
913
import { Button } from '@/core/Button'
1014
import { Checkbox } from '@/core/Checkbox/Checkbox'
1115
import { FormMessageBox } from '@/core/Form/FormMessageBox'
1216
import { TextField } from '@/core/TextField/TextField'
1317
import { subscribeSchema } from '@/lib/zodSchemas/zodSchemas'
18+
import { getLocaleFromIso } from '@/sanity/helpers/localization'
1419
import FriendlyCaptcha from './FriendlyCaptcha'
1520

1621
const SubscribeForm = () => {
@@ -34,11 +39,20 @@ const SubscribeForm = () => {
3439
})
3540

3641
const onSubmit = async (
37-
data: z.infer<typeof subscribeSchema>,
42+
formData: z.infer<typeof subscribeSchema>,
3843
event?: BaseSyntheticEvent,
3944
) => {
4045
if (isFriendlyChallengeDone) {
41-
const res = await fetch('/api/newsletter/subscription', {
46+
console.log('locale', locale)
47+
const res = await subscribe({
48+
locale: getLocaleFromIso(locale) as newsletterCategoryLocale,
49+
frcCaptchaSolution: (event?.target as any)['frc-captcha-response']
50+
.value,
51+
formData,
52+
})
53+
console.log('subscribe res', res)
54+
55+
/* const res = await fetch('/api/newsletter/subscription', {
4256
body: JSON.stringify({
4357
data,
4458
languageCode: locale === 'en' ? 'en' : 'no',
@@ -49,9 +63,12 @@ const SubscribeForm = () => {
4963
'Content-Type': 'application/json',
5064
},
5165
method: 'POST',
52-
})
53-
setServerError(res.status !== 200)
54-
setSuccessfullySubmitted(res.status === 200)
66+
}) */
67+
if (res?.status) {
68+
setSuccessfullySubmitted(res.status)
69+
} else {
70+
setServerError(!res?.status)
71+
}
5572
} else {
5673
//@ts-ignore: TODO: types
5774
setError('root.notCompletedCaptcha', {

0 commit comments

Comments
 (0)