From a80fb54d691031f724bf01ca71cf5b1c8184e54d Mon Sep 17 00:00:00 2001 From: Josh Daniel Date: Mon, 16 Dec 2024 16:27:24 +0800 Subject: [PATCH 1/5] feat: setup email implementation --- bun.lockb | Bin 262839 -> 279269 bytes package.json | 3 ++ src/components/devfest24-email.tsx | 65 +++++++++++++++++++++++++++++ src/lib/email.ts | 34 +++++++++++++++ 4 files changed, 102 insertions(+) create mode 100644 src/components/devfest24-email.tsx create mode 100644 src/lib/email.ts diff --git a/bun.lockb b/bun.lockb index c8eb6f6b5ddbda20440949517e4b7e207996e3f4..d5b583f061fa3b3aba1a2087c442911a72bd487e 100755 GIT binary patch delta 57467 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 delta 47582 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

TzJ&u-|^%zkADxTihYdKJU->ce~r{7DUW>X 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 HUU~lmr^E2` diff --git a/package.json b/package.json index 6fbbd8c..634c439 100644 --- a/package.json +++ b/package.json @@ -20,6 +20,7 @@ "@radix-ui/react-slot": "^1.0.2", "@radix-ui/react-tabs": "^1.0.4", "@radix-ui/react-tooltip": "^1.0.7", + "@react-email/components": "^0.0.31", "@react-three/drei": "^9.109.2", "@react-three/fiber": "^8.16.8", "@react-three/rapier": "^1.4.0", @@ -34,6 +35,7 @@ "next": "14.2.5", "next-themes": "^0.3.0", "nextjs-toploader": "^1.6.12", + "nodemailer": "^6.9.16", "react": "^18", "react-dom": "^18", "react-firebase-hooks": "^5.1.1", @@ -50,6 +52,7 @@ }, "devDependencies": { "@types/node": "^20", + "@types/nodemailer": "^6.4.17", "@types/react": "^18", "@types/react-dom": "^18", "@types/three": "^0.167.1", diff --git a/src/components/devfest24-email.tsx b/src/components/devfest24-email.tsx new file mode 100644 index 0000000..5916c87 --- /dev/null +++ b/src/components/devfest24-email.tsx @@ -0,0 +1,65 @@ +import { + Body, + Button, + Container, + Head, + Heading, + Hr, + Html, + Preview, + Section, + Tailwind, + Text, +} from "@react-email/components"; +import * as React from "react"; + +type Props = { + id: string; + firstName: string; + lastName: string; +}; + +export const CertificateEmail = ({ id, firstName, lastName }: Props) => { + const previewText = "Claim Your Certificate!"; + + return ( + + + {previewText} + + + + + GDG Bacolod + + + Hello {firstName} {lastName}, + + + We're excited to let you know that your certificate for{" "} + Google DevFest 2023 is ready and waiting for you. + 🎉 To claim it, just click the button below or check out the + attached image: + +

+ +
+
+ + This certificate generator is powered by{" "} + omsimos.com — If you were not + expecting this certificate, you can ignore this email. + + + + + + ); +}; + +export default CertificateEmail; diff --git a/src/lib/email.ts b/src/lib/email.ts new file mode 100644 index 0000000..5766087 --- /dev/null +++ b/src/lib/email.ts @@ -0,0 +1,34 @@ +import nodemailer from "nodemailer"; +import Mail from "nodemailer/lib/mailer"; + +type Payload = { + to: string; + subject: string; + html: string; + attachments: Mail.Attachment[]; +}; + +export const handleSendEmail = async (data: Payload) => { + let transporter = nodemailer.createTransport({ + service: "gmail", + auth: { + user: process.env.NODEMAILER_EMAIL, + pass: process.env.NODEMAILER_PW, + }, + }); + + return ( + await transporter.sendMail({ + from: process.env.NODEMAILER_EMAIL, + ...data, + }), + function (error: string, _info: string) { + if (error) { + throw new Error(error); + } else { + console.log("Email Sent"); + return true; + } + } + ); +}; From 31d1b6b978d0150dace5d7f0486a4e86c820bd2d Mon Sep 17 00:00:00 2001 From: Josh Daniel Date: Mon, 16 Dec 2024 16:29:41 +0800 Subject: [PATCH 2/5] feat: add api route for sending email --- src/app/api/email/route.ts | 48 ++++++++++++++++++++++++++++++ src/components/devfest24-email.tsx | 2 +- 2 files changed, 49 insertions(+), 1 deletion(-) create mode 100644 src/app/api/email/route.ts diff --git a/src/app/api/email/route.ts b/src/app/api/email/route.ts new file mode 100644 index 0000000..3a3eec7 --- /dev/null +++ b/src/app/api/email/route.ts @@ -0,0 +1,48 @@ +import { NextResponse } from 'next/server'; +import nodemailer from 'nodemailer'; +import Mail from 'nodemailer/lib/mailer'; + +type Payload = { + to: string; + subject: string; + html: string; + attachments: Mail.Attachment[]; +}; + +export async function POST(request: Request) { + try { + const data: Payload = await request.json(); + + let transporter = nodemailer.createTransport({ + service: 'gmail', + auth: { + user: process.env.NODEMAILER_EMAIL, + pass: process.env.NODEMAILER_PW, + }, + }); + + await new Promise((resolve, reject) => { + transporter.sendMail( + { + from: process.env.NODEMAILER_EMAIL, + ...data, + }, + (error, info) => { + if (error) { + console.error('Error sending email:', error); + reject(error); + } else { + console.log('Email sent:', info.response); + resolve(info); + } + } + ); + }); + + return NextResponse.json({ message: 'Email sent successfully' }, { status: 200 }); + } catch (error) { + console.error('Error in route handler:', error); + return NextResponse.json({ error: 'Failed to send email' }, { status: 500 }); + } +} + diff --git a/src/components/devfest24-email.tsx b/src/components/devfest24-email.tsx index 5916c87..82da1f0 100644 --- a/src/components/devfest24-email.tsx +++ b/src/components/devfest24-email.tsx @@ -37,7 +37,7 @@ export const CertificateEmail = ({ id, firstName, lastName }: Props) => { We're excited to let you know that your certificate for{" "} - Google DevFest 2023 is ready and waiting for you. + Google DevFest 2024 is ready and waiting for you. 🎉 To claim it, just click the button below or check out the attached image: From 4b3f732afd2f78e71493dc3d7773f2acbe167a0e Mon Sep 17 00:00:00 2001 From: Josh Daniel Date: Mon, 16 Dec 2024 16:31:13 +0800 Subject: [PATCH 3/5] chore: add sharp --- bun.lockb | Bin 279269 -> 289993 bytes package.json | 1 + 2 files changed, 1 insertion(+) diff --git a/bun.lockb b/bun.lockb index d5b583f061fa3b3aba1a2087c442911a72bd487e..aa9c699383335cd55fda85a2626116d599fd878b 100755 GIT binary patch delta 50601 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 delta 44715 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 Date: Tue, 17 Dec 2024 22:48:09 +0800 Subject: [PATCH 4/5] feat: update email format --- public/gdg-icon.png | Bin 0 -> 4281 bytes src/app/api/email/route.ts | 61 ++++++---------- src/components/devfest24-email.tsx | 111 +++++++++++++++++++++++------ src/lib/email.ts | 13 +++- 4 files changed, 121 insertions(+), 64 deletions(-) create mode 100644 public/gdg-icon.png diff --git a/public/gdg-icon.png b/public/gdg-icon.png new file mode 100644 index 0000000000000000000000000000000000000000..3f91ec5c14d3e5bc3b8e323ba893d0c083468784 GIT binary patch literal 4281 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 R5cn4c(Zd>IDz%&={|EKGTE74Q literal 0 HcmV?d00001 diff --git a/src/app/api/email/route.ts b/src/app/api/email/route.ts index 3a3eec7..9be9870 100644 --- a/src/app/api/email/route.ts +++ b/src/app/api/email/route.ts @@ -1,48 +1,31 @@ -import { NextResponse } from 'next/server'; -import nodemailer from 'nodemailer'; -import Mail from 'nodemailer/lib/mailer'; +import { NextRequest, NextResponse } from "next/server"; +import { render } from "@react-email/render"; +import Email from "@/components/devfest24-email"; +import { handleSendEmail } from "@/lib/email"; -type Payload = { - to: string; - subject: string; - html: string; - attachments: Mail.Attachment[]; -}; - -export async function POST(request: Request) { +export async function POST(request: NextRequest) { try { - const data: Payload = await request.json(); + const body = await request.json(); + const { id, email, firstName, lastName } = body; - let transporter = nodemailer.createTransport({ - service: 'gmail', - auth: { - user: process.env.NODEMAILER_EMAIL, - pass: process.env.NODEMAILER_PW, - }, - }); + const htmlContent = await render(Email({ id, firstName, lastName })); - await new Promise((resolve, reject) => { - transporter.sendMail( - { - from: process.env.NODEMAILER_EMAIL, - ...data, - }, - (error, info) => { - if (error) { - console.error('Error sending email:', error); - reject(error); - } else { - console.log('Email sent:', info.response); - resolve(info); - } - } - ); + await handleSendEmail({ + to: email, + subject: "Certificate: Google DevFest 2024", + html: htmlContent, }); - return NextResponse.json({ message: 'Email sent successfully' }, { status: 200 }); - } catch (error) { - console.error('Error in route handler:', error); - return NextResponse.json({ error: 'Failed to send email' }, { status: 500 }); + return NextResponse.json({ message: "Success" }, { status: 200 }); + } catch (err: any) { + console.error("Error sending email:", err, process.env.NODEMAILER_PW); + return NextResponse.json({ message: err.message }, { status: 500 }); } } +export async function GET() { + return NextResponse.json( + { message: "GET request received" }, + { status: 200 }, + ); +} diff --git a/src/components/devfest24-email.tsx b/src/components/devfest24-email.tsx index 82da1f0..3135960 100644 --- a/src/components/devfest24-email.tsx +++ b/src/components/devfest24-email.tsx @@ -6,6 +6,8 @@ import { Heading, Hr, Html, + Img, + Link, Preview, Section, Tailwind, @@ -17,44 +19,109 @@ type Props = { id: string; firstName: string; lastName: string; + eventName?: string; }; -export const CertificateEmail = ({ id, firstName, lastName }: Props) => { - const previewText = "Claim Your Certificate!"; +export const CertificateEmail = ({ + id, + firstName, + lastName, + eventName = "DevFest Bacolod 2024", +}: Props) => { + const previewText = `Your ${eventName} Certificate is Ready!`; return ( {previewText} - - - - GDG Bacolod - - - Hello {firstName} {lastName}, + + +
+ GDG Bacolod Logo + + GDG Bacolod + +
+
+ Certificate Preview +
+ + Dear {firstName} {lastName}, - - We're excited to let you know that your certificate for{" "} - Google DevFest 2024 is ready and waiting for you. - 🎉 To claim it, just click the button below or check out the - attached image: + + Congratulations! 🎉 Your certificate for{" "} + {eventName} is now available. We're thrilled + to recognize your participation and achievement. -
+
-
- - This certificate generator is powered by{" "} - omsimos.com — If you were not - expecting this certificate, you can ignore this email. + + Don't forget to share your achievement on social media. + It's a great way to showcase your involvement in the tech + community! + + + We value your feedback! Please take a moment to share your + thoughts about the event: + +
+ + Provide Feedback + +
+
+ + This certificate is powered by{" "} + + omsimos.com + + + + If you didn't participate in this event, please disregard + this email. +
+ + Follow us on social media: + + + Facebook + + + LinkedIn + +
diff --git a/src/lib/email.ts b/src/lib/email.ts index 5766087..b1fafda 100644 --- a/src/lib/email.ts +++ b/src/lib/email.ts @@ -5,12 +5,18 @@ type Payload = { to: string; subject: string; html: string; - attachments: Mail.Attachment[]; + attachments?: Mail.Attachment[]; }; export const handleSendEmail = async (data: Payload) => { let transporter = nodemailer.createTransport({ - service: "gmail", + host: "smtp.hostinger.com", + port: 465, + secure: true, + debug: process.env.NODE_ENV === "development", + tls: { + rejectUnauthorized: false, + }, auth: { user: process.env.NODEMAILER_EMAIL, pass: process.env.NODEMAILER_PW, @@ -19,11 +25,12 @@ export const handleSendEmail = async (data: Payload) => { return ( await transporter.sendMail({ - from: process.env.NODEMAILER_EMAIL, + from: "no-reply@omsimos.com", ...data, }), function (error: string, _info: string) { if (error) { + console.log("Your Email", process.env.NODEMAILER_EMAIL); throw new Error(error); } else { console.log("Email Sent"); From 5bf0d1147f4ff2157fae3c48a46d71826634df1b Mon Sep 17 00:00:00 2001 From: Josh Daniel Date: Tue, 17 Dec 2024 23:31:56 +0800 Subject: [PATCH 5/5] feat: send email after generating --- src/app/api/email/route.ts | 2 +- src/app/event/components/devfest24-cert.tsx | 3 +- src/app/event/components/event-landing.tsx | 32 +++++++++++++++++---- src/components/devfest24-email.tsx | 2 +- 4 files changed, 30 insertions(+), 9 deletions(-) diff --git a/src/app/api/email/route.ts b/src/app/api/email/route.ts index 9be9870..cdce536 100644 --- a/src/app/api/email/route.ts +++ b/src/app/api/email/route.ts @@ -12,7 +12,7 @@ export async function POST(request: NextRequest) { await handleSendEmail({ to: email, - subject: "Certificate: Google DevFest 2024", + subject: "Certificate: DevFest Bacolod 2024", html: htmlContent, }); diff --git a/src/app/event/components/devfest24-cert.tsx b/src/app/event/components/devfest24-cert.tsx index 58fba15..5cb4a8d 100644 --- a/src/app/event/components/devfest24-cert.tsx +++ b/src/app/event/components/devfest24-cert.tsx @@ -65,14 +65,13 @@ export function DevfestCertificate() { link.download = `certificate_${certId}.png`; link.href = dataUrl; link.click(); - toast.success("Image Saved!"); setImgLoading(false); }) .catch((err) => { toast.error(err.message); setImgLoading(false); }), - { loading: "Saving image...", success: "Saved image!", error: "Error!" }, + { loading: "Saving image...", success: "Image saved!", error: "Error!" }, ); }, [cardRef, certId]); diff --git a/src/app/event/components/event-landing.tsx b/src/app/event/components/event-landing.tsx index 518e59c..bfce5a4 100644 --- a/src/app/event/components/event-landing.tsx +++ b/src/app/event/components/event-landing.tsx @@ -79,13 +79,31 @@ export default function EventLanding({ try { const querySnapshot = await getDocs(q); let message = "⚠️ Certificate Not Found"; - querySnapshot.forEach((doc) => { - if (doc.data().email) { + + for (const doc of querySnapshot.docs) { + const data = doc.data(); + + if (doc.exists()) { + await fetch("/api/email", { + method: "POST", + headers: { + Accept: "application/json", + "Content-Type": "application/json", + }, + body: JSON.stringify({ + id: doc.id, + email: data.email, + firstName: data.firstName, + lastName: data.lastName, + }), + }); + push(`/event/${eventCode}/${values.type}?id=${doc.id}`); message = "✅ Certificate found!"; - return; + break; } - }); + } + toast(message); setLoading(false); } catch (err: any) { @@ -144,7 +162,11 @@ export default function EventLanding({ - + Badge diff --git a/src/components/devfest24-email.tsx b/src/components/devfest24-email.tsx index 3135960..4e3255f 100644 --- a/src/components/devfest24-email.tsx +++ b/src/components/devfest24-email.tsx @@ -69,7 +69,7 @@ export const CertificateEmail = ({