From 44f299e6e02324abb89694932b19a5bfa0078542 Mon Sep 17 00:00:00 2001 From: Sherin Thomas Date: Fri, 19 Dec 2025 16:19:30 +0530 Subject: [PATCH 1/3] Fix Projects page background particles --- app/projects/page.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/projects/page.tsx b/app/projects/page.tsx index cb97766..c1adcd5 100644 --- a/app/projects/page.tsx +++ b/app/projects/page.tsx @@ -63,7 +63,7 @@ const ProjectPage: React.FC = () => { Date: Sat, 20 Dec 2025 12:25:21 +0530 Subject: [PATCH 2/3] Improve error state and empty state handling in members and projects page --- app/projects/page.tsx | 151 ++++++++++++++++++++---------------- components/Members-Text.tsx | 70 +++++++++-------- 2 files changed, 120 insertions(+), 101 deletions(-) diff --git a/app/projects/page.tsx b/app/projects/page.tsx index c1adcd5..1354e0f 100644 --- a/app/projects/page.tsx +++ b/app/projects/page.tsx @@ -35,8 +35,11 @@ const ProjectPage: React.FC = () => { const { theme } = useTheme(); const [projects, setProjects] = useState([]); const [loading, setLoading] = useState(true); + const [error, setError] = useState(false); useEffect(() => { + setLoading(true); + setError(false); const fetchProjects = async () => { try { const res = await fetch("/api/projects-with-members"); @@ -45,9 +48,11 @@ const ProjectPage: React.FC = () => { setProjects(data.data as Project[]); } else { console.error("Error loading project data"); + throw new Error("Network response was not ok"); } } catch (err) { - console.error("Error fetching projects:", err); + console.error("Error fetching projects:", err); + setError(true); } finally{ setTimeout(() => { setLoading(false); @@ -58,6 +63,82 @@ const ProjectPage: React.FC = () => { fetchProjects(); }, []); + const renderProjects = () => { + if (loading) { + return ( + + {Array.from({ length: 6 }).map((_, i) => ( + + ))} + + ); + } + + if (error) { + return ( +
+
+ + + + {/* purple-500 */} + {/* pink-500 */} + + + + + + +

+ Failed to fetch projects +

+
+
+ ); + } + + if (projects.length === 0) { + return ( +
+

+ No projects found +

+
+ ); + } + + return ( + + {projects.map((project, i) => ( + } + github={project.githubUrl} + live={project.deployUrl} + tooltipItems={project.members?.map((member) => ({ + id: member.id, + name: member.name, + image: member.image || "/default-avatar.png", + }))} + className={i === 3 || i === 6 ? "md:col-span-2" : ""} + /> + ))} + + ); + }; + + return (
{
- {/* Loading State */} - {loading && ( - - {Array.from({ length: 6 }).map((_, i) => ( - - ))} - - )} - - {/* Empty State */} - {!loading && projects.length === 0 && ( -
-
- - - - {/* purple-500 */} - {/* pink-500 */} - - - - - - -

- Failed to fetch projects -

-
-
- )} - - {/* Projects Grid */} - {!loading && projects.length > 0 && ( - - {projects.map((project, i) => ( - - } - github={project.githubUrl} - live={project.deployUrl} - tooltipItems={project.members?.map((member) => ({ - id: member.id, - name: member.name, - image: member.image || "/default-avatar.png", - }))} - className={i === 3 || i === 6 ? "md:col-span-2" : ""} - /> - ))} - - )} + {renderProjects()} +
diff --git a/components/Members-Text.tsx b/components/Members-Text.tsx index 4e138d3..6bb21b5 100644 --- a/components/Members-Text.tsx +++ b/components/Members-Text.tsx @@ -120,7 +120,7 @@ export default function MembersPage() { const [founders, setFounders] = useState([]); const [loading, setLoading] = useState(true); const [tabLoading, setTabLoading] = useState(false); - + const [error, setError] = useState(false); const handleTabChange = (idx: number) => { setActiveTabIndex(idx); @@ -149,6 +149,8 @@ export default function MembersPage() { useEffect(() => { const abortController = new AbortController(); + setLoading(true); + setError(false); const fetchMembers = async () => { try { @@ -204,6 +206,7 @@ export default function MembersPage() { return; } console.error("Failed to fetch members", err); + setError(true); } finally{ setTimeout(() => { setLoading(false); @@ -250,40 +253,39 @@ export default function MembersPage() { ); + const renderMembersTab = (members: DisplayMember[], isFounder = false) => { + if (loading || tabLoading) { + return ; + } + + if (error) { + return ; + } + + if (members.length === 0) { + return ; + } + + return ; + }; + + const tabs = [ - { - title: "Present Members", - value: "present", - content: loading || tabLoading ? ( - - ) : presentMembers.length === 0 ? ( - - ) : ( - - ), - }, - { - title: "Super Seniors", - value: "seniors", - content: loading || tabLoading ? ( - - ) : superSeniors.length === 0 ? ( - - ) : ( - - ), - }, - { - title: "Founders", - value: "founders", - content: loading || tabLoading ? ( - - ) : founders.length === 0 ? ( - - ) : ( - - ), - }, + { + title: "Present Members", + value: "present", + content: renderMembersTab(presentMembers), + }, + { + title: "Super Seniors", + value: "seniors", + content: renderMembersTab(superSeniors), + }, + { + title: "Founders", + value: "founders", + content: renderMembersTab(founders, true), + }, ]; From 9d6893bff05782d7dfe72873fdfac3aab6b8b491 Mon Sep 17 00:00:00 2001 From: Sherin Thomas Date: Sat, 20 Dec 2025 15:48:25 +0530 Subject: [PATCH 3/3] Some Fixes --- app/projects/page.tsx | 9 ++++--- components/Members-Text.tsx | 53 +++++++++++++++++++++++++++---------- 2 files changed, 44 insertions(+), 18 deletions(-) diff --git a/app/projects/page.tsx b/app/projects/page.tsx index 1354e0f..1543d84 100644 --- a/app/projects/page.tsx +++ b/app/projects/page.tsx @@ -40,6 +40,7 @@ const ProjectPage: React.FC = () => { useEffect(() => { setLoading(true); setError(false); + const fetchProjects = async () => { try { const res = await fetch("/api/projects-with-members"); @@ -50,13 +51,13 @@ const ProjectPage: React.FC = () => { console.error("Error loading project data"); throw new Error("Network response was not ok"); } - } catch (err) { - console.error("Error fetching projects:", err); - setError(true); - } finally{ setTimeout(() => { setLoading(false); }, 500); + } catch (err) { + console.error("Error fetching projects:", err); + setError(true); + setLoading(false); } }; diff --git a/components/Members-Text.tsx b/components/Members-Text.tsx index 6bb21b5..46dffc0 100644 --- a/components/Members-Text.tsx +++ b/components/Members-Text.tsx @@ -120,7 +120,16 @@ export default function MembersPage() { const [founders, setFounders] = useState([]); const [loading, setLoading] = useState(true); const [tabLoading, setTabLoading] = useState(false); - const [error, setError] = useState(false); + const [tabError, setTabError] = useState<{ + present: boolean; + seniors: boolean; + founders: boolean; + }>({ + present: false, + seniors: false, + founders: false, + }); + const handleTabChange = (idx: number) => { setActiveTabIndex(idx); @@ -150,7 +159,11 @@ export default function MembersPage() { useEffect(() => { const abortController = new AbortController(); setLoading(true); - setError(false); + setTabError({ + present: false, + seniors: false, + founders: false, + }); const fetchMembers = async () => { try { @@ -172,6 +185,7 @@ export default function MembersPage() { setFounders([]); setSuperSeniors([]); setPresentMembers([]); + setLoading(false); return; } @@ -201,17 +215,21 @@ export default function MembersPage() { setFounders(foundersList); setSuperSeniors(superSeniorsList); setPresentMembers(presentList); + setTimeout(() => { + setLoading(false); + }, 500); } catch (err) { if (err instanceof Error && err.name === "AbortError") { return; } console.error("Failed to fetch members", err); - setError(true); - } finally{ - setTimeout(() => { - setLoading(false); - }, 1000); - } + setTabError({ + present: true, + seniors: true, + founders: true, + }); + setLoading(false); + } }; fetchMembers(); @@ -252,14 +270,21 @@ export default function MembersPage() { ); + const TAB_LABELS = { + present: "Present Members", + seniors: "Super Seniors", + founders: "Founders", + } as const; - const renderMembersTab = (members: DisplayMember[], isFounder = false) => { + const renderMembersTab = (members: DisplayMember[], tab: "present" | "seniors" | "founders", isFounder = false) => { if (loading || tabLoading) { return ; } - if (error) { - return ; + if (tabError[tab]) { + return ( + + ); } if (members.length === 0) { @@ -274,17 +299,17 @@ export default function MembersPage() { { title: "Present Members", value: "present", - content: renderMembersTab(presentMembers), + content: renderMembersTab(presentMembers, "present"), }, { title: "Super Seniors", value: "seniors", - content: renderMembersTab(superSeniors), + content: renderMembersTab(superSeniors, "seniors"), }, { title: "Founders", value: "founders", - content: renderMembersTab(founders, true), + content: renderMembersTab(founders, "founders", true), }, ];