Members
@@ -271,19 +292,16 @@ const About = () => {
-
{isMobileMenuOpen && (
)}
-
- {/* Hero Section - completely unchanged */}
-
About Us
+
About Us
Welcome to A.G. Patil Code Club! We are a community of passionate tech enthusiasts,
@@ -292,12 +310,9 @@ const About = () => {
AGPIT Board of Directors & Faculty
- {/* GalleryCarousel Component - only changed to add name/position below images */}
-
- {/* Mission & Vision Section - completely unchanged */}
Mission & Vision
@@ -308,8 +323,6 @@ const About = () => {
-
- {/* Our Activities Section - completely unchanged */}
Our Activities
@@ -325,8 +338,7 @@ const About = () => {
-
- {/* Success Stories Section - completely unchanged */}
+
Success Stories
@@ -338,9 +350,8 @@ const About = () => {
-
-
- {/* FAQ Section - completely unchanged */}
+
+
Frequently Asked Questions
@@ -364,15 +375,11 @@ const About = () => {
-
- {/* Join Us Button - completely unchanged */}
-
- {/* Footer - completely unchanged */}
A.G. Patil Institute of Technology, Solapur, Maharashtra, India
diff --git a/Frontend/src/components/About/about_members.tsx b/Frontend/src/components/About/about_members.tsx
index 7cf936a..60effc3 100644
--- a/Frontend/src/components/About/about_members.tsx
+++ b/Frontend/src/components/About/about_members.tsx
@@ -2,7 +2,9 @@
import { useState, useEffect } from 'react';
import { ProgressiveBlur } from '@/components/ui/progressive-blur';
-import { motion } from 'motion/react';
+import { motion } from 'framer-motion';
+import axios from 'axios';
+import { BACKEND_URL } from '../../../config';
// Define interfaces for data
interface Member {
@@ -35,48 +37,98 @@ export function AboutMembers() {
const [hoveredMemberId, setHoveredMemberId] = useState(null);
const [hoveredImageId, setHoveredImageId] = useState(null);
const [selectedBoard, setSelectedBoard] = useState("TY");
+ const [loading, setLoading] = useState(true);
+ const [error, setError] = useState(null);
+
+ const dummyMembers: Member[] = [
+ {
+ id: 1,
+ name: "Roni Bhakta",
+ avatar: "https://media.licdn.com/dms/image/v2/D4D03AQEvEHK2KOMLwQ/profile-displayphoto-shrink_100_100/0/1705087348506",
+ email: "roni123@gmail.com",
+ linkedin: "https://linkedin.com/in/ronibhakta1",
+ role: "President",
+ domain: "Full Stack Development",
+ yearOfStudy: "3rd",
+ yearOfPassing: 2026,
+ bio: "Experienced full-stack developer passionate about building scalable web applications.",
+ social: {
+ github: "https://github.com/ronibhakta1",
+ portfolio: "https://ronibhakta1.dev",
+ },
+ },
+ ];
+
+ const dummyCarouselImages: CarouselImage[] = [
+ {
+ id: 1,
+ image: "/default-image.jpg",
+ title: "Hackathon 2024",
+ tagline: "Innovate and Create",
+ },
+ ];
useEffect(() => {
const fetchMembers = async () => {
+ setLoading(true);
+ setError(null);
try {
- const fileName = `/club_members_${selectedBoard}.json`;
- const response = await fetch(fileName);
-
- if (!response.ok) {
- throw new Error(`HTTP error! status: ${response.status}`);
+ const response = await axios.get(`${BACKEND_URL}/user/club-members/${selectedBoard}`, {
+ headers: {
+ Authorization: `Bearer ${localStorage.getItem("token")}`,
+ },
+ });
+ setMembers(response.data.members);
+ } catch (err: any) {
+ console.error("Error loading members from backend:", err);
+ setError("Failed to load members. Using default data.");
+ try {
+ const fileName = `/club_members_${selectedBoard}.json`;
+ const response = await fetch(fileName);
+ if (!response.ok) {
+ throw new Error(`HTTP error! status: ${response.status}`);
+ }
+ const data = await response.json();
+ const membersWithIds = data.map((member: Member, index: number) => ({
+ ...member,
+ id: member.id || index,
+ }));
+ setMembers(membersWithIds);
+ } catch (jsonErr) {
+ console.error("Error loading members from JSON:", jsonErr);
+ setMembers(dummyMembers);
}
-
- const data = await response.json();
-
- // Add id to members if not present
- const membersWithIds = data.map((member: Member, index: number) => ({
- ...member,
- id: member.id || index
- }));
-
- setMembers(membersWithIds);
- } catch (err) {
- console.error("Error loading members:", err);
+ } finally {
+ setLoading(false);
}
};
fetchMembers();
}, [selectedBoard]);
- // Load carousel images from the JSON file
useEffect(() => {
const fetchCarouselImages = async () => {
+ setLoading(true);
+ setError(null);
try {
- const response = await fetch('/carousel_images.json');
-
- if (!response.ok) {
- throw new Error(`HTTP error! status: ${response.status}`);
+ const response = await axios.get(`${BACKEND_URL}/user/carousel-images`);
+ setCarouselImages(response.data.images);
+ } catch (err: any) {
+ console.error("Error loading carousel images from backend:", err);
+ setError("Failed to load carousel images. Using default data.");
+ try {
+ const response = await fetch('/carousel_images.json');
+ if (!response.ok) {
+ throw new Error(`HTTP error! status: ${response.status}`);
+ }
+ const data = await response.json();
+ setCarouselImages(data);
+ } catch (jsonErr) {
+ console.error("Error loading carousel images from JSON:", jsonErr);
+ setCarouselImages(dummyCarouselImages);
}
-
- const data = await response.json();
- setCarouselImages(data);
- } catch (err) {
- console.error("Error loading carousel images:", err);
+ } finally {
+ setLoading(false);
}
};
@@ -87,12 +139,18 @@ export function AboutMembers() {
setSelectedBoard(board);
};
+ if (loading) {
+ return (
+
+ );
+ }
+
return (
-
- {/* Carousel Images Section */}
+ {error &&
{error}
}
-
{carouselImages.map((item) => (
{item.tagline}
-
-
))}
-
-
-
-
- {/* Team Members Section */}
Our Team
-
{members.map((member, index) => (
);
-}
+}
\ No newline at end of file
diff --git a/Frontend/src/components/Auth/Login.tsx b/Frontend/src/components/Auth/Login.tsx
index db9a996..500919f 100644
--- a/Frontend/src/components/Auth/Login.tsx
+++ b/Frontend/src/components/Auth/Login.tsx
@@ -1,33 +1,42 @@
"use client";
import { useForm } from "react-hook-form";
-import { z } from "zod";
import { zodResolver } from "@hookform/resolvers/zod";
-
-import { Card, CardContent, CardHeader, CardTitle, CardDescription } from "@/components/ui/card";
+import { useState } from "react";
+import { useNavigate } from "react-router-dom";
+import { Card, CardContent, CardHeader, CardTitle } from "@/components/ui/card";
import { Input } from "@/components/ui/input";
import { Button } from "@/components/ui/button";
import { Label } from "@/components/ui/label";
import { Link } from "react-router-dom";
+import axios from "axios";
+import { BACKEND_URL } from "../../../config";
-const loginSchema = z.object({
- email: z.string().email("Invalid email address"),
- password: z.string().min(8, "Password must be at least 8 characters long"),
-});
+import { userSigninInput,UserSigninInput } from "@nasirnadaf/codeclubagpit-common";
-type LoginFormData = z.infer
;
export default function Login() {
+ const navigate = useNavigate();
const {
register,
handleSubmit,
- formState: { errors, isSubmitting },
- } = useForm({
- resolver: zodResolver(loginSchema),
+ formState: { isSubmitting },
+ } = useForm({
+ resolver: zodResolver(userSigninInput),
});
+ const [error, setError] = useState(null);
- const onSubmit = async (data: LoginFormData) => {
- console.log("form data -->", data);
+ const onSubmit = async (data: UserSigninInput) => {
+ setError(null);
+ try {
+ const response = await axios.post(`${BACKEND_URL}/signin`, data);
+ const token = response.data; // Hono router returns JWT as text
+ localStorage.setItem("token", token);
+ console.log("JWT:", token);
+ navigate("/dashboard");
+ } catch (err: any) {
+ setError(err.response?.data?.message || "An error occurred during login");
+ }
};
return (
@@ -35,11 +44,10 @@ export default function Login() {
Login
-
- Enter your credentials to access your account
-
+ Enter your credentials to access your account
+ {error && {error}
}
-
- {/* Code Club Role */}
-
-
-
- {errors.codeClubRole &&
{errors.codeClubRole.message}
}
-
-
- {/* Year Fields */}
-
-
-
-
- {errors.yearOfPursuing &&
{errors.yearOfPursuing.message}
}
-
-
-
-
-
- {errors.yearOfPassing &&
{errors.yearOfPassing.message}
}
-
-
-
- {/* Bio */}
-
-
-
- {errors.bio &&
{errors.bio.message}
}
{/* Submit Button */}
-
-
-
+
{/* Sign In Link */}
Already have an account?{" "}
diff --git a/Frontend/src/components/user_page/Userpage.tsx b/Frontend/src/components/user_page/Userpage.tsx
index 45894e2..0a21c6e 100644
--- a/Frontend/src/components/user_page/Userpage.tsx
+++ b/Frontend/src/components/user_page/Userpage.tsx
@@ -14,11 +14,11 @@ import {
BookOpen,
Bot,
SquareTerminal,
-} from "lucide-react"
+} from "lucide-react";
import { useLocation, useNavigate, Outlet } from "react-router-dom";
import { User } from "@/types/user";
-
-
+import axios from "axios";
+import { BACKEND_URL } from "../../../config";
const sectionTitles: Record
= {
main: "Profile",
@@ -45,7 +45,12 @@ const BreadcrumbNav = ({ activeSection }: { activeSection: string }) => (
);
const UserPage = ({ section }: { section?: string }) => {
- const [user, setUser] = React.useState({
+ const [user, setUser] = React.useState(null);
+ const [loading, setLoading] = React.useState(true);
+ const [error, setError] = React.useState(null);
+
+ // Dummy data as fallback
+ const dummyUser: User = {
id: 1,
name: "Roni Bhakta",
avatar: "https://media.licdn.com/dms/image/v2/D4D03AQEvEHK2KOMLwQ/profile-displayphoto-shrink_100_100/profile-displayphoto-shrink_100_100/0/1705087348506?e=1748476800&v=beta&t=IVnehed4T53hvzHeeNxaKQdN9EJknAu4iM4tpBddSvE",
@@ -66,7 +71,7 @@ const UserPage = ({ section }: { section?: string }) => {
yearOfPursuing: "3rd",
yearOfPassing: "2026",
email: "roni123@gmail.com",
- });
+ };
const navMain = [
{
@@ -79,7 +84,7 @@ const UserPage = ({ section }: { section?: string }) => {
sectionKey: "clubinfo",
icon: Bot,
},
- ...(user.codeClubRole === "president"
+ ...(user?.codeClubRole === "president"
? [
{
title: "Past Events",
@@ -107,6 +112,33 @@ const UserPage = ({ section }: { section?: string }) => {
setActiveSection(getSectionFromPath());
}, [location.pathname, section]);
+ // Fetch user data
+ React.useEffect(() => {
+ const fetchUser = async () => {
+ setLoading(true);
+ setError(null);
+ try {
+ const token = localStorage.getItem("token");
+ if (!token) {
+ throw new Error("No token found");
+ }
+ const response = await axios.get(`${BACKEND_URL}/user/profile`, {
+ headers: {
+ Authorization: `Bearer ${token}`,
+ },
+ });
+ setUser(response.data.user);
+ } catch (err: any) {
+ console.error("Failed to fetch user:", err);
+ setUser(dummyUser); // Fallback to dummy data
+ } finally {
+ setLoading(false);
+ }
+ };
+
+ fetchUser();
+ }, []);
+
// Handle sidebar navigation
const handleSectionChange = (sectionKey: string) => {
setActiveSection(sectionKey);
@@ -115,24 +147,40 @@ const UserPage = ({ section }: { section?: string }) => {
else if (sectionKey === "pastevents") navigate("/users/pastevents");
};
+ if (loading) {
+ return (
+
+ );
+ }
+
+ if (!user) {
+ return (
+
+
Error: Unable to load user data
+
+ );
+ }
+
return (
-
+
+ {error &&
{error}
}
-
+
-
- {/* Only render nested route content here */}
+