From 53ab83dd354fe7f1bbee1a9cb9c0ff8aa9f4d990 Mon Sep 17 00:00:00 2001 From: Joywin Bennis <107112207+joywin2003@users.noreply.github.com> Date: Fri, 15 Nov 2024 21:25:16 +0530 Subject: [PATCH 01/40] remove unused CanvasCursor component --- src/components/common/ink.jsx | 9 --------- 1 file changed, 9 deletions(-) delete mode 100644 src/components/common/ink.jsx diff --git a/src/components/common/ink.jsx b/src/components/common/ink.jsx deleted file mode 100644 index 3e99cca..0000000 --- a/src/components/common/ink.jsx +++ /dev/null @@ -1,9 +0,0 @@ -"use client"; -import useCanvasCursor from "../ui/cursor"; - -const CanvasCursor = () => { - useCanvasCursor(); - - return ; -}; -export default CanvasCursor; From 50b9da8ec6ec51331a7f94a8d2aeca3ec643a6b4 Mon Sep 17 00:00:00 2001 From: Joywin Bennis <107112207+joywin2003@users.noreply.github.com> Date: Fri, 15 Nov 2024 21:46:58 +0530 Subject: [PATCH 02/40] renamed container scroll into kebab case --- src/components/common/container-scroll.tsx | 29 ++++++++++++++++++++++ 1 file changed, 29 insertions(+) create mode 100644 src/components/common/container-scroll.tsx diff --git a/src/components/common/container-scroll.tsx b/src/components/common/container-scroll.tsx new file mode 100644 index 0000000..f16f343 --- /dev/null +++ b/src/components/common/container-scroll.tsx @@ -0,0 +1,29 @@ +"use client"; +import React from "react"; +import { ContainerScroll } from "../ui/container-scroll-animation"; + +export function PreviousEdition() { + return ( +
+ +

+ Check out the Previous Edition +

+ + } + > + {/* */} + +
+
+ ); +} From cfa24cf5b1474452498d4547b2c67c8dcf306478 Mon Sep 17 00:00:00 2001 From: Joywin Bennis <107112207+joywin2003@users.noreply.github.com> Date: Fri, 15 Nov 2024 22:00:32 +0530 Subject: [PATCH 03/40] refactor: reorganize registration form schemas --- src/app/page.tsx | 2 +- src/components/common/registration-form.tsx | 89 +++++++-------------- src/utils/zod-schemas.ts | 29 +++++++ 3 files changed, 59 insertions(+), 61 deletions(-) diff --git a/src/app/page.tsx b/src/app/page.tsx index 2d22d1e..310e450 100644 --- a/src/app/page.tsx +++ b/src/app/page.tsx @@ -3,7 +3,7 @@ import React, { useState, useEffect } from "react"; // import ParallaxFooter from "@/components/common/Footer"; import Speakers from "@/components/common/speakers"; -import { PreviousEdition } from "@/components/common/Container-Scroll"; +import { PreviousEdition } from "@/components/common/container-scroll"; import About from "@/components/common/About"; import Team from "@/components/common/Team-Section"; // import { CtaSection } from "@/components/common/cta-section"; diff --git a/src/components/common/registration-form.tsx b/src/components/common/registration-form.tsx index bace413..71d5958 100644 --- a/src/components/common/registration-form.tsx +++ b/src/components/common/registration-form.tsx @@ -1,18 +1,17 @@ "use client"; -import React, { useEffect, useState } from "react"; -import { useForm } from "react-hook-form"; -import { zodResolver } from "@hookform/resolvers/zod"; -import * as z from "zod"; +import { getPrice } from "@/app/actions/get-price"; +import { invalidateCouponCode } from "@/app/actions/invalidate-coupon"; +import { submitForm } from "@/app/actions/submit-form"; import { Button } from "@/components/ui/button"; -import { Input } from "@/components/ui/input"; import { - Select, - SelectContent, - SelectItem, - SelectTrigger, - SelectValue, -} from "@/components/ui/select"; + Card, + CardContent, + CardDescription, + CardFooter, + CardHeader, + CardTitle, +} from "@/components/ui/card"; import { Form, FormControl, @@ -22,30 +21,32 @@ import { FormLabel, FormMessage, } from "@/components/ui/form"; -import { - Card, - CardContent, - CardDescription, - CardFooter, - CardHeader, - CardTitle, -} from "@/components/ui/card"; +import { Input } from "@/components/ui/input"; import { Label } from "@/components/ui/label"; -import { getPrice } from "@/app/actions/get-price"; -import { toast } from "sonner"; +import { + Select, + SelectContent, + SelectItem, + SelectTrigger, + SelectValue, +} from "@/components/ui/select"; +import { basePrice, initialdiscount, sjecFacultyPrice, sjecStudentPrice } from "@/constants"; +import { getSjecMemberType } from "@/lib/helper"; +import { FormDataInterface } from "@/types"; import getErrorMessage from "@/utils/getErrorMessage"; -import { basePrice, initialdiscount, sjecStudentPrice,sjecFacultyPrice } from "@/constants"; -import { invalidateCouponCode } from "@/app/actions/invalidate-coupon"; +import { useUploadThing } from "@/utils/uploadthing"; +import { baseSchema, studentFormSchema, studentSchema } from "@/utils/zod-schemas"; +import { zodResolver } from "@hookform/resolvers/zod"; import { useSession } from "next-auth/react"; import Script from "next/script"; -import { useUploadThing } from "@/utils/uploadthing"; -import { submitForm } from "@/app/actions/submit-form"; +import { useEffect, useState } from "react"; +import { useForm } from "react-hook-form"; +import { toast } from "sonner"; +import * as z from "zod"; import { PaymentLoading } from "../payment/payment-loading"; import { PaymentSuccessfulComponent } from "../payment/payment-successful"; -import { RadioGroup, RadioGroupItem } from "../ui/radio-group"; import { FileUpload } from "../ui/file-upload"; -import { getSjecMemberType } from "@/lib/helper"; -import { FormDataInterface } from "@/types"; +import { RadioGroup, RadioGroupItem } from "../ui/radio-group"; declare global { interface Window { @@ -53,24 +54,6 @@ declare global { } } -const baseSchema = z.object({ - designation: z.enum(["student", "faculty", "employee"]), - name: z.string().min(2, { message: "Name must be at least 2 characters." }), - email: z.string().email({ message: "Invalid email address." }), - phone: z - .string() - .regex(/^\d{10}$/, { message: "Phone number must be 10 digits." }), - photo: z.string(), - entityName: z.string().optional(), - couponCode: z.string().optional(), - foodPreference: z.enum(["veg", "non-veg"]), -}); - -const studentSchema = baseSchema.extend({ - usn: z.string().min(1, { message: "USN is required for students." }), - idCard: z.string().min(1, { message: "ID Card is required for students." }), -}); - type FormSchema = z.infer; type UploadedFile = { @@ -254,20 +237,6 @@ export default function RegistrationForm() { const designation = form.getValues("designation"); if (designation === "student") { form.clearErrors(); - const studentFormSchema = z.object({ - name: z - .string() - .min(2, { message: "Name must be at least 2 characters." }), - email: z.string().email({ message: "Invalid email address." }), - phone: z - .string() - .regex(/^\d{10}$/, { message: "Phone number must be 10 digits." }), - usn: z.string().min(1, { message: "USN is required for students." }), - idCard: z - .string() - .min(1, { message: "ID Card is required for students." }), - photo: z.string().min(1, { message: "Photo is required." }), - }); const validationResult = await studentFormSchema.safeParseAsync( form.getValues(), ); diff --git a/src/utils/zod-schemas.ts b/src/utils/zod-schemas.ts index 31542b6..044167a 100644 --- a/src/utils/zod-schemas.ts +++ b/src/utils/zod-schemas.ts @@ -23,3 +23,32 @@ export const emailSchema = z.object({ email: z.string().email(), name: z.string().min(1), }); + +export const baseSchema = z.object({ + designation: z.enum(["student", "faculty", "employee"]), + name: z.string().min(2, { message: "Name must be at least 2 characters." }), + email: z.string().email({ message: "Invalid email address." }), + phone: z + .string() + .regex(/^\d{10}$/, { message: "Phone number must be 10 digits." }), + photo: z.string(), + entityName: z.string().optional(), + couponCode: z.string().optional(), + foodPreference: z.enum(["veg", "non-veg"]), +}); + +export const studentSchema = baseSchema.extend({ + usn: z.string().min(1, { message: "USN is required for students." }), + idCard: z.string().min(1, { message: "ID Card is required for students." }), +}); + +export const studentFormSchema = z.object({ + name: z.string().min(2, { message: "Name must be at least 2 characters." }), + email: z.string().email({ message: "Invalid email address." }), + phone: z + .string() + .regex(/^\d{10}$/, { message: "Phone number must be 10 digits." }), + usn: z.string().min(1, { message: "USN is required for students." }), + idCard: z.string().min(1, { message: "ID Card is required for students." }), + photo: z.string().min(1, { message: "Photo is required." }), +}); From 2021227d0e8ff39188d4bc8bc9af357b8445eba7 Mon Sep 17 00:00:00 2001 From: Joywin Bennis <107112207+joywin2003@users.noreply.github.com> Date: Fri, 15 Nov 2024 22:52:22 +0530 Subject: [PATCH 04/40] refactor: rename components to kebab case and update registration form options --- src/app/page.tsx | 4 +- src/components/common/Team-Section.tsx | 2 +- src/components/common/about.tsx | 61 ++++++++ src/components/common/footer.tsx | 132 ++++++++++++++++++ src/components/common/registration-form.tsx | 4 +- .../common/{TeamCard.tsx => team-card.tsx} | 0 src/components/common/team-section.tsx | 69 +++++++++ 7 files changed, 267 insertions(+), 5 deletions(-) create mode 100644 src/components/common/about.tsx create mode 100644 src/components/common/footer.tsx rename src/components/common/{TeamCard.tsx => team-card.tsx} (100%) create mode 100644 src/components/common/team-section.tsx diff --git a/src/app/page.tsx b/src/app/page.tsx index 310e450..94893ba 100644 --- a/src/app/page.tsx +++ b/src/app/page.tsx @@ -4,8 +4,8 @@ import React, { useState, useEffect } from "react"; // import ParallaxFooter from "@/components/common/Footer"; import Speakers from "@/components/common/speakers"; import { PreviousEdition } from "@/components/common/container-scroll"; -import About from "@/components/common/About"; -import Team from "@/components/common/Team-Section"; +import About from "@/components/common/about"; +import Team from "@/components/common/team-section"; // import { CtaSection } from "@/components/common/cta-section"; import Performers from "@/components/widget/performers"; import HeroHighlight from "@/components/widget/hero"; diff --git a/src/components/common/Team-Section.tsx b/src/components/common/Team-Section.tsx index 848fa95..3a02b69 100644 --- a/src/components/common/Team-Section.tsx +++ b/src/components/common/Team-Section.tsx @@ -1,5 +1,5 @@ import { tedxsjecAssetsPrefix } from "@/lib/utils"; -import TeamCard from "./TeamCard"; +import TeamCard from "./team-card"; const team = [ { diff --git a/src/components/common/about.tsx b/src/components/common/about.tsx new file mode 100644 index 0000000..1bacb48 --- /dev/null +++ b/src/components/common/about.tsx @@ -0,0 +1,61 @@ +import { motion } from "framer-motion"; + +const AboutSection: React.FC = () => { + return ( +
+ {/* Background decorative layers */} +
+ {/* */} + {/* + */} +
+ + {/* About content */} + +

+ About TEDx + SJEC +

+

+ TEDx + SJEC is an independently organized event + bringing together innovators, thinkers, and visionaries from around + the world. Our goal is to inspire change, provoke deep discussions, + and foster creativity through groundbreaking ideas. Our goal is to + inspire change, provoke deep discussions, and foster creativity + through groundbreaking ideas. +

+ + {/* Decorative line */} + + +
+ ); +}; + +export default AboutSection; diff --git a/src/components/common/footer.tsx b/src/components/common/footer.tsx new file mode 100644 index 0000000..7e5daf5 --- /dev/null +++ b/src/components/common/footer.tsx @@ -0,0 +1,132 @@ +import Link from "next/link"; +import React from "react"; +import TextGlitch from "../edil-ozi/text-glitch"; +import Image from "next/image"; +import { tedxsjecAssetsPrefix } from "@/lib/utils"; + +type Props = {}; + +const Footer = (props: Props) => { + return ( + <> +
+
+

+ Contact +

+

+ To get in touch with us regarding sponsorships and other queries, + drop an email to:{" "} + + tedx@sjec.ac.in + +

+
+
+
+
+
+
+

+ St Joseph Engineering College +

+

+ St Joseph Engineering College, +
Vamanjoor,Mangalore - 575028 +
Karnataka, India +

+
+
+
+
+

+ Contact +

+

+ Dr. Binu K G :{" "} + + +91-9739866947 + +

+
+
+

+ Socials +

+
+ + + + + + +
+
+
+
+
+ +
+ + +
+
+
+ +
+
+ logo +

+ © 2024 All Rights Reserved +

+
+
+

+ This Independent TEDx Event is Operated under license from TED +

+
+
+
+ + ); +}; + +export default Footer; diff --git a/src/components/common/registration-form.tsx b/src/components/common/registration-form.tsx index 71d5958..33eafdf 100644 --- a/src/components/common/registration-form.tsx +++ b/src/components/common/registration-form.tsx @@ -305,8 +305,8 @@ export default function RegistrationForm() { - Student - Faculty + SJEC - Student + SJEC - Faculty Employee diff --git a/src/components/common/TeamCard.tsx b/src/components/common/team-card.tsx similarity index 100% rename from src/components/common/TeamCard.tsx rename to src/components/common/team-card.tsx diff --git a/src/components/common/team-section.tsx b/src/components/common/team-section.tsx new file mode 100644 index 0000000..3a02b69 --- /dev/null +++ b/src/components/common/team-section.tsx @@ -0,0 +1,69 @@ +import { tedxsjecAssetsPrefix } from "@/lib/utils"; +import TeamCard from "./team-card"; + +const team = [ + { + url: `${tedxsjecAssetsPrefix}/team/sharon.avif`, + title: "Organizer & Licensee", + id: 1, + name: "Sharon Tyana Menezes", + }, + { + url: `${tedxsjecAssetsPrefix}/team/sasha.avif`, + title: "Co-Organizer", + id: 2, + name: "Sasha Sajith", + }, + { + url: `${tedxsjecAssetsPrefix}/team/hanniele.avif`, + title: "Technical Head", + id: 3, + name: "Hanniel Andrade", + }, + { + url: `${tedxsjecAssetsPrefix}/team/vyasa.avif`, + title: "Curation Head", + id: 4, + name: "Vyasa M Nayak", + }, + { + url: `${tedxsjecAssetsPrefix}/team/kaneeksha.avif`, + title: "Publicity & Promotions Head", + id: 5, + name: "Kaneeksha Kiran", + }, + { + url: `${tedxsjecAssetsPrefix}/team/lawrence.avif`, + title: "Design Head", + id: 6, + name: "Lawrence Robert D'Souza", + }, + + { + url: `${tedxsjecAssetsPrefix}/team/larsen.avif`, + title: "Creative Head", + id: 8, + name: "Larsen Lionel Dsouza", + }, + { + url: `${tedxsjecAssetsPrefix}/team/ritesh.avif`, + title: "Creative Head", + id: 9, + name: "Ritesh", + }, + { + url: `${tedxsjecAssetsPrefix}/team/anupam.avif`, + title: "Logistics Head", + id: 9, + name: "Anupam B Shetty", + }, +]; + +const Team = () => { + return ( +
+ +
+ ); +}; +export default Team; From bb61bcb7735340924e10283bc7eac6218a017d9d Mon Sep 17 00:00:00 2001 From: Joywin Bennis <107112207+joywin2003@users.noreply.github.com> Date: Sat, 16 Nov 2024 11:56:07 +0530 Subject: [PATCH 05/40] fix: adjust heading margin and update registration form option label --- src/app/register/page.tsx | 2 +- src/components/common/registration-form.tsx | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/app/register/page.tsx b/src/app/register/page.tsx index e35c900..7a59f46 100644 --- a/src/app/register/page.tsx +++ b/src/app/register/page.tsx @@ -24,7 +24,7 @@ export default function RegistrationPage() { return (
-

TEDx 2024

+

TEDx 2024

); diff --git a/src/components/common/registration-form.tsx b/src/components/common/registration-form.tsx index 33eafdf..d10e4d9 100644 --- a/src/components/common/registration-form.tsx +++ b/src/components/common/registration-form.tsx @@ -307,7 +307,7 @@ export default function RegistrationForm() { SJEC - Student SJEC - Faculty - Employee + External Participant From 41308af585750a1c28fd187b30668738f44f637f Mon Sep 17 00:00:00 2001 From: Joywin Bennis <107112207+joywin2003@users.noreply.github.com> Date: Sat, 16 Nov 2024 12:08:55 +0530 Subject: [PATCH 06/40] changed the speed of performer description hover effect - need review --- src/components/widget/performers.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/components/widget/performers.tsx b/src/components/widget/performers.tsx index cd25d88..f9f367e 100644 --- a/src/components/widget/performers.tsx +++ b/src/components/widget/performers.tsx @@ -78,7 +78,7 @@ export default function Component() { tl.fromTo( description, { yPercent: 100, opacity: 0 }, - { yPercent: 0, opacity: 1, duration: 0.3, ease: "power2.out" } + { yPercent: 0, opacity: 1, duration: 0.5, ease: "power2.out" } ); section.addEventListener("mouseenter", () => tl.play()); From 9e99e56ffaabe9397e3c5dfff0f91c41c5ec677f Mon Sep 17 00:00:00 2001 From: Joywin Bennis <107112207+joywin2003@users.noreply.github.com> Date: Sat, 16 Nov 2024 16:18:21 +0530 Subject: [PATCH 07/40] Feat: change email button in the registration email feild --- src/components/common/registration-form.tsx | 13 ++++++++++++- src/middleware.ts | 6 +++--- 2 files changed, 15 insertions(+), 4 deletions(-) diff --git a/src/components/common/registration-form.tsx b/src/components/common/registration-form.tsx index d10e4d9..968e09d 100644 --- a/src/components/common/registration-form.tsx +++ b/src/components/common/registration-form.tsx @@ -37,7 +37,7 @@ import getErrorMessage from "@/utils/getErrorMessage"; import { useUploadThing } from "@/utils/uploadthing"; import { baseSchema, studentFormSchema, studentSchema } from "@/utils/zod-schemas"; import { zodResolver } from "@hookform/resolvers/zod"; -import { useSession } from "next-auth/react"; +import { signIn, signOut, useSession } from "next-auth/react"; import Script from "next/script"; import { useEffect, useState } from "react"; import { useForm } from "react-hook-form"; @@ -379,6 +379,17 @@ export default function RegistrationForm() { value={session?.user.email!} /> + )} diff --git a/src/middleware.ts b/src/middleware.ts index 789c960..4c69a05 100644 --- a/src/middleware.ts +++ b/src/middleware.ts @@ -14,9 +14,9 @@ export async function middleware(request: NextRequest) { } } if (url.pathname.startsWith("/register")) { - if (token?.role !== "ADMIN") { - return NextResponse.redirect(new URL("/", request.url)); - } + // if (token?.role !== "ADMIN") { + // return NextResponse.redirect(new URL("/", request.url)); + // } } } From ed335b9b3fbf09de6382141a7ac745d31e0d2f3e Mon Sep 17 00:00:00 2001 From: Joywin Bennis <107112207+joywin2003@users.noreply.github.com> Date: Sat, 16 Nov 2024 16:39:35 +0530 Subject: [PATCH 08/40] feat: pre-fill name and email fields in registration form and shift the name&email to step 1 --- src/components/common/registration-form.tsx | 86 ++++++++++----------- 1 file changed, 43 insertions(+), 43 deletions(-) diff --git a/src/components/common/registration-form.tsx b/src/components/common/registration-form.tsx index 968e09d..30769c1 100644 --- a/src/components/common/registration-form.tsx +++ b/src/components/common/registration-form.tsx @@ -88,7 +88,7 @@ export default function RegistrationForm() { resolver: zodResolver(baseSchema), defaultValues: { designation: "student", - name: "", + name: session?.user.name!, email: session?.user.email!, phone: "", entityName: "", @@ -289,6 +289,48 @@ export default function RegistrationForm() {
{step === 1 && ( <> + ( + + Name + + + + + + )} + /> + ( + + Email + + + + + + + )} + /> - ( - - Name - - - - - - )} - /> - ( - - Email - - - - - - - )} - /> Date: Sat, 16 Nov 2024 16:49:42 +0530 Subject: [PATCH 09/40] added tool tip and info button --- package-lock.json | 125 ++++++++++++++++++++++++++++++ package.json | 1 + src/components/ui/info-button.tsx | 34 ++++++++ src/components/ui/tooltip.tsx | 32 ++++++++ 4 files changed, 192 insertions(+) create mode 100644 src/components/ui/info-button.tsx create mode 100644 src/components/ui/tooltip.tsx diff --git a/package-lock.json b/package-lock.json index 0fee371..c6d13f7 100644 --- a/package-lock.json +++ b/package-lock.json @@ -27,6 +27,7 @@ "@radix-ui/react-select": "^2.1.1", "@radix-ui/react-slot": "^1.1.0", "@radix-ui/react-tabs": "^1.1.0", + "@radix-ui/react-tooltip": "^1.1.4", "@react-email/components": "^0.0.25", "@react-email/tailwind": "0.1.0", "@react-three/drei": "^9.114.0", @@ -3061,6 +3062,130 @@ } } }, + "node_modules/@radix-ui/react-tooltip": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/@radix-ui/react-tooltip/-/react-tooltip-1.1.4.tgz", + "integrity": "sha512-QpObUH/ZlpaO4YgHSaYzrLO2VuO+ZBFFgGzjMUPwtiYnAzzNNDPJeEGRrT7qNOrWm/Jr08M1vlp+vTHtnSQ0Uw==", + "license": "MIT", + "dependencies": { + "@radix-ui/primitive": "1.1.0", + "@radix-ui/react-compose-refs": "1.1.0", + "@radix-ui/react-context": "1.1.1", + "@radix-ui/react-dismissable-layer": "1.1.1", + "@radix-ui/react-id": "1.1.0", + "@radix-ui/react-popper": "1.2.0", + "@radix-ui/react-portal": "1.1.2", + "@radix-ui/react-presence": "1.1.1", + "@radix-ui/react-primitive": "2.0.0", + "@radix-ui/react-slot": "1.1.0", + "@radix-ui/react-use-controllable-state": "1.1.0", + "@radix-ui/react-visually-hidden": "1.1.0" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-tooltip/node_modules/@radix-ui/react-context": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@radix-ui/react-context/-/react-context-1.1.1.tgz", + "integrity": "sha512-UASk9zi+crv9WteK/NU4PLvOoL3OuE6BWVKNF6hPRBtYBDXQ2u5iu3O59zUlJiTVvkyuycnqrztsHVJwcK9K+Q==", + "license": "MIT", + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-tooltip/node_modules/@radix-ui/react-dismissable-layer": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@radix-ui/react-dismissable-layer/-/react-dismissable-layer-1.1.1.tgz", + "integrity": "sha512-QSxg29lfr/xcev6kSz7MAlmDnzbP1eI/Dwn3Tp1ip0KT5CUELsxkekFEMVBEoykI3oV39hKT4TKZzBNMbcTZYQ==", + "license": "MIT", + "dependencies": { + "@radix-ui/primitive": "1.1.0", + "@radix-ui/react-compose-refs": "1.1.0", + "@radix-ui/react-primitive": "2.0.0", + "@radix-ui/react-use-callback-ref": "1.1.0", + "@radix-ui/react-use-escape-keydown": "1.1.0" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-tooltip/node_modules/@radix-ui/react-portal": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@radix-ui/react-portal/-/react-portal-1.1.2.tgz", + "integrity": "sha512-WeDYLGPxJb/5EGBoedyJbT0MpoULmwnIPMJMSldkuiMsBAv7N1cRdsTWZWht9vpPOiN3qyiGAtbK2is47/uMFg==", + "license": "MIT", + "dependencies": { + "@radix-ui/react-primitive": "2.0.0", + "@radix-ui/react-use-layout-effect": "1.1.0" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-tooltip/node_modules/@radix-ui/react-presence": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@radix-ui/react-presence/-/react-presence-1.1.1.tgz", + "integrity": "sha512-IeFXVi4YS1K0wVZzXNrbaaUvIJ3qdY+/Ih4eHFhWA9SwGR9UDX7Ck8abvL57C4cv3wwMvUE0OG69Qc3NCcTe/A==", + "license": "MIT", + "dependencies": { + "@radix-ui/react-compose-refs": "1.1.0", + "@radix-ui/react-use-layout-effect": "1.1.0" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, "node_modules/@radix-ui/react-use-callback-ref": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/@radix-ui/react-use-callback-ref/-/react-use-callback-ref-1.1.0.tgz", diff --git a/package.json b/package.json index 8d8e8c8..3b8e51d 100644 --- a/package.json +++ b/package.json @@ -32,6 +32,7 @@ "@radix-ui/react-select": "^2.1.1", "@radix-ui/react-slot": "^1.1.0", "@radix-ui/react-tabs": "^1.1.0", + "@radix-ui/react-tooltip": "^1.1.4", "@react-email/components": "^0.0.25", "@react-email/tailwind": "0.1.0", "@react-three/drei": "^9.114.0", diff --git a/src/components/ui/info-button.tsx b/src/components/ui/info-button.tsx new file mode 100644 index 0000000..f6754a7 --- /dev/null +++ b/src/components/ui/info-button.tsx @@ -0,0 +1,34 @@ + +"use client" + +import { useState } from "react" +import { Button } from "@/components/ui/button" +import { Tooltip, TooltipContent, TooltipProvider, TooltipTrigger} from "../ui/tooltip" +import { Info } from 'lucide-react' + +export default function InfoButton() { + const [isOpen, setIsOpen] = useState(false) + + return ( + + + + + + +

SJEC email id required

+
+
+
+ ) +} \ No newline at end of file diff --git a/src/components/ui/tooltip.tsx b/src/components/ui/tooltip.tsx new file mode 100644 index 0000000..a66b3f2 --- /dev/null +++ b/src/components/ui/tooltip.tsx @@ -0,0 +1,32 @@ +"use client" + +import * as React from "react" +import * as TooltipPrimitive from "@radix-ui/react-tooltip" + +import { cn } from "@/lib/utils" + +const TooltipProvider = TooltipPrimitive.Provider + +const Tooltip = TooltipPrimitive.Root + +const TooltipTrigger = TooltipPrimitive.Trigger + +const TooltipContent = React.forwardRef< + React.ElementRef, + React.ComponentPropsWithoutRef +>(({ className, sideOffset = 4, ...props }, ref) => ( + + + +)) +TooltipContent.displayName = TooltipPrimitive.Content.displayName + +export { Tooltip, TooltipTrigger, TooltipContent, TooltipProvider } From cd6de8462d21e312d428d0ff40ee2dc894bf1354 Mon Sep 17 00:00:00 2001 From: Joywin Bennis <107112207+joywin2003@users.noreply.github.com> Date: Sat, 16 Nov 2024 16:55:28 +0530 Subject: [PATCH 10/40] feat: added info button to show SJEC email is required based on member type --- src/components/common/registration-form.tsx | 81 ++++++++++++++++----- 1 file changed, 64 insertions(+), 17 deletions(-) diff --git a/src/components/common/registration-form.tsx b/src/components/common/registration-form.tsx index 30769c1..84374d8 100644 --- a/src/components/common/registration-form.tsx +++ b/src/components/common/registration-form.tsx @@ -30,12 +30,21 @@ import { SelectTrigger, SelectValue, } from "@/components/ui/select"; -import { basePrice, initialdiscount, sjecFacultyPrice, sjecStudentPrice } from "@/constants"; +import { + basePrice, + initialdiscount, + sjecFacultyPrice, + sjecStudentPrice, +} from "@/constants"; import { getSjecMemberType } from "@/lib/helper"; import { FormDataInterface } from "@/types"; import getErrorMessage from "@/utils/getErrorMessage"; import { useUploadThing } from "@/utils/uploadthing"; -import { baseSchema, studentFormSchema, studentSchema } from "@/utils/zod-schemas"; +import { + baseSchema, + studentFormSchema, + studentSchema, +} from "@/utils/zod-schemas"; import { zodResolver } from "@hookform/resolvers/zod"; import { signIn, signOut, useSession } from "next-auth/react"; import Script from "next/script"; @@ -47,6 +56,7 @@ import { PaymentLoading } from "../payment/payment-loading"; import { PaymentSuccessfulComponent } from "../payment/payment-successful"; import { FileUpload } from "../ui/file-upload"; import { RadioGroup, RadioGroupItem } from "../ui/radio-group"; +import InfoButton from "../ui/info-button"; declare global { interface Window { @@ -66,11 +76,13 @@ export default function RegistrationForm() { const [uploadedFiles, setUploadedFiles] = useState([]); const [isProcessing, setIsProcessing] = useState(false); const [success, setSuccess] = useState(false); - const [sjecMemberType, setSjecMemberType] = useState<"student" | "faculty" | "unknown">("unknown"); + const [sjecMemberType, setSjecMemberType] = useState< + "student" | "faculty" | "unknown" + >("unknown"); const [pricing, setPricing] = useState({ basePrice: basePrice, discountAmount: initialdiscount, - finalPrice: basePrice, + finalPrice: basePrice, }); const { data: session } = useSession(); @@ -79,15 +91,19 @@ export default function RegistrationForm() { setSjecMemberType(getSjecMemberType(session?.user.email!)); setPricing((prevPricing) => ({ ...prevPricing, - finalPrice: sjecMemberType === "student" ? sjecStudentPrice : sjecMemberType === "faculty" ? sjecFacultyPrice : basePrice, + finalPrice: + sjecMemberType === "student" + ? sjecStudentPrice + : sjecMemberType === "faculty" + ? sjecFacultyPrice + : basePrice, })); }, [session?.user.email, sjecMemberType]); - const form = useForm({ resolver: zodResolver(baseSchema), defaultValues: { - designation: "student", + designation: "employee", name: session?.user.name!, email: session?.user.email!, phone: "", @@ -121,7 +137,7 @@ export default function RegistrationForm() { const existing = prevFiles.find((file) => file.id === id); if (existing) { return prevFiles.map((file) => - file.id === id ? { ...file, files } : file, + file.id === id ? { ...file, files } : file ); } else { return [...prevFiles, { id, files }]; @@ -132,7 +148,6 @@ export default function RegistrationForm() { }; const handlePayment = async () => { - const couponCode = form.getValues("couponCode"); try { const response = await fetch("/api/create-order", { @@ -177,7 +192,7 @@ export default function RegistrationForm() { const formResponse = form.getValues(); await submitForm( formResponse as FormDataInterface, - pricing.finalPrice, + pricing.finalPrice ); setIsProcessing(false); setSuccess(true); @@ -219,8 +234,9 @@ export default function RegistrationForm() { const verifyCoupon = async () => { const couponCode = form.getValues("couponCode"); try { - const { basePrice, discountAmount, finalPrice } = - await getPrice(couponCode); + const { basePrice, discountAmount, finalPrice } = await getPrice( + couponCode + ); setPricing({ basePrice, discountAmount, finalPrice }); toast.success("Coupon applied successfully"); } catch (e) { @@ -289,14 +305,19 @@ export default function RegistrationForm() { {step === 1 && ( <> - ( Name - + @@ -347,9 +368,35 @@ export default function RegistrationForm() { - SJEC - Student - SJEC - Faculty - External Participant + + SJEC - Student + + {sjecMemberType === "unknown" ? ( + + ) : ( + "" + )} + + + + SJEC - Faculty + + {sjecMemberType === "unknown" ? ( + + ) : ( + "" + )} + + + + External Participant + From d5128243d2313e0463c4c35812822f8943e94cf9 Mon Sep 17 00:00:00 2001 From: Joywin Bennis <107112207+joywin2003@users.noreply.github.com> Date: Sat, 16 Nov 2024 18:29:15 +0530 Subject: [PATCH 11/40] refactor: added info button to designation label instead of select --- src/components/common/registration-form.tsx | 80 +++++---------------- src/components/ui/info-button.tsx | 17 ++--- 2 files changed, 22 insertions(+), 75 deletions(-) diff --git a/src/components/common/registration-form.tsx b/src/components/common/registration-form.tsx index 84374d8..63e3aaa 100644 --- a/src/components/common/registration-form.tsx +++ b/src/components/common/registration-form.tsx @@ -30,21 +30,12 @@ import { SelectTrigger, SelectValue, } from "@/components/ui/select"; -import { - basePrice, - initialdiscount, - sjecFacultyPrice, - sjecStudentPrice, -} from "@/constants"; +import { basePrice, initialdiscount, sjecFacultyPrice, sjecStudentPrice } from "@/constants"; import { getSjecMemberType } from "@/lib/helper"; import { FormDataInterface } from "@/types"; import getErrorMessage from "@/utils/getErrorMessage"; import { useUploadThing } from "@/utils/uploadthing"; -import { - baseSchema, - studentFormSchema, - studentSchema, -} from "@/utils/zod-schemas"; +import { baseSchema, studentFormSchema, studentSchema } from "@/utils/zod-schemas"; import { zodResolver } from "@hookform/resolvers/zod"; import { signIn, signOut, useSession } from "next-auth/react"; import Script from "next/script"; @@ -76,13 +67,11 @@ export default function RegistrationForm() { const [uploadedFiles, setUploadedFiles] = useState([]); const [isProcessing, setIsProcessing] = useState(false); const [success, setSuccess] = useState(false); - const [sjecMemberType, setSjecMemberType] = useState< - "student" | "faculty" | "unknown" - >("unknown"); + const [sjecMemberType, setSjecMemberType] = useState<"student" | "faculty" | "unknown">("unknown"); const [pricing, setPricing] = useState({ basePrice: basePrice, discountAmount: initialdiscount, - finalPrice: basePrice, + finalPrice: basePrice, }); const { data: session } = useSession(); @@ -91,15 +80,11 @@ export default function RegistrationForm() { setSjecMemberType(getSjecMemberType(session?.user.email!)); setPricing((prevPricing) => ({ ...prevPricing, - finalPrice: - sjecMemberType === "student" - ? sjecStudentPrice - : sjecMemberType === "faculty" - ? sjecFacultyPrice - : basePrice, + finalPrice: sjecMemberType === "student" ? sjecStudentPrice : sjecMemberType === "faculty" ? sjecFacultyPrice : basePrice, })); }, [session?.user.email, sjecMemberType]); + const form = useForm({ resolver: zodResolver(baseSchema), defaultValues: { @@ -137,7 +122,7 @@ export default function RegistrationForm() { const existing = prevFiles.find((file) => file.id === id); if (existing) { return prevFiles.map((file) => - file.id === id ? { ...file, files } : file + file.id === id ? { ...file, files } : file, ); } else { return [...prevFiles, { id, files }]; @@ -148,6 +133,7 @@ export default function RegistrationForm() { }; const handlePayment = async () => { + const couponCode = form.getValues("couponCode"); try { const response = await fetch("/api/create-order", { @@ -192,7 +178,7 @@ export default function RegistrationForm() { const formResponse = form.getValues(); await submitForm( formResponse as FormDataInterface, - pricing.finalPrice + pricing.finalPrice, ); setIsProcessing(false); setSuccess(true); @@ -234,9 +220,8 @@ export default function RegistrationForm() { const verifyCoupon = async () => { const couponCode = form.getValues("couponCode"); try { - const { basePrice, discountAmount, finalPrice } = await getPrice( - couponCode - ); + const { basePrice, discountAmount, finalPrice } = + await getPrice(couponCode); setPricing({ basePrice, discountAmount, finalPrice }); toast.success("Coupon applied successfully"); } catch (e) { @@ -305,19 +290,14 @@ export default function RegistrationForm() { {step === 1 && ( <> - ( Name - + @@ -357,7 +337,7 @@ export default function RegistrationForm() { name="designation" render={({ field }) => ( - Designation + Designation diff --git a/src/components/ui/info-button.tsx b/src/components/ui/info-button.tsx index f6754a7..229333f 100644 --- a/src/components/ui/info-button.tsx +++ b/src/components/ui/info-button.tsx @@ -1,34 +1,27 @@ - "use client" -import { useState } from "react" import { Button } from "@/components/ui/button" -import { Tooltip, TooltipContent, TooltipProvider, TooltipTrigger} from "../ui/tooltip" -import { Info } from 'lucide-react' +import { Tooltip, TooltipContent, TooltipProvider, TooltipTrigger } from "../ui/tooltip" +import { Info } from "lucide-react" export default function InfoButton() { - const [isOpen, setIsOpen] = useState(false) - return ( - + -

SJEC email id required

+

SJEC email id to get discount

) -} \ No newline at end of file +} From 0f297f312cce6f6b8b43dfa9ffc458b8cc0923dd Mon Sep 17 00:00:00 2001 From: Joywin Bennis <107112207+joywin2003@users.noreply.github.com> Date: Sat, 16 Nov 2024 19:40:07 +0530 Subject: [PATCH 12/40] style: update registration page and form appearance with new background and text color --- src/app/register/page.tsx | 2 +- src/components/common/registration-form.tsx | 7 +++++-- 2 files changed, 6 insertions(+), 3 deletions(-) diff --git a/src/app/register/page.tsx b/src/app/register/page.tsx index 7a59f46..eeaaf75 100644 --- a/src/app/register/page.tsx +++ b/src/app/register/page.tsx @@ -24,7 +24,7 @@ export default function RegistrationPage() { return (
-

TEDx 2024

+ {/*

TEDx 2024

*/}
); diff --git a/src/components/common/registration-form.tsx b/src/components/common/registration-form.tsx index 63e3aaa..97a7b40 100644 --- a/src/components/common/registration-form.tsx +++ b/src/components/common/registration-form.tsx @@ -279,10 +279,10 @@ export default function RegistrationForm() { } return ( - +