From 023cee02bd2b279236c91005344e4f8839bd1ede Mon Sep 17 00:00:00 2001 From: Aryan Ramesh Jain <138214350+jainaryan04@users.noreply.github.com> Date: Mon, 15 Sep 2025 15:46:22 +0530 Subject: [PATCH 1/7] chatbot --- src/app/layout.js | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/app/layout.js b/src/app/layout.js index 7991271..2ce0a9e 100644 --- a/src/app/layout.js +++ b/src/app/layout.js @@ -1,4 +1,4 @@ -// import Chatbot from "./components/BotSidebar"; +import Chatbot from "./components/BotSidebar"; import './globals.css'; import { Press_Start_2P } from 'next/font/google'; import Script from "next/script"; @@ -43,6 +43,7 @@ export default function RootLayout({ children }) { {children} + From 2616c42af294dc0947bf528277843c3a0ed88a61 Mon Sep 17 00:00:00 2001 From: gracymehndiratta Date: Fri, 19 Sep 2025 14:41:46 +0530 Subject: [PATCH 2/7] added the backend routes for leave team and remove member --- src/app/api/user/route.js | 37 +++++++++++++ src/app/team/page.js | 114 ++++++++++++++++++++++++++------------ 2 files changed, 115 insertions(+), 36 deletions(-) diff --git a/src/app/api/user/route.js b/src/app/api/user/route.js index dc18e46..34a3390 100644 --- a/src/app/api/user/route.js +++ b/src/app/api/user/route.js @@ -13,3 +13,40 @@ export const verifyToken = async (accessToken) => { } ); }; + + +export const leaveTeam = async () => { + try { + const token = localStorage.getItem("token"); + const res = await axios.delete(`${BACKEND_URL}/teams/leave`, { + headers: { + Authorization: `Bearer ${token}`, + }, + }); + return res.data; + } catch (err) { + console.error("Error leaving team:", err.response?.data || err.message); + throw err; + } +}; + + +export const removeMember = async (memberUid) => { + try { + const token = localStorage.getItem("token"); + const res = await axios.post( + `${BACKEND_URL}/teams/remove-member`, + { memberUid }, + { + headers: { + Authorization: `Bearer ${token}`, + "Content-Type": "application/json", + }, + } + ); + return res.data; + } catch (err) { + console.error("Error removing member:", err.response?.data || err.message); + throw err; + } +}; \ No newline at end of file diff --git a/src/app/team/page.js b/src/app/team/page.js index fcdea45..caea308 100644 --- a/src/app/team/page.js +++ b/src/app/team/page.js @@ -1,6 +1,7 @@ "use client"; import Image from "next/image"; import { useState } from "react"; +import { leaveTeam, removeMember } from "../api/user/route"; export default function TeamPage() { const [isCopied, setIsCopied] = useState(false); @@ -16,6 +17,14 @@ export default function TeamPage() { } }; + const handleRemove = async (uid) => { + await removeMember(uid); + }; + + const handleLeave = async () => { + await leaveTeam(); + }; + return (
{/* Background */} @@ -23,10 +32,26 @@ export default function TeamPage() { src="/team-info-bg.svg" alt="Background" fill - className="object-cover -z-10 brightness-110 scale-100" + className="object-cover -z-10 brightness-110 scale-100" priority /> + {/* Example control buttons */} +
+ + + +
{/* Content */}
{/* Title */} @@ -46,37 +71,37 @@ export default function TeamPage() { title="Copy team code" > {isCopied ? ( - - ) : ( - - - @@ -89,8 +114,18 @@ export default function TeamPage() { {isCopied && (
- - + + Team code copied!
@@ -204,7 +239,6 @@ export default function TeamPage() {
{/* Responsive container with proper aspect ratio */}
- {/* Center Team Leader */}
{/* Leader Text Box - Above the purple object */} @@ -231,10 +265,12 @@ export default function TeamPage() {
{/* Left Side - Top Member */} -
+ " + >

- NAME DESIGNATION + NAME DESIGNATION

{/* Left Side - Bottom Member */} -
+ " + >
{/* Right Side - Top Member */} -
+ " + >
{/* Right Side - Bottom Member */} -
+ flex flex-col items-center" + >

- NAME DESIGNATION + NAME DESIGNATION

Date: Sun, 21 Sep 2025 01:56:24 +0530 Subject: [PATCH 3/7] fixed the submission page , fixed the dashboard now on mobile ,page shows clearly , and fixed the team page including the alignment and added the dragon man and boxes --- src/app/components/JoinTeam.js | 38 ++-- src/app/components/MobileLanding.js | 10 +- src/app/submission/page.js | 163 +++++++++++---- src/app/team/page.js | 309 +++++++++++++++++----------- 4 files changed, 343 insertions(+), 177 deletions(-) diff --git a/src/app/components/JoinTeam.js b/src/app/components/JoinTeam.js index bbb79b3..a3ea831 100644 --- a/src/app/components/JoinTeam.js +++ b/src/app/components/JoinTeam.js @@ -112,26 +112,25 @@ export default function JoinTeam() { }; return ( -
- - Background - +
+ + Background + - +
- -
{ playSound(); - setModal('create'); + setModal("create"); }} >
-
{ playSound(); - setModal('join'); + setModal("join"); }} >
- {modal === 'create' && ( + {modal === "create" && ( )} - {modal === 'join' && ( + {modal === "join" && ( )} -
); } diff --git a/src/app/components/MobileLanding.js b/src/app/components/MobileLanding.js index 1285186..95a069f 100644 --- a/src/app/components/MobileLanding.js +++ b/src/app/components/MobileLanding.js @@ -9,7 +9,14 @@ export default function LandingPagePhone() { const [user, setUser] = useState(null); const [userStatus, setUserStatus] = useState(null); const router=useRouter(); - + useEffect(() => { + const storedUser = localStorage.getItem("user"); + if (storedUser) setUser(JSON.parse(storedUser)); + + const status = localStorage.getItem("UserStatus"); + if (status === "true" || status === "false") setUserStatus(status); + }, []); + useEffect(() => { const status = localStorage.getItem("UserStatus"); if (status === "true" || status === "false") setUserStatus(status); @@ -61,6 +68,7 @@ export default function LandingPagePhone() { {/* Timer */}
+
{user && (
-
-
+ {/* Form container */} +
+
- {errors.problem &&

{errors.problem}

} - +
+ {/* GitHub */}
- {errors.github &&

{errors.github}

} - + {errors.github && ( +

+ {errors.github} +

+ )} +
+ {/* Figma */}
- {errors.figma &&

{errors.figma}

} - + {errors.figma && ( +

+ {errors.figma} +

+ )} +
+ {/* Other links */}
- +
- diff --git a/src/app/team/page.js b/src/app/team/page.js index a8b351c..cded7e4 100644 --- a/src/app/team/page.js +++ b/src/app/team/page.js @@ -6,6 +6,7 @@ import { useRouter } from "next/navigation"; export default function TeamPage() { const [team, setTeam] = useState(null); + const [isCopied, setIsCopied] = useState(false); const router = useRouter(); @@ -33,50 +34,41 @@ export default function TeamPage() { } }; - if (!team) return ( -
+ if (!team) + return ( +
- ); + ); const leader = team.members[0]; const members = team.members.slice(1); - const desktopPositions = [ - { top: "25%", left: "8%" }, // Top left - { top: "75%", left: "8%" }, // Bottom left - { top: "25%", right: "8%" }, // Top right - { top: "75%", right: "8%" }, // Bottom right - ]; - return ( -
- {/* Background Image */} -
- Background -
+
+ {/* Background */} + Background - {/* Navigation Buttons */} -
+ {/* Top Nav */} +
- {/* Main Content */} -
- {/* Team Name */} -

+ {/* Dragon */} +
+
+ Dragon +
+
+ + {/* Team Name + Code */} +
+

{team.name}

- {/* Team Code */} -
-
- +
+
+ {team.code}
+
- {/* Mobile Layout */} -
+ {/* Desktop Layout */} +
+
+ {/* Leader Center */} {leader && ( -
-
+
+
Leader box -
-

{leader.name}

-

Leader

-
-
- -
- )} - - {members.map((member, idx) => ( -
-
- Member box
-

{member.name}

-

Member

+

+ {leader.name} +

+

Leader

- + Leader object
- ))} -
+ )} - {/* Desktop Layout */} -
-
- {/* Leader - Center */} - {leader && ( -
-
+ {/* Members around leader */} + {members.slice(0, 4).map((member, idx) => { + const positions = [ + // top-left + "absolute top-[32%] left-[21%]", + // bottom-left + "absolute top-[50%] left-[0%]", + // top-right + "absolute top-[32%] left-[60%]", + // bottom-right + "absolute top-[50%] left-[81%]", + ]; + return ( +
+
Leader box
-

{leader.name}

-

Leader

+

+ {member.name} +

+

Member

- + Member object
- )} - - {/* Members - Corners */} - {members.slice(0, 4).map((member, idx) => { - const position = desktopPositions[idx]; - return ( -
-
- Member box -
-

- {member.name} -

-
-
- -
- ); - })} -
+ ); + })}
+ + {/* Mobile Layout */} +
+ {leader && ( +
+
+ Leader box +
+

+ {leader.name} +

+

Leader

+
+
+
+ )} + {members.map((member) => ( +
+
+ Member box +
+

{member.name}

+ +

Member

+
+
+
+ ))} +
+ + {/* Copy success popup */} + {isCopied && ( +
+
+ + + + Team code copied! +
+
+ )}

); -} \ No newline at end of file +} From addd5cc31ef3965a4ae63e25ff897326b85684f0 Mon Sep 17 00:00:00 2001 From: gracymehndiratta Date: Wed, 24 Sep 2025 02:39:04 +0530 Subject: [PATCH 4/7] added the leave team route --- src/app/api/team.js | 4 +- src/app/team/page.js | 109 +++++++++++++++++++++++-------------------- 2 files changed, 61 insertions(+), 52 deletions(-) diff --git a/src/app/api/team.js b/src/app/api/team.js index 2b88ba9..66065fd 100644 --- a/src/app/api/team.js +++ b/src/app/api/team.js @@ -7,7 +7,9 @@ export const createTeam = async (teamName) => { export const joinTeam = async (team_code) => { return apiClient.post("/teams/join", { team_code }); }; - +export const leaveTeam = async () => { + return apiClient.delete("/teams/leave"); +}; export const teamDetails = async () => { return apiClient.get("/teams/get"); }; diff --git a/src/app/team/page.js b/src/app/team/page.js index 75c3ee3..580ba1c 100644 --- a/src/app/team/page.js +++ b/src/app/team/page.js @@ -1,13 +1,13 @@ "use client"; import Image from "next/image"; import { useEffect, useState } from "react"; -import { teamDetails } from "../api/team"; +import { teamDetails, leaveTeam } from "../api/team"; import { useRouter } from "next/navigation"; import Toast from "../components/Toast"; export default function TeamPage() { const [team, setTeam] = useState(null); - + const [toastMessage, setToastMessage] = useState(""); const [isCopied, setIsCopied] = useState(false); const router = useRouter(); @@ -35,16 +35,19 @@ export default function TeamPage() { } }; - const handleSubmissionClick = () => { - if (team?.members?.length < 5) { - window.dispatchEvent( - new CustomEvent("showToast", { - detail: { text: "Team must have 5 members." }, - }) - ); - return; + const handleLeaveTeam = async () => { + try { + await leaveTeam(); + localStorage.removeItem("teamDetails"); + setToastMessage("Left team successfully ✅"); + + setTimeout(() => { + router.push("/dashboard"); + }, 1500); + } catch (err) { + console.error("Error leaving team:", err); + setToastMessage("Failed to leave team"); } - router.push("/submission"); }; if (!team) @@ -67,19 +70,8 @@ export default function TeamPage() { const members = team.members.slice(1); return ( - <> -
- Dragon -
-
+
{/* Background */} - Background {/* Top Nav */} -
+
- +
+ + +
+ {/* Dragon */} +
+
+ Dragon +
+
{/* Team Name + Code */} -
+

{team.name}

@@ -171,7 +181,7 @@ export default function TeamPage() {
{/* Leader Center */} {leader && ( -
+
{ - const positions = [ - // 1st member → left - "absolute top-[42%] left-[21%]", - // 2nd member → right - "absolute top-[42%] left-[60%]", - // 3rd member → left lower - "absolute top-[50%] -left-[5%]", - // 4th member → right lower - "absolute top-[50%] -right-[5%]", - ]; + const positions = [ + "absolute top-[32%] left-[21%]", + "absolute top-[50%] left-[0%]", + "absolute top-[32%] left-[60%]", + "absolute top-[50%] left-[81%]", + ]; return (
{/* Mobile Layout */} -
+
{leader && (
@@ -255,7 +261,7 @@ export default function TeamPage() { className="w-72 h-auto" />
-

{leader.name}

+

{leader.name}

Leader

@@ -273,7 +279,6 @@ export default function TeamPage() { />

{member.name}

-

Member

@@ -281,7 +286,7 @@ export default function TeamPage() { ))}
- {/* Copy success popup */} + {/* Copy Code Popup */} {isCopied && (
@@ -302,9 +307,11 @@ export default function TeamPage() {
)} - - + + {/* Toast for Leave Team */} + {toastMessage && ( + setToastMessage("")} /> + )}
- ); } From 8e1e92aef2c66e10842626f37be3906b5dc0d2c1 Mon Sep 17 00:00:00 2001 From: gracymehndiratta Date: Wed, 24 Sep 2025 02:46:50 +0530 Subject: [PATCH 5/7] added the submission function --- src/app/team/page.js | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/src/app/team/page.js b/src/app/team/page.js index 580ba1c..5ff45bf 100644 --- a/src/app/team/page.js +++ b/src/app/team/page.js @@ -10,6 +10,7 @@ export default function TeamPage() { const [toastMessage, setToastMessage] = useState(""); const [isCopied, setIsCopied] = useState(false); const router = useRouter(); + useEffect(() => { const getTeamDetails = async () => { @@ -34,6 +35,17 @@ export default function TeamPage() { console.error("Failed to copy: ", err); } }; +const handleSubmissionClick = () => { + if (team?.members?.length < 5) { + window.dispatchEvent( + new CustomEvent("showToast", { + detail: { text: "Team must have 5 members." }, + }) + ); + return; + } + router.push("/submission"); +}; const handleLeaveTeam = async () => { try { From 988eabbfa8d8889d1c36b5fb64d6c6888c7f43f7 Mon Sep 17 00:00:00 2001 From: gracymehndiratta Date: Wed, 24 Sep 2025 02:47:44 +0530 Subject: [PATCH 6/7] submisson button func --- src/app/team/page.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/app/team/page.js b/src/app/team/page.js index 5ff45bf..77da265 100644 --- a/src/app/team/page.js +++ b/src/app/team/page.js @@ -110,8 +110,8 @@ const handleSubmissionClick = () => { Leave Team From f018813d5ce1e8ad169364e0a69b4f3ad4d16cd3 Mon Sep 17 00:00:00 2001 From: gracymehndiratta Date: Wed, 24 Sep 2025 03:03:35 +0530 Subject: [PATCH 7/7] added the leave team route --- src/app/team/page.js | 459 ++++++++++++++++++++++--------------------- 1 file changed, 237 insertions(+), 222 deletions(-) diff --git a/src/app/team/page.js b/src/app/team/page.js index 77da265..c6d4b89 100644 --- a/src/app/team/page.js +++ b/src/app/team/page.js @@ -10,7 +10,6 @@ export default function TeamPage() { const [toastMessage, setToastMessage] = useState(""); const [isCopied, setIsCopied] = useState(false); const router = useRouter(); - useEffect(() => { const getTeamDetails = async () => { @@ -35,30 +34,30 @@ export default function TeamPage() { console.error("Failed to copy: ", err); } }; -const handleSubmissionClick = () => { - if (team?.members?.length < 5) { - window.dispatchEvent( - new CustomEvent("showToast", { - detail: { text: "Team must have 5 members." }, - }) - ); - return; - } - router.push("/submission"); -}; + + const handleSubmissionClick = () => { + if (team?.members?.length < 5) { + window.dispatchEvent( + new CustomEvent("showToast", { + detail: { text: "Team must have 5 members." }, + }) + ); + return; + } + router.push("/submission"); + }; const handleLeaveTeam = async () => { try { await leaveTeam(); localStorage.removeItem("teamDetails"); - setToastMessage("Left team successfully ✅"); - + setToastMessage("Left team successfully "); setTimeout(() => { router.push("/dashboard"); }, 1500); } catch (err) { console.error("Error leaving team:", err); - setToastMessage("Failed to leave team"); + setToastMessage(" Failed to leave team"); } }; @@ -71,8 +70,6 @@ const handleSubmissionClick = () => { loop muted playsInline - height={128} - width={128} className="w-32 h-32" />
@@ -82,248 +79,266 @@ const handleSubmissionClick = () => { const members = team.members.slice(1); return ( -
- {/* Background */} - Background + <> + {/* Dragon */} +
+ Dragon +
- {/* Top Nav */} -
- +
+ {/* Background */} + Background -
- + {/* Top Nav for Desktop */} +
-
-
- {/* Dragon */} -
-
- Dragon +
+ + +
-
- {/* Team Name + Code */} -
-

- {team.name} -

+ {/* Team Name + Code */} +
+

+ {team.name} +

+ +
+
+ + {team.code} + + +
+
-
-
- - {team.code} - + {/* Mobile Buttons: Leave + Submission */} +
+
+ + {/* Desktop Layout */} +
+
+ {/* Leader Center */} + {leader && ( +
+
+ Leader box - - ) : ( - +

+ {leader.name} +

+

Leader

+
+
+ Leader object +
+ )} + + {/* Members around leader */} + {members.slice(0, 4).map((member, idx) => { + const positions = [ + "absolute top-[42%] left-[21%]", + "absolute top-[42%] left-[60%]", + "absolute top-[50%] -left-[5%]", + "absolute top-[50%] -right-[5%]", + ]; + return ( +
- - + Member box +
+

+ {member.name} +

+

Member

+
+
+ Member object - - )} - +
+ ); + })}
-
- {/* Desktop Layout */} -
-
- {/* Leader Center */} + {/* Mobile Members */} +
{leader && ( -
-
+
+
Leader box
-

- {leader.name} -

+

{leader.name}

Leader

- Leader object
)} - - {/* Members around leader */} - {members.slice(0, 4).map((member, idx) => { - const positions = [ - "absolute top-[32%] left-[21%]", - "absolute top-[50%] left-[0%]", - "absolute top-[32%] left-[60%]", - "absolute top-[50%] left-[81%]", - ]; - return ( -
-
- Member box -
-

- {member.name} -

-

Member

-
-
+ {members.map((member) => ( +
+
Member object +
+

+ {member.name} +

+

Member

+
- ); - })} +
+ ))}
-
- {/* Mobile Layout */} -
- {leader && ( -
-
- Leader box -
-

{leader.name}

-

Leader

-
+ {/* Copy Code Popup */} + {isCopied && ( +
+
+ + + + Team code copied!
)} - {members.map((member) => ( -
-
- Member box -
-

{member.name}

-

Member

-
-
-
- ))} -
- {/* Copy Code Popup */} - {isCopied && ( -
-
- - - - Team code copied! -
-
- )} - - {/* Toast for Leave Team */} - {toastMessage && ( - setToastMessage("")} /> - )} -
+ {/* Toast for Leave Team */} + {toastMessage && ( + setToastMessage("")} /> + )} +
+ ); }