feat: add basic webui
This commit is contained in:
48
apps/web/app/contact/actions/contact.tsx
Normal file
48
apps/web/app/contact/actions/contact.tsx
Normal file
@@ -0,0 +1,48 @@
|
||||
'use server';
|
||||
|
||||
import { konosend } from '@konobangu/email';
|
||||
import { ContactTemplate } from '@konobangu/email/templates/contact';
|
||||
import { env } from '@konobangu/env';
|
||||
import { parseError } from '@konobangu/observability/error';
|
||||
import { createRateLimiter, slidingWindow } from '@konobangu/rate-limit';
|
||||
import { headers } from 'next/headers';
|
||||
|
||||
export const contact = async (
|
||||
name: string,
|
||||
email: string,
|
||||
message: string
|
||||
): Promise<{
|
||||
error?: string;
|
||||
}> => {
|
||||
try {
|
||||
if (env.UPSTASH_REDIS_REST_URL && env.UPSTASH_REDIS_REST_TOKEN) {
|
||||
const rateLimiter = createRateLimiter({
|
||||
limiter: slidingWindow(1, '1d'),
|
||||
});
|
||||
const head = await headers();
|
||||
const ip = head.get('x-forwarded-for');
|
||||
|
||||
const { success } = await rateLimiter.limit(`contact_form_${ip}`);
|
||||
|
||||
if (!success) {
|
||||
throw new Error(
|
||||
'You have reached your request limit. Please try again later.'
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
await konosend.emails.send({
|
||||
from: env.RESEND_FROM,
|
||||
to: env.RESEND_FROM,
|
||||
subject: 'Contact form submission',
|
||||
replyTo: email,
|
||||
react: <ContactTemplate name={name} email={email} message={message} />,
|
||||
});
|
||||
|
||||
return {};
|
||||
} catch (error) {
|
||||
const errorMessage = parseError(error);
|
||||
|
||||
return { error: errorMessage };
|
||||
}
|
||||
};
|
||||
Reference in New Issue
Block a user