diff --git a/frontend/bun.lockb b/frontend/bun.lockb index 08a46ef..89e3ba5 100755 Binary files a/frontend/bun.lockb and b/frontend/bun.lockb differ diff --git a/frontend/package.json b/frontend/package.json index 3a806de..b324d48 100644 --- a/frontend/package.json +++ b/frontend/package.json @@ -10,13 +10,17 @@ }, "dependencies": { "@radix-ui/react-slot": "^1.1.0", + "@react-email/components": "^0.0.22", + "@react-email/tailwind": "^0.0.19", "class-variance-authority": "^0.7.0", "clsx": "^2.1.1", + "dotenv": "^16.4.5", "lucide-react": "^0.427.0", "next": "14.1.4", "nodemailer": "^6.9.14", "react": "^18.3.1", "react-dom": "^18.3.1", + "resend": "^3.5.0", "sharp": "^0.33.4", "tailwind-merge": "^2.5.2", "tailwindcss-animate": "^1.0.7" diff --git a/frontend/public/batch1/10-01.png b/frontend/public/batch1/10-01.png deleted file mode 100644 index 3387d26..0000000 Binary files a/frontend/public/batch1/10-01.png and /dev/null differ diff --git a/frontend/public/batch1/design 4-01.png b/frontend/public/batch1/design 4-01.png deleted file mode 100644 index 00ef35d..0000000 Binary files a/frontend/public/batch1/design 4-01.png and /dev/null differ diff --git a/frontend/public/batch1/design 6 update-01.png b/frontend/public/batch1/design 6 update-01.png deleted file mode 100644 index a58d7bb..0000000 Binary files a/frontend/public/batch1/design 6 update-01.png and /dev/null differ diff --git a/frontend/public/batch1/design 7 update-01.png b/frontend/public/batch1/design 7 update-01.png deleted file mode 100644 index b55a2a0..0000000 Binary files a/frontend/public/batch1/design 7 update-01.png and /dev/null differ diff --git a/frontend/public/batch1/design 8 update-01.png b/frontend/public/batch1/design 8 update-01.png deleted file mode 100644 index d814c11..0000000 Binary files a/frontend/public/batch1/design 8 update-01.png and /dev/null differ diff --git a/frontend/public/batch1/design update.png b/frontend/public/batch1/design update.png deleted file mode 100644 index a8af868..0000000 Binary files a/frontend/public/batch1/design update.png and /dev/null differ diff --git a/frontend/public/batch1/files_list.json b/frontend/public/batch1/files_list.json index 8dbe018..6ef1706 100644 --- a/frontend/public/batch1/files_list.json +++ b/frontend/public/batch1/files_list.json @@ -2,7 +2,7 @@ { "id": 1, "name": "design update", - "photo": "batch1/design update.png", + "photo": "batch1/t shirt mockup 3.jpg", "price": 25, "size": "Youth-S/M/L/2XL | Adult-S/M/L/2XL", "inStock": "yes", @@ -42,7 +42,7 @@ { "id": 5, "name": "design 6 update-01", - "photo": "batch1/design 6 update-01.png", + "photo": "batch1/t shirt mockup 6.jpg", "price": 25, "size": "Youth-S/M/L/2XL | Adult-S/M/L/2XL", "inStock": "yes", @@ -72,7 +72,7 @@ { "id": 9, "name": "design 4-01", - "photo": "batch1/design 4-01.png", + "photo": "batch1/t shirt mockup 4.jpg", "price": 25, "size": "Youth-S/M/L/2XL | Adult-S/M/L/2XL", "inStock": "yes", @@ -99,16 +99,6 @@ "favorite": "no", "description": "It's not an option.." }, - { - "id": 12, - "name": "75-01", - "photo": "batch1/75-01.png", - "price": 25, - "size": "Youth-S/M/L/2XL | Adult-S/M/L/2XL", - "inStock": "yes", - "favorite": "no", - "description": "It's not an option.." - }, { "id": 13, "name": "Mockup 119", @@ -132,7 +122,7 @@ { "id": 15, "name": "10-01", - "photo": "batch1/10-01.png", + "photo": "batch1/t shirt mockup 10.jpg", "price": 25, "size": "Youth-S/M/L/2XL | Adult-S/M/L/2XL", "inStock": "yes", @@ -142,7 +132,7 @@ { "id": 16, "name": "design 7 update-01", - "photo": "batch1/design 7 update-01.png", + "photo": "batch1/t shirt mockup 7.jpg", "price": 25, "size": "Youth-S/M/L/2XL | Adult-S/M/L/2XL", "inStock": "yes", @@ -182,7 +172,7 @@ { "id": 20, "name": "design 8 update-01", - "photo": "batch1/design 8 update-01.png", + "photo": "batch1/t shirt mockup 8.jpg", "price": 25, "size": "Youth-S/M/L/2XL | Adult-S/M/L/2XL", "inStock": "yes", diff --git a/frontend/public/batch1/t shirt mockup 10.jpg b/frontend/public/batch1/t shirt mockup 10.jpg new file mode 100644 index 0000000..48fe8f2 Binary files /dev/null and b/frontend/public/batch1/t shirt mockup 10.jpg differ diff --git a/frontend/public/batch1/t shirt mockup 3.jpg b/frontend/public/batch1/t shirt mockup 3.jpg new file mode 100644 index 0000000..cb6eb62 Binary files /dev/null and b/frontend/public/batch1/t shirt mockup 3.jpg differ diff --git a/frontend/public/batch1/t shirt mockup 4.jpg b/frontend/public/batch1/t shirt mockup 4.jpg new file mode 100644 index 0000000..e50d1ac Binary files /dev/null and b/frontend/public/batch1/t shirt mockup 4.jpg differ diff --git a/frontend/public/batch1/t shirt mockup 6.jpg b/frontend/public/batch1/t shirt mockup 6.jpg new file mode 100644 index 0000000..6fae246 Binary files /dev/null and b/frontend/public/batch1/t shirt mockup 6.jpg differ diff --git a/frontend/public/batch1/t shirt mockup 7.jpg b/frontend/public/batch1/t shirt mockup 7.jpg new file mode 100644 index 0000000..8593ee6 Binary files /dev/null and b/frontend/public/batch1/t shirt mockup 7.jpg differ diff --git a/frontend/public/batch1/t shirt mockup 8.jpg b/frontend/public/batch1/t shirt mockup 8.jpg new file mode 100644 index 0000000..1c17c3c Binary files /dev/null and b/frontend/public/batch1/t shirt mockup 8.jpg differ diff --git a/frontend/src/app/actions/sendEmail.ts b/frontend/src/app/actions/sendEmail.ts new file mode 100644 index 0000000..98daa03 --- /dev/null +++ b/frontend/src/app/actions/sendEmail.ts @@ -0,0 +1,44 @@ +"use server" + +import { Resend } from "resend" +import { validateString } from "@/lib/utils"; +import OrderFormEmail from "../emailTemplates/order-form-email"; +import React from "react"; +import 'dotenv/config'; + + +const resend = new Resend(process.env.RESEND_API_KEY); + + +export const sendEmail = async (formData: FormData) => { + //rate limit + + //only allow authenticated user as well + + const senderEmail = formData.get('senderEmail'); + const message = formData.get('message'); + + if (!validateString(senderEmail, 500)){ + return{ error: "Invalid sender Email",}; + } + if (!validateString(message, 5000)){ + return{ error: "Invalid message",}; + } + + // console.log("Running on sever"); + // console.log(formData.get("senderEmail")); + // console.log(formData.get("message")); + + try { + await resend.emails.send({ + from:"Order Form ", + to:"arcjcb11@gmail.com", + subject: "New Order", + reply_to: senderEmail as string, + // text: message as string, + react: React.createElement(OrderFormEmail, {message: message as string, senderEmail: senderEmail as string}), + }); + } catch (error: unknown){ + return console.log(error) + } +}; \ No newline at end of file diff --git a/frontend/src/app/emailTemplates/order-form-email.tsx b/frontend/src/app/emailTemplates/order-form-email.tsx new file mode 100644 index 0000000..7f6c6b7 --- /dev/null +++ b/frontend/src/app/emailTemplates/order-form-email.tsx @@ -0,0 +1,39 @@ +import React from "react"; +import { + Html, + Body, + Head, + Heading, + Hr, + Container, + Preview, + Section, + Text, +} from "@react-email/components"; +import { Tailwind } from "@react-email/tailwind"; + +type OrderFormEmailProps = { + message: string; + senderEmail: string; +}; + +export default function OrderFormEmail({ message, senderEmail }: OrderFormEmailProps) { + return ( + + + New order from kevo's attire. + + + +
+ You received a new order from the order form. + {message} +
+ The sender's email is: {senderEmail} +
+
+ +
+ + ); +} diff --git a/frontend/src/app/page.tsx b/frontend/src/app/page.tsx index 1f3e1a5..e2162d4 100644 --- a/frontend/src/app/page.tsx +++ b/frontend/src/app/page.tsx @@ -8,6 +8,7 @@ import Modal from "../components/Modal/Modal"; import ClientPortal from "@/components/ClientPortal/ClientPortal"; import styles from "@/styles/Home.module.css"; import { Poppins } from "next/font/google"; +import { sendEmail } from "./actions/sendEmail"; const Popp = Poppins({ weight: "400", subsets: ["latin"] }); @@ -40,6 +41,16 @@ export default function Home() { */} +
{await sendEmail(formData)}}> +

Order Form

+ + +