Conversation
Replaced Resend email service with Gmail using Nodemailer throughout the project. Updated environment variables, documentation, and workflow templates to use Gmail credentials and app password. Added Gmail configuration documentation and removed Resend dependencies from package files.
Introduces RSVP API endpoint and test, adds RSVP form logic and submission, and provides a script for sending test emails. Updates environment files for email testing, improves gallery and homepage UI, enforces light theme, and adds a route loader component. Also updates package dependencies and scripts for email and RSVP testing.
Updated color schemes to use theme variables, improved image overlays and gradients, added motion-reduce support for accessibility, and enhanced decorative elements with aria-hidden attributes. These changes improve visual consistency and accessibility in the 'Our Story' section.
Added new DevTools reports including Lighthouse JSON, browser console logs, and Puppeteer script for arvinwedsincia.com. Updated admin login and layout pages in the client app.
Initial commit of the Copilot chat log documenting UI/UX improvements, image adjustments, mobile responsiveness, and a Next.js Suspense boundary fix for useSearchParams. Includes summary, actions taken, validation, and next steps.
There was a problem hiding this comment.
Pull Request Overview
This PR implements a comprehensive set of production deployment configurations and email system improvements for the Sharothee Wedding website. The changes focus on preparing the application for production deployment on Hostinger VPS with proper configuration management and switching from Resend to Gmail-based email service.
- Production deployment configurations including Next.js config, PM2 ecosystem, and environment files
- Migration from Resend email service to Gmail with Nodemailer for better reliability
- UI/UX improvements including route loading indicators, form enhancements, and accessibility fixes
Reviewed Changes
Copilot reviewed 39 out of 45 changed files in this pull request and generated 5 comments.
Show a summary per file
| File | Description |
|---|---|
| production_configs/* | Complete production deployment setup with Next.js config, PM2 ecosystem, and environment templates |
| client/src/lib/email.ts | Migration from Resend to Gmail/Nodemailer email service with improved error handling |
| client/src/app/api/rsvp/form/route.ts | New RSVP form API endpoint with email notifications |
| client/src/components/RouteLoader.tsx | New route transition progress indicator component |
| client/src/app/layout.tsx | Added Suspense wrapper for route loader to fix Next.js build errors |
| client/src/app/admin/login/page.tsx | Wrapped useSearchParams usage in Suspense to resolve build issues |
| client/package.json | Updated dependencies replacing Resend with Nodemailer |
Comments suppressed due to low confidence (1)
production_configs/.env.production:1
- Production environment file contains real credentials and should not be committed to version control. These sensitive values should be managed through secure environment variable injection or secrets management.
# Database
|
|
||
| const nextConfig: NextConfig = { | ||
| basePath: process.env.NODE_ENV === 'production' ? '' : '', | ||
| assetPrefix: process.env.NODE_ENV === 'production' ? '' : '', |
There was a problem hiding this comment.
These conditional assignments are redundant since both production and development environments are set to empty strings. Consider removing the ternary operators and using empty strings directly, or remove these properties entirely if they're not needed.
| assetPrefix: process.env.NODE_ENV === 'production' ? '' : '', | |
| basePath: '', | |
| assetPrefix: '', |
| ignoreDuringBuilds: true, | ||
| }, | ||
| typescript: { | ||
| ignoreBuildErrors: true, |
There was a problem hiding this comment.
Ignoring ESLint and TypeScript errors during builds in production is risky as it can hide important issues. Consider enabling these checks to catch potential problems before deployment.
| ignoreBuildErrors: true, | |
| ignoreDuringBuilds: false, | |
| }, | |
| typescript: { | |
| ignoreBuildErrors: false, |
| } | ||
|
|
||
| return { success: true, data }; | ||
| })) as SentMessageInfo |
There was a problem hiding this comment.
The type assertion as SentMessageInfo bypasses TypeScript's type checking. Consider using proper typing or handling the return type more safely to ensure type safety.
| } | ||
|
|
||
| // Send notification to admin (ADMIN_EMAIL or fallback to GMAIL_USER) | ||
| const adminCandidates = [process.env.ADMIN_EMAIL, process.env.GMAIL_USER].filter(Boolean) as string[] |
There was a problem hiding this comment.
The type assertion as string[] after filter(Boolean) assumes all values are strings, but TypeScript can't guarantee this. Consider using a more explicit type guard or validation.
| const adminCandidates = [process.env.ADMIN_EMAIL, process.env.GMAIL_USER].filter(Boolean) as string[] | |
| const adminCandidates = [process.env.ADMIN_EMAIL, process.env.GMAIL_USER].filter((v): v is string => typeof v === 'string' && v.length > 0) |
| }; | ||
| // eslint-disable-next-line react-hooks/exhaustive-deps | ||
| }, [pathname, searchParams?.toString()]); | ||
|
|
There was a problem hiding this comment.
Disabling the exhaustive-deps rule can hide dependency issues. Consider adding the missing dependencies or restructuring the effect to avoid the need for this disable comment.
| }, [pathname, searchParams]); |
No description provided.