fix(emailjs): update param mapping and api usage

This commit is contained in:
google-labs-jules[bot]
2026-01-23 17:20:35 +00:00
parent 7ee61ed342
commit dd49676fca
3 changed files with 131 additions and 15 deletions

8
src/config.ts Normal file
View File

@@ -0,0 +1,8 @@
export const config = {
emailJs: {
serviceId: import.meta.env.VITE_EMAILJS_SERVICE_ID,
templateIdAdmin: import.meta.env.VITE_EMAILJS_TEMPLATE_ID_ADMIN,
templateIdUser: import.meta.env.VITE_EMAILJS_TEMPLATE_ID_USER,
publicKey: import.meta.env.VITE_EMAILJS_PUBLIC_KEY,
},
};

View File

@@ -2,15 +2,10 @@ import { useState, type FormEvent } from 'react';
import { motion } from 'motion/react';
import emailjs from '@emailjs/browser';
import { useTranslation } from '../i18n';
import { config } from '../config';
import { Button, Input, Textarea } from '../components/ui';
import styles from './Contact.module.css';
// EmailJS configuration
const EMAILJS_SERVICE_ID = import.meta.env.VITE_EMAILJS_SERVICE_ID;
const EMAILJS_TEMPLATE_ID_ADMIN = import.meta.env.VITE_EMAILJS_TEMPLATE_ID_ADMIN;
const EMAILJS_TEMPLATE_ID_USER = import.meta.env.VITE_EMAILJS_TEMPLATE_ID_USER;
const EMAILJS_PUBLIC_KEY = import.meta.env.VITE_EMAILJS_PUBLIC_KEY;
interface FormData {
name: string;
email: string;
@@ -72,26 +67,26 @@ export function Contact() {
try {
const templateParams = {
from_name: formData.name,
from_email: formData.email,
subject: formData.subject,
name: formData.name,
email: formData.email,
title: formData.subject,
message: formData.message,
};
await Promise.all([
// Send to Admin
emailjs.send(
EMAILJS_SERVICE_ID,
EMAILJS_TEMPLATE_ID_ADMIN,
config.emailJs.serviceId,
config.emailJs.templateIdAdmin,
templateParams,
EMAILJS_PUBLIC_KEY
{ publicKey: config.emailJs.publicKey }
),
// Send Auto-reply to User
emailjs.send(
EMAILJS_SERVICE_ID,
EMAILJS_TEMPLATE_ID_USER,
config.emailJs.serviceId,
config.emailJs.templateIdUser,
templateParams,
EMAILJS_PUBLIC_KEY
{ publicKey: config.emailJs.publicKey }
),
]);

View File

@@ -0,0 +1,113 @@
// @vitest-environment jsdom
import { render, screen, fireEvent, waitFor } from '@testing-library/react';
import { vi, describe, it, expect, beforeEach } from 'vitest';
import { Contact } from '../Contact';
import emailjs from '@emailjs/browser';
// Mock dependencies
vi.mock('@emailjs/browser', () => ({
default: {
send: vi.fn().mockResolvedValue({ status: 200, text: 'OK' }),
},
}));
vi.mock('../../i18n', () => ({
useTranslation: () => ({
t: {
contact: {
title: 'Contact Us',
subtitle: 'Get in touch',
intro: 'Send us a message',
form: {
name: 'Name',
namePlaceholder: 'Your Name',
email: 'Email',
emailPlaceholder: 'Your Email',
subject: 'Subject',
subjectPlaceholder: 'Message Subject',
message: 'Message',
messagePlaceholder: 'Your Message',
submit: 'Send Message',
sending: 'Sending...',
success: 'Message sent successfully!',
error: 'Failed to send message.',
},
info: {
title: 'Contact Info',
email: 'Email Us',
github: 'GitHub',
},
},
},
}),
}));
// Mock config
vi.mock('../../config', () => ({
config: {
emailJs: {
serviceId: 'mock_service_id',
templateIdAdmin: 'mock_template_admin',
templateIdUser: 'mock_template_user',
publicKey: 'mock_public_key',
},
},
}));
describe('Contact Page', () => {
beforeEach(() => {
vi.clearAllMocks();
});
it('submits the form with correct parameters', async () => {
render(<Contact />);
// Fill out the form
fireEvent.change(screen.getByLabelText('Name'), { target: { value: 'John Doe' } });
fireEvent.change(screen.getByLabelText('Email'), { target: { value: 'john@example.com' } });
fireEvent.change(screen.getByLabelText('Subject'), { target: { value: 'Test Subject' } });
fireEvent.change(screen.getByLabelText('Message'), { target: { value: 'Hello world' } });
// Submit
fireEvent.click(screen.getByRole('button', { name: 'Send Message' }));
// Wait for submission
await waitFor(() => {
expect(emailjs.send).toHaveBeenCalledTimes(2);
});
const expectedParams = {
name: 'John Doe',
email: 'john@example.com',
title: 'Test Subject',
message: 'Hello world',
};
const expectedOptions = {
publicKey: 'mock_public_key'
};
// Check first call (Admin)
expect(emailjs.send).toHaveBeenNthCalledWith(
1,
'mock_service_id',
'mock_template_admin',
expectedParams,
expectedOptions
);
// Check second call (User)
expect(emailjs.send).toHaveBeenNthCalledWith(
2,
'mock_service_id',
'mock_template_user',
expectedParams,
expectedOptions
);
// Verify success message
const successMessage = await screen.findByText('Message sent successfully!');
expect(successMessage).toBeTruthy();
});
});